From 1ea9ea4fac14f857082012e7518ebefa97a37078 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 20 Nov 2017 22:07:13 -0500 Subject: [PATCH 01/33] Add fault handling code mostly used to detect when the serial port disappears while a GVRET style device is connected. Beginnings of code to add a reconnect button. --- connections/connectionwindow.cpp | 14 +++++ connections/connectionwindow.h | 1 + connections/gvretserial.cpp | 90 +++++++++++++++++++++++++++++--- connections/gvretserial.h | 1 + ui/connectionwindow.ui | 7 +++ 5 files changed, 105 insertions(+), 8 deletions(-) diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index 99d084b..5021893 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -56,6 +56,7 @@ ConnectionWindow::ConnectionWindow(QWidget *parent) : connect(ui->tableConnections->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &ConnectionWindow::currentRowChanged); connect(ui->btnActivateAll, &QPushButton::clicked, this, &ConnectionWindow::handleEnableAll); connect(ui->btnDeactivateAll, &QPushButton::clicked, this, &ConnectionWindow::handleDisableAll); + connect(ui->btnReconnect, &QPushButton::clicked, this, &ConnectionWindow::handleReconnect); connect(ui->btnRemoveBus, &QPushButton::clicked, this, &ConnectionWindow::handleRemoveConn); connect(ui->btnClearDebug, &QPushButton::clicked, this, &ConnectionWindow::handleClearDebugText); connect(ui->btnSendHex, &QPushButton::clicked, this, &ConnectionWindow::handleSendHex); @@ -149,6 +150,19 @@ void ConnectionWindow::setActiveAll(bool pActive) connModel->refresh(); } +void ConnectionWindow::handleReconnect() +{ + int selIdx = ui->tableConnections->selectionModel()->currentIndex().row(); + if (selIdx <0) return; + + int busId; + CANConnection* conn_p = connModel->getAtIdx(selIdx, busId); + if(!conn_p) return; + + conn_p->stop(); + conn_p->start(); +} + void ConnectionWindow::consoleEnableChanged(bool checked) { int busId; diff --git a/connections/connectionwindow.h b/connections/connectionwindow.h index 77a0d88..104cbab 100644 --- a/connections/connectionwindow.h +++ b/connections/connectionwindow.h @@ -52,6 +52,7 @@ private slots: void handleRemoveConn(); void handleEnableAll(); void handleDisableAll(); + void handleReconnect(); void handleRevert(); void handleNewConn(); void handleClearDebugText(); diff --git a/connections/gvretserial.cpp b/connections/gvretserial.cpp index 0e38871..c5c334a 100644 --- a/connections/gvretserial.cpp +++ b/connections/gvretserial.cpp @@ -37,7 +37,7 @@ GVRetSerial::~GVRetSerial() void GVRetSerial::piStarted() -{ +{ connectDevice(); /* start timer */ @@ -328,6 +328,7 @@ void GVRetSerial::connectDevice() /* connect reading event */ connect(serial, SIGNAL(readyRead()), this, SLOT(readSerialData())); + connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(serialError(QSerialPort::SerialPortError))); } @@ -344,6 +345,82 @@ void GVRetSerial::disconnectDevice() { delete serial; serial = NULL; } + setStatus(CANCon::NOT_CONNECTED); + CANConStatus stats; + stats.conStatus = getStatus(); + stats.numHardwareBuses = mNumBuses; + emit status(stats); +} + +void GVRetSerial::serialError(QSerialPort::SerialPortError err) +{ + QString errMessage; + bool killConnection = false; + switch (err) + { + case QSerialPort::NoError: + return; + case QSerialPort::DeviceNotFoundError: + errMessage = "Device not found error on serial"; + killConnection = true; + break; + case QSerialPort::PermissionError: + errMessage = "Permission error on serial port"; + killConnection = true; + break; + case QSerialPort::OpenError: + errMessage = "Open error on serial port"; + killConnection = true; + break; + case QSerialPort::ParityError: + errMessage = "Parity error on serial port"; + break; + case QSerialPort::FramingError: + errMessage = "Framing error on serial port"; + break; + case QSerialPort::BreakConditionError: + errMessage = "Break error on serial port"; + break; + case QSerialPort::WriteError: + errMessage = "Write error on serial port"; + break; + case QSerialPort::ReadError: + errMessage = "Read error on serial port"; + break; + case QSerialPort::ResourceError: + errMessage = "Serial port seems to have disappeared."; + killConnection = true; + break; + case QSerialPort::UnsupportedOperationError: + errMessage = "Unsupported operation on serial port"; + killConnection = true; + break; + case QSerialPort::UnknownError: + errMessage = "Beats me what happened to the serial port."; + killConnection = true; + break; + case QSerialPort::TimeoutError: + errMessage = "Timeout error on serial port"; + killConnection = true; + break; + case QSerialPort::NotOpenError: + errMessage = "The serial port isn't open dummy"; + killConnection = true; + break; + } + serial->clearError(); + serial->flush(); + serial->close(); + if (errMessage.length() > 1) + { + qDebug() << errMessage; + debugOutput(errMessage); + } + if (killConnection) + { + qDebug() << "Shooting the serial object in the head. It deserves it."; + disconnectDevice(); + } } @@ -781,7 +858,7 @@ void GVRetSerial::handleTick() { if (lastSystemTimeBasis != CANConManager::getInstance()->getTimeBasis()) rebuildLocalTimeBasis(); //qDebug() << "Tick!"; -/* + if( CANCon::CONNECTED == getStatus() ) { if (!gotValidated && doValidation) @@ -792,16 +869,16 @@ void GVRetSerial::handleTick() qDebug() << "Comm validation failed. "; setStatus(CANCon::NOT_CONNECTED); - emit status(getStatus()); + //emit status(getStatus()); disconnectDevice(); //start by stopping everything. //Then wait 500ms and restart the connection automatically - QTimer::singleShot(500, this, SLOT(connectDevice())); + //QTimer::singleShot(500, this, SLOT(connectDevice())); return; } } + else if (doValidation); //qDebug() << "Comm connection validated"; } -*/ if (doValidation && serial && serial->isOpen()) sendCommValidation(); } @@ -813,9 +890,6 @@ void GVRetSerial::sendCommValidation() gotValidated = false; output.append((char)0xF1); //another command to the GVRET output.append((char)0x09); //request a reply to get validation - //send it twice for good measure. - output.append((char)0xF1); //another command to the GVRET - output.append((char)0x09); //request a reply to get validation serial->write(output); } diff --git a/connections/gvretserial.h b/connections/gvretserial.h index a4a3963..63e7f9f 100644 --- a/connections/gvretserial.h +++ b/connections/gvretserial.h @@ -62,6 +62,7 @@ private slots: void connectDevice(); void connectionTimeout(); void readSerialData(); + void serialError(QSerialPort::SerialPortError err); void handleTick(); private: diff --git a/ui/connectionwindow.ui b/ui/connectionwindow.ui index c24610e..d8b48f7 100644 --- a/ui/connectionwindow.ui +++ b/ui/connectionwindow.ui @@ -38,6 +38,13 @@ + + + + Reconnect + + + From c819459d19afd7da035746d38fb08bdfd8731a9a Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 16:41:10 -0500 Subject: [PATCH 02/33] Significant changes to GVRET code to make debugging easier and to make code more robust. --- config.h | 2 +- connections/connectionwindow.cpp | 24 ++++----- connections/gvretserial.cpp | 86 +++++++++++++++++++------------- connections/gvretserial.h | 1 + 4 files changed, 64 insertions(+), 49 deletions(-) diff --git a/config.h b/config.h index 6dfdecb..a7ebdb6 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG #define CONFIG -#define VERSION 180 +#define VERSION 181 //try to keep this in sync. //SavvyCAN will complain if you connect a GVRET board with a revision diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index 29f4011..6e9bd69 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -164,25 +164,24 @@ void ConnectionWindow::handleReconnect() } void ConnectionWindow::consoleEnableChanged(bool checked) { - int busId; - - CANConnection* conn_p = connModel->getAtIdx(ui->tableConnections->currentIndex().row(), busId); - ui->textConsole->setEnabled(checked); ui->btnClearDebug->setEnabled(checked); ui->btnSendHex->setEnabled(checked); ui->btnSendText->setEnabled(checked); ui->lineSend->setEnabled(checked); - if(!conn_p) return; + QList& conns = CANConManager::getInstance()->getConnections(); - if (checked) { //enable console - connect(conn_p, SIGNAL(debugOutput(QString)), this, SLOT(getDebugText(QString))); - connect(this, SIGNAL(sendDebugData(QByteArray)), conn_p, SLOT(debugInput(QByteArray))); - } - else { //turn it off - disconnect(conn_p, SIGNAL(debugOutput(QString)), 0, 0); - disconnect(this, SIGNAL(sendDebugData(QByteArray)), conn_p, SLOT(debugInput(QByteArray))); + foreach(CANConnection* conn_p, conns) + { + if (checked) { //enable console + connect(conn_p, SIGNAL(debugOutput(QString)), this, SLOT(getDebugText(QString))); + connect(this, SIGNAL(sendDebugData(QByteArray)), conn_p, SLOT(debugInput(QByteArray))); + } + else { //turn it off + disconnect(conn_p, SIGNAL(debugOutput(QString)), 0, 0); + disconnect(this, SIGNAL(sendDebugData(QByteArray)), conn_p, SLOT(debugInput(QByteArray))); + } } } @@ -233,6 +232,7 @@ void ConnectionWindow::handleOKButton() return; /* add connection to model */ connModel->add(conn_p); + consoleEnableChanged(ui->ckEnableConsole->isChecked()); } } diff --git a/connections/gvretserial.cpp b/connections/gvretserial.cpp index c5c334a..0bc861c 100644 --- a/connections/gvretserial.cpp +++ b/connections/gvretserial.cpp @@ -35,6 +35,29 @@ GVRetSerial::~GVRetSerial() debugOutput("~GVRetSerial()"); } +void GVRetSerial::sendToSerial(const QByteArray &bytes) +{ + if (serial == NULL) + { + debugOutput("Attempt to write to serial port when it has not been initialized!"); + return; + } + if (!serial->isOpen()) + { + debugOutput("Attempt to write to serial port when it is not open!"); + return; + } + + QString buildDebug; + buildDebug = "Write to serial -> "; + foreach (int byt, bytes) { + byt = (unsigned char)byt; + buildDebug = buildDebug % QString::number(byt, 16) % " "; + } + debugOutput(buildDebug); + + serial->write(bytes); +} void GVRetSerial::piStarted() { @@ -161,9 +184,7 @@ void GVRetSerial::piSetBusSettings(int pBusIdx, CANBus bus) buffer[8] = (unsigned char)(can1Baud >> 16); buffer[9] = (unsigned char)(can1Baud >> 24); buffer[10] = 0; - if (serial == NULL) return; - if (!serial->isOpen()) return; - serial->write(buffer); + sendToSerial(buffer); } else { @@ -186,9 +207,7 @@ void GVRetSerial::piSetBusSettings(int pBusIdx, CANBus bus) buffer[12] = (unsigned char)(lin2Baud >> 16); buffer[13] = (unsigned char)(lin2Baud >> 24); buffer[14] = 0; - if (serial == NULL) return; - if (!serial->isOpen()) return; - serial->write(buffer); + sendToSerial(buffer); } } @@ -210,7 +229,7 @@ bool GVRetSerial::piSendFrame(const CANFrame& frame) ID = frame.ID; if (frame.extended) ID |= 1 << 31; - buffer[0] = (char)0xF1; //start of a command over serial + buffer[0] = (unsigned char)0xF1; //start of a command over serial buffer[1] = 0; //command ID for sending a CANBUS frame buffer[2] = (unsigned char)(ID & 0xFF); //four bytes of ID LSB first buffer[3] = (unsigned char)(ID >> 8); @@ -224,9 +243,7 @@ bool GVRetSerial::piSendFrame(const CANFrame& frame) } buffer[8 + frame.len] = 0; - //qDebug() << "writing " << buffer.length() << " bytes to serial port"; - debugOutput("writing " + QString::number(buffer.length()) + " bytes to serial port"); - serial->write(buffer); + sendToSerial(buffer); return true; } @@ -262,6 +279,7 @@ void GVRetSerial::connectDevice() debugOutput("can't open serial port " + getPort()); return; } + debugOutput("Created Serial Port Object"); /* configure */ serial->setDataBits(serial->Data8); @@ -273,20 +291,22 @@ void GVRetSerial::connectDevice() serial->setDataTerminalReady(true); //you do need to set these or the fan gets dirty serial->setRequestToSend(true); + debugOutput("Opened Serial Port"); + QByteArray output; - output.append((char)0xE7); //this puts the device into binary comm mode - output.append((char)0xE7); + output.append((unsigned char)0xE7); //this puts the device into binary comm mode + output.append((unsigned char)0xE7); - output.append((char)0xF1); - output.append((char)0x0C); //get number of actually implemented buses. Not implemented except on M2RET + output.append((unsigned char)0xF1); + output.append((unsigned char)0x0C); //get number of actually implemented buses. Not implemented except on M2RET mNumBuses = 2; //the proper number if C/12 is not implemented - output.append((char)0xF1); //signal we want to issue a command - output.append((char)0x06); //request canbus stats from the board + output.append((unsigned char)0xF1); //signal we want to issue a command + output.append((unsigned char)0x06); //request canbus stats from the board - output.append((char)0xF1); //another command to the GVRET - output.append((char)0x07); //request device information + output.append((unsigned char)0xF1); //another command to the GVRET + output.append((unsigned char)0x07); //request device information /*output.append((char)0xF1); output.append((char)0x08); //setting singlewire mode @@ -299,21 +319,15 @@ void GVRetSerial::connectDevice() output.append((char)0xFF); //signal we don't want single wire mode }*/ - output.append((char)0xF1); //and another command - output.append((char)0x01); //Time Sync - Not implemented until 333 but we can try + output.append((unsigned char)0xF1); //and another command + output.append((unsigned char)0x01); //Time Sync - Not implemented until 333 but we can try - output.append((char)0xF1); //yet another command - output.append((char)0x09); //comm validation command + output.append((unsigned char)0xF1); //yet another command + output.append((unsigned char)0x09); //comm validation command continuousTimeSync = true; - serial->write(output); - QString buildDebug; - buildDebug = "Write to serial -> "; - foreach (int byt, output) { - buildDebug = buildDebug % QString::number(byt, 16) % " "; - } - debugOutput(buildDebug); + sendToSerial(output); if(doValidation) { QTimer::singleShot(1000, this, SLOT(connectionTimeout())); @@ -457,7 +471,7 @@ void GVRetSerial::readSerialData() //Debugging data sent from connection window. Inject it into Comm traffic. void GVRetSerial::debugInput(QByteArray bytes) { - serial->write(bytes); + sendToSerial(bytes); } void GVRetSerial::procRXChar(unsigned char c) @@ -766,9 +780,9 @@ void GVRetSerial::procRXChar(unsigned char c) } } - output.append((char)0xF1); //start a new command - output.append((char)13); //get extended buses - serial->write(output); + output.append((unsigned char)0xF1); //start a new command + output.append((unsigned char)13); //get extended buses + sendToSerial(output); emit status(stats); break; @@ -888,10 +902,10 @@ void GVRetSerial::sendCommValidation() QByteArray output; gotValidated = false; - output.append((char)0xF1); //another command to the GVRET - output.append((char)0x09); //request a reply to get validation + output.append((unsigned char)0xF1); //another command to the GVRET + output.append((unsigned char)0x09); //request a reply to get validation - serial->write(output); + sendToSerial(output); } diff --git a/connections/gvretserial.h b/connections/gvretserial.h index 63e7f9f..345d0d8 100644 --- a/connections/gvretserial.h +++ b/connections/gvretserial.h @@ -70,6 +70,7 @@ private: void procRXChar(unsigned char); void sendCommValidation(); void rebuildLocalTimeBasis(); + void sendToSerial(const QByteArray &bytes); protected: QTimer mTimer; From 8cbea00c4c5bd3b8add045a2368249092e0c235d Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 16:41:44 -0500 Subject: [PATCH 03/33] Remove DBC related status bar message since functionality is handled in a separate window now and that status indicator was stale and unused. --- mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index c346ff0..be9950e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -133,10 +133,10 @@ MainWindow::MainWindow(QWidget *parent) : lbStatusConnected.setText(tr("Connected to 0 buses")); updateFileStatus(); - lbStatusDatabase.setText(tr("No DBC database loaded")); + //lbStatusDatabase.setText(tr("No DBC database loaded")); ui->statusBar->addWidget(&lbStatusConnected); ui->statusBar->addWidget(&lbStatusFilename); - ui->statusBar->addWidget(&lbStatusDatabase); + //ui->statusBar->addWidget(&lbStatusDatabase); ui->lbFPS->setText("0"); ui->lbNumFrames->setText("0"); From 0ce41ecac1309bf1c09ba09cb7ff3040aee6ebc5 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 16:47:21 -0500 Subject: [PATCH 04/33] Saved new screenshots for help file, modified some help files to reflect current version of the program. --- docs/source/connectionwindow.rst | 36 ++++++++++++++ docs/source/firmwareuploader.rst | 4 -- docs/source/images/Bisector.png | Bin 0 -> 36326 bytes docs/source/images/ConnectionWindow.png | Bin 0 -> 42852 bytes docs/source/images/CustomSender.png | Bin 9170 -> 0 bytes docs/source/images/DBCEdit.png | Bin 16811 -> 0 bytes docs/source/images/DBCEditor.png | Bin 0 -> 60860 bytes docs/source/images/DBCManager.png | Bin 0 -> 23802 bytes docs/source/images/FileComparator.png | Bin 17960 -> 0 bytes docs/source/images/FirmwareUpdater.png | Bin 5844 -> 0 bytes docs/source/images/FlowView.png | Bin 0 -> 137477 bytes docs/source/images/Flowview.png | Bin 32628 -> 0 bytes docs/source/images/FrameInfo.png | Bin 20339 -> 0 bytes docs/source/images/FrameInfoWindow.png | Bin 0 -> 62688 bytes docs/source/images/FuzzingWindow.png | Bin 0 -> 74851 bytes docs/source/images/GraphSetup.png | Bin 0 -> 61477 bytes docs/source/images/Graphing.png | Bin 21401 -> 0 bytes docs/source/images/GraphingView.png | Bin 0 -> 47669 bytes docs/source/images/ISOTPDecoder.png | Bin 0 -> 82614 bytes docs/source/images/MainScreen-Interpret.png | Bin 73471 -> 0 bytes docs/source/images/MainScreen.png | Bin 72081 -> 162535 bytes docs/source/images/Playback.png | Bin 17842 -> 52956 bytes docs/source/images/Preferences.png | Bin 19345 -> 72312 bytes docs/source/images/RangeState.png | Bin 0 -> 71364 bytes docs/source/images/ScriptingWindow.png | Bin 0 -> 139003 bytes docs/source/images/SignalEdit.png | Bin 16490 -> 0 bytes docs/source/images/SignalEditor.png | Bin 0 -> 96712 bytes docs/source/images/Sniffer.png | Bin 0 -> 97286 bytes docs/source/images/UDS_Scanner.png | Bin 0 -> 56517 bytes docs/source/mainscreen.rst | 49 ++++++++------------ 30 files changed, 55 insertions(+), 34 deletions(-) create mode 100644 docs/source/connectionwindow.rst delete mode 100644 docs/source/firmwareuploader.rst create mode 100644 docs/source/images/Bisector.png create mode 100644 docs/source/images/ConnectionWindow.png delete mode 100644 docs/source/images/CustomSender.png delete mode 100644 docs/source/images/DBCEdit.png create mode 100644 docs/source/images/DBCEditor.png create mode 100644 docs/source/images/DBCManager.png delete mode 100644 docs/source/images/FileComparator.png delete mode 100644 docs/source/images/FirmwareUpdater.png create mode 100644 docs/source/images/FlowView.png delete mode 100644 docs/source/images/Flowview.png delete mode 100644 docs/source/images/FrameInfo.png create mode 100644 docs/source/images/FrameInfoWindow.png create mode 100644 docs/source/images/FuzzingWindow.png create mode 100644 docs/source/images/GraphSetup.png delete mode 100644 docs/source/images/Graphing.png create mode 100644 docs/source/images/GraphingView.png create mode 100644 docs/source/images/ISOTPDecoder.png delete mode 100644 docs/source/images/MainScreen-Interpret.png create mode 100644 docs/source/images/RangeState.png create mode 100644 docs/source/images/ScriptingWindow.png delete mode 100644 docs/source/images/SignalEdit.png create mode 100644 docs/source/images/SignalEditor.png create mode 100644 docs/source/images/Sniffer.png create mode 100644 docs/source/images/UDS_Scanner.png diff --git a/docs/source/connectionwindow.rst b/docs/source/connectionwindow.rst new file mode 100644 index 0000000..039d1cc --- /dev/null +++ b/docs/source/connectionwindow.rst @@ -0,0 +1,36 @@ +Connection Window +============================= + +**Connection Management Window** + +.. image:: ./images/ConnectionWindow.png + +The connection window is used to add, remove, and modify connections. At the moment it is possible to use any SocketCAN compatible device (in LINUX) and any GVRET compatible device in any of the supported operating systems. +At this time GVRET compatible devices are: EVTVDue, EVTV CANDue (1.3/2/2.1/2.2), Teensy 3.1-3.6, Macchina M2. + + +Connecting To A Dongle +============================= + +SavvyCAN is able to connect to GVRET compatible devices to capture new traffic. These devices will present as serial ports on the connected PC. +To connect to a dongle select the proper serial port and click "Create New Connection". If a valid device is found on that serial port the first +statusbar section will update and the currently set canbus speeds will show in the table at the left of the window. These speeds can then +be changed by clicking on the speed (or otherwise selecting the cell in the table) and typing in a new value. Leaving the cell will update the speed to the new value. GVRET devices also support +setting "listen only" on each bus. This mode causes the device to not acknowledge any traffic or try to modify the bus at all. It is as it says, a mode where you can only listen to whatever traffic +is found on the bus. Some older GVRET devices supported a mode where you could change the second bus between single wire CAN and normal CAN. This is deprecated. However, newer GVRET devices have +dedicated single wire CAN buses and the relevant bus will show the checkbox. + +SavvyCAN can also connect to SocketCAN devices in LINUX. Select "SocketCAN" as the connection type and then type in the device name. This should be just the same as you would provide to the can-utils +programs. That is, do not enter /dev/can0 but rather can0. Then push "Create New Connection" and you should see the new connection in the table on the left of the window. Note that SocketCAN devices don't +support changing the baud rate within a program. You must do this when you set up the connection via console commands. This is outside the scope of this documentation. Consult the SocketCAN documentation +for details on configuring such devices. + + +Debugging Connection Problems +============================= +GVRET devices present as serial ports and have significant configuration options. However, the ability to configure so many things and the ability to compile the firmware yourself both come as a +double edged sword. They present many opportunities for things to go wrong. Because of this there is a debugging console present on the connection window. Click a bus in the table then click "Enable Console" +to cause it to start logging serial traffic. From this console you can see what is going on. It shows what SavvyCAN is sending and what it is getting back. It has extended status messages that might help to narrow down +what is going wrong. Additionally, if you're feeling adventurous you can send traffic to the serial device from the Send line. "Send Hex" accepts a set of hex values separated by spaces. "Send Text" will send the raw +text you type on the line. GVRET traffic is ordinarily binary so "Send Text" won't work very well for that. But, there is also a text console possible on GVRET devices. If you connect to them with a serial program you can +configure things via a text console. Type ? and follow it up with some form of line ending (Cr, Lf, CrLf, any will work). diff --git a/docs/source/firmwareuploader.rst b/docs/source/firmwareuploader.rst deleted file mode 100644 index 0926aa7..0000000 --- a/docs/source/firmwareuploader.rst +++ /dev/null @@ -1,4 +0,0 @@ -Firmware Uploader Window -======================== - -Uploading new firmware to CANBus connected devices diff --git a/docs/source/images/Bisector.png b/docs/source/images/Bisector.png new file mode 100644 index 0000000000000000000000000000000000000000..79e0f94db6db6127e379513e6abd53ea5d60c82e GIT binary patch literal 36326 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 Lqy&qQw0RF=hHDn6@ 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≤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 literal 0 HcmV?d00001 diff --git a/docs/source/images/CustomSender.png b/docs/source/images/CustomSender.png deleted file mode 100644 index eb59c30bdb3187e99357e3a83ec87ee394d57281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9170 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 TQ4V;y_wBo2WMNpW@ATjwX3YWW literal 0 HcmV?d00001 diff --git a/docs/source/images/FileComparator.png b/docs/source/images/FileComparator.png deleted file mode 100644 index 5c815d4b22f005b358262994a6fa6aa197529ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17960 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 LNkvXXu0mjft7J`) diff --git a/docs/source/images/FirmwareUpdater.png b/docs/source/images/FirmwareUpdater.png deleted file mode 100644 index d8e768a84cfbdfd864d5ce7543a6a507c1594bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5844 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 diff --git a/docs/source/images/FlowView.png b/docs/source/images/FlowView.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8389c354a9b1f3a477b4fa416c720678ebc484 GIT binary patch literal 137477 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

@E6V76R+RC$#G{$C|2i4 z;>0^aV7I?zl1Qu>R!C`TaFk}IqYL}+?g?j2OYaaaJ=}V;fYcmmfR6qhU}Iy=a*8gO z+uipiEld_DuaMdo7gLu|2zyJ1{sj|ZHU|?EEYM?u0r%Og+3fY2P$EYlU=@$kM%u;Z z6;Zj~MSTc^fZ)BWgBe8c5Ve!4zi%`EjH=fV`UJ|A=eS7kx*3j0UZ!GFQ&VGc8Np0j zE@%OWD*53I@5eXFtsQzF)DmP7D=@t#L$dNG?pNTj!SRs?CRRb=vHygNn+wK2BqpZz zC#o{pL(_k7;gRg=y@Z=tGnn1!qA1e?Aps$qElH#L1CSOdKa6uw)6kq;m4uu2yyt7Y z&HBqzf{kxC+AJIam^7Sh96ztaJzE>mG==(aw2w=8$e(3p-{nfC5q3%dSz_4mOv4$dG8<1F$&nfuliikzzPd=aOk2G7*vGoNBqU~M$2K%1GkNh%w|DtR zrO_hwm82*jVgD(}^QUgG-(v|44F%}PFWCaXoo*tFG_Ilvexb(#r~CscOYCZwA~SjW zf3*OOL->*ZL3l~@#waO!9@!!=%lzX609-o)G1N8=0NHnJtn!fyxqyXqzI-PcaXcr| zznEaB*kBeB<&mZpA11E1D2>#yCMf~}jw{*bi%!6PiXjC)i=H?LY=a5(%D|!{M+p4# zEV@S@O&To}k3G`(4ix-Z)4p`@F`~YLp!j>51cSb;7k{q%&luN;g;2qDuXX>HABL7M zVtN8Xavw{$B<;9FoX7*cID!HYv130Be&KNhUjpCs$E2rdOXrKZozQHwTjv2e_}`!F z^o*EWc=n$c;GOm8oqn>I?)ndU5KQNRrwTMsgR6G+*kGb-K(Uqc*k{?KDZs@ z4}Zr54~@IxyKNC1-1@t`=m={`v3d`6R`s8F2hz0ZgN>yZYI!p~X@8IBXTU!BBO$vq#o>PC>b@}U|+za-j?lq|I$b26U#k*RPV2Rfg>WA`_VsW45afNP@{`V-t^3jj3xXjy;i)86O4X+Gno1_1AEpD6_x2-FR<9 z2QR#fZ?8>8b;u=3*DN)L?SvW^Toc4R0DVPLn)e*4amhr!5gZkg_-5-+Uj-g5birRJ zsqmvc`dqH#kzjIB?HT##HPpclRxqVVM&Bw|v-uakBB9Z^x#xxEj>OISdmRF9hUPG5 zw2sFd_rzIN#sA*sUPbX_Z~m1&JiI9!W)TXP)Rd@?M9O|4K7rSI+?s^VL)-O>N~(DY zjZ`nZb$Tl$6DO4kXw7fWmBOPl7@MWOPNmEIh{1_Gm)e`8)cBquso>^9;`O*_LTfzY z*f*BF&}`4CosxrCOgLfoUJMfom>a{cbiO_>=LTrP_ z8L5gnUc}qCkFt8oYnz9mQQpr0yzzZ)3uZl#FoIuXkg(8RZk)J!N8T{APBuPoBi3#^WmVk}xnsW=tzS~IBLBH^A!b4w?+=lHFa3<4-_uJ zGLoHoiO6hMyxuqI@09UQ)~c#v`QlgmAh%sqN$7%(e3Qm)EfD_&Dm>-s*|m%g~vMHF7?do^uJ14VbElmunsp?mfmx2~nlmN1inZ1i`nZ=}(Lratvgon6(Q(fv5n zF1yFZ>G;0u!w6Qo*UXaeQrMEd&e>Suve=)6-iJB2=Cff}`S`uCmP?4e*5Y13QB-H(Plm zoTvn5Q{m$&3)DaBs{%w_aC|8#+qI~^A<%!lmn&>Z9@GFJJ02|;v@KR^fcvbbhSwq7 z>?7qPDqr#~uIcXbIUR_u<)&99;;9TV-&=nHs0r{iTcG5A@d9qN$dC}`|04R}W&OOL zs4MQf^Gt^ap^4%pe}LhzR-@zDq#&ngW*P-BTq_p$*R>2A&Mm$NqyZ?Uyd;upaBA?` zZ*ea#FXi*qUVjgW;>pp8F?k||gpZnuiHWlsB;|4>b^9lbyRSe(^s6#VGx5rt(=I1i z>g5xn3hvJ{0D|Z0##ua-^EMk)4Cc3kcIG8Yb&1pUcHLuR4C6;QLdwuJ9w#BBPa^H$s)shkHuA$*M4x}(oXS3cMzGLz0 z!52E?etDQr_s)T0aV3As22Afy?%qC;+ZW+`l}4k%8r=1UDpNy~F-k?TpmwRSA9n%R zQJw3Rr7tpJ8{jHWE>5&({A=Qw4L?PZNy04md@EpgF(T}0Y?`fgMkExE?`?B$$(Y{T zfz}Qh_g>Y0Qu$wx>hJF0mTmOaM zw@iC{Q+&Yf^n_R_1Pe+l7=8CtdfgymTCZBAG+JIuQ)CfzcS242#D3T zaxOnayk-@dFfAL;du2oM)vRB=-om24{?e7)Jnlpwz0L~u=FZlF@4jtLODLH@#5;qw z8H&%!qAl0MO-jao$_KOn()s@YMu)w^U@TWr3dTdDC4#%bK}%cvi{K*yNVqp@mO@91 z&G+og^;8sOubp<^KJm{tPylaL`2VCRH=GWqve$v17UITT2PsrXh&J}B(=E${u z6Ni26dz{3gJ*Smbl8j8ku^K5$m?wDi?mg){{D<(Ts^9DerP6pZ(q!_tY>wTnrUwxb zQ8Y!=Wy`=bZ$BOV8@pH1IvJt77@w$>D_$;yn_fSCYxtW(v*48hzZzvl#(PbvE38Vytom&kWE2`Vb$F z)rf$>bA^hF^unvU^E;#cZ}d1mb#G zZrY;&psFNJ@hDK`iyt*V)Freb#N13qjbt<=;WoKm{6j$>@KiNteB-=4n)LxFldWI8 zc@FLSq}-H2pT4o8z*9T&(Wpm70y2(NVlGexrND8qZQha4;jU$Daz9v3nAdOU-m2BJ1)B#QZQ4-j@A|R+SHGP zTxUjRVp+QohXipoL5Wbpp8cu6wsKfd(W1Uvzjag||1k;i%yDBW@zl66z6b+$k)~kI z`OAgtoRWtp73?HO%M||P+K9888rLXF=J@1@sIq37O?OF0d;7Khh{oD6Mw3QZ)#Nyt z2;eQdOPDb*wq<3>xZj|lLD)CYjOJ=s35 zWHQhQ+ujZ1*Xyn1Ln_i@N=xZ7GBbm%Vc6Ja-oJg@2H=#k%JTIgnM~_X(%(y3;zLSG zq!O!jbgKZ>lQVnSwXZx;tlV+!aYx%Q)2P3P7`C-4``thyi4NK!5=|rLi{K&UHwt)t zEmKo5fCmFZT-DSGx5)by_-n|M6kQVLyX+CJd`*z57x5d7Q%^8{_fm3ll|B{W3 z4djw)Z?WG7`1x^a4!PUAR=YEL5*ZFdMW%;SlN@C^GkxD&Ti-YW7;7TF5*`@g zynKO7lHk&(zPQ(+ktAY&%5+_QkqM$VpY<*hK(^WRJULflGVZ{KGG#iTXm z_d^-I#Y;xa*<5lXJjnM(G84MyynDW1&959Yp`BwUtGTGfFIj;v??WIVZmTkR9veDe5w=A zS>^QXjxp@IV9(u3PmGgO?U|zz7EmQIIKWTt*n!Nak%5(rZyg?RRCx7|3I zw7Lz`)^=A-hC6XltNR;`4mD){^_)yUTIw zbq4rsK9Rjf26~SqN)xmg68aO2&Ti$1LO)`BuE25ntN8=BvD^?5bHi^AYiXDav_lu3 zIz2@%qwR}@WLyb(Ufl;^=Qd!Mc&2+*i_bDfRP!91t)hu5h>M_CQwf>P^#K`_C}Xm%L_$ z=1Pt0oVQo5DgORnsf(y9CN&;h?6G)GX@KfXx#o69ASoh3#>pAI6Ua;c{An;-Dr4-( zEzA~;S?`G{7~Q)7;sb^IT1p8wkmXXVH2(bYaF;Hdf4z4P6wk$-AS0G57qG^|$A6ut z6w&#!)6P7OTE=U68FlSX5@z4N6KEw6zq2EqXR%xcLCG={Z)lYN4$$gk#OoZz#h=Dp z`TaddLGn>rS*ds23f)BRA_kC~`yC3M(PvMvQfV|F;V>O5tJ0qK4~jWCj7k2zUl9!d za2|gPkB;sP*Z!ENn2XF0_vVSy7{UjIxiQ2ABso_Li*h$H8RS440$gT1CtB3S{%8o0 zOaS4ah{$Nd(C2f8zX;v7{}{>JoHxwcBr(*f|RD{jLfMyJWK^Z6D5vp?J4e_jhhL z7hE4QGvXPHKS)Z3$`>fd0sSb}!=WoN35lT+EvJ4E8pYsP7b4Jh2n5DZ3QHHc;IZG% zBkERER<8FDHtTle3`J9`rec`SSwBJ_%&H7Qs*|KZV`XL4x|N{K_|dne4eISjzPC35 z^o>{yPFlVf4gWWCPI;l|rBYH7{TrWqt}6Pm+7Ej+J|_yE~IbFMCXs!dLHqdHKzuNW{ak%9-@~zE_oQZ zU9umArG2eXFvn)~fISMvHcu9~{|1U*Z9vNpC9=>vlCz&?VOlO0!(SiO*^=3ZRs(O7 zHGidtT$jXZnLU41KCqN;aw0q6fbxoaI|gmR3?Wy<0)~llj8px@XWHPM<)3ufiP=Nr zh?rCMoi^a~$wUnM_=|qTv-udABZRG@t-g!&4;YJ#j*s6ubB%X-7~oLUwQC*Q!Z>p{ z-hfaRVBfmhMuFS`sHdb7uO@%P+1%ZZ$HW_WvUty?4SiL#yeTI!UYwtu<*qTihMe=R z?*W1Y6f!yUJixUv9YNI8$0x3+G*dOJvo+I~oe%W&hPTqP=QsEEIxPJz4W&8E#X+g+ z_6S*Jx?94z$vN3u?FuZjkhmpLf=Ax&X?^y<5VCi{(_}ndhWMT=xTn9L0dfWR%QiRE z*x=lA@k9YyNQZn-yr^6l@N zC9quR0-K#_aO9;@EFq%iN`A9Bkg86k;7v|Y~(m`;vLqC#YW#_qLhgslm#Hn3Ha3hMAKQ5 zt##xL?8GBuD`)5=O*-LihALaLZ3b!M-4t#;3` zf5R!z8^)6++>iS0RI4K*r;D5^h$l1oSg1FwH#o}?@VIp*WeSbgNYTz!S{NT%*+9;X z)9Bpi$OHrh-{ZX-^zsRMQh4Q#ByXH0j1S>!gkmGXf%NFh*Is*;Le(e>SQ~AP5)+ge zHS7$V)y~(H3WfeDDfn-2S%{es#ojgN4Fk_-XHsf+U>$@;ZblFWDR{5qZ@lQc`Ay+h4Qp zwNoQQgOB)m453xnZtnIRC%$MIb|PpKPKK`jqOmSk>&u!zd{ia^S9ua1pS2aCASG}1 z?k&n%z+`t+bbNH?WyKitaP*~4RAk-dHt|Ok#f%LCOO?ZuoN1^Hb>n$+8HC1Bk#T3C z7u*ioRm_|D!JWr}igmcp^DITzAR~94YDWD~1mxbw$15Lwo9Jg2(%1brt@(6k{t)eK zE^JQ_+4JPfx+(q#0Rv9T%Rql+xkVB9|hz4r4->m@rJg3k-2K>>Ujic zosMD{G9WfLt5zqMmYzpNY>@?K98bkN&Nl0koi!(l0fz_}muo+=CZ^Q$b*HJQ6_*?9 z51Zf!A;CQd?GkGc$0ZUDjzr%#xC~ZW-MY;cDqBIc&0702Wjj;*$jHbB;F%euKBmF( z$mZ%$-C!tDe_<(87zMPKu{$2(f$+H4G>&45`k0z4HfC_Z{Oer0ctI@Xkw}ofbnmEY z(9=y9QYwuJ7ndRs{VBl7J5>0VSm(U2^W`44ti617Sj@%?zt;zpfnJg&!bva60`dbw zX0BflbeRMM1rd?3M}WjIYF;7QjF_!_bhFgPGOG@1fl&=JakAT6ddm1?V!c~e>e|B6whNh!`|EAV;k<9iLlRS@+Ks-lhDA&0XhqYR67bzoQvKQNpc^ zPR+y9HW;BNB`?neBws}9xAuW(v>`#lL~EwAr|2+F=rljT3r68YSD;A&3OGI)wBncW zfbfh0On~OVfRkb#`Yqa|5a1W-QP6 zEoQHFOvZIc8aqW9iN>A8r}(x&YSsO*u67oUXgHkD>x*z;2AO1<*99|KqN7nv(Hcx% zxvU1gJA*jjAv0(6GCuMJgns>pfg^T%oBZATcOw4N8RI)PETaYlotooCLiKx=(!caa zCvGsR7u1Jb4gInkpyu_}!_d0M7q$)npzlotM6S)+rUXwa6aCVoIXasBn;6k9zyy!I zaenn$M7_QI>x$x*FZS~8q$vz2)tPOHXLWUT9~RhgJvbebsT7N!un49^Mbn|5$H%Up zp>8(N&Y7#83b!uNr|n+kb_JaRCwO1Je0#^K8Z;eowx8kK-=Ti)XDMjFVpGb z&%5uv2SdL#yEzxD)p=!*=SX1Je_EoM28 zKgaqe>zCyU3sFxX1S#N?va=`r{P|*aZ8ab)>?0A+kF2b$o}naWrwXY6T46mE~JJvLb$v_ks0=eHuW|5^ZAb3zL$(DdClr9Q?L zpIbTRDvy&=Yo2_3ihjQ`c*8l~uHO4B0iC;`H{8V#p8lnek56XVpXHsE2!lI7MwdE3 zI4Exwe*sN_LEtbGC{(Z|bKd0hD}qhwH)PD&XmA#U8BTtP0;-zqq^Q-^Y_a=B?TlwcvG6_I2K-H8nY6R$w6kT=>4sa*| z$Gi^01RjT-Kd_&7XlR}LvlTl_ExbT({rC1Hlp}~Z(|T^QDt8IHE`4lYp$zS!4q)BB z{&F4Cy_vvL43M2^kt%ATpTm5{uiO%_U?umCtP~p~b+!DOPLh zZhnBbva?%HD%nir6gUa)5^K>N-z;LXnD}03czU8>jaRs{SA+fi@O zYN)^TB)(GfK>Dv1pk&n4jCUcKOWcI;b4oTcY7QCOsfq@v5hdF1-oR;(<+z}h($yIR zzN6eGC}hu0ciHc`mE$Sh&Fy-ZeMnds*#`!M5FuT>9MVqD6o7SvY z-TMHkkT1$mi&zI#EHf;M>jhb*Cab9pkWmu2NuEW73Ht*`}2c$@a!V{gRKc|cjL?>7s(quXPkp? zHy5@v_RXA)+no%WnboQ8Mp^aVKiB-gOPdxH*Z!JYc5HQes+!_s8vbySoJOwte6_4_ zVNC6{6ATEtvt?9S3+}h)J0z5BO#V`2mY2T!S|^d&_vdFAc6N5hd#eNOFV6r9ns*C> z^K}COSxQPOBO@bvpsubCKq1SApq=6NVh=DVB=qzV;H-?bcs^1N$X{vz%a-{hEF`qL zyBjD@+R@eJ(*nH}tD~W%MFDN_MTHM$#e_jrEO< zs7RNz*w73w{=B+3OP*BrKRH%b_Xlt7HAV3G%?qh%ZtQm6#vlbJy6#G8wO{KxuHah~n^_%X7Or+Su>`MLjO7 zh2BD~HMM3l9_Sz5-{1c#Dyjp$zxnCw8=0IeE-j7v_U+r4*!;oXh>yzUdaps#3TT*! z0kPuA0$_wfaJm-iY}uWT|8c*&+=!Cm(Qf_zY?V})&&H>5iiUbOQBCF|9$(4?G4xg% zv+n%-f}Vi^ji&m=3a=gmHhbM1v#ZxXufQLlc^=n(sW_?b-c(VcMiUMrBje@4d=E&x zV4T)MSmPP=5r6@oA3|_FJv|rQuOOlW^4%b@rER|U0!a3Fp)w;-GsUx762Jgwe1AGX zE1tyi1}K+5X*LheRhfR{=1z}o#4jR`qzdoT>z|cp+8~MQ1Fw!93TwlPKzE2u9bSTX z&YWGb{c&WUUhjqt_&ppm=-i*l$)e5eGOy#G5q$zRG+$6(d_hfpWwO(l` zm#Rz^^EZUYyA%{Qt<%%f^`~CGc!7#4?eW^Yp(#qOjDF~+XSyn#XC9A;ba4-JxW zM`KZbSnS>n1cif^V8ydQcriw1`jy=(s!9t8TtaAJ)-NIHe-wM`94>Hja?ry}3J-2f z#VTjs{VeZnLHu_LXgc2!(j^;5M`CD^H4PVOwbdH!HFw#voj6riCKrPH+|{TSdb+w2 z;%Ac7*gR7!D=S^Z6`2tc5yd4WtgRh>TM?R%&^~Sb)1S25(?MgjytIwt@Df$2V-v&w zLNb@C`Lx)lzjRW00&o8RzIuAkB;%#uzu%2TxH$-)c>DJ<1tBD7(Ssf|bi99mScRJI z_+|dbJVF{;YSml@?z-75tBI`j{m;cXrPb2(s z0dxBQ4Ox^M`-u{CGV8B)26T3I{>c`@^te9}R;e^fmrZyMk4)#VuLM#R!&K)@?2TJO zkLw>dXIoJT2_m0A!+^v^P*aoeJ0M(6Clxg#;^O>DN@$lnAGyJ4*<}+<$Iw|@?d|X1 z^f387AtMS3z3zz_EVA6#m_xGD>5$z`%>Pa-?{y3n+qw<=vuDq!)oQ~*PFiNSBTFio z-23A>yotI2=ncO=?m%H0V6K}5P!y1TpKTx;+5nKS46-Z^v5%-J)0%eaBH*8i^S`qiD#ndp7# z7aL28{1M&SxC;9vyYpjPI7FJ^%YvUjXL8FXk!vnTw@znJ>Au-RZf0C^a_!UoH5SKk zJ8fRVrp|JgIL7i;f|E5>m6IF)4vFv`GpPm4Ab&!Z??4p5LPfD(?D#c08Ux-sf+rfH zUS73@p?W<@!pCQ4b6Z=wdc>rpq|ov6y6w}YhzBwp=m1+Ka5Qf3usVS8u58LH*0ev3 z&3RJ`%5S8}y|lCxf>@3V+>fkOER4_b5K0+V{yVC(O;5F7(y*%G~cqceQ@x5VBizHrOVT`2i}*iN#j$rIPq=xWIR^m z^}m0MR9F}oe1azdLJuZru$?wWZP)*@g@%T{l$AAH?1;7)E6r_S=jP@Ppb#XXGhKN# z;$C7k5tETYcOUZxOvw3^;Ad}#a$fH*_kM(o82Gp}|2)aFqb>7up$zy#tx|SAUlXyA zf18lShr_Z-#;WO0e`^($uJ^%>!_FAVn9NFCUy7N*;mJ1>qg(dbE$)tu8f%Q5GW*jS0GQp;nD6ZY|m@gG4nw^Z0! zdzw3QReZ+u_2=Nw(F*n(X#e{+3dTM%;z@kDmtYK)1a4SjVz8fICJa$-QWA>Ki}xiZ z_yh!tsinjuBvRp07n|c1(#ivlnfe(PU2#VygHRkS)5#@1lhx5-?&@O3CT0(ii}!H3 zx^TTuKp;h4)I=lW;&*v*GbASF1?1I0Azf_RAAy0V)6m%&Ut(St&i7ra;Wvx@isE%X zJ{)~IDROdhqb?6pXXo3@xmtVFz1>}4aAsSQ(LkjB z^Snr%?5(F!YTzao*RFuCAZSLs_fucR4>Iv}S zYs326+cx=2%By>AjK4U|jkX4z4QQr?qJQVcX6f(B9Y!nm} z#nw}`8irYCI?>V5%d4w><+l2VTT|V>lwL0l43N&!`}gldH=nV(g2C`ANg?A3|Kfq- zg1+)rQ=Qdr_MD3D$>2^=p66wy{mE8cZ~w6V_#P?|5z+Qy`0!It8kt>H>cQUX3PE?L zjrtB{_XI@^c=!&jzQqZ@d$Dv_qidZNLu2$i8r<(1NSCE|f2 zlQ0_j=^ATFBBea&&{+Z~+lzkt+O8jCpyQH=zi6<`oI}_ita8Cl!(cg++zM$5JBOR1 zFI&3Ml`2p}A|r2ybMjbc$i-udNJxmsa_6Q7eJ?ydE@wxOQm@US_Vo7VZoM>vnyTya z!aLkdk|nYo1B)N+ImZ*zjZUsD5#AF%-f{s@z+Z-XFlM0S@@>+egsn<)}ul z)~dmi&CAPcF<^Jv9B*y(!!sQ%rWY3%he|7EW30^FgX02SHd*0p%}wKRyR%nL!klD? zZf?F?OP$A3vzEMnIE^>?*BWA9^K9?BzoaB2eei%mBo)G{a)3?Acb$WypI!U7xHY<< z$YH$)4tXx99UGRej;Qs;gR|U>XZ-di&yRkx@+`IJ-aLl7RW)DZ*Ot3eXf&dAmRdSB zNKMMfhybjTX)26_*x1-Vf|M9*Yqb^V?tl7BfiBhb!sM1VFGb0;Nd`XI&!0Sg!F6K! zI)Xj@{avwFSwtixz4?hkBO|Xx#k9ltf;3iE5S-`TU0o5pk{in_D{L;?&&jS#QL{Uz zQYe<@=Q}pWFyWO!o9bV0TD%s1p(d>tp-qPKjo|F_qBO3rscao<&3pVyX zwVb;9$jC_CQ+ooI{8CO!Go>`@veLfcVdIt%J$UANkl*8rI|-eEue^|U+Th24h;$`d z%EF?eFMhq}zQXvXCPzN((b&?`jE33CSC!sE_@tzDDa+BdIem&BIjDce{R!+`o^Xu@L1Lf7LF8 zqh2E)d2%KF1k@sXjQ24yzhb%=_gT>7V$Zw9xK(ApY;9@zGVYxaE*Of47sJD;KsC(> z4O4RQ8u#}&pLsj3Rg&WE3diuQmFPWZs!(HeTx4Ry{L+#%xpdEi$ObBu<<;TT4)|>6 zEi7~o1ZM3#n;F!Eg;9B|8hgI`2&QQabZ*q;DtL~B(!A)vj9qx2sC@?MxK zO+L}Ds>(@q5+1k6-s0ikQSLvToj7W0gs^>;+bxiIpa0ZlyqWVUbc+gE?+grt2a%6S zlS}089~`(Ij=aJq=ZmwNa8uCIYV3?<(-><@egx!eBb>spS(6W*jB_{~08hBtdh{`*Gfj)GCm`}e5kLpgdd0)sM72Dlt2S|(ox z(;V+Tn2hF(4f9KHWoaA!NO=dO2n`cjI$u!FdB1$zg34cl4j z6cyB42+fE3Aj=|#+jBQ&XVBO8HV5(EIac-lEK+kF0^}boL@uv)`G6$b9cVm;L4i_j z=lAEUUO1{X_)5e1Vv>X@1T&vlCpiG{j6z}bEN56|;amFxz;iwo6~u>!qfcK>Q~mj4 zckiARB5V9z=;Gg>KiP`Sp5uqW873Fccg^M~?{I=i$R(udkN*s0)4VY=d*m3$r=+ah za&eZ4EYG3#YwYRyBK&dnQcqRe-oc`^BicGF$|V-I&hNhhG* zh#V(c1F}6{xGGx;+pKvB$g`~Yl=$Ib?C_wna&bN67t&uYn-w^1Vm=gj^kEx`f?LIWQ)05A^q&q*> zTU1x~eC7US>J#}N){_BLJUnH>4tHISSyLJk-L0&cPftgmx|oT<@dgK1N=C-ZRXQ%G z3pZ@Lia4e8E}PYXX!fzI%QFV=D^CP2c{NF62?qEYeO@HjPu5ywGh5D1Pq)N9-TD?9 z+VK@Xku%CxiR7No3t=GTR8>_Mtjdau``YL|Rj6xIF&xw8g*`W{3&@$sp9&mtY7@F% z6)n=>K8bH_?S3V4LwHd4rAnu+vbv0uoaE6>pBJx;UUNAnQa+#+l6YP5Eh0g<;bJUK z$KmcxX$kz`Cl@%vu|o-DmrCxj8k>_9va7cS36A@&U(=0w;21!%)>}g=ae1n=O7!8g z`+!tR^|Pa3bYhR<;BbJ##Z$!5i_I389PcBv>nLQWYA>T=Vs^LnR)*N1?-qcQ`MZH5 z6|9}_-ya18wwK=PbAW)dg=YsW%*-@2Gz8MpSg;@dEM>kzmnDskiMixp{&1*z3xviW zp4v|?TwW+YyKs2@kyPo&LqETYphR6BY#bbEl@}vpWBPC3Hgv}Ryq6aCdHMUJ0b(DL zOZx)5`Tg%$kH_n@?LLxwhmD_Gl#o^B?SUjVG@6B0h^21aP_{e&xv-Vjp*I5$^Yohq zbrxj1UHo3DJ#@&T%sSFj>d?d^NJ8KCB{lsDuBqutc~w<%cJ@WTeF861Swr3w?EO<& z8drCU`R@o9m4Ft%@v92&I*UKZ;#W^^3B|^)uQnn~PVULdP_A@zWU#zs8L9i3k;B?h z>NuMP=j*wqKt$1zfSiPc@2eCkBbR_LxAM2t&Gf9N;ILf`jfgmuUl9KtgOis0)OGiI zWo0Ecg+TGZsormK6r05kdiuALQpMAERs*j2XjHx}E^wG1XxMW&tH1fK+S};WE5Do= z{Oei8({#)bgY*Z4u5N4?N7nXcGp-sL<92hDgDn6LCE<8@N?&rv zWAL|gpxq1~bpq}iYG0GB1!^(QRMPQ&ST< z^a~UM<=vAt?mvRm8Pnwxso`YN97`i2M(oGe*)LH*838lo!$%RUOe)MPR&H*+nT9{( zwVtud%P-kEpu1yBmW_1+uijm9axs%-y-fX~C^&4ksyPUil$2om+3AxOHau)?YkS+D zhI5c0OE)#;t-ILZvj>4iAE2#$DN`MoolRP zYP^H2{Q33A|B4>W4H<-VX+Velh^i>*M|Tc#Y5enic!VOu0}S9>ap5NpaBvxR9;5*5 zu{t|YNL^bSKLX9T3~s`w+}tN9YWdo8M?!})Q~4~={K&S(BqRtc_L0ZMYrY+Lm)0;@ zeL}lAS<|j0e_%XaFAPYp-Rgj3sr8kQ3=Yvi2{(Y1vd~}O!waLMqkAqde;W(S9%71u zv$LZXq{Dusrx$si_^xnzI66I5eW%)qLmsJ9RBwP(09oX+m zEyoa5@){a38Ph$ix}FErRN?~CN1K8G^gJ;&y$vzGq;(f*@ratNd-!B8CSLu15E*Q) zx6;yjV`+KMmIo2cm~C|9J;PQ?ddh?2T$L*_DR>DtA9pBrO zp#VffSN5_!B1o}0gYfg`&l;ZEpl>fUmcQkG_~|9NST0Ne49vb-wj#5+ilqbu--l5+ zz6;^=TTESM54__1pwTqV>wd@t5i~@^#Jy$Kx>i%Qxpqi2@QtZyYpti@P1N)GFnPdm zpKxr*8X3_jrOTzhE;1q_B`va@6Cae5QD{whEiiCmrnmBZ*`0RKE~m1q?m-d;y+nG5 zn}u0LdrX3EvcjFyNl6WLzJXR_`dc4*6pkHsjjUU6!Ps!Tvh>7a>?hV#*R%7VJlA2g zGUqU0UNqo|0J%`1B?s7Jkx}QPCr<()ABWv`Rus{eqfzp8q{w(~eqK3C3(7xO@^j}W zd&?^bOAmIyFflPPk%_a6jQ)f=J(DprpOcuazEY~#nMmId)~;Qp^43HsW#DAgXSScnzP=8t7_D$Zg?-{ilup6ef zcqgJzKDGOVOU}m%BtuuCP%yN)y51LDU0tI>Q&pvX^Rx$Crl`q&37^jY#hKy1T+j|n z$jQk?zp9XxkpV2Xp|SB(iTUt7GBO!CIa~-e5mr+x>tioLL`Ajqrbvu{lB~A2*5h!* z`1*|-w(~9DG$@ra1OXri{D(a{M@9@W0F`w}`vPdHmCJ)$be*%p{wE-wrkpoz^538w z9Rb7~+d!2A9WuzEq&e3d+}sUOav)t{2W%BE6{zmjR?1&=M#n_i9E{>?lv#b0kw9Y|1oQmXZrixHijf#$$9w;8L<0b1)Z1A|mWTx_f~WS?zrZlVCBOaUFlwT-g2}vp2 z!@Az|k$_M^ErK^^^AcPz|C1=-%$y5!jjHoZT? z@(qaF>^TZb4MF*pD{731G9{ZeK>&aN)|~~jg7_1#&V->H<4Pi8n)es(Ak~+ z{l=-OMCU2bNS3M|Xbpf$ zm&eLj%B-jIoJRPaH(_^tZ5EImM9%*`JKG;%dccpMl8CZj>M|AGgr$am`}XaQjt(LL z7uKWA3A8tVzT&qS6td?}d7a7bjuR6TcO(eLg4{_D+MUE_p5;y(F?R0FLFCegR^#PA zM>&RRcw9~DcAUbDRZ>@fDJpth&}~0Sx6TU)0@c280O;Seh0_B7AGp8ofR0P{62=?F zy5@iYK*zRWfV3dZ{s%ZH&Dyob#^LW^i?Lbhqc)75o}N}b6F7B6)_n2txkDW#o$-l@ z-Fw|a-A7a2$b2n$1PiH=I#~xh*M;#XC*#$t4mB4$-Rs6T5)yJp3TB$^bl<;^akr#- z40+Ir-ZQ~MxXR|9Z$$6d}0)uG+{H# z%PrNed&rC!ECQxCfZT*GIN8`BRYNYWuBfb@rw*z)>cX({VNHqwUE_KV=L9=!{Xn%2 zgsLINVa9N8RqqAu5{Z1qo;lm9V{z1iqI!RSbyHr$(ys1wH5=K#CyTTa?t$nlBq2d( zVFy0d>bk%u+F$^q8^3%DAY!{$p`|n91q}p>R=G_=PELp7Se|ZhR)0VVK807bbmXI+ z-ptFr%I)p;AE~LsdJKaqjye?;uIr;EgcVxIfV0CxC%XGc(fUfi9_Wnvij2$LhWUttJB&mU|WU52P=fy5df_NqH{ofr(yy>N=R^P7W?RyY;`4fqClg zKPu~Zz!`)b9&z!{pM2txe1)|&C6FAkkkoCvqPW0eG?Z@Cx$b&(A-24>W`Afww6e0| z;#R8H_hZ;(bRdG9zf_X^r)o~FrF!u)71ZCnQ2fL8jBJFwF3tggZahEP`W72Y<=Ei{ z(ueDk*8|+&+jie%-5t4G!eG6%+>mN-Y%;1W$aC#5h*_)F0hdu)x`ZsBxteGn^W#k% z0|3z#B}^4y@xJ%<^|c#mX}JXfQDAL;4RJ*qqa|}tECMg^EheU|Bboyh$$;(5{sEN$ z1ET-~QVIakn8wBbr$s!WtZU4QBzO&RDBe*O9t0D%-`lWzW?A=@4?PE>Ifc=ao}21-HKjX<6g z{V6Xet1+pmXEoHF{lFdQxNqR_Iqe&@M=KuEnIeIi$FpIU%!j z#>?+2<=WBHXNroR2d1a<59gWcq{=#WxAzpVfn20>u*{^<%yo!-A_*THkH9b#Ax{v6W@l) z_7+SekST=q^rRd_6&soDy6gWfFlOW8GW_#Z{`hRG9R(z#fw!L>e<9TM@N19!P0!4n zm%of45#)pXFPxL*l-pnYDp13f=da(WY3ND*{nYdHzNDnzz4V-lXP&1>ghn+_OHQ=0 zF82fIU!z!Os69NZZ1znu98jr~fFUngkcE)paF8j1}n(A~Yg z_o0imkcgOis%Je?C`O)6JD`}Dj@~mc33qxJ^PL|5d^2+sfD}pc?4dpmb{EIp`x>sr zzeaMoL?i+pJ-dv65)*%6e*TStfwEb=pC1Mgu~AV`1x_0pA3lDBx(;{B^C-R$@jKSK zw)MjetSnCsGh<^39i4<-=ZO0io*o`i@ICTE7o1&PU2#I*6z=Zs2JEjh=YZeC2Sv_k zsbzLVPSzrNx$7QHT3Q;X`A|SdhYTQ~pko0R9lAk1_n`msw6_hB z!LM{cG~*TbAFT1XnAJbPr8t#drIP|_hrPXh?eVPr;no!ZHW!#jo&z7|V6`6L=MRAp z1x|?ljWK_2OMz@hG!I@23^Bt=>An z<>fv^DI43cw54}whSslFv0jZTh}R`%_(jIuO|7k&$`#OzPp_^@IXG}a(+mQM0w^<3 zkYs*IiDTxodB+`UwTx)pvh&7`W1>>4$;NLf&FV)RWoG=PK|wjI@dL{#!I7`j)$612 zB%V4iURTob#(_p%h44P7Mi`B3OK0bk5@rq#_%a5C)n)q)ygj5O)blL#St`h%X;@f- zp|)2&^8|k@z;UUsQp7_S(4#<63U3FrRjg3{LLF+_`&}$^4%q|oOnE3hc{+#~gB%`c z2Y0t;L_Xi93`$I-1i-g#1B5_xeW}twM)*0d4M9}`$2ptL^mAZS#2`o$knu+#wR=QM zo8C5uF={wUTls1s_`a zVlq-g_8ANGv!G52h>p%|((w*fKH4jUp@f!Wd3l+A?E7~qt5Tq#SD8(4;4gY$qoR1$ zL09yIhsQTO+yE%lHu}sHt8u!_mgUis{U}o~vWq7x*ldidAR!#!x0}!I@_=9hKpz_r zi-3p_DS?8Aueix?((@pKMOVj^7@6T01paZ@ax#xr`_pf4)f`d4LT`)4$kSyxQBYD; zgrYkIO7J!{*;4~dM@ZMbdE40;V#Gup_5<0+SbQW{O_py7j5#(|*{dC{Uy#3h|Iznu zp>e)lT}y@uEc#^70K9urcP`~_4awF=Mk}=K2w8%D*c8~7@kgDOMa@~PBbY8kUH@62 zol!m#W4PsR#fJUzvF-CnP@d+x9Mj%Sx`z+nr=MRy)KgPiU#M_5wsP0d^z39z{!pI& zc7gFqUkza*)0Ip#EkA!OeZNspS`Cl3`~FOiZgQKxYUxJ9AL)HpGnCw#Y78$=vrL-k zIbH18?EJdSp>Exbxb*b&-P>&8*y9mM2DFMF1v=YifS?*1MR6$vZq>(dncu>}Q7I+* zTj|IM-T2$pflU0`ZrCh-48eZcdZBxExRC;^5vTQ}R>kIWZwerj?_hVxev-{+9~%|L zYB|cOsH6nKW3{}pf&v9Eid71pAEgzyDW3%d2j7M+5;!Xz?+Zt$n9FTuULdz1X$=iN zZ4dsUtD^~$;lZ7qI`S*a+yh>~tYBYIFEk)FANI;7dzbHhmCpEt77=40^|HM4V2y2m zeIyXtAyehG&sSNku7(Bz^L?qey5g(qlSPu@MD>D1)a5a?J#^WeO-FSKDk>@g0f7p; zg~BEWXBUV*`|fuY#Gn}8-9B3RgSzeG%}m46)U=54e!fO}=Yby{EfKrHEd{$d5_0lf3oAjGoNzw*WoBk(rPF0(6cl^`J&cpj`b_SM zVIn4vrP*&JJvO2jc#P)49eX;dIYK5%q(UD-cnN25+X`+-hrYU$U}euiF|CQ&lAZV^can z|LB4oA!3xws1IfvUO%ErA>uM(N|z)1)z(+oV3|gfR(&qTy44Z==lEwgp4&W~ep79I z$gggco zK0MJZ4PP~5hqCzm{M=;$p(aIMm67qKyqp)Q4O{GteQG=V=|@FiU?4)93d*Wx2y8xeFD3A2#A1ue5lF!91I#h zL2Qf0PA8A9G?bur_Ipr!a$1hMytST^S>-iDeETNsa$Kj4*3sF?%EOc2j~bcEYBi39 zRC{SxIZ2U=xpbruWV*TczA85Z?kh0*?`p-iue13 zgelqC@wc1&{rykQ_qtsU23wIhF5ufq3UtS(Yx%tPi{S%1kCS(;>sJq@yINcIx)THe zmdHxovVHmT7F?2LF{a8sYYD;$xMQdZGB-gFhpbAT+Naqmy9<-(>$-e{1vaxZse{Bo|Gr;{~5p(UnCSZ9j2hJ%X;i=CrLH zN_0I-%g*wjsOv)8v?Az2AA^E$FD}kd!T&7{RLSGV<4q+hjL1pfb2-JvVm$f-k5+zX zVKo2biNQ_4ISoteAjT1Nm@dwn9w?LXd!>a9s0z53rWO_*d#EWRWmodZiHNj`Ob6Eh zso0yRtqIr#uj4AVh%a`QjVAEFE%*+Q(u`@;AXC#wdp88IK0|+>90^B1a zYME~h+c`Wmg5vvm>-_>~6@LNR1N9Zu>aIr3WQjLry!#Pn|f6_c05HQ*a#HYjZIB& z-@JJT`yuS6*~OG)H1n760?{DJl@~m?4<%MqZ0z2}(UiWqX5UracQ~|HUZo~o!?B`J z@GB_bfX0ZvBoEH2>b)+3O6RRsU2k$lZl56`2M|L@cB zYGMhOV?(P6sW&Yl#w4QBi>PP`$!ht}03Bxh`E!s|Mm2*nX8c~3Koy9A#>eAe)0$Zt z#;20<~OpW8)ZXz_F3KUN@j02qNzvN3~r03X;IV zl}G^~{>cHe!MQ)O$_lWaKQjv7NO${N+!d`f@HGuHC6~NYVPO= zPY{$kt&Wbq7}EgsGgK+PJ0vXZ_ix|m09>Mci`mGqFcA%?`Nu%N@w4cO;H{Y4TqE4C zLwBGzx1D)0lGy>3m5N!#cg%ip8HQ`rI;@0_7OJFiS1`t=4gL9(s)J6HBfAOM=GA82 zk5-{AfDq&1-x~2|yz8={sBKOVtcv2^cmjxKt|LC#t5?0C|A>4jf^NFeKeF00Jls4! zj%~e#3uh(h{qQKgu^=|lFDx@nEq^kA^ynJYfN#4K?qts0y80HWX2&vIZaebx&!y!= z@>BgZX#0P9UGP|p9Wr*t@_-=aU3qydh_s>o0~fs&a5}1=v5A{tC?jITU5E4HW#V}K z)O0XtgoNs3792&=0UVY+qlSwEbW>}a_4M?vqoWr>MJaW}!o+m{V~OeefB@fs*gGxO zRn9%hp603fVnwFFE5wKE;<>l%aN`sRe-Pn)VcVi0e(4^4iw97UbHA?IZ zx2KckwQl&f4UPmKNizeDRi?WOBGc^ktWX3(#WcF@ldmt{ojdhcmq$Wz@$tajDLy+8 z@;c`QT^yVM_TZ!>VAi5DdewXF^~h^b)2_#Ii6kp*cb;xZ;}{L(TT?>kJ90J#R&lOE z(o)&imn({gmzVsY#|&?+G~U{JOhf$&BorkrbU_sSa_;%wRb(Cq2RuO2*)l$S zpXfE&kYtRGa)bBeHE>SmlW zUs$?QGkdNG=q-c}Klu#36G@Kp? z%Ys(zOI4L-^l(Z<+!KwzbDNu=zr7l<${b~&O`p%K7#=GBToWOjf=225z_a7_<% z{B*hs>^*(ZIaG;^OcwcHQR`UdNZ`7PPj^QTUCdy?x z>YWw4PuRY)JSRa5cUWC^vv5dbVL@g@r_k`Fu~R6PHn9hpzLwTZH+v=3HjOp#afOQD^21Fy@hO= zurLk`jIzg4wB#kqTSIBOc8;eMzMnrwXiQeSa>VjP#t-4aN&2vjSmk=B&3w;$%(9EZ z6WWC<-SRigScDxa%ym%xq#ky*b-mrUPt~;6;?-nl*ltX!XK(i6loNMl>gYTZa73rO#IVhq?t+g&^EBtac85W_xFPQ z*2!KP4#Ef^=n##vJTESa=UO430T2Wq2V4^P$9~U<36$OH8XAE9N|11wHGamK`nHoO z|0Y)zXY9DluP)St=%k1+Ev^j;*tgtI+UVn+$M zN=19ZSn&d5j?ss)a55J>wY|626hK^b3yWVwRh1^5@8pese>g~KUu}1z3Cbqr=Xd}8 z$r2KAh@!8L2SlcXKLIWnr{V$1mLks|0{$K`J>BYYJfjF!M>#h)zM&y*C?(bsH|k!- z6pwEe8 z1IEE=W`MkIfr7${m$x{C?`ct^-X5pZ^V zuBdnld#YB2T{K9?LAarb>=l)5ZjqQTe_8rcL)_j+P1#qR83?BedSl1Hr#<8DX{BF; zbeVDd?&us!VVGt9Y~XKL2PF8MIDJ}L5(Y)B!FmowFzpK zUz0UeBUR4Mg0zakO9}3!;%EH)WsM^hhUBTQ62Eq}18OZ)*L4sl?#WPz+nsQkK~~K40*A{VXBoC(;UsR(uBSN9XLAr(<3eM2kvOqQFJaP=7;lr zZn^{fRMRMFp*E>zzoeZ@^hDXxz&=NO;p;Q*l{D-G=>HCMYPk7lS7vuO*UHg&qMc>f)fu-Gc zHj{QC5uNET+dU&PUC#@g{2Deyzj0TA-JkS(v^hd^&Cj}zo6&s;kiRDRGDE=s>p#Y; z1}b1r(j3j@Yt?H)AugwI##`tfA*HUP@V`7EK8RfY`D#^^aHOCqzfL4rD5s4&@Mo^v7a6qsE@(A9|X*%58(B>c!z36O)(5l-5w;Azym? zx}n%n_PJea7|)RBUwe<8QF z3{Yp)r~&i2+@Bt7=ej-pORLU{{2dk{^Bq#scJOcXg5>1sQ$aS#0OV^8lz?}&!iAm; z1sbf(Obo$F=edJn9Yfe6spV*qkE0>%#RADYuwzco%p_}ZLm3F}#+H_s5l=M5p?%?X zS|u^R{KvkUW)S$kT}38+W^DZIXGA->V8H=NB4zFA}GV{>x(Ci zO@Cl>lDN6mr6_TC^{=k?=3K=)TP_Cs%W>k_Sv(uF6$J_85=tO@{~jk_dK2Cj(Bqhx zAV0(|87r8Pu+`BJjf-?LZCO$w{BKklNk2$i{})jPLcckPO}_~nY$w6*f7MYH1yc%9 z2nh+Hq{#s=R$&jfFaZNvH?%}MAg8LzeUU%{uaulXcmFHN##C!Mmc(t!oD|M~<`8lk z`6*Kv48SGXfO9R_fzT5yET9TREAYB-gR77LMxKXE7SMu3L*m~xG_;W#cjwFtZ7r=Y z{{BkLOA8ChAZ}@z3Hh=dvHR&2o!Pn6V2JtrWQ~EA;Ar7WdZ(g9X2ji;rZ<+uFHT~( zmb5deRK`Xfr}|ReSu{#_-<)a|r3NXba_M?%uNq%0A1wV6QIx>@XC>TeOa8x>Vz5I9 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/Flowview.png b/docs/source/images/Flowview.png deleted file mode 100644 index 9cd22bee85a23ece79a11445741fce19c82ab83e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32628 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 NjwvcDq#ZKw`5!u)@3H^@ literal 0 HcmV?d00001 diff --git a/docs/source/images/FuzzingWindow.png b/docs/source/images/FuzzingWindow.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4950b1382f962ca9c67179b99fac2846ed776a GIT binary patch literal 74851 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 z z_@g#Q6CpSmU_qHzfeB8zXJw9q?DZB33asGzK(qqaZuR9WB&^{&bYSZS$#>iRQ?DZG z9ZlprD%Cf!zaL5WPPP?dSL7vr*e=Ldsi;WIpROCtZ#WN4Nxv!}k_b)|LqESn;5IPf z(PVsXJlI%ST525NpKvO2ur7kv6vO!^<}zMY);QpQ%zM+_v9=`k=FL4gAv54F6wFpf z2yyqe&ZW%NW%A*Y_V_*~BogqX;gAXysUVN>`4;eFT6T2aYqTgPK5=c%C?a$03Ml)T2IT4J&%km%>16gQBwVZ&*vBitrsr*2~3M)rmnZk zq_L9DqlBtjo|GelBJHvT2XU~9S^&AFw+ug?sk}VPB*c8S#=*Z^Ol)9AWZq-LN+ym` z;`1px;{&yo^*&dbSmx%NnlgU-)t4%7EZ!HrF%}^|d4PVtFMNJWq1I^lwB8H#rA`r* z*EKROUqw8g!|E8n3R&(gdV2%MhJMX9TVQa5)&$9lNMc_9IKrn>>a0^={xy>Rb)6uV z9=(XHE#VbRS#bAYc6c!S39EK>K$?vm{MT#qoq=Qq{16hJ#f|Kq&sUR}xc=CbInY)* zf|tAEdsiVZbqk5o&J_72vgNjvm^;FsXQ&UjkzPAHyxf-M!sMHsg_a#@$08 zYt5>CA((#s$3d!*h$|eV4wTM*KYx=yVK^O}kXO5N$mw)2?Q3t`^FB}J<-V@()`T}C z&HF6R4a~00Rc|z;-Ql&Qa-pDyNBf+T_=!5rjnoHtuYf~f2$+2g{ao-kJ>&r|SiHkC ztmiMYNI+n)6xB#MlIt=+P-QcjPGM7JsZemPxw1mo8Rp<^cov+c=MF?<-))5MT^e?( zMSC#?j9bk(te-C^7upOqq42FaWjW1YvpEXXSPQ!^?U8=5(Px-Prju)wnXGL{hzfIT zEG!Jfg^BFS4FrT8VKM(rB{0$6n#m=+gx4LZX6tvW6!wDVMIz9g&MOw#B$1OH5^Ya=n}!8Y{IB=b6wQ6CVHFh)xk=@vMyEgBPOuU z_G=!#_d8VzytKH><(`cDv8-WLHV{yBGn`&UUuS!-Opkb-@<;O|_#(bZY3=jiFZ4R+ z1CCt0EXPKrkzy_jlKx}bpw1X3dR(uo547b1%^BQ87gL0z1TgQV4%rV^UKpuNK9pmzTB^9k>csYV9A7oqCmHe>nI;Cg%6+R=U1l>Pswd#M4r# zZ(FP1<=sVzj%MHV$3na}v%Zf{c4j*2MgH5V z>r3)e&T(WQ;W3lUD}BlbVn5OT#MIRy$1gBSu#6?nb61}xwxX|=O#ey_T)|!vM@fA8 zlr>anhftftc6;!Q^)>+%XlWBQX)0oK!BG>D7vAq8`ze0a4^?6+ZpvQ|BO48)hV*v zcfx@N2|eGZ{bPA419wcI+B$MyW9by#zxzWl8K_Xb;s@9ir6yy?riAX;i0f0gGs)xP zGaw^iyMHp`eIj|QQ>0zfU9mHI@a|zInHMhjiolfl`tR># zz1DjRzGzUD(%FE#E>$E7!yw_^?{s|`<_^1^#OmOG<`N}L&)T?oc6W_{PH|e{8Uq$MjtsJhF*qzNkh+Mmor*kO` z?fR5e@#~-KWDPY*8oROC8z=UFpD*Bh;I_UG|K}EtOLqh1J-R(>?N6{UA6(zv6&2f8 zpiWZToy|7LORxz>$OHt`_YXhaOp?Pmk+}OrT|Y6>fos+)aC zEd_X%9Ila#0tpfNC6?ZT$Wfv?WFq5ACCo*{n;Av4eUKI zbAb)0NLFc8EJq=+A?fM|*$)2L1guK;ad5&utpWKf%lQL6o${C%mB_O~owCFi zK4@hoh=*{_gBITlv*tI;%l+^VaX2Wh`tD6NWv2Y@H)=Tw2`#-_BPi8g*U$JJ)(i(4 z5y2Gvk)W%a!~TRwGK{S2?_)wfH_lifxQqho&M&)Tnb4ZPqF!%J*Sw-PGRh+$cuN6< z2kyxZ)=LBtdUZ>@ z6sZU*36wvjr8#4D2d~Vw9a;4n-zMOF{myG9iNeNa-QEEoi_NDeO-0!Q)Int>bHI1NG*V;Jq(&Atdi&Svzml(155m4`}**N!OcdB$GSB(uqb#<1ls%{0plDbxY{P^)V@i!1#TidL6A8bH( zXo%_8dqjR>=cx^#QI9*$qy8onvsHg#zJY*2y{X=^y^#M)M3$$_UVyOOH@k?4!kKc0 zE@$}qZRe@Q#AUktOxqs5Y@!}`q~M^S$9@LyE4BG+o%g>R5RnPEhJXKl&1Ex$_a(hM z1|5?br8YJoAWO#mT1GgSiRu{Vae-FcpIRr4Drc+|!E$;KI7Jt~NAYPRNP=CBM3s~T zlZk*SdkS~VVz!RZ~hkv zPS=~_S0_7C6lhZLQc&e>HbuSdsrLkr* zk57PZ%5>Rd?Hn8wzrQ_LC-Ovo3_5}YxR-h=w0!Y@rYoju90b?q8N({)Co#c-Dc}-3rP9br<@ih>q^=A3)wVz6T7UDbj8*FEU*} z+0uUvk7bD(y_Q}ODfiqUug7?H<56P}&iB*iUhBKzMk!=vMcK-5c98ToP~s#>w+IY) zXP)IEM>8iHpItA58)2$d>4<)NivsFO@EIFeiQ5R>L+I@Tx~Q)}Vw_`W$n`1n{iYbv zqHwk}CO;q(X|p~#lo{yqUS1O5Xrq4?4-t6cU*b~QI6c-EGKmkfyF50w->6*c;CHBY zIcKGdYQBWqVIu6=AICAvDp|K)IlZM6>FpfSqxZmG93n$VottvrT04BOp#FN>Alu1<{?>B_$iqnHhb1%fde2i}8z;e+`^ ze$D=rPV_%bT|}-OA*5B7nKsBGO{--bW33;Rg$HR=SRm=4y)|NuTsN< z?%I9*6;kq4xT9w)oi7NOBuke6are;{?y2J9N~f)dkRDm@jDP&CyQ0D?@piSs)Yw>ha3g4HjP2BG zeb?>rDSJ^szzw|8YU*2Y8l^^=u@MOHc4tWc9&+gIXadKD5z7X&B=Cv43kbj}Y1Wz3 z>IjstfY}_YT`Ns$)RIe!i@)w(Ib;1SW$$nR@PAp&^r&b@T}@)rv0DP*3IbbuY-vXB z@=k;Q_#9;UiGoD(`s;;-vDj-mRB*s4;!j?Ky8up5^l$fYB>1Mc+6-5myhHlIN_5l* zCY+-W6^7~>8j<~G!vDCXRWoKh@32p!`K<&4aj*LRj*xA-V6%3{JHZBR_N~v-ZmIjg zQMmKSqem_k*{+Srj)mInea0g(nG4+2@7;d{{_|}QCT`?^p&_XTP5(rA}{Ozrjuv$8@%UhHdgzna})y;o!Gdqpb;$-94MAdxSgAuV0 zf}S~muvjLJ)fW&6+;;cU3i>y2$?;pmGg>cKx?^&!s{l&z3nBUoB1v@2!;b#(XL<|E zY@ zHe8>L-0Zn%)Hrg`%Em4ZXNy8QBd9$h*(?A{j|(Q^wT}6FrkvjVpfSz^^3O7BCrX_h z0Jjo2sjdKu@O%OfU0itY{kC7p&a7)PBAf?w zgEbBF3Dn`fFJ%TSOs=Y(t5ed|(g9i9F_PXyI5n+ITu1X%3_ug{fEjv6+W4u{(a)?` zg7HOZjWN7Ogl)m|TBr0(E`i4vOE=-BKkTta5dUvjh zGODW$y!c=0{P%eW-c(n6;A&C_SL}=@?dVi`($?(4k1rQrV3Kk$9=XETay9z|01+Vg zz&rjm2NI93#{CKSZIFtgGn@D(5tIim0yZDU^~I6yPGwuFP{Jp#Y{m?}I=AI@jex~` z?%objmwC@*ZQ;)oB@RE*j7JXJ%Prt2vd{W94sT!n#M#f*7h?lv(}IGcb&p z{(9Li8A^S&Ds3W{Vp(LmaEnT|Jsu@c(Q0eg)zL1W1bBpkfXBrrC}?18>}x;-;rgW( zN5)^O+}k0j;ei>2uBfQ^^XHkNjj5FSZxRA9T(%ynII6qNYuy5l70MkpjE#*Y3k_Z0 zZ}9ktg|&2bx>Kl87y9h?yzx#Bmh00)t~g477|8hT-*eN%bMK6oc??kGj~9l7gm7~g zsF}{3k-wGL%a*STeY-dPu<7Q(U_QVwAL{Li0C6lPVGl_s5wV(aI3YNQ$(D2tnm5PgLe zO`sj*0iMIcLiRVw*yr~!3P^vyg5&mJYSR~pTn?Ia_#hsFf_Kq&jvSA6yOMZgFqk@y(XRDOkmE_{bvg~%l&A_5X=BH{k&RvgJS)qEk|^xG zX}~#ym<%L5ehqHz=$J9w&|}`C>giFHHSW_2LS9}qNo-0Cnt6T*2)KD3G+?mX^veke z3wM1oLT$>TY`i0fw6eP%E~1Dvj|K4Cf8P^yrb9nDm~ZGQ+){pod1%`F^KZHJNGjN% z&?~!V%_@v#7UvZC6Zx$+^a{2>N78<+yX#LxCd%d%f|`W;7Y@xl`c#Pnp~ZyF^Wscu zKLdRuBXPKi{4Wxc7SN=}o`46Ne0#F}737v~5K-Q-3<-Q@7*b&rpyV5RDr($IV;WiIa_HOfe7+POu^w1)}oIyIsdh7 zxsbrsBf2Q`FC+#|M<4@~{z(J=?zC$%N_v}7t%w=&?AbHWym`+S=$Cw~qOG`_w=zT} z(Ft;5;3s#)BoV|FNDT$}l#!mf>3}u7{{D6Fq2w~%T+!KAo2X52@w8>M3B zf?-_^9_Tm6vdgbfQ6FNr%JDninr#?9qR?bEiryebiSViBqCKw1AVO`UryqhK*4K)bB;G_hzCzrEo?BD2ze4 z4)sDdBR*DTNS>NoE|f-;EI>PE)7D>kH@_LTnQR&l+2LUCby7^@>>{ha{oB*S)OEd! z<1^eb1OLgt+7-2m=s?`|^iDY(o*e2gU)TYwGE||Z_|wQRGNvz)+v0~+?;Wl({&GnM z@f@zg5t)~WDm*`Cd=1V3vj$fhpr3K
?Wf-^?@Y3&2 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/Graphing.png b/docs/source/images/Graphing.png deleted file mode 100644 index 9238ef25885a5d10b06a7351f2bb94d7bba1ae82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21401 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 CM4ROR diff --git a/docs/source/images/GraphingView.png b/docs/source/images/GraphingView.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1279d34d803fb635b06d4b8bc6f5d9ce2f930c GIT binary patch literal 47669 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%0DP1Q(G3WX3Cio7D!+oDSd;5II?#&x{~@ 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/MainScreen-Interpret.png b/docs/source/images/MainScreen-Interpret.png deleted file mode 100644 index cd16990a980e1d6db96a7cb951b1d400371fcf8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73471 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 SUNr^(Q#he4n<{O5>;C|!Oi*_K literal 72081 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

-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ξffYs5~cRI`YG*)10w`u;eiat6uc>aOEY_@7Yh~o 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 LYA6+4F$w%1H#7Eh literal 17842 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 N;= literal 19345 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 diff --git a/docs/source/images/RangeState.png b/docs/source/images/RangeState.png new file mode 100644 index 0000000000000000000000000000000000000000..bcda793996431079cff8f4c5f5bb2199dbaf7ebb GIT binary patch literal 71364 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/SignalEdit.png b/docs/source/images/SignalEdit.png deleted file mode 100644 index aa84cab4e8567299f1a966f324410ff62c33953a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16490 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 diff --git a/docs/source/images/SignalEditor.png b/docs/source/images/SignalEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..4dfb22718da14b1090f6157de399942b4f9a7de1 GIT binary patch literal 96712 zcmaI81yq$?v^9J%5J^Qu8W9kryF(B`x&=w48w8|F0cj8sq!EyAX-NU;5b1_PNlQ0; z>%8xcf86i>AHy*`9-i}@{p`K=T64`gw?Rq@QaG3-m0na4CEQUzumb%-MaGVYgBSv^%iAhq|(465q*)}*Gto?$$~X; zLJszu{J9DnSMH{Zi4{B__!3Du{T-c;k3Y3PmfG)@I0ls;J*lViZQ_+jI^X}&Enf<~ zC%Mkad6&dj??-26e6Oy1f2tvy^+d(b?(TK3HpYKG((qX2m)GmE^ugjXGMMPTb6#x>|8c!+!SngGwUDAB*5I^aPfxCR^e~bExN&gW zhomIW215eWKyD#ZP1%UrySlD^@oekW5%4A{uPhXS@8(YWXP~#l)sj#4*XHM@5MjRQ zoF*nFfA&vK$)o=LWdxb;51%?;P7((P2W<4K!D*9QvHw1x3ypbqkMdP}&WwMrRF}Kj z9$5LGukmeR3PPG>t&VISwGF<-rZ}e28@KpVI!o4{Qgr|Ml+Rnk({x7L6d9hjd!8NN zB`o7{NS}c^;Y)f&YA4glegYypWJk=TPCJZ9;L3 z*GZ9~d?a@K3bRk=m4ekwhxd8w zv6uQzrZGZR_qY=KlO}^j7v#H(e_ibBJKT+(a${~y)WjuMXwGoGKRvvfTTMab=i-x* zmF2MaM>$lI8s_Eb^fck)rk~$6{5y9_%F0^$`%Aj5yHL+O*%JFYHpP4V$vXr2B%c^Q z!VJ4@aeOyztU(jpGRkxGsg5NJ`-lER+xX8YFk1duS)qBog zR%P2X`gk8c%~Ed{sZ1JbAYZWO867g0maQ4E61KVjvfV7%vA!k3K?8s5n9thEkk4g_ z;W(JkbS8XnlfU(q8RO@y@ zcSk%>MpaYunUc~ilCbv!S&DZkDQyLo*VbfrmwKe-<(V}$neyT>s9NN^bxG%~(L2Xz zJ*r)aJp~N>h30*wVBnMw;OFmXeOE#>X|$5 zk7mYFww@fKP2DVJrP<%JwGv7SyZzWWJgI=f*Wr%9{;KQ)+Veh(92mn3#xxjZH&Kn=yHHm;=e|cZ*l~1&_&}2KQpe9|FB(Q*wL#x-J## z3VpcyB{g%UD#`?y9~B&w@dn9TcAvx>BBOespqhxrciC=N?V6h~xvr62VDD zhMwDNtK9ETh)JifVQmtS(gzbC?4R|Iop%P2Y1fkQrsi-in3_i2b@t=r|B}la$nJaI zpO&ROed^)7$`ye0?H{V14(Ap#oHj5s#KJ87DBa5>?p2CGMInhwcBf9i2L|NZe*gYG z`uz>##l=Oo+G0X5T@Y$BN<8X(nAJKT>QzK7eS^2y{`h$>`B9v@Q##S$LaR9?`kw!F zA~Z`==D3ayqgN7ZMmJxdaWgLz?U1<6JCN59TAxEurncJVqNc!I{NdH+-f<`Zi z>EJ-Gf*{!Ak25kG^odNX)d@ye(m8N^EKCy@TeQM5`tVsbu-`H4jhR78YX+Y$&7^o> zKuj8aqLAyymKJ0xwzs!8q@FB=Bo6Z3-CahF9cEQ|Nazn+&#dh2e^=qB1iRL;gc6No zaDRx2mG4lLte?;fe_69uPoMv1L$IA^{ z{5sA|#chS;mSttBShue%_a@CxR`1d*y$WVNw7_)5eA&HhF>Y+gOv zhx=QrLrAAjSAKu|hQ{p_{yf_@J0XQty7CrsE+#tqsl7c1LPSJ_%lx;Wj}L-`+v3_| zc%zad%MsPh$3X3HE zr`-~=DF0+1b5rID9Si*k)))Fu^!oO>?fU7xBLTP|FiX^9wL!q1IP zT-#=fq^Eb*YpdSgwM6C^$8_fq32T;r@vS7xm}S|%N!9YCb!aG>F4^T>$URnkBBJ)8 zJPkCn{9>;<0-op5ii$RLTPNUet%dkvQMHIBWjNozplEP7F~FAgc@Z{V=JJiT z?wqMzu0}7H&z#3%mGh+$o3f}C^+C&Rd(Vmf)_Kec{3FZwXB|78)-gw=`x{S+N<%c= zS246J1b!6{Ad>r8OkOng1g-Z3xxYR~es=q4pzv{TvFmk-2KR4; z@GMPp885okXgLbI{XX)xB_?mqf16Kw2w%wb?-*Tz+ zYh-I8NjV$kF+pQ~^5q6$#WF?RMW2cC;6-dneovQfbBVAXnbodWfmgT{i znwxK0hGAm6er?fzSf?arY!gzN$9XWUHAw$w_uI3YcyW`rw+Eer6fvl-AsWsPv|l5q z>OI|=n3y)5g#dE=eH3askb9NhW|MDRE6u2-cok&QsI(8SCAdGdXrtZ|545Etp?U#*ss?1he@B{lY|CBr!b#oh)!WQk6q@W6ug3j=#7|J&>Rqt#% zW1zmTD$JgCnnCRgeKdK_FcE`FR8ph3)ZqBPuy3R|K zZrds(zl+MFW1%QFAFO&rEg817v&eWz8}nPU-eB<@R}3)3lS~~|d4k8sYkgx4N%B9Z z^ki{laTp`$)J?3M@BaQ3+3g{mRkZXe&r2dOT>nzeu=72U6*Jf1n{Q1%@BAfyX7iMf z+OupVTYt*PzcsX|m*Xrh{@{{AFg*M6{PUOR%+-#MlDqSf3G8dDj_MRMQ*tiGWVQ`= z#Z*-AZ5wt)is}ypx?-5V7qL$%=;={x)ry9pDIPY=q@w01Q0-;QX>Y`zzX-RZ!G+z6 z`fl&ml$+#hU!Kn%^XP?|&l@vjJy$!sMfg})icx7c4&h9QYtz(3CGYyMaZ1fb>kz%H zz`8GAM1+a5KlB57_?{(FMiUE<5Zgvvm3M+;NP}_KB;9!V*wG#m@S zp_yN4G(Q$P?<<+lZeJchyGmD&yAMl%NZH^0IWfHxZd}kkSWBoAke!O=ac5O3Pm6o= zM6crsMf62gK$k}0?CeX$tl99<(b3tpHA5{oyMwG0_PO#AG&Uk^xr;tQu03n<$07H< zG!LkIw90tORV!0ju`ViOXX%o^8n3kxpYAXcg-IfC$wkCRvfKu;U#nixy0+c5%6*8t zj&5UPgN;Ypnd04w_z)S{Q9PIa*BU=CLLZ?j8psum<7tAiHf%fFK~eX&a0Da0zx_95 zn)yH>HI8S(uSZ`QO?%I7HeQ_H_%k5-DX2*5uS;9+wF;}|Rqi#H^PY~fwWDhV<7I}; zt@`rTDGhdS^*mED-$sZk?r*mFk7{CKh5QkmCC10cziD<`Vl+_MnaRDbkLne5?CH?R zV9r)^V&C$|4NBYs-){tjwZ6qQc0`7mZCV zc4szfk8Bi$=0YOAJ$e{6!}_)KPvc!lCjQov7E9w?TZvbuRsyW$Me@w<1vzq&{p|q> zeNn1PErGOcE|((?KH@rVEKwsD9kZ9@bAO_l-dEVw7>;?D7hI?JlOm_J-*wg7(g`3T zT&=0s-}xZ5D6&~-KJZXeOLJ#DajGWY$FoEQTCJUGBD`AzJ#3OHl({53E$Js7>D+U~F zAhMO4!K3CAubG_dop`1G3@js8^@;d?;&HzT_cj%Yuu0Kqg!j@f54R!EkKNX=|)GGF^(l)*G)+^pLgwXooTW z2G4w-Y8zjfH?MCpvF7Tb6l9C$yu_f&rn;rLLeV#O3H%@UMh-~xy9^i4%Gu+()uHL% zvs5Aw_(L}8#sk0Y-6wnDDHNCQA^hUlts+U5I@<|H)ji=-Zc(#|+a3$2a-%4JUvvz= zE3)eaWV%4}sWsJ+A3NbA_zv8k^TzzY(34et3d##R2saiSa+nS94I&Da?9EufPl%CH zb)InlXN59^HzPf?&C2ujPqAEGUAgcqn)B|^MaIN<$yN_p4zr)=r`tK%Hw_QR+|zft zh~a2%4!H7VDE`i1?)BwfeMIBHfUgOfJeo_I1Kr1{s7Fjp-Kyc~& zf{soqc^&`CVBgvH^?pl*_2)<9wy{>7$u=$Ly^@$&4ngyv$#Ar!B22=}nTBtv3|8 z*)l|8NVuH{O`OAY16P+;kxls#raLJew%fzrnQR_|4Vve>!T837dUe48H8m^c0W}lM z8-tEcJi@#KX20&;r5l-WUN_p*(2q(=vKA-;|*z_ z@a2Qlt0%iZ6UVaE7zCVGo+HopTZm^XC5;ttYlxf}9q1a?lRG;* z3keJHmw6vDFWZn=H)xEVpW=O~?_p_p^(27Js{Lhs+$DK>vU{?qlNGbN4gehry~Sh; zm1*x1;%cLNt2c2Rjn}HV2DWDmR9pla@A3*d5D+95a954S&y*zX)jn_xkD;f}?$n&o z%1g5*cVA~3jLi#)vUF$UWHDZdjMn$dcper~z|TNnp&9?W;7g#TzZ(RRw!YEP)3fLulHNIFddFMT%E~JCu&0vX?%mXpHGan<45c&w#qn}0 zcrFIXa$giCsASUGTEXrI1)|HI~T2RI9{-#WOGoRq~^u$6HQgE!EcPJ zo}Bl~au{du4ot`XBAT?nv!7S)8ZF$7)G)e#Vs}M<@9>pY1p2yAN^7}?utk;mRwx7rEP6cgg0l*Q&!WzUj%1DN3)z2$;ipKxADI0MokeD2_QNnkMf2r2rswX zy(Y^1CB5X$7e+oo?Zfj43&SZ2bq~T#dV)dDwO43tYkGNcwalxQTI8a~Wn-WB*l}3O zI2>A=mS!n#=S>~s_Qu~uPisuKL>_MPq~$1=Vm9N8fBG!K=pQkWD=&NPc?<*v)L7oJ z`o&5aYiMr#j_5S;>%M(NwJa25(R=Bx>@4AliDVw09`y9|v!$#{zcc06+%-^?a*K7e zgZdqRnbQpxzigf0NKEGb%g^22Os(~2nD^$9#lI|8e$|uP){EpIp^Nsrb*Z!{Q`=*~ z_oYvcd8AgFO5&~xLHBy%TS41URV_66gkr-yImX*?V+Pr3{4MGz0d;#K@xacqR~xyf zqCiZ5nao#dnXpc-3@m!N63Qkk1w9!3SAM;I^D40;w zH#Ikxwz6W{y-S;*oMjV-_sNTBmufAUFybJ5sHJK@sVKAKk zVle;3c6k#g2Zx=bJY*D`g-xVZxR{LHC#-kQEgJnV`Tz@^vJWb zD}|X~RoZIe?`(?@PaF+-9nn0#CsF@eYFZq zMhbOZTwD-;FHX01f8Nvo#1O}V`lcs_HsR&vcbAry4h0EN-;xS@y}hT4(V-5rZ`*4r z&Q!D9;_mVBai(Ec471^{FJg#9VfPq?B!M|3QoJpkoZopfF((m9@a@~TtE#GIS5`VE zs~zN*p#(|G$z8k8$QWXp;zx`D%C?>!c%yA+u?x*coA5pd$47xTtFs#$@WqLNiIJraI#n~<;-I3Hpm7q(ZgUS)oV zr)}=)3Rze%8ZOfBvn;BUw6IuZ_N+Y^w_I3SvR~>ZHZU;wGgadpw0pR^tjD5L_1MLQ zZ+E$m4oKQaYN_8@ij={@!7`s185kaLaedmJZ;OhJZO>Lt*DPP%GM+%kCThGv>Cre` zpe;Lix;LP>y|ZJ`{2r&JwbkI&tG6{Zf+^k?{L<3W9v8>UwR^v1otbK^#yHZ_()e8d z-VeYfH~8`Hy47fL>fi`n%SQViKCEY&N9UURi$Qus zvd50}yLa#8mf^~tP-0G(+oijG6l63=b9Ia=`#q2cmZtuyywpU^J$R>P$Tgs6m+6sOa=CW1x3Ue3aT zK_IDDZMe5L9M%glIXNlgVaUeI+hF{OpN=jdKcC5BDECd<#ny1&e)Kb3GCn1w;uYK4 zZONdM-(HCXGz#(@3*L&Kc(4>k!`p!2kA z0EMvIOGCq}k4sH@ip$H5A(i}F;>Q}iz2hb**j^&G>JBLYHy9ZkPknr;QI_)SmlA4o zY);j%lZ1I3PC0{anZRQ$^9c(ZTcT*B)NW3k;OQ%vt25ZKnY-|e%fB;ZVX^Jcj$ZRv zk4wOGzD0gL|I?oipM3tDFgR^?anV1GzB`UHOX8cS;ftrrFkI86?l_$)J2ZLP^bSCe}RRE~z;!>&Dc!hk*)5csQ<^(TEIcdw1`lUtL)tuBwUl>WilBXWW{J*@lIb z+48Vr8Ywi6a!R1p0D|vRN>nN50r&c^p&ZpkPiYiQh*z~+QW6_yj$!qBxxoO|p1uKV z*`Vr{d*t`;x$^b2Kq>~_m@Ky(6Y75&bL*~nU@mfD@O@8%`uUPyw37qKzJa+^1F|rN zRrNO0g8z+C#CwCZh5`&((SIUN*qsMec3mF-6KCR+V*YowV8bgzVkaXbJA!n#rO84~ zeKlG}9ob*!ei-az`wa>sbefC>!l?ZN06`T#Q(VlZ=e9!I)YL>I>UAdEwYcf4{Obh}SBsqeQ0RwCqJ`9idXYT6zo{y5sgpszo^1uf zhvC+A-D08lLi=q2r}aPpTZM&%*kpXS()%$QKhnznLn2~QwfJWK&WiuD@0RR+;VL97 z{MyMW)BSK0;%LAXmXwPGha?QW{Cm|Y#2#{aIRHdi*li079Z?7g35i>`Z@v0*`Fw48BzsPw?2 zs=FcUpwKBK3w8VqxhJilu+)qv+OkeDp>le9TKalk66ShkvYJyhOMzK6CB^IHk)EC& z)RVWPqnbdJYgSkhLoY`ragxfy(W2^P2hy&OYFS~d$S%;Cf03AGb zdw9#t`rp0BAw^XfKvhNcCk%HU%CSXr5@7=zv4cgO?e)C_MS1zNzSmqy8%6WHW_DDW;~Tj*gAZ0cwDZNzcUeRrWKBPQ3>)APtzEHe1@}vR z5-^?4O(jv|6w#k+jAh~_bXu|O=}Edh|Bb#kkx%^eAY!+l&RfxUw0h0?yYQGlxi;_Z z?GwvT7bmU)t%{eYF*8ShnpbM~Q=AcOBw>CL9x-oIuktzU&?_EpHDej-qc`>pMfWBN zqzzf*T^LYu04OFCbPDyofoG3wxrs|I&;rH-Vh$q=(TgMM;50_@G@qI&8R%(^04|oQmy@r)gkSmj`Q0KT>;5VoCAWKF<8=O6${ZFh4r=k2ft6n? zj@=2o5m5F~!d6eu&w+sfwc+OGbTSQw7SWI&FBg1swo3RcZhB9D5YioCx{v5<@QO+P zLm=njQM-~Dl}@cIo{YGktqvR&x6o7rD*|TrKFcOPAjK#;#mMAHv7=%t1n|wRsm)T) z`r037(h0lK7an0y~lp!WxK`0 zhxSud>z%J}Noi?~wYPD><@w>vZp$6TUnPc8ZhL=zlo+;cx-c6PhXw@)BMU00#nbz5 z5fMF$dMG~%LYDb72bEv8llnJf4}hs-wXU2sP8(?&MS4O9qlTJVT32S5mflP5I#K<%-AmeqKM(6UBSUaj>^%1eMD#AYevixU)0(>sOl9 z;Q}lmj@*t}p9gy1a(3o@sNmv1LjADRsv`}5nUG1RMX@1Yyl5oq%?3#fAz`LNxI%d5 zvIQr%Qw5|+q3-T(2tDBH@$v6SE6QfM=2c|wR8;VM{rYwG&#cl4ViBNhI-?IA~9CPQ$We1)T+|P+g5gKdD(g7qEl;Tax#&3#v>}| z4&4s4HK@r#Vb+O*TGw4v!g8xi?(UWw*osJ4Tv+%J7bgwSL%!jvy}kW2S=k!Pbr9hi z)ZCDsb4}M_jDHUfT1Q6i$;!%NVqt9^{fPVc@m+d4b$B>{$OSg<3y*iDPW>k8gCiC|B{y}vqdP5*HeAmK7YOnTZ~Ve@4Fu6k-*;GOh5Z*fRN z-xxLrnXnsyt?d^6@)i#fIJtOucm}hTeUk*8RUk|z4(I?5e8g1beo^bf?y%eoJ2aTz zVF^tzqUP zh2&wRy!G<|$58p=_+CGN8e(K(f=@!y37Br>cLo+9Ce&WNckf1HBEJLF+n*4J^`58k z7ZQwqRlHD3MUroKxT}h?o$oU+bK~4_cVFK?@lD3cgTL*|H@3C{3c_&oy-&%XK6Tr3 z6Ap+VyB=)&o$PYe(m3A!Veqo-2s|4xr%7yP+~e)p7C?^Gc5_#hgx-0cbM815;@LFn zJ8X9;iE?sAK|>V>6es|7%^D}>j*boh)U)gBasWJEzkW>=)>?zxI;nGT@&-!yhv;a) zp=6?7(8wkR*O`O#`jkNkDQq>$2KDDTax}%ez{HOF#*Ki9i>9)Q3KPJVwBi2m-(Pw8 z>Xn$IqhpW*Y*r58zP>(Q;jMuzJkOK8N6JpH(LzaiH)BMEg@j}#uhIC?ClK~rT^TRO zQkL~Xd~q(y(yX_q^^#9O8Q>mFyM$Hi_cA)vSd_>6UncdD-j0f6-ReXQ5SgI&W zb-b$Xv_AP%S-D^I1ifp`mmGG0WEjcR0q3U4llRzjz(ue`w!DA;-W~{y?~W_tV9_YI z7(!0iHq^~O?ucbKL^Z&GJD9Y}vgP)1(64fu_8J}iode`^c6N3&7eEOCaXt8RI1V=U zSM|K-XMo(Gip_0qh6Ch5#Xlfqc0@%*1#PFzWK|@d=-CJ9sE2d&^G^VffK?}7ua1P2 zG-0Q<4rVYz4dPAxJ@&f(DyI9vX8MF`T^<_^mBdqP&6;4I0^dy+5%x#KQc^d#4mDR* zg@`JwrkuLaB~f5-Btlf8zgpEUr*jnt{r3Q;owEb;n^V~|jprA+5B~+3f!hB-UHHfU zLlJjriaoR7mpOU}7g`_goZw|kDdN8@ghPtHOdxm1& za#Y<_^sZi;dw<%~+MP~Dm>g8qYmK1PCw@IO0G^3w^70vP)`k~zFFP5F{;p*G6kOwn zuB%X25L%ZfNdj*eIOQN?v*{)Y=mgfaFU|0Lh>3S=Xud5TC>8u4U|szQuI5~eAk@QB z(?00%RIH_W8=L&GAT%F2BXNG#=qe=egh78h?XfG5f~6=d5~PetC9#;D7bS)Upl?*Y zL+uV79bNtL5~)_1nHbOs#M~AHP_{JmJ)>{lc^KPCjE%0Nqr+#vfbl;;=y&I>Ue<=Q zCc_Bf_jPr`(489qwN|^^D+uWZYT5J5laWf2`d&zZbIk!j;yfBC0g@MTVFZvB&?NI( zizOx}D*)^EcW5H>M~A4FPz*_*Q%W^IVcj2ERQ zOxhKp+1d2C6hiF)n>34GiUnCuwf(;V%J&81tjx?E*ckX^Il)u^tpm90HJGrWg4|Q)~v|8ghO%c$62vJZ_(9qBnyKEakV!zTDr6?lp=JtIB zOHx4rcWtD|wEY8>`u4#;>}B8$rRXUgez!d{M41*dcyMVSK70>sPx_F>Se-jBqQAdC zbAc1S7-~H*Eup2QoWAHd20iiInFrACVBq4m_HG{Bndwp$<>0`FDh161_)!+~it4Yt zJl&jhk7k?2FUJ_+9Vxf0y7%YA3$!y?gft9Ks}@K%0dCVE9l#fW-Gl zV`nrYiXB6IX4N<8{PYN-0^l@s@YIZqU4!paQf5FyQ#=PGyR*9+C*;Zjs-vd1cEY$; zjZ;BR!Qa1j_6`njkqH7);bhWwc5JXKkS#%X04Dr5N*k;X2nbj?ZjYpX@y+Na2*S{b z11lnPuJo9c)2)qA8G8NN31CW6l^7n1` z#x0AK8@xPWDW5@5!$mYe#~tr3&!{;4`IU-IF7OHR7)7+qQ}9F~fcg0O-yn#f??yx6 z>-kn_d5T?kO@Oj!8PWIlY;*aiLv2aV8Xws{I6TaPoZB7Cp58*X43BBjo7e$up$}4d z8JZHoiuu*m&i-^MG{8j0h2BsyZakEWZ6vj=MSE;!Mh{C=|BwuB`YeO~*8XAd4c_%m8U4UJJousn**5f>t1 zNOWPgn#$$Pbj!D>Zp*kg3Ju;aU7~XaX>&qC3u&VL{3FTN{^;6LDIPmE%Nl{eDL`RCl4X$7&*M6!#08K2YdF zKKL;+lLEl+rLplFNQe=|IF=gynQwlP_t8D1od?0UwL70A9UtyOf#c@;c5e@Ra!N;5 z*Hn5>W{ji$JA}`)=b`Rn%PW+q<=CkYKjiUq6;h@ zTnqy@tD>T^=}d$g+%2TY$J_slSt`!r0cx2MdPJujqAdF6ZXh$hFDStIE+FvT&v9vn zHT1`iX$l`j(bIQ1lya=fqC1zF_|A`#p=8&X>ieb;w=X-GpcPx6;)u+^dP5&kpOvd(nd4=|B*5hCUmhnWiLx56^#`T}3M<8<=#MTp(9xk#-X65zhD5lxHIo8L1X00rZQ`EK(vp(s z0G&~kVgH$@D?@ZJWN6@fdN2=5j5q5LZ>ZtQNFK?pgl?!JU6tpRRmL$2iv}Gt>s9jjV^gn15dx2)6dQnm+#&U z_CJBfGXLFjb97>at&WEX8=HbBky*R4#ByZIag!hvWQvUm;c%dMczA||hAVIob?(AX zxAYX_Rtt42lY6u)Zl5@cN`_;w_D6st#BD(i8uPKUH317(xA@-0rKOJ_cckw@6Ns;fxra=-Pem13!rCCda4Ao_ zG{_z!c^=V5X^GXiDeQi{vaH`ZHmD{I7I z=7oOsJb0Uv;^K%E9XGE%c5+h4D0kn`;vtTUD|64c4*E*kI6h7S8a`tID;34HXg7xp zxE6<$2h|-U3cSJeSzou33?+ICTeQBuK3~6KTJ56o?Nu(@X)>U{~LQU0^cFc<0!9fH1z&q6?f+ zSJ)P(4sTkGp#x=vjYBC7ZZ{<%O2^)12iNVz?ZI5t6iSW!TI+K`piCa_tz-p-)nPPV zT)kmF!4lh)_8^&pFV?R`0(G;$%IO_lUFk1EhSw*&zgWzWQC(00{XB6%4lQwfW}q6n z`zZ;Z0N-CzIc#*_)ZgQGkz(pOL6zXa29fJ7<8xpXup8Hk8gL2vwza-HJ^~#GTGlTk zYd3Ll78gJ3KNJ>Dx~J#z))g#w#D-(vi~$M1{yQs%B29omhVICB$*nr4*EFRs!}aBTQw6eA z{gmm-0&hA9l(Q;>>$)lHD#)tg$wXIuuW;Ww;edlJlexng;C@yJCT}|**39&QQL|1_ zB&qrGY45D>3MI$(KF0VPk9PxEeQcL&tc>T&7Tpe)$h|mGVjd3y)4rsfso3X;Kq*r?TSS~Co@~O>H4X8o!|)G zI-9|4s=jkewYU>XAtthD8TnVQsDM~!-=BJPm~Uue(wbE&b7`!Dq5S)vgDeZnOLOy% zQtALWXQjI0Dev({2*&Lpa>z(wITM7tF~M#x!B>~O`c{iMk0L}$Hsf5>ZDYKgfPml^ za54jUGJpX=b#w$Y1&(orta(5;ptD7O`sBAPzgunN;d#7coGBM)kjra3E%fc%H@Rh9 z9UZwoZW0{$9(Y_m&#M45Vv`dR5&RENbfgCytq&+3tt_ki361%R8X7Q^vjT6YeY?oPZi}*(-Tc9FpZ+XVjyu0M9t{j~ zP*L2CzEHOxFEg(_-K>E;2b9YbkQGO(9q39*NuHraezVJ*qqt>OL|f z1YR*eP_K!V(Hk;ZGHvh7nS**v3Z12;W%B7rX`-n2TgIC=7j2|4l-=M^l!nH=lf#YX z$v#n9YR)MBl&N#C&>eec=lSxRMaABIEFy^_VQ@@{lg3ISh;>U`XdU=PT)@?k)?Snb z-}{M&he!9|!8;%d37*aY!~x#tSFNi9Fw4M9UY~{H_7W6>OegT0$MHKnyvL%02$pJ` zM z4!Du5`k<~Fuo1bqo?Sz-=;r?2$D#_>ZOGXfT;Wt7kC05C(@&S&DN?2m;&+dsmWog} z_ZC;nVu%yswjSp)>5dhHLxq%HM^py~2Po=ecD4~10I+;C0(0qsxiR)?5Cu$zHp4i^DZ4F@! zGuIG-Tqb0M-RU;Wk2>QlbPQ+(uo$y_2SO2Ep@cd_{S&z^)vGBLg+Y-2&E z%?GqkhY^Hn-)Ly*u7Y(@1CD-VebR$&L+j*Dn!taFYsT9sApyiS4QVzg+cd0od-$HG z2L&GwCys7771k&)F_$j6+aEAsJNB54n>%{4R>;ELHJUFOnBuS-^#nux%PFvHu1{8Fv)7(<@_`vl-Z;~XZAz`sH046#VrI}?fxRZO zC<1S;`TgIv%{r^G?_p39)-4CWyit;s6ct>Jd2{OTGAgWuI?fdRBohwk`Q1{_s#TRY zGIm3?E&qQ<6!3JAo}ikKS6I6@G*|ru(xHFF@lX)^pU-T6$SrGehx7}I8LqarHn4Ok z^__X5__HMRf-WFNcagU#ik|y{V+Wd(%0zdNkHG7YF`c1;8UdJ&R2~H#elzYO5^$vN z6Fwwc?n_yQBp`G+=>X=3m}+Ki?Fq~+jIpZMhJ?&oYRK3$dKBXToUmH9^}hq}Om9Nr z2f28zAV9n9(3OEyvi(noN#N7o{!HZT?-OWE!okP_av&At8fcGINuh1cfYu#>5(Pk1 zLICdobg>Y45%_>Ls&jV+N0O3I)8>CsE5PZr4eC99jNs?z2TpR*(F&OTqvK;Z$zv%1 zr?Gy53B%6W8DO)3T#~@u^nSBdcWC0kTr&?4ZK;RWc|pMafC*aeCZJydve|D=RtMKd z|J(lDeh$17kQ1=c*^Syi2*$**8={MeiJ_<)m>-qO|3ygb?hb{^fk}`A*9K&5;Kbkn zuSqT(KPKX_(hO4Gf)*H`f+Ae6h?hJ8m|-BHpcw-^&<2l+(%TWJaGR*KT?Qp|eWEe~ zy3P1i;xI`#pDd-RNdySf`0wlwP?@4nzW);?EuxB`2GBOs)ySQv7W1-O_ z23ege{}dBGv&fpvb`hrL%x|`w4Wfb4*9fkom+gAhdDQLkFT3_S zQ#`KkbM0*cP8>q`#7(=x>J@N_v2k&!O7yY3wiNmv+t(35x#O_b{=G6hJX~fwlMI~v zpFTl{C2S}Ls73Wz8OUP?k-51Ha`N()NoyM$VPJLuVulJJ zE+_$7csH(JzYfUei%QO38&DAzz%ZQ`1vvcoq*o+HD&wIAqoZ9w+gD3RqiO*%&1im3L5tlbomfMTJ7i_&)-r^YQa%DG-h+ zhh-VGzO1ygcb%OwUSNuOfbla+gX}&vwJ%VgX-f1MAkTmy49s&#B(e$RQsOkljfshYI&TLom%uV3 z0Ve2;acr-y;0JwGI0liIor6O>L!}?c+17CKE)a0gVtK4d>fH8`sR0yCK=rgydh2-O zfx3~K!-$Xs6Z|b+);IlJJdUAp=5z~Rsg5%RM+yAUwVrGvE zg5Ua3}26vYpyqJNOgU`Sa>MJX;<~TMo_Byo+NS-$R485kVZnwt~Tx z6&I(Sp9(8FmMogGg6;=orI$PrHp0Hj)h@I5ekJ|7IY-9lGWwDov9P$jI~*Lnw{pqG zFcR*#LD=#sXQ0|+F<5LqTUklzam!cJ5>)|*qxSyiL36+6s6$CODMrHa`nOYioogVp2%)|$O zl%OC0!g{Jl#n~sbeojRLu^I7NwMVKPLUQ+YZj=i*=&Rw!Jgj1hK19#{d85h@V>y2Bo+0Xv! zVzc!277$L<;Rm7i&)>%(iAUIxcT#dHnH;ohKU<3_&YHZ;Q-~RF6nKiyQC)o3CVYF_$gudmc?afz@&l*zx{`o~kG{tph zGd;<_x60{r>9La|hHs1KjMp0Om1us+dtI?F{AB({vfIb3rsP*WrgDCM$51pTD~B8`v_+O{F2y!=hx!zl!Rbu|Fma;?)!0q?m7T^jkw za{t}Pt~GDLewD8(kD8ynACmcw2H+bk!D*|Rx**BJx^@07M$DEG#zBqw(T2)Bo)9 z-(W7mYi;F7P7><4zi}7baDRVMiKh^S=&(p-4ZPksdBcG7X>^K-m-n8#ptf(NcFMPJ z93~={4}fbjUM-EvG4nrFPGPO|eEK}*y)reWaib}D3 zR#krSs@Tca>7<(&@y>ljm;OFq6)#kYM1J?-U$401h%6q!Mm}3KGB!W5Xd8jGRx6k; zi*ejMyUxJCuzk4IL@GOD(0s|GqNL;l{L*}DsL4-lS)5_4oSq^4Edox~N^C{yeh1uWz|hHLDt* zvTu^VG*-~mDX&F!zP+CkP8copr~2ZI+w^es;cT!>|5i~Q@LA=>tF(WULot!`DN)>R zYZ^T)FK6?##T`@?O$D5~=eD-@%!?mY8x947= z2hIPDOwT`c5hfKmCkm+1j47anH1gpMRBWd`zC zF7~t`q#4drZ*1xuTLZ_QtE*w8*U`gr__?~A2S7p7EHk?eW>-EwJ~qQvY(f^DQL@iA zQ3qQy5e*FuVx~W^AUt}~tEyuAc+Mj9#DrG}iCz{vVPWP)U4x#h{=}Y>Y}O{h5kD2mmzK6j>^9`q|X=WE%wi)Yo4{LB$HiAghaSEIGqcy_QuJ!aJ~}a zF>nc~7$UN*tM;p$))Ck964~C?cyXAb7|Xp(>vg)pm6tZn;Uc6}5EIARjhdW^3M&9g zO|$G}4{yHV74f*mg1WE3jQ3t-~ z6m&)p<>URJ%ZC3uVSTFRo)5r0yY*3au!W)kJYcLJ-<9gD&q4lt?d)v2@T{3hgBEt_ zpkm(8&eo;JyC|8T*=>?UW!CPetLhRo`;H4QG}RgeSQ#0)jh?;X%TYssovO@C(DnG( z~p<`~NqtrJYKHh!#pl$jGd;kdc{@Eqf=MN>)N~5JD0{ zNV2jw3E5<2@14DV_t!b+`hLE@>-zq2UFYW9ZgmcC@Avcd9FNC+J-Hn6Qh1MXOOF4Q zm?4pR<4mMlw;*^Xm!$LW8%EyXz~VA)`yOK5P5;QD&-%FYtIX`IEw5taTP}!+C(xu1 zjP`2&d=nz2jwj!|TfM^FBB!%es`QL&&m6nn5^zir% zwIas#5G7?LdWrifnmbUD((&?!;5$fG7N;aLOgeY%-mL+-F}g0CW!IFHPHZFHrw-nV zw*lhm$N|7(crM_ zd_RJt*LEO4fduUQ0NyRp=%Qzt0e7EbIV6#XT!3$n;#4b~&t-A?%q!Jf6xPv`1*3JF*J_%u1f)nD(M%(S#~vz?-v80fW; z-K2&YiMvPJwml)LC&~rA#4mm2lBfJDr>8VC_q&FO`P=7+i;G`*JWc`K3}z8KHV&M; z^8;W%3zvOqe?x3x4p!Y ztKL2|`F&w>_vSZtADG;6wQ*J_CzWyZfP%p{nb=w>DJg5eE?2K0!m+l;Rbb=6niBtk zC(C<}&$PL1&P)m^%-n5lAk|Mz#Hi7I)FsRF=(;Q498qk~s*-c#N0%f2?DQ!nX1=eQ z&lh79X%y~vXcaex~{~u97#`iPEt0|)|O?+ zd+}lq93q)c>%0(Z2+x-D6~2Fe2JPLb!$Mi({QSIef7lTWq|$fR{4(?2e%8C;mk(VO ztCIKBSPm7V5H#55>rHcem|QF6^XK0v{>x4poh2hHYOf-HlCXRC`0AwnBVL=u39@~& zkNbqu5sX6Bnwb?;;u0meLcbAv%@ zg|`KN{t+$^3SnRK1rBa*hKm>XlKGCt&H$Kl43>`T2S$)Kiru{DQNxK>ek-Ico$mqR zJsSS`6snLzL3U+ioeti7O|C*MMSl-jtvhX^@R`?_iVOT1O$U2=YPw9Vzi2iIwWUtk zL#I?IOlCV*xSC+Q634Lru&}zi0=@X#3Wzy*maCHW(&Wyc{Oblkc^N8{$tv?yaW>of z8)#jZCjRIjpuHk$YfE`x&(1O*%4)CL>XO>pOJTZ|l^00#F1L-hE{o?{!8H)58~o5HMxi?-aezqzi+9++ z8g-r}3=(k9c)WN~R9j01VEMYRup;(Om}#P&H#cCRfI{e5LhoZ`d@QQ$S@zO=ExR~#1Fba4XMbr<)J60d_z z!QoFGz?b`G8*8@fW`|s_7ov@vo}0_odO);1#!G+vtrAael?rp%9Eu`SN_14FqIw^g z-)1n;EmHl8TzI4{icg@$QSbA@i7ytV?D9$Xn}2CE9^&e`P(;t)WH7NfUKf^}VQQSV z5UT8-t%;nYU~E)?BW9{nl5@pWE#yi!-WgGu~$J^RE&8uZ)|I0GYxYG2aW`6g2XApXFXZc+Pah^ z)B;fpe9#}Df=Bht1|JWeGs#l9&_*FNrDizK07qpcUi`P=CGms6P3ri9c3)7ur+~TN zt8yAs*-jJ)5YsOYNBK^23ZnQa%zN|T&*afYb=!x5q=tqUwG(qRpAap6hc9D7d_`@( z+bqjtmCio{J~4|n-JSp+M(BwRlNjP^^3;ug|6E9-^vLlogen>R14PG(ub#Zqb~*q4 zxsYUEwptSLvX|>J?8(v|6ThJR)_&*AreDYYZs*LpDY=Zy4BZQ?yH6f8_uw(1D(@FL zlz5Uf!nn2daqpWB(%vN_t%P*vZZb~5m;0e@=DMSd;U`!RQhl+%f8{ls&zHq|bAd_& zb9jj^03|b%T3*f-miF<#MCtII30C8&wSrpEn0oVWLY8}uhlk<`U^?i@JsFVYpP#J=q24LOv;t&BA;A_!~e(`@ShZMNaO5Wg!~v2ly4c>mMDs7&5c6dPYYv^Z(k&1P}-VX={5s z0iz&S%&?RkKLVf(GFgI+MEn!iN-81zLJ1r)2Dliv3OyrgMeu#-{bMjG5ZU|`+s(dKQpAG?<56<2gVNaM;%a`kVUmH zc7M^?3m_PFw_qSje?d3|$Zw7&v5vLG18`9pK=QIkLyTqw@h( z*xAcFovjqyR8P1mq#ysnsCD_|7oKq|4;R7JI6qlRCZ7|X(%BsA!HxJsA=bVu5=5g_jp_dP02&Msu{veIMmB z2=GXt+3f|c_aP?c3*Ih@a-@-7rS~T`29PrQuReNonSf}acWwRki(R8=yJH)q(#31b zbFVA40k@OW&?K1}VsPNfc?OHv=>XAScAY)aaepE9=9V)JN(hkuWKTeqLb!$UwrhqT zE+E0xaSkj8oPy^AzTe6qW=;oR@Le~5|M)^7>9`{@GUP6$GWYIXGa64`+gLq%?(puK z8b;p7kII{y2WuF({edL{0|*Q}Iod(CbEj)zZ>F58s$g84flJ0}6>I+b%sfeS{g&g$ z8G!e~sXJKWsRmO5spr|=8|UVnY<9#NO1w4WE7X`0zVlW3jKmH0^$JT;&q%lJyR{^R z3dgruvc<7?)RtER9szyEe){xTse}e#e^Y4N&+$8)ffnFVLP=wNh|ZO35V(P^C#<=_ zeAX;5KMkS(BEj}LG6rWOrkXGW*HAR0cSHfY;gfQP4-^_5GyIslJ3Dd6FAZf+nGcRDYO|kRnV+cgD^0FTiMpMt z(%sm&T}UXxt}5w4wvSSnPim@6>enWUp_&KqczaBCZiBCn^L{q>MON0G1#MZpZ6x=xaTfu@tU=;;$1{1qd-jyvBz^BQgggXwf;CZ^GIot))czA6>()91lhI_BB` z5#fF!|9;@P{d}lxIh7Bor|`u(O*zfdd>Yka!EONx1xk~T)zvsrZpz6WWn=3e^&NS{ z`*?Eggy)Ux$jeZsOA2i4FImOq(clWMcKNrtTb>|c2JsCN$qFw7Lyx^QF<`r>V}zR<*s zQv?JA5dOfLFg_V+X^SatFfKh?X8r?-dMa(uCv@9}n&x*&K%P()c)N3XtGJYk%ClSk zE~3#l=sA8knJX%uSf4)pabsOdQBnU@x@mLs;i;D|?|%7m8QxV*?MAM_t8()4et|J% zt*z*?6Zj&2KGXg+I#qk7;XPlY5zW9Ci$K8zUh|~Ev{Le?8VRv@%ciCNvaCMNza^Y?jkHsgywEOr(3xKK8d;HmD82!V*a9 z$4{T?CF#do>pIoR&Pc7NulAN!+1O-ifYwt~%qskq7Yuy}8yjV!yqLZ|Wn0@7(1SiS z0$ca|^IvPLVvRI6T@CfWaR#(pAowo3D#ST|hB3)ZmN~gn z$QIp2%c5*cESN1KKA`Ih>YOnJmMp@;58v+Nus(2nAY_vZ7jF4bR|54KWA+z~CgLl0 z>^;_~OhZkrVwffTuGx(b$X3&4XG24(ydvT#T-Z>vtsM>9=u1>Ln|jBqQ&^bWmNlka z^HxA?n%0yqROaSQIs+@x$B)yQ16x~SzkWReQMze<*tKYjlHy|T`g(S_9(b%qneZ-( ze|;OUS4jNC1cw}gvyW(Lkux%WudL0#B`v+@%9X4?qfO+&p9bu&Sn;0JtyO)8)7r+4 ztM<)?eRPvSmfd`9>0xl3DPPBbj*3`!C#=sj^Op>U*U3_J+Df#!6qS^0#}0taEq4H( z|JF9olGP*u53xd`WU~$oQ4(-#Z;P8Oxup;^+LYwyC!=(3MnX&m8-dQxE|ZTmc~YvX z*L-Q7rpdEm`t`M@^kM&_IyaO4`4#B$25mBUMg3sKsiJqo!j5pDKIsj!(k|Uv4(;F z>PGysMmvQbfd=xMy?BvOZk%q~ohK2j!m=}-;Vc(7riZ8~qlK-#3ro+=rsP^?rhcnm zoZQ^S^+JeSA9%ufXLgqDa349LF(SUr}7DSB%itfsmzhu7fnAnnAM3 z$j`#}rCR!TY;CWgHa&Z`IB~Scp*mP0FI3WGm0Dil#Ld^98uIM=UP$@6KGo%j+BZ4v z#9Ps5VCTW6xYH~^R9%Oo;0RJ1A24&{P>ou|e9Xh4@%*1me$ zX>G>CNhoNiNT^uOjD?Tw|Iz|ThVho-Y`NmJW@G4XA=#YtKn#iMQ#o@IhVJ0Oe#Ya| z0E%^Ceb3FI^-GqT`pDJ!l`b~>#hHp?m(SQpj0mpob!e!&^vKV6VO|4z@|c)-80&A+ za}+@~#>y&r_wK&bM`797RB>_o*mmq?@Zwr!JqD{Lu zka+kyBBESD%~)%3@}7ztuZL0uZEoTAG^I5s(h=2$cLQNlASJ1EuhqnAe&^ zt2l>~F%_T+cxPa1rt|CZ@ZaQ;_Y}gbR4xr5BEqWyeU#C#l$$&kLf% zt?{Pv4o%B*-gH`9U%z+$h<7|I&cuA%v1+=PC+4>M@}DRgz87^q`TWpWST|bDA7fq{ zb)SqY2POy*B2{%xH7k>+r&rpV@}{u4+2``YNaLiZMg|6&Ka>4s8KbpsTce%fz8^Y& z;S#g@><15d@5s}0Wt)jjzmh(EQeRzQZOdD)lJ_cn6{17Zf&K!(wJtQNVCBswJFY-` z^teTYTb7lL(_v}a-bV*PHGc&Kq0!8@ggSL&V==#P*k(0$6(xYG<9riu`Qk+TZ4r^( zkY&N-=%fxp(b}jRbp*V;oQ%z|g`sdhA*X=N#Hle?`Be9KYngCY7dXTs1-{3J8&h{? zTRXW*#_lxb(?hx2u5Zzs*f2tb+$h3T1tjHGq!h$6yY}zjaS9%qz(TCv_(uJZ%CD$$hOO3$9loHEe!9yq9ly^<~0!#o< z{`dgg*lN~SwjV0wXVP&c)zvV3ILPGRz(hO(=VzmH;Qs-7kP!74R4CAYJ_FXFqoX6f zE{!ATtB8R8qoJ`0Wf76gyV7fP={HP2h#k*wJ^Pga;>#uw6*27TlC1$wVyKn#$goPll<;<)!wQGf!XzI^f1sS4b32~)7kZj2fI zo9vhpm`Ql$4j(#n4Vest3I{1vP&~mT<_+CAq{ri}DN)U~M~@yQxM3KTW-HG6l3aq= z8uK0h`z@l@Q4D^8X2MRW7@u?mP)e+1#2}mzcqS1!IsAmLlW>7#n9|}067x#_`WuCM z_VWuq5nxyxAq~H4gh}u+4}kyyDm~@T>2yB}BLgc_58=%_b?TknYCD7>__5)KB#&+Fwh_WMBDARL4U z8v-`FT^&FWnuJ|2Odr{^10`yo7i-?f#S=iSz*5kV{1drFQ=$0nZ_sI1(FCWhMKpAW z5Gl`_9FsyG4Mbr-M@Csbll`8Ws>KSj?epfgnQu}cCM?X{!in+(5{6Gg0t`9L?qviL zoQM=Bf_(!Lg)E{Y$B+Amh9(H@EGR143g!84VPR}}U`P_JK7l(!Gb9@?6htE(C;M?s zG4|L`vdB1459rGErd2Uzh%d4j;Ca@gjk}>-1SQ^Vb~eLE6NHt4v4VZ}ZZ|kW`|&i0 zWUOjVvT1H7PzA`7ZbVB%+xkfeh_5H80{k;+KzSM) zt_n+XfF8jY^viCJ&$mBlKUj7AUqsPZ*q_`q_-+|mRbp_7tq(*tHh-s$te#Fc#52LA z9vvUQ2gND+m9fO2H*au7$sQu@9*Vtts;UwYM#D+pi@A(41eFvIV0;njK8iDf% z?h`aW$b@xxjc6pmSIaA7$!%y`0n$UbFswiUCY@L;xQF5vvreYnyur(tFOl^4XS~fH ztCQV!wm&=1bQ2IdA#8*+PX&hHq}t>EfZCI^|03x9nS3p4!bF+DzhJZ1?cA>GG80~H zaA#fHAE^6KAIh8S54E)mK5mb+b;w?nGIWP@%+aWE+C9|4`+Gd&>|Ao>BfT|xkI=l1 zx`p(Y#LGYD)8ES{>$KRp<{LtD{2Mwa2Akr^8x;bHkc4}&{6d>27$nP@ z?2}Sc$@B8U_8l%y1p3AxvG#p_jC;6CfP@daosxT~>rs%SUpsOtezwNlJywBSkT=gq8=XG!7T`*ou_?(hLf2x3%fk7^JeyR*_0$tQ)N=ijpd3jC! zwk>LEwEO~mT+6?#qdt6io}iGx&B=7}VmaC>yitDs4mQq2=i7f)6;Uz$|EeVEWJ17* ztRKwDhF_7y1k3>K{W?K`+%%LaFeqr-JE>L;BbC+T*=cFf1n7AE`e78a)%8wVeGpI% zp)taz1d|Lq;k8&7EHV~=Vq-0)KcmHlj`<2FG+E4QQ@12{7u0{*1`sVi{wtD%dwV5d zs%KD98SOs3V$yi7etzPlMJm`*ADZ>uX}r0W#$ATg;KNHw#-Y-nMm`CFYKn;TxziqC zx0x;$|3-_KJVpPIl_0~ivg+Z(XJ`MiG*cdtWghjejh6icfR^tlZR-rIcz7A1IEniF z*#lVJ3GoA<6|d79TE-dpUv8HI-A#c#z+HuJG+O3#;$@25Tueb^~nHIufB)G=Qw?Ox9(8PqIQ=!H9bB3_U(@} ze!g>p`#V4)EC(AR4i44(_bVzZDn5XnF6{%+$ivf$HWYTpMWVrTaOA6tl{9_nt)r3~ zVpGd@)#{An?*a{p2thF^DKe1Xm+vnEsDKzf=o8caZ95lCrL)C7VXLzID=?54Pmqg2 z@7~e8q*mtM;kc;Ry#Jt8lgK?SAph8n( z?Z}*^()F?PtZ6Jr6Bw9Nn%S@+?r601 z1svE=-*H|j%ns%0=o~w6fsK>15MEep=!}e$>szj#c@24QQ85`=K}(A}C=OC2_wxb| z_Z2wyEH}4PAfv63$Io8|mD$Z`i$+=wE-s|YxEB?jVdqGlyy64n@{v8Oyb;N|wUc+E zr4JttS$NlQKOmrqtPm$_nvb%gT)wTr_m-SQ=%@c*O34T?gk#BvXlZ@J9?T!#go6Q^ zUtDvfSc%j{Y|I2v;jm=3&aIEL8gSbA08!Kx7Z@4q)sn$G!?0_P0(w0K$9NAe7*k9pH8w(lvY_OH1 zF_>9g92%|@vbS(rpI7*1HRcu_O()4evmMkPe*_$YGNxI?My}Ou-OXWC(ud`h+CN{) z-0buE^&#N(S0g{~yc%oBQ<(7a<5k9h^oon)*`85l(P9b&OVHA?GjXBIzays1JQYGJ z#QG53W$RKGtyIW~+tpW~H4Gl_vi=nSjqSqyT}eqSBpHq*$W`q}{2)*e;V7E7N@slV zNYI!{ogbZiao_T8RApW)1)-k|2tYO6bb*774I&Ar+LkxLaKGl+7CSx}=Qs?t9& z@D^Yd6mbm^3UYF#9JTy12`#I0wL-dJNz+t=t3$cT0N~*I2L{P-ZHzS$#fDm+VDk{$ z^mKIdN#5p$J(2^Y7|IB~5IIQ^K#afW)t!O8Wt*(fWr7elY-S?T7a(tgLB#NnF3v@p zgZ*mRx02t{l#H*OP^Jn!W}J}H7gtqP1uMeZ9~mYjD53*8Ff&)nfIZYudTO$>Y|Fd4 z{&(`R4bfgxw7X5_&UIN+-3I9gh{|Hwf;(PU zbG6x5^0Vmw>KaQkySV`$&C`v28xQ; zqS5=PxL!gp&%Kh0vW zUZ*A^U+*)|_o^yjVrP(^)A}oYT(~lfSfKL;XGBCUXzLDP^xRxssn15)PwAK($lr9@ zktpv)5GQ3CdPk2o30-7Y?9ABDX?n_Fkg;PgYqAeK9EinZ!&-p~{oI8M!BhF&zOszD zvE1Z~*U!9$@m2vy2L^hk&$k?4Mzo=V5GsOwhg~8$mjy!qX&}%^YiUYveqlu$nUQ-- zSYRL87lM-J?y_+~NI?J*EN0Td1MUNQu9fE*sGi|gQyQ|fx9@|?5OKJ7BneaDhvs7V zinic1{3z=zp$)zhhDZ|NWH!+0A;4t|jsxS*x4XN#R5z`I@5XFuRDS;+Z#5AzhJjpb zYW&pklRCGu8XMC)*=8qKHATfz*8Gy!;o+XCss0;BZN#8aI73e#17Iv2`qB4NtsF+J z>L`%TGc(hHoJQdSj0!&Q#`gjR`w8qOv8JFZq0gA%wBQ@11*e^)kAY@A#|(tL=IN+s zI;w%e{>n`H{jA@VckdQ~QW}%|8jGow-4qQ&uE${az>sHwM5gU_lY=musNa^_c^{bNB_ei_Lu@Hmf z#>a_?{a2xfl#pnun&U@13+1ULv^hj94X6_(Q>y*zx*w#@SA35bcsQaeZ%as_mBQ~n zyix8mi6%G@Ax_66b7W+i&}NcTcg*>SwNv`tefS);CTsF&+FL`vGtu>h@610oQ4+i| z=HoDEhWrm?Sy@}cWv2=f|9by_D)_m=W^@=djAw;!NT%Z3ZMp@{Aq6PAf$0+6&`h7THy=j9M1RKKlll=L%T15kOy zH;44I2jf~eHPra?xie&b4}XR`Q>V{ zeVBRS2-~>)=k+iU*Dy9uZs%}ip-@EXL`OT$liWY9r0Yql_Mi;T2ChPDc_ zvSu^AbeKV*Ic*JzC{XTzKLg1^swn<}H;d~mH@7d!cqL(79JyI2`_OY{WEHKC6#jBg z^=`{|7Q%i_$SjfXMQ9RJeBcvGq|dZA1wT7!OZjEzQ|Nw&A|%x{PM4#H1K0%`5B>5_ zgS4fU$3=}_H(a;U+|ejIt$^ngy20PZS$rWL5zaKBQfAQ@=Yoh z3H5X=EH#9}6dGVwPtQvD1ebi7`@|uRBHCVHE0^_4gHg*%guf)F0nSe%_1bBJ6RIJ* z#RCRqlIHfRszh4-R=5kiptg^Rp@%FU{2KJz`sCyYh`y7f{1ZGr;-v{95)q|{Q%jD> zLBp@EmtVGi3&+&9l|{n|DJ5@N#?tn7fAmJd!HTkS`fOZ*Kxn-Iy>4qOe#{314pR2l zK|weZcmo3DD5$Ey7CZqou;*sg;>I?-yV34T++W2rLCKbup6dC!8*LmK`na9Zl`gMMC?`I6~dpz+2;vGU|1xFC^ z4QXkG4GmF>Whoh)XJ$;U88&~?0Fa${(hWW5H3sM9fPs4nPewn`({TnA-*(dOXk}x1 zyD56{cFQd3zTtNDV0ZV>!scCh52)wiUs2ND@!GBT5(h_V`B3CT(#tuL6ff@(3PqZ$=J{b~ zCNpHxeCCI{yfuW~DYS@)$^Tip`?SVd8TXBxt<}DJ7RNcFB&f; zJ|_In{I{!uGpYzrOiatb+j#CqX!bEh7fAyRjuMBX1e#7{07s##1e(`_{suy&(7rFm z&6roF+0~9(PA?*7rJgw_mBnS9Y<+@W?1FSxKB0-QeLJs@se$S_ zNKRh-?wU);*>o;L$Z^F*b6{%_MMNl+A7^og1b!PEG8j^_us1S~7L|&Pcg!SGAN>?o=8Xh6}IY;6kV!^Z#!@D$cv2pm!LY$MdY zu%sF~ssdPFH+hRKW(d7zB+4QL_8_B15hnL-0gT*!%*ip0a$cL>c&83Ou<${Rw_ z?DhJ+pqxu#8mQN)Qv7CgC7IdD#Y3c)UAxr`l%$Pg-F27oy9~gt8k_q|_%2;Kh&>az z>&jD7o`~!wE`xw;zVxep1Ga*lr~W4vqDcV!UR_CPDIlBt6pdn1v=%#|--k{Dw@pk# z^7JFF_W7|ov; zslWaj-F-VbXZD3)4cb6*@Eb^yAv$cJr-U;eF|s(Qs6Oq5+kwa^=fMRKD3p=P^lv*V zKehhS$LAsD8d1`qMb$)!067QM`urOtv13laIDHQw5l(*|+u3uFd99%&f>&c(qI?w| zD117nkPLy6GQ`8f<5tG$UDw;KNB>ZEZT=P}{%v;536Fqi+%!Va=vU^`xLOJQiD|5+ z4Zn~apNzP;3&5bYAZ&$0WftnYFAmEVs1LUgk+n57P0BeESSb*s`iF#k|4&;+7}_}y z%nivO0#gZH<+F_wg!&kB5HoDLn!DR<<&Qpe61V{Y@x=ZC0XqsHZleJH53FFTIzk9B zsSZ(5iEVDIZ}E8fa(h8%=Y#Hs15LR-aEn8d(F@ftUK*Sm+%AMn_#eYck0-+@3y*X5 zH*n=Gs`e0QkdY8-0$jyF=o(hDka>+_)m1ufd%SxZWSw)}n;RMT)O537=Z%Qi;FvdLudXEk<+NOD9Fl6hRD-fX=gEt{XIPr5)YLO-RpYuRwu6-x|2YM z-Guzu&plqv2euqE?}$%yaQ+(euIt~?q(NFp!qY?5!Nt^FJk zVOVi!n2^GSqjP7x{|!j0-r035AeIHcS5Sn77#u|70Q66t@!MS?~mV|-%7Pa!?Vi$(67xWt^ctS%(PYDg3`mwcjYn46`cmIFJ=`)f7N#nJfNS-Yks&qg}gjn zQ!!mzS#{v%*z$U$lIPj-lxC(mM?o4#euJ>Hj@^OdOO|;<*$Bqa%4l~Hs9+#7WedJL z-YsMun~t6p!{wq@d#rpfwn3~o!fA$8M`5wn-@?<7MPjk+c}M`Vpi=cq)1wK=r0$(> ze`vE;XGsl@je&3X3k&lGDLXW`!*_YziTXgfe*3elwHv5b-AgrlzKtajkz;7ZWu&A| zm0A5m2%VE^)XKpS+9E(a_{|%2P0eSBD-Hbi?VI`*qWn*V(ak}SmI$1{4-;SjNWa;j z{54kulAabpJ~=tUi?^CVyEx}UyY^&q(&W_7z5IL&D@e@*1Iui~PlG0Y=;cfv0Pi+j zzfD*trWWTyyVpoX{PgtncCD^{TVME_gr=mWz3q1nTs`>EU@B0?=P@-+1ULMKn6j$Mm?{ZGT6`S~7;tffKj{7P}|&gUvDu{k+! zvBUmen(1Djw9ZsXYH%XMzIvIHbIa3bf&j@!M)XHVNAHM;^gv5l);IHe-p*y{Uy^U; zkX4TWJ9`nryT!4YB42C#SDF{@?YLmG787dHi)5-&y~|$!>o{$$c5lOysQ{l^0rfjk z#ep^`?70AN<1Fq)VF-Hgm@+Od&f!lK?fzq31n>MXH5jQ*f-|0y+siKy1>S6S_qtE5 z-dH3vXHVtv-R~Df8}G1Or4|Fm6g$q2+OS#| zGQo<)yhQ;n)2_S7zr!--U+(uO>98A1#685GD=T)W(ao|{*1)PAaB?OS_;Yao{{5G^ zxV{*+u&^kpi(K+8FBVwr5C$&})EzsKIl^wv230LLL~N7*CdcV>8YE}L`naw}{%wNu zLQB$H8E!jBIT9$@`FWUO{8z5~#pLDI_cfjHB|xJ(gpXkRVR`#CkAl$TO;@)xLkati zhqMLiKci&NAATcxP_r*BaVnfc>*mb^uZ8=0HZ4@Fo7|(EPA1ouS5%yjq3(MhF;{fa z`Q-$~)bd;2Wl6#Z(yO6Y@wBwQYIvB(DW5ixD|l^vahWi{Bm3p5@%E-tpq*0TI99iHWG>WZGEE!vN7lU-;D5YoY``u6H{9ibQi;o4Bqn zH_B)xMd@Q!Zf2G^Euk2%oSxn#7~%W%t1LDx%~_`(C#b34M-N=OaDlfuDKTP^+Fk2S z5(`IPA2|*OJS7lTHHPVM;-NW?OP31r9Cv<9QWe$E*q~JM5-ev*ZV?l!(!e{3wJlv5 zdJ}A(V!x=GqsmI}e+c(S78D#@T{x-U6t9F0{Cy3Fy++E85leSq{)`G>;7Gzr%$gfOqpJby5}De;RRUK#^yO3xNN+<-@gZ>nb*Gddw*6) z$h1pKHF;;Y5ClxD=Tsi>xN|a6z?5MeT?S|fG!3jzf`X5cMd89_v(i* zNI(DU$VmXzjZMr90s{M^XGqIBq=D(otgKo? zH3DBVXz4CqU*6*Bo|DByDyhCtglMZ<>D@uP47pVT4 zcCx3}i|Xv8v8vGllGLo7(bCtn`a;w-6y@b{-xzc2gbOBTR1&oG}Y?!Ou5$%MP)6YLaXQIX7^RexMU(+JS9sK9M`E`u{^)(3RlDgizJ;EEJa0M zWR2C-Hng@DG;?=r_6;aB)LWc?XpF4`o(Z1VOa7JGZ|+{Xsy@`Kh;He$Yuex85<3(U zL~r=``TaZ%A?{&Pmn|9X-sNblvBF+e_FumI=~l9&S7x=IW$VN?KzTd7Oi1tn%*{_X zG;o0Czx7s_es9Ob#{^{w^BGS%UrA23o|1{jm>b->8aS{;baZTsEUx}$c`l!@f23Mm zQj&~D@`lgy(z+9Flc*bOfV2m{%&YW8)qrN{3!Ne3y8Zv;bsS`fri)hDobfep5pwjI zoh9#c?Oy&9yYz=Sbg8aEXrQHb<4h9e!_8L_`c@ZX8!CUk+U9bNwodeZ%J(g&M4V6~ zit3Cr2-OCirMp@F&B_p(MJ&gXoa)m4H{s!heKYS`hTPs7UfRB=8q1EIecz$9SgG^( zv(q;|s4gz=&1utooENz_F7D}8OKt5(HKo`1Ev~*Rn4HS!dBls!w*1?{v#{_q;kmTl z(;KEG$Q61rs7f4i;1bHBYK;uCS0N$S?d*Q{{v4Y>6I7+e)huxD#^0;I#8os}yJ|6? zYIdp2SLKDEK$zC<))GT?^@9PTN7u9j3@t47gjW014ryUp_VgUWtdC3bNqV)5yF3m{ zx48Ie5z8-;@Sc8;+sZxtZ-RFpS*xs!>~rM|DKL8x7dP_pm&%XDk9FIBA+>1d;DJbr zll%WX%I=)Z9C}hPeGEHXOw2lbZ@BljtS+jY0!yGL-dAUIEG+zLYKU!-bf^0riDrz>voi<8j9C8alfCWp z==b6(mZm_$m0tZkYE@Hpg~8>n&9?AOJvVu#K=}l0!m-JbLHGBcEB9R_D2!9) z3288jouE>PlD?pCY^+=E)A`a@@@H!%eQ)^YeKQ_6bKWq^vWfE0s)4epMGjuxniQ=E zU{5|<4D7)P05d~uoIWj$FT-iY_ecG^a|q&MbkqR%?m$c6fHJ_hw2I|Bag1tdojte| z?Ep@qX6Y?jKQfcP3-BJm*>~bA<^Q}ZTZ20 z387(N@PfD|4u#_k%8EyYa|qI3`qh$mOimR;v03@>;X|8#T)JKPSMkY=?qfk*^z?6u z_Xcy<=x88o>%~}E#ycW)DcT~G(b1(iUQ^n49u6-ym>8;feE?O!g^L$GMOI(;d&Ih0 z{8)Ij>X7$psCvPzT#e*z)nQZsXaGi9z-Cg>3B;Hph=mmgU_; zIFT#0b>}tDQQte>m7AN3E52B=$JrqeA#Rj`4$6Fb2`xJ^d~g(b05RB(l}0;+Rltu( zJM=3~^9gD@%Ex~A%x}${NN<0(V+P-D12gyX4_!fF(7}XMEIuKr7dQc$0#~$+bA);X zc;xhisdFf9Br)Pro=$UGNR2SB=4|=lxUCNo75|j8{9(@CYTM6QW@4e*RV9S9C3#|437Gi zTJSPZp0I%9h-YXL3AoYekFN+uka?A!Sfq|+4`n7fa+Gc%snWADDe|~CxD5#PYL9nq zuS=yHEwTrk0qqZs&F?KpKOdyF2eUxX4}=u6y1JT3Wh8uNBn|@?)rhHx_?Dk_b%o`E z>6ymE5jMTM2}5o{0m=M4!(%Qbbi>^%%^8_1qX}%G)efue-GgXo!Wy=1%vQ0cg1&gw zGCnyuNCe}B7$#jyZmC_(0k{)}YaeKEjZd4=ps(}VS*QF6SbW3VO|rcU3$K~vEk88L zW)>9S!QQ7kThWs5)-pCwNh@&D;;!F0n#~@6?T6aawQ4zhJ#FVidevwhJX*SK{3F(e zFR-ZQvkV&Zg!zwmw!egAAkT@8QO@ROOx4lzEAN>liYx27P2rN{val3~IqznZ$z|+~ zY*)aip75sUc{-!*$z&s0KDDTowt)K{G{4yojQmhF(z_h;N=wOjc4ydMk;gC0^jl=5 zw2k9(MtX-cxYzX@-Oc0Dx;2Bd%MOK}DMR0|;1Tmnn5M8Gp|yAD*{fF2vuoU89+=S_ z>*g#gnioIZnu_+TL~V0LfrPkuFK@MT3W>9L$omc)zv7Smax!;O6>%fAOTK-&LaT}! z)9ykfKfAjnEiE~SyAh^spq0dt`By+diqpDX5-v=+DPY!>}jPmkyTt27n+YPp=XQD=)ao7%Tp&W?^36BFIDHuLPCiTTsLI49z;oIo~L zB*r=y#o%1v9g%bT@9{)82($qT)&c#XiO`Uca7zWNz?QM-Y(BGCL>cuM(`tENQ(3aZ5M*4Nk9KNMk` z5hcTr1-&#AZ_7~yl|p0)ir^v~)4XN+mIu}+dBa$2ZcaSny~h~PYQ!}O;(zkn7>g6; zb@+m~wS0%pTXprq6tqTL0MPItAeSZ%;N(R8NYH+-;Ma{b`0 zHNF)WhKMt)+(FJO9Vd6!{%J}UD%xCLpIaNQq%|9><}O{EcNCF8)QpvHPML51%Sb$itHdd-iQUZ{=uX~^j4N)M^MdG4=eWb`&Lu()ujdSkP4 zpW7o`uhkoJHoT}Bf{T~cTvsjU3a==aNlHqlI@nqj$!k*5Mie}xg7EzkM_-W%Eh5US;jmJ`%YmRvaI)icO` zHb36(UJSS&?|?t^$nfUJB71qb{Rjn;tLxKFcX&`Tr}9=a0aysvG>tsMcFHL6i`^!# z^60j0mJC@;f4r;>Oo34os04A<&l+~(yoJabR3PIGT~Z%$=x7W)f1 zJQL68pbp}~RAW(4my7qe7n6*UPe8dP3OB#2>+(J_-=C0=wTuZzOM|uo9VK{6tKT`N zxRQ;7gM9oxZ>P2dv;`X5!@N)%#+q4vlof4G%Jqo4%|}W7==a<*PTG5lS-90(OC>ej zD81qjdRe--pJUsEsA4DCPndFY%4us;e7^q)EiIlM8X0K1zgLMJ=2gu{r|nxVeDfxf z34F-Wa67Iu0#U+ojr&hX-Nb zT3X_PDi9c#l!C%-Y(fN5qqb5XgkE4AMqX%CZZ9Y8d3Nf?q@mg}yYpH@gze~Up`JKr z=V!En%SUu{qB|_+V#!1Lg4Nb`=C4$nvYkj>E*DCl@pU%Zdu7O{wxi6=tL1i+k7#u7 zi;KrHE=S&q^0CXvz29F^$;PtMVKc}hXYqypVb+<-NbE@|nlskvXRRvfVmE_1DE=6A zEJbGO^2i*(Q^QWwq0*pOy#=__!Me_%`$JFx$;z`tez6egNG%a-Tr|cRn2Fp^05_2+ zJ7Ct?!9d?-)92k`I}}C~0s#4E>wF1Zp&+w3Hr#GcL@g0B3iOA#yZoy9j@S5UUwr1d zpTcA_Ba*BeWTiSm4{ibS#Y6_puVusx ziL-iuIIkDeXn+{JDo;nnx8@8G1IICqg-^rC+td(G)nv6s(%rFwWQ3TZ@I4LY+M_Nm zR6sQ`$^6sFIZO2y9qi|#5LWVXOeiliAWCy&raZ5_&)1Q)X9Dx!Z9>f|b6;&g%+>-J z3CreVzC&{WscLr6%N)q)wA)LvY1b{FYus>z;QXGarhe4jy6?aNg4}@6w&>TOKs^CB zzBPPU?)FeOj5c*0znkUJaig9vAi141-!^n|!U^Ju_}ZKG+dbspKNn?PJwil55?`-K z-cSFlJ%7Ial>jn0>X{?HY1B!!rrDDzsQNGI#BINJKZjdwbMJn`mbVL;)q+n7-`!p= zG)Z}8CTMFsmaWT&*BMF~OIk5&OzxRqhVG{HNLf-mYtC$Wt9X(F%6eO*`dl&lO@dDe z!om$j?ID-Kg9-G5=pNQEz58V%R%BIF)d11)SeF{Ml$+(uH}iFvm&b5KQ0SuN+4;Kf zFY2N1weA(>CWAbon(U4J13_wo&B~?&N!gR{6B4|@S(@XZDoq?FZA~{;HgmuGuh5>S z<>mt$F~1UFGJz5qNr6&g(jZ_Tp~fAU&V_w|rX#UQMAcOoXLJ&t^MkEcUx0Mgj2#79 zjr7n{pR)&$FH?2%_ye##J0ey)hJc4bC^ZcRCY(^9K{-MLp!L+xu{;Fl-lZpxKuf0;nk{DBk7e3H~xwCU8)E6&(gb&BH^4x18{P*wsg*(qrWUtlNz; z4FSHkkRQ&hu6x<7Lw!&F1SB97gCoPkZx(Yl*J?NWansy~q@)AU(v<+Yt5LAE{GRzw zd3KMHwbjw(pI`OdQnvBvN7ZCqZSCzD?c!){D$Em_M4@7zHuSH2-ZG|RW@gsa;(t!R zrUlIeLlI+u4S%?8gl?LWEoKiCnp+Bn=CG%^lp7it99tJ4K=vV&K$7T8x!Or2Vu4=% z)N7>hZbLH@DIGURP`cbAUBZdLTr5e;o!Sm zLmhc}PU!od7qcPW6M13&_$j=BSljuf{?F|@!I2(>s>+6+s8xaNM#URk*mLudqpPs+ z0j5CJTer(Gwt8um_(k{bzoGr1k#b+(knhXyF>PGpU?BHE#q#ZsiN{)8ir@#h8edrSZ&J z;)%|Mvj%z5RT2A&thjhJBp*>Nv0Cf{NKXTl^DcXpXWKRx1e`ps>E7~R=2^lvohIYTe z^uw2@e6mvCwP{V&~<(h5nsHTKZA!x>K$y+2hqyA|j)fCRKztlk_Yx_wxFAnL z8V*F60K;x8BIpl7;9gvG)Q7_c`cQvUr@7FMM-AdQ>!8EMVpG@C^FZ*76K=`@J9Vrn zsZQ@hZth9Irg+sdD${=auomPbP-}0AZ4d$ASrr(zAxw^i*P9SMaIkh`CBw*m%5nTL zpWD7|O>%N;bI0=w%6xCA-U*9G=9%ktPx(;(p_%mbv#7(UeKY`>lVI!8+}v=zx>Zo@IXAE&QX%L8!>3-u)f;|U8iG_=%0CK?#$**q3l z80b-}pbY;}2_?Ls5f_}IbRRwpU!wR!v2VpzE$UyCdq96X}WOda@S%W?lTA_ zE_(X(=_M2^ho2~$<_6$ip?hj-lBjN2g1l(qJ|iJmIg~ziKYv~YoJU|V@4Z-*WJ3uy z4|L$0yYvLxhP)}(yrnY`(+eTuN>)y826af;|3}$(z+?TlZC`0AqfkbXNGT+ni%^Ib z+R0uS*?UJJM1(|Eq0$h^UJ+SYNmf=i*?a3fuKxf3{XWlgzt8);Z=d`A+#|04^&8*w zJdfi%&g1N9BRxR&$$5#1>3Z%I7`k`ev|Bsn+C83^-7{S!=J?)Qx$A=;gQhdl!0g4# zm$hoUP>+%QTzJY@cK8gfz?0~E_Zo-hjQOhw4}*0gvczDbL`1;7{=+sB`i1 zW$y-}UyVVKn8NMb`%sPBY=`1m9;cB2M2O|mK~Q3$26uWt6kBsqtB^~Fxc_Tf35ssn!co0i)&r)W#KaqoZvM;?%>of70sIOz;kO->$X!>*}{#6+BD0 z2_ILB){-OyQku(ZM^3-su$Si~i?sDsKq)p?bNig!`C@s5qLEV@eFy7k6VOrG}f zk!zo)_aP0+s3TS+=T6^$SWYoL!_PRonBN(ZIk>PgJT4X3HDPE_R{HbjPVtz>Xf3h1 z7ad?JPGwA!w8n#~tUTlFvI2LY-svjoJv>5&3r|j;*)~=gU63(uTXuW(mU7VM4Dlmk zG>VB7>C!?%)!!};RA3D+flpGBWr3N1or%vhATne`l#*Z0+sQ z$*lO*$gtVJ1>4aA%1$WTpuZa*FVkmz!}1_4xrQ0fJ|by@Dug=1phL94iqjD?#QjE+ z^Ogg=tvHsKO~FV2>*{~f)c4V2L>Ru=ACkT6$xJ`kZZMw6^(0dA$`#*hQPrQl=+bh0 zkcg7Bx^^}^9cw6Hl~14vD)(1PJQa80r*#e^v+Y+jXQ!sD9v=%Ddt;SY)oq_gbj^MM z11teSLERq)?0&_hBF^`1R+m$F!OA?^Nis9*8*P~-$~G=^Rc%~2W-gdfdWkDc-Ktcc z1n|S7;@GyL8k(JJH8NGFoAJ|041M(IGmC?1F&ep&k`EexU|@Lb@aSj{R37Wv?M|!C z?Sq11VxI$9@}S8E+}qG&9>=^d$OlSg z0e+gp){^^nln1Ffu8bAV#O*Ni9k#YgNYG=JYFEP3M!cYiH4#~Wi2xQ3-S#U-d-=Ad zXvLU)s=0=&__fUw zXym(t>cZ)AT`URrn*DJrLp3>P;4J7n)lX)(KMd8AJ0wxv(ju0+vv!65-0LeB(9T_7JBps@=jW4}hau3piPkt~ zCI;80zy3KG*(Y3Q@0*ChOq!`~r84Mgz{vBm%aY3-6O%&@g(Z^}d}0mm;*+j%riZP#tW6B#ZD7VN+a9?1Vh2p= zJ6C&gIyxmdA=cjt%^8XhGvs+$V?aSTb&6u)ez|zLpIxr3zc#`G#$E^2+Npom_o-Bj z2KM_^=%mi}EUdt3dLh5A3-^uyn@{n<>*6%tkcAg-?$K-3fSp6er<8?J;~q;j2~pRc z-sdqw^7dzzT63;O>F~X`ufhJaWWz~!s;RcY+vPYgduPHVltd)>dG^uG6!YUWaGd!R zYmTudrNo=s`)wHv^CTx#(q*~j6%=sUg>enWIjhq__cDg>*A2pXNy%2+>^t3dhETnE zUD-s6f)+&7Q-?xhtSSoyt;9K7^RnPEG4rV}-}~JD@Tvzj2EYn}FX@;VLP?S(KW;IHDgkvV=Mkx5{KatH^) zE?N9BU51k0DLxUAecv8)oDmY;IxZKT&#imo20U`!K?}7td}PM)czQ-gLj9`*XD!4q z$C;We6lw@6H`z*d(*ra(O%#lwr+`StXm!uh`uU5^QW9xPjuniWX-i@u96Ee*ouR|F zO5eVJ4}kIN+^?@!%?BD9=!R}eHZV>)_9L?N57q0b@H7#l=4~CKHr(ASQ!41gaR#5s zChMxsOG0oJ{nK83*ctLvr7GKSf8If@gyKc6Ol+S}{(}^3ykOo|;_kuQDMa zLy3vig{^93oOsDVs>8U{j%MMTOMxZ{%OFpok{oSka(2;tcdel%dkcBe4;>L!&Ld|^ z`}%fCO47efG=vytPorEW?!?QNu&Gi~P=Ex!Y6L}T{G}u4{~;wSsj70F3zyHlmx+%1 zM5jT!xhT#*fDRQ=;l(9%x@>E0oL$}x+2%&Pdq!i9JVZ7+zX5FbPfIZvF#v!G9zQN~ z?V7>o%@$&$WQr#Ar@7BzXKz}*RstYatoiny_ZNGO72BU9ad#&Jwz@pePZG*@=}Rgx z8(SS@{T)yrQFFh)D&Ab-osw>4hyZXJ%8x0>etu1VWpeJ0V}F zaS4PJgT50r7ntEm$9%NdKwhcjrt2zAxUyR(sWp4xB@aHp0amk2^-M^AeL_D9Hdpq>&SD860P!c1SN@3*K*u_IH zMwYaC_5q+c}jDB?Plkx>QR&c~rafOmE4%2Iw~ z_s6R51_C8SjxMhPN@lgwu2g1r4gln+wHu{|6WP#toSM0_adkmD6NNwp|A6Hh zr&O(^)-rq5<5K%xDx^G{n7>n>iiSJQTlXbAJ}7o9YsCt$v;FOR;Wgv+=VwTS4BLjk zKAyz?ZQH+{$gY<>gf7RfKeZDu#6bz>5?i|`=<&cu7n7RuPEJRh-JE4?kUPKq!RdZ=g9kv) z?l2bRLPkA%=(H%Fo$0NOyK`s5{FuZEySYm!()6Y~KS%xbR(qw+ z&rQVzse_vpYwC@8)fmiR$N4rnSuXBEeB+@yr+jD?>HT*@YBV~^gT6P!9C!gReoi(2 z>i=aa9LWWz}5Ou1z(Kc&9I41p!!&9iNTYm-Z^LZYnj`uXaIRZuud5E=9!QCaj1;#BeiRwGe6o#}fWiq$ zV`<6B#$1m(>?{{|6&l4l`ualSL;?g`s_#Uei{d?#bUaQ&9OwlO93FbE8t4nmsu z+}r)JZdk%|4%^dysxe-lw2Q{q`boM?k8*xA{traRe1sn056%`wqjz#o5>D5gsGX72s7fJ!3=S zKW_=>h!F`}w%mKK3h5|)Ua>?pb7<)07E^mL+4wJ@XC8)yow2jKDPt4;Wn@m^`0=v_ z2J+vZo{Rr0bo+9LSCumSUfPFcm~}BvfAeUqEg!HlhK8e|)hYg!^4Uv>g(8DNS^v_z zK`DgC4~7!AQBv}n$1C%gVb?VWiK~KK@a8o#=$Oi!l&NobMI7qgE1WZ zvekLFY$fIWo35_WsKMB4cPfEPt?4c?!%F}q2+h@~`aTjH8Es>Z@PtOluKPnSPY$dR zH;Y+6--vR@$;tRTk@nP|YFI|yZK1v#L`+{}xF%wKsoA0jNYeYxC2+3bO5|K`ozfdS8pJNQ*hsnH2AF_D0Y0782A-17Ujjc_M%l*b5aQL%Q zw;@EFmp^}~H+s;yKq@kFzP{No;n{xaH#a#MqIw~^2?_ZQg``6JH6BP;ZAg`dV}TS3 z&iAdOpeOVoD}coC4MqBCccq{|n!PkqOQVq6kE85Q!nVS6P)pgdr)$E>Yb$h+c-O6Z zF+Qy7N7-^15h>H2Ni&53b@?QA54?=i5oXY8KjF4^7FnaDltFY0#du#|OOn3TOXjUR z_Q5pdQHIF~#tq`}dyox2yHEjnmH~zmkkkhLk+GG!2F%D1`=(EH8wm7o@*lrJB+5er zi!cbENAa^S?tb_{O8`#ni3JCUcT>j9O!2#HV0@(&7xcV%mIu#$L3$&-ARSTFF|Zyja^HMvxYlIsOET?76OT~8kJBAW)hVvvwA7@I}l`5Zf28Cjb#KWuay^1rsHTYGR z&Y6WV2|^J@({(eyRk{-CLxOdly{!spATp)RGlc#}(HhH=f&Aa31n&vq#;fRjiuX<3 z6b`nqr%6sZKFbHb`grbA+cuM#D`|B7wLRE`;-D(i<=D6AkLN;bj@=koCyKL>E{v{Iybw?`G#JGmv%N0=0-&4Sw?z) zyIO<89UTT9PNI+f?2vLS#W`iMaTP;LDE*7#zz+04E+G#3;C z_w~;!X6+C9^oAVN74-X1tN=5@qrMo~%`$*bSlIj1v!{X=EnQv7qRbHbK2--$Jt1=Htuld3I<05;`3acje}+i`pHxq@nDpKEJWF^b{kdVdvL_*CrJ5 zy+YAH^(-!Sz2~EV0X5X6ahHyqQQomy%lIHzgVH-n56Y_S>cQbdHed7ww)aX1vmN>a zY%Di8yO%5NTgtNVKE6JeBDu?IM`O-e-f*9*(M*)iBIc`KZ`8pSvZ6*fILbu)Es+3y zm~N*U;~Dg_Pa-fxC~;B!4a@njN$nhK>;z1h?( z&fj}Nf=SB%e|Rj3v^LXn!;ksS6_O~?=lJcla_O>zdwHcO{7B&G4_;9Bpw7y$$$lr< zH+BEuxxc>R&Oxlgbdm5qMay8oxih4M8d}G#K{m2_L->1h%62I<@f30D@WNu=5Q!UwCEmTn57yfR zp75{{aoSi|VvuX`>G%JlIWQc8gIy}Lk!Rcny!gwsv?!!BwEz8`?g{oI^t?<+2nB>f zHD+x58bJT^s^Njyzn-JICEi$E6_*gZ@1OyAjw?izhTR6Kw+_~dbhLFJ z_nvn909q{_nbQ?ug5L@yC1t8b*9Hujq0`Ns+^YL`h1Gt1 zs)W<2$49x=WwcdmHDGV@Z@KEWS;u@*z`c9-xU=&>vavbe5Qy>_sgyq**V8&Wx7%$9 z=v+lc?EnpCZ1f7-C(538kRaqA2=(<=Xm5xPKT!#82THi);^I}o*uA_c1YIV^o8US8e)FF%M3_W^o; zD!V&BfSYSs(xg=K-6&9#rilReXsd{oVhX}z)`=fHpT^VkF%iHswd<> zd;ZO;fVqS0wS9G1*_)XgMz80h%*+%(@1RIMnrk$(vNk(A8{eFWp^3>eOr7V3K1{lH zJrxug7!i05EPUWV0)&-4kB?pZ>vjD6prjka_5Q4qOP*fo&0Q8HAk1nauO8mzuO(gd zPe<~+3hA>@VnY<+Q8eaC^03{PXSahs6f`l2>x*2y*J-_Ga?-OLAntti`gL(Pqn~kL zaqPgPx4b*v`Z7cLb!+SZXSuH`i(BemWAySk%6`qLRu7VRZunYb&Ji?eyt!Zq zGl~S{o7v^B{_(Bd7tkL13rMaT?zI-H_;R+or3%aeNCU*G0L_&0e(Ph)IRy zuBwAuNciZ+T01Df$LECt9fdHoAv+VsZ(=SlL?dthy>6*MK$+>w#6)G6aZnDZN&u@- z*`n^k$cvGYO6XVSMC-f`{BO)GUetQ#J(KgBhm`T2x^prAU5KDK?NAmXzl>mmjq48>0J z0D@wG219RpI2VGkq!nX^JZYLw0}&K*!-?(8iMMY3AkF+G^R5oYMjrUq6|SO6!aiF) zWN4fnwC4lwG><$`u3)4i^;hoh6!ny)hO)w>$qZqK6+O@}JG=IoIxXE^1>OfYBrqt& zCnZIbe{df)CJ()3VBIr&F8!!TxoI%oV3n+7HZfO7sO1wItS7a(ubHqyux(YdL0f={ z|4Be%-%S1Y^q`MYd!cC>nhSnsPOB6s>+=Khp<~&fwV$i1wPD0+sii#m#`ijy0kS!? zr)~rB5B438h??0bF0s5A3qW^US=eL~mFzJHg`l3Kx_j;0{rc69pTFtaL~pe@#Gq*U z>;Mwh=bCq-?vZmNdx0Xjb4H#@)ggfzl-I_%EF_~q{fPf)K_Z4C3Od_*T;Acof+_ydCPaiWsKpUxavQN?Nf-lURBh`KOz5SN*G z=%rpe+j}_;o0$zwNw0Uf^dy~qApH4^l0AmrZ(QUSP24Gq2M_WqKOO^>_MWTRI^YZm9-A~=D(7A43GA^G8qQo!%Pu1gWA93;Nli{dmI-mas| z%02dZIgV@MO~N94VnP+`8;>%JwG*AFz4*- zCVty}h~s!+7dpvfo?)^w;oEF;$mkkTI3&bYFq)$XJahKGd1t5oKRvn8yByyZdaq#i zzsQg5cq|b>S5PqSR3jSTIK5ERU=GH&6LhZW>iSpztze}L4H=l2wxG{ZE9Rgvg93ik-Xdp`ze>Ki-UYG=3iV=PVkR3Yu1%154f2dA^E`bo6LwQB?Uz4u(4 zNm!M0PKr}RK~s|#?ihgJwXNxid2N(Cr<7btSYunFO$e4^JhXvS1zhvCN~>HEoNHVS z7;u^(6W$|7VjYrJae*;08c=m@$-4D4BH{!}==R;y=nAH%lgZ_4xPYOm9_WSM+aBYM zHwr)U8|bATSab8su(ZJ<4Up5Aa2FF>5_un$=>44IYBgtH*Xhj6OB z*>5}VWAgiV1HN#jUl@uV?mRHEx{gH$N4|NWn~ZCG8y^V+dKA9 zO`GDbhxG4uy+~zsuCRD8j#sZX@-b4LJ|B=(ncwK?t*YUT+UrwS*A8e|AD%sEWM+2C z%4(aqxDeKo9Pf=$HhZ0$yQM8_!s9f@UCopd@Y_6@u&7OI&7bi+DJLg}F}qav-)w1W zWmzyYB@#akG;e94ps-+%pE)h($QZ~{b<)YnTlVFYL=@baPrsmDT#l@JP~cLh>6$TM z0&f5|t~c&41>lt810K)R^h#m+4#tUlV%GXx7&VEzc0E2fmmY5GzW49*X|xRaQl_TX zUm%$@#og1i@CXgv)!E4fXB*=43g**r&)><)3gosO9zqoFu2C>B7{bYSzmybxTwI`2 zLd&;rWG8p-C&!Ai+`@>bR1_oA8n~qc(d}0)O~N!c3=Jkg#$XLkHaX>I*_%z z$*k~GhsGUIO_$Q-vAk?Cy&vgEI+7`@t~QhyyjKuYcO_L>j{{G)zo^6%`*9 z)r_i`JBSUIo77-cS4t(y!>0yot9$%^mvw&iRU9nHm{fW1+H4qZ3yEZ^IrF6batrXj}k_F7@kz<_~|A(Pbc&7wT2 zUiY^PORaYqs;sSVt*9j4@unE)ZPpUe8@e#^^3(zLJ*F+aigLEGInHHa*?m2)7nj@Y z78gT*cX!_m>dxr5`1zneMfcaEO6scav3~Etr*1!V#%O4;0A=bByZDZr++5xIyGx5s zy~>NrRdxG=eXUBQ&4*`dq5Sk11e7|1%JC?_ZX=cnoJ?*Dng;AN?GjFL~|ggb$7nnkL*KGoNEh(lBT48A8u z#UrezUXX96l+!KViRGcsUS#ZcSul9^Jbl;YW07~yz0_#$;`j4i&s1@wqlw{!wfK0> zh>~f?{N8ze{bxBjo0F51eS`cnyPBTZ`uMoN2zG&jEus{Cf=>6f)B&mB!DGC}I zl4QLPLT*X=@o~Fuvb4F>Yj@gOaTxayPQrddGyfz)+=kH`A z=C(Q1#TI`3`qh`_z`al9j14qxQf9!3x*=(DdL}ZU}F_X<*}eNtM8x5@0<#A}C+`hptvh9A#xmCxf}lNe(_%w ze<3U^o6=m;*ti=Gf#ir@D#yi^LvG*^)jvyY7{>X0ban?YZkio0Z>_=aCLaaTKHLvW(HK3oqlEpuy!7Vg$s)#u$B4PNjEv+o zH8;q}dV-egdCv^5Ge!{}rn4`$KL2+4;GIu9A9UmiB3a*Ilhv(hYCYhi!b38Uk54#I zvpok(Z%5m6C~|U^uI=tDSo(;J*i&>zc4+A9{(}dZw(c;P&(Sck?(5%uBB5Tpuc8}w zmy7@#Zk^`j0x@Tytx{5*A~|gE8Yt;5xk0{d+Xu(7ZFfEJCdeML`Gh4h-FxDG9oRTv}? zPV$|=apD?ViLrMHMV8VVZMlfmCq^bF6Zq17_)la|??l6ArMb1;7v|=ut`%P7K9=Hv z+TdcsCAMId`BHoOw2po|7@uh~J9Ny|+>x{nu5g8E_?!Q{a%>(?8^)wxhi4yFs$;Q||EpKzY3ynV^(S_2!uzxr z5?_=TxZ&i~)N)2f@2|3UEgafPz-yh5o=$l{fm-^;&-ns})<|ZEv|hcsfIyJ&;>GTa z47fgp>8CDQzdKxS7<3we?2D`hvgf>vUyATF~LM45j;z(xe7yFNZ!t*w=wrKWC! zU@1R4#MgJd6VphkW6fGt4G%<5#9hEe2nmVEu!XnfXSFt5-p0ymQK8RkX>AR^(RUsSYf*1}tc+QDHnN65zofrW$R!|>yy#=!j0P{r*U9d5~*xQ5{k&)NnH z1rvp3xi_6Wf!Ne%os}k)g|*?6vsdDilE{#@uu}fcX$~1XJ1VS@P%Qu8Kuxf;vO0-| zJqA2{FxpQ>K-ckMtkibv9JQx{VtY`Mv48L{QTXtz@fV-1kwC2DFX_dh(BE;dUxP!W z6ikV{Gq^tUsK)tIN5^g$1V*$9oZM+SYeaqD{~XZx-HHlJ!if_etYl=X)tQaMvlSIB zJ_vBgB@0fG>79LIu3~#@YkBD}zigGUuqJpseR>Q|)nqYBLG$zWSFXIm+P57UxwJU; z%k3N6+n6=r^Ne?bnVo-OXb@t&M#P;69cpG-o(r$`T+L7@?Yy=CrLmE?P6quOTrsd>> zhITRRH9Vw}I?b}0W5N)7dzwEOGLO;vokva^Yb{qg_ktD! zasmw)E>HJVHHIgdK|{iiTnuqo zv5P@%q-LZfHn*xCUct>HM>8izsU}QzxIxFF6kP!qP@eYo+K$USp*h;s5klBIwFPIQ z9PyIxwrlR|pZ0cRZRgnwYOIF7>R=LBZ+0m7^m*pHj~;Pg_t+L%KdACo>YEHYzV21f zA(a)ar!L#j5sGjEx{{ZQXZ@FdF_&h``kNX9@nPQbRs_$7;nzI|2I!+Qxe%b4E;nvR*k)<-F+L2l+jZlH!qKL|K?Zi| z!kySTZBRn8f$f{V%)n<~YtYl(ZN9*a+WJ*;G8`+P->Az}AHVnLkv=JQl$O4LrRVTv zdIjBXlwtO4VT|sjJRj%i{eu!xVyzBJtq#$xW>^$zP)y9v2ZlOihsM~nJ*L;Y(|W_B zO;F*4hxCuOqyBHOj|9Y3Eb~?#L5+5U6lTMQdYx*+pjNHgM+y1r53qlphLO?Z^Jg{@ zi>yQ<^Vlpi;04IgmlTY7A2NT=&0Z&2c*@MVPRqT^ju~R6D9RM8j zRN?t>*a+)2re`QN5TvBs3MbPNiGrUU7bJ$d4tnQ6~)aBeO6C9aDY z@EqUar}oSd`o>>pVdXsK?)>bp=fTfq#)0eyz0g+PJlovX+;;WeQ>rKLJf7LLaLRt3 z-`3XX*(Il9AQNO(M06ty3xx|8;1M5Cn!cZWai&g^)1@K6!Nk;J;si=k$}Jmd>3Zv& zOdQnu-e<)Qyh=$ahv#k_J_36oX#HAdU5zqS<>b87>^7Jx+Xx8>u?q@PoEW6?{=gH6 zbu%=3_UJY<&o@Oe)6jHdL)z!{HJ@s8rmm)@d#F8pH1>XNY4JjE6eFJb+S$1wBbSu$ zF|9;@>U}|WZZ5l+*iM{We60dfEWN_Te-m4N(|*;y4Ezkx=Q~eA$K~)0UOf-{OEYo)a4bu7~!Z4l?2Q5F^kGi_-G`noyh~c>+>mWop zS$E#r7#;n5a{e0I@#B1iL!d2=N;Lg40IS%K)IKFDF(+5{NO zGCwZe_vZ|C$jQrV_Xc%!=P+oM-BXlKNKK`|idn~*xn@3#@#ytH1-ZTpB!F0vj4eFx zZ}ms5v3UBv>YCaj{x@nOJw9O04Wy65A0mO2`|xM0HYu*i$@LLPzm7l59u3=QfjZKh zW}4Om2_8hHa^``ElJ*mo^-oE^T>nh3E{}Qs`#_D_6Hj7<-p+v`W#(Hl|K&6O4Ze}k zsoWqHl6p_iC8WOkZ{N0K5cB$VCf;oAB;%++Y9#IZ7q4D@(9|SynnU-mw~-v^1i^&5 zl8v0~?Ab3krGW^+zNNZ{cUhCl93Z-1l#>4ym__LiDF)(Wn5AR=fBX=kwn4sxs(+Vh|+{lWhovZ*alo+FZ=llnQuu#>ZHaYEIG-r=FAZ<-meI+q zEiG*w?dtEprEjqBj=#Skn4|r)eiyNAHXvY)QOfnzRSPob(EkCzjT3imC>a){^q* z_g`FM5_v6>3W;T9hgRpBH$Vu7J+no1bqsg+7qzxpx7`6(goIuC&VQol$HYhJ5fNpn zOv>N+z4lS*4vUr|s;a7dx}V<*(kuKY99Kw2bh&GPvvdtm+<--@^Ea>+cAnIgls5KuudJNFB#$UXE|NCQIcTw zRByvdds}-0GXX~0n_geJJ3D*vWw8Jk7a0(v%)4Y6Py|>}Hx?=TV%qC$f9qK8>MGf* z#;ex~lw4+9@p5ABid;$Q6837*qMUUz&yr3hksf*3lXs_p8ak4zh_{(t<_&P;>JFI+ zi-^RbtOn&bI2t_4^DCG3512#cH9oIr;nD{)=`59jo*v4uv)*66a2aKYixKC>nr%tU z1|j%#0KeY1{b6U9zsDZ6e$^OuflIRbqcosrcXu4=VnCsw)LDK67)Mq_bdiVo5v-xG z3)Pq__W|)aYLPN6ca{?x8g5xBY-$69fPzo>&h%}tg~la;AaMKgwT-!hpOF%2_D*6V z?Y@2E)Rm}}?}Oe7UY|3m#;`99Nk6S^sR=tbZIojVzIw{i!Ww}9nWX692jZMx{ridz1OPhE|vMLUCSN#F)8+gM;3k;aA0Kudl@ajqr3B{{zCy zb-!#f!rbxt6eX)~^oSXkDDk z8p~c7e_?4gyt4Q;dC#6bBu0r8eI%XXr~7~qz+eO?K$UQfF4#xHdGFqN z1_g=I(vrxVs9sx0ax*f@ifbeNkGn*b&@((z4NWNMP?^ljRsFb6U!d0#ADJmNIK=$T za?z3=gNwG}lKKJ+i%U!F2yCQ%T82 zB9W6+0H7cIc6)7S-w@;${OEgN$LUIRoG3s)Nn4I{Pl~g2oYVE4oz%gnH-&wn+qMmF z;#P%YVt-wBm_^E6BxcZqo;883o#xRU+P~Lj$+vHp)7KXRS%ib&wQ;Ke>>+Q7T+4Xz zVlzs*m+suVtZ^Ur2djvFkIy11IgGYg!4?nEcHV?qZP=I^aD~tz^*cuLcN671L`W1H zdj+0Q0J6n3-h%s%MI?*ftWhuDUa$#{&RnEQ6#Hp$2fzWufssFT>IFf&@xt@i0RjQL z2jDcSgE1Bo9wHP~R&E2zO5zo80a1p4Z)9#RkCot!7A?+^c-9+{mzJ015jgkr@a#eb zi{k_VJB@(AyiR*I|1~$&{=M=?XOPSc~>?0tyX_p6T zRMZ_4;ucz4b;W9iT|>6c=~-C`C?64xaNbTUvo;Ri#pUO6@$kqS8xwVP9eq}p{aeK#Zd$*ej0NJ#EVp@p(5Vq+qC=rJ0f?CU0nw{qEQ*$~P2( zTL|Bqnw~ta(&uFqJVb@H!i*2wZ*eLx_l_#G9@RcG>-VCikpPq zV4#2cwC{vXThqXMpV)z+X!?|Q?@Dy@F83CisZH7&JUq?OLBDF9LrNnC3|GnC-=c>h z8s0Ec2@I~I#yPX!S`?XwMC@c|e@938`h^RW1kk)0PHl!&R=@1@m+F1dOad9HIT6vE zp7E#XlXaah4S!`}RAiRbX*#2a7GQi%&WkpRE>$%(7h4)b1)tQRw3nPIS@@!jB&q?k z7C^?|2JPR~=p2)*L19VukTQBEuvQdj z>?W_M=ygQh^enZHXHx9~lR=V$h$59&;|v0^vB3B;aSs!cYd>&)#9=AWw8-VNf2Q{b zks9(bPR_q+B&Xh9ygOXu)=cl#&6}f{_d2(m=742G=3QLgGx*Tl%uH~%u*R^hc;6rc z8Nt&oZD3P)wt<>?l!UYGG9=-! z0fg3J_C@g@Er1|}2ejjZ%^I(-oW%;07Ga-)xkFeU`0q`_H^Va@(t_e}zY%}|$Fb)e zNki7fMFQXc=b*zIBNJ0onNz0@Mn`iPSxkV_BuE$aU+B z$1PszQA|yxTH4siT3H?0PT`Mb&O3pyBO;8%B=#mU%}h_r7#Z=A8Uoj@Z9zx}I73Yh zN=$7R^Zb{3V$D7eLCxwTw0=8pof_0twic67wgDW)rcZKsBgJC_DiS1`E>>2RlM7kn z)QSHcoYdDm??C?qKU`a@G&w8uQKZ&xP*H6VCxGnOvBt_)$+JissM+=l32mycAB;6= zy9S~?DTx^yAyQK>qE`69jQ-96g_rEd>cmzq*x4ObS6APO{!J)F2)1XDD$}cFS}X4j zEw-5F>(Cqz%VcG3yJ}=KdBcV5rU1j+iA+O(5^sauvS$ki#bVyRt>(>fj{K_)dFV&J z8_%?aT?UyoUr0;MPyno++0|84+9DlB_oNv3GXWzjTG*gif)Z03!m2UIna^~;# zt#97GWoe2%fB=CXnoz(FrblNF9#V?-9UUEA4?HC&Cs~9`aMrJ3cp4x7oFD<+b6y_V z4#{ao0wf!~@kc@l1Oz3=>0!f_V|~V&&i%qyu0GWgyo>4XPtDB?*b0d;r z1%6IHmvZ8w75_fXdB*wCnxbf@W;WrYEFhW)54A4%QgCW`MJ#ft3!4NEtK=<=mQDui zp;e$Wc3J;A7TY_*j;DKKVn?dVA5SG%VXm?G`}#VQK*QWwH`$FJ*XPyF=Q+Mi#~ryj*=@ZO7t3TSiOn%>$WhAGT?^=4?^RS~E~BwC`|GS(yuO zNp<7y>Fu3t`jWMQkdx!&=-8^a*jEBC@UK#*IcP`Q&{Llr6;x(B%(v6z<09pXp#7)T zRwfUt!_}f%Zg=!<`23uhun>P-_>}dKa-{YTb3V{)MWk&i-V_Y;4!hXde{H~9@%_LI zJ&()EKKgR5xjJ$iN?Aft z_AGxzP1RO{X-oRH2Hx2FFmlCK=k@~IZJ&G6eyik}cV>W?^Tx`zS>wx!<@bHb%S}@9 zHwB;8Pn-D=ju7wY=(r!ts6a7flblQ>XlZEXNL0_S;A2v2n{J+RI{c;T(~E}0?r+>F z_mmRTDpRqtcdFh0*a1AE*T%z(lfBAckr`DdddF@qtFnh-p)DDK>+KtwpRC%dgQzH! zUrZ;NEv>9XeS9oVd=e-e0ct89bku_f4Sw?pWyb$qHwk zI%chm%sIp9I$|G|64(r?dx~C9lGC|JLwE-CcksoF!D@lAp4Tnu!-jp#($pt+PS)m4 zoO~G7F@6l^pAXU^nCA3CM-w~BU9XhGCK3P1&G&4~CXs}9HBWpdha5?wnzLtXH5|*!OS`AaAM1?gdozX{XNDsxdV>7# z3IRABXZ<+&g@madJWwYRNHh;3>Afmg_0H zGN0HyLbHd-Kfz}QI=lsiy)D(5TJ9yICMhEmj3D$fQVLfoLpc>k>odg*_Mu28pIjK3 znv&K^do0;0C*+7ptJTak2cvXVRA2cS(=2kQagp$}H3iXgQvIOSG?|s|AFktg1;xo|f3tYV`gCwvmLs1ZO=iYkKg_*e#niasY1FkH$M3zVyfT=r``g!#0xg|_>Vmo=-9Rr+_U(L78=bh4plsH-i56&yk`r z;pgMF^&NXf%ztI^$my%$&JIN%(iEb)eNu;<-0y_zH$I-+DTB*8mLgrr8qI?u(o0>2 zjM6&W@5&tD=Wr4m&zaBy6d9VCsx`!NYd%_9T1=`oCX8|7GYZXqcjzt!AGnd-^TuQ+ z-j>DZI@!aIOVQ!MDkm@H6XdI&B{aL}y&rwQ=r|d7^Q%z?efdy(=7`?->SiohD}rB3 zbK;Cd+sLc*B+B7lPT-u@@0n0gx5;zRc0Wms^#~7VAZV{lxIfFy{gJMj*wCHFdVBP8 zrjnt!g-M6?%!AW=iSczS;g25c&Sq1fwAZ(zXaBJ8&v6via=m{)glx3^eC?Z;;; z^b9*bzI#WdEVX9(^oO%cvHwh$aBz}b7761 zQbD|Zb@<4MQ)f1OT%4uD)Rel=%}XhQF(Y=f?K8)^o7C39yjnH&!q&_d$%jyME+zlo zn_qhxay9Z6v|+%xAg<=1ByC~xB8X|DmR6V41S>6bz_~=NyQ0_g&Hid-HVZ(i2xVauiJ`NoDZAC%YFI`9wG^mw#)!m+) z{c8`bja8Yoa7!DTANTe%#Fo5hICket1D#cBs-t1Q8WcRm_Z~!{SVZ*WuJsv2m;tHo&Fe=4I zv)V~gkhg(Xuc!wwU00{}mbvrrr#2~_mx`bkzj!e?!nyvDd7-;TR_NIm*aVG+5q*hh zPw2hwAQp*WT!9lsGFAYT6#RDHd8R~uzx`=}fm$sOWE^uX1&q{3PWCQSMcC8`4<65Y z_Wm$579^pbPF*Ku^%Dn{OAX(wCNCU%-08-ex%z<$`Oa~zW;gwc`O;19GUbT7UU9Fp zdu#K){`m2ucVhgWZ^H+l zeNL1?M_m}7tSrdz(D%mO3_4KM#i~F(R?^1Z$+tKD{rC#&WKEVys$G@5>B>#IkBin+ zndU2F0p)vMfp18?)yRc4(0h?bEnprGwtXEwxvFlX+$q_V3(|`_k=^TZHIQ2~O*`)4 zfDGHHK|td;)qg#8ye(yNJ63;jGS)hnf_lk`Ml z`{_Lx`^j^Mw61FNkEVM`qo$@SP6zBwyTFO<(3`1KBM_#nte}w-yWJy~VnY{fM%CWM zD<|}MWjg44;nd&&DOIl~q0*iDw zY4hooQNHzgLMYn%+l`7rlW*U3bxDe5&8(d_S`})Vd`^|J@d=R~PzWj+x@a76e7Krn zKeZx@Hx9sQ#>o44?K4%5k&}(*4f1;Vcz;3#7Z(?Y%CtOa>ONKPUMB1uGYmMBp~a;C^R=c;<6{Jy>K+3)Oq-?{I{ z`|+wZY)z$Bt(t4j5qj@qjOz%4jkE_~dU$Egs_kl>5y426ZkbSSPXa1hiVzA`hr>Pg zbKyC5qPPE!Y$;fE@Tgt|ZbG(Xt0gPn@la49N%$Bbm{PDa^P#OI4@7#6SI7heOb??q z)ZXV7k;3s$Hvy!fr>EzkyGLA6;;3UP4fr||R3uW)jbN*%2cz!N|qU?^kZkNm`h zv=Yzx^TX??p!Ly1#>ti}Geg|yNc#3YcM({w^eeQx!@G#lCs@nkrol4zmlg_z(pQSF zPafNx73VP|8b$5eRIL4Cb6c1i4-%gfNObd(a~(_{-z#eJhD(591@=*pbU$q%p z8bd3KYtHTjhG#mIl=i9{iYHUUaQ@lQ9p>xMMB^h#(vW3{^B%R5TEY)xFWO4bI^m?A-d>8ATo zO+YGe<%6Dul~rB&Y9$$xi|fS6Q^yfAo$)W7$8gUQ&`mu1Ps!&#s-$F=o`%c=toMC6 zIbUhcrq4aAcd~kJga56my>p={`u^3D-K6rhJd{*0N451mn12Ey7rUmnAK^RUGq*&Z zA-rRNh6<=?r~PN z&eyaON$Kh7(`A9_7PKDrjT_Vg{uA~N8>Cg_6gDF7Qp?I{lD)AfLDo^UAPyA8Ogr?1U%JtK!QKybgZ&r!%zgl?V%qi9qK< z&Q}o;_OZ}nP}h~SHtj|?w<}f}^a5T-6Q2EL&a~&>`d_)?E*=)>#N)y z&u2}Nv6kjd*SDtv`nu|1vb$jCgXC^<243X1mzMIx4WpR8K84`MZxS#^_=xIzDw@Y} zr||lXO9`)vK}HF~1YRpk?w<&{z_HNHGoxEfR6Eg??mzmzDV}Xq2BP|aQ04ENTvfq6 zS?a)SHGNaIbK{4&I9$?)>FkSRToPl&^GxNb>KaD93GM;PG=4!`rF5=bl@wQMYw=D} zCXD9QQfd>Zw#|#g*>83@=@ra&G|jJ6dfs60o_ugtQ4t1=QC!n=yCVJKWq6D@9ar^% zeu2%)moL5?BvQGV51=7xyLE7qBHws6R;utcagg+_`zMY|GjStpORI%W-9nyBKV!3EOhjH>`?#_UhtazP*wHiItAAYKoHa`F}xKT_-&`dJ*Dkn<1lJ7ySK^*nwjET+N60faWAiOUtFv zQ-2cRn*M?IN%%L(yQCI)9K7rOWheD9fTXQLGt2Qc2_(cXYVa7f%jEmAKc8c88DFPC zv*kuW&m@}lZEJn)G*P~r_{JO>L%)ptSg^KoKtyt;2}J#EQQk1bti)qR0k%-tfk#QR z&ic_At{58_pJl3JKOG4tAA(F}iEVx+rquDw4e5md@+Z|k1f-0TFMR8-HdC#XtT&=! zc5INyrf!I!r&4aLJ@jA_zDmhw*3PSkxJgv9iajK!JOBFN;8cMiSBc$mm(@|5!Nz+t zmOFDgLY7?7+3V{%H6o$FdB(LYkjhh83Vg1 zj+z@kDJw8LVk1cuj9zP9C^A_CkftW~tk4euDHZzE#BhQ{2%-R81R_6Xb%4@mrbkWXs}&*j^;h}%f1^8f%K>amwC?Wz4pSqZ_vv|m zJajzwjF55fB7<&G+c&wJk#W74JsF=~b7A)x{nqu{?=I7^ z6VO9s`aYu=DYWhu@i~|v1kUSyNy!P8k1QEUxQGE(#W*4aD7;L^if0;6fh&0W^r^v2 zw$&R^FKQ@38%aeSIW|EGnWUeFOIBC)=m0?82cIW#+Al`L zih;9fs5KM)a+(#FVC6pB_x%U)@SV*1;ZjGtv1*2zXnil!d}xSr<<~D6Cc%!q$_I?` zw)Vpv)qP$V0caRyZ-CQ>BDIr<63^@0tWGY`XOBmXmY%@rVnuCB49WdSXnPgap&aIN zxE#AfeAR_xS5mG3(2Yt-FFFN2gR%PNTJpLYQ6D&=?YDk@RIUP(VnV^0*b~^+91O^|0{=ckAi6=KF2!((?Nv? zJ|Z4aaNPyKJe2N-w2BH7BysDlMf&Sos$u9wWUmpR3+P>a)a{1`mnAVrXNGrB@?Vx` zL;g-HpLh-B;1iZn+#2&Rwo@#BJ!5rZb=Ln!#5GWEl~yYwYedkpDH$9>QSKR%qWHsj z2j_E+Stj&5^wGD6AtSWABJOSST#2F4dOjx^z4pj2=m;??DJkiOI$Me%`oCH5MT@bgK6mBJTvihcJ&AE_SxBP0aONLx0AnIxuhK9r8_%| z7bU+uITd7*C}=Yp9LY8&y4ch;Vj@+^0o{F}uJhF$e_oh&Z|?71p}6Jx)nnVUzrYMx zyx173*d&FuPcV6k7jfnNqW5sE+D?l&vM+q6c;@H{xYJ*_YBu9SQdoA z=&%UP=eT2`c?qh1A8F`^-8(ZwfXLM^K|uf2ySm;IOibU`2idq1*?)gxQ|s}BMkDonKE|w zzs!%}eC7;&ef^lP^3wqZXEi9B(TARiM?#5dlPsgRbvV_FXBYLnPTM-TcGoS1G+4|+ zFB5-2J|YH`rSvz2Xl6yn93@aFY-uZd-_CMlih5*ZB++R}=aqCK5qIE2Lqw@3-6&2q3c3s7ikxNu4j3zt-HDpdu=L$y%z9p>D_1LXQza5 zICYnH9Gk-&@DZ5n=4^Xyu~pygb0@rTbzy+Euy>1o^#8S0c$Wze903J>J@3;kT^l^! zg2!wg&0mBP0SGS3q?8QT&YcLtS6vx!$8b=bAgE``-;c4oU1JihBnv8GJ@0LS0I{+D zgkjUYFO=Ds87u3(dBSYnV$x12+=~IX<&I_XNIA848ZlVRDk1iju9)lP8#l=5ZI(@! z1Me|aV8?Kifvm~Wx;8mHs?qCnWJilW&=@?1A!8$nCTwIMCfWHxlR%w>M2=*_8m~i! z1f=V1@4!y~mQ#VwMLoM?mx&%Gxvc2>U@y5W4?mBJx-jSL(T$bz!6jOZh0yx&wm#N; zwOcuqX!85`P^zzhes8t`2G*uA%oUh9byh~b`)Mm)>QLl(O$ zca92#T_%D$v3lG{6?K^8j&Rk{fVPo>xM^S~uT> z9n_%ODISzRKmRB7M&dAJPmc=8fX#0mb31cq5=~A?9RPi>u1`5+Yhfh6Y0-mL6#~W+ z<5TydcZX3sjG-vi5$BG!SUy5!Da={Chy*(O6=4o&)vI?UXF6hSdY^aiJKNcDuaq9z z!W22j^l8AU=?4a6yLx+J7Bq48{tWF|`3F2yDZ0D*B?ebOCk|2jIYKg%56}~_f#svQ zwdF#Q#BBuLFbUcY`W{tyIVC=8FgOR*LJDNvSk|E)OJ}eTbp&kri0cQ8&ysgUuolq~gst3rzJwvX@e0yxSED zrup)co@?L^Mg6Xl)NyGSPb^dA5pXLF?X3H+8ZP$Q+`rG@=Q}mwwu&J;hJZwS4--ZY ztW~IF$nEj1uGhyea8*$iork&09n!gu#S|?ZIra*h&dKgB)4+ zt7o!d^mT2TeV2v#&t6oBc~UE*WA+4m?*#cJ&>Zb#ChF_=-l|i%hiJrzCm zB^)n!9UbwQEHuCnf%>RqA!eQ%wUb8>nAJ5mH`m~oIW$qs)2T`q=d_!>GFS+PE(?d@ zIza@5`QHzceQKa;GF;MDT>ATWZp_zKZs&!2P_}0}Ahx?rc6OnN<5l@_*Rev%RtC@P z_|==ZH8R{*6JrfeWU+a}YpU-@B7B{d(+}`r0ZX*5MbrJePjeI(Q8h6I3aaY=;KUpn zZ9G1MoDWb%baSmYAee|}c%ppr?fHtM?~dw>$1_6p+s!!EdAnhdw z01(9E)+#D~lP`N#w_Fo8@$?4Mp&>{i2nM(0)330K6%0AMj_fNFX6)12P4!6Ky^9ip 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 Date: Sun, 26 Nov 2017 17:00:17 -0500 Subject: [PATCH 05/33] Add missing images for help file. --- docs/source/images/CustomSender.png | Bin 0 -> 23642 bytes docs/source/images/FileComparator.png | Bin 0 -> 61090 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/source/images/CustomSender.png create mode 100644 docs/source/images/FileComparator.png diff --git a/docs/source/images/CustomSender.png b/docs/source/images/CustomSender.png new file mode 100644 index 0000000000000000000000000000000000000000..e40f9801fed293d803192bf24e9314d2f998a7db GIT binary patch literal 23642 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 DTxeIB literal 0 HcmV?d00001 From 0b2176dea7ce345d787007f293ac6a661a82e3ed Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 22:25:02 -0500 Subject: [PATCH 06/33] Added a lot more documentation for SavvyCAN. It isn't yet integrated into the program but if you're nosy you can look at the files themselves to get information on how to use SavvyCAN. --- docs/source/bisector.rst | 7 +++++ docs/source/conf.py | 4 +-- docs/source/connectionwindow.rst | 8 +++--- docs/source/customsender.rst | 8 +++--- docs/source/dbc_editor.rst | 19 +++++++++++++ docs/source/dbc_manager.rst | 17 ++++++++++++ docs/source/filecomparison.rst | 30 ++++++++++++++++++-- docs/source/flowview.rst | 47 ++++++++++++++++++++++++++++++-- docs/source/framedetails.rst | 10 +++++-- docs/source/fuzzingwindow.rst | 44 ++++++++++++++++++++++++++++++ docs/source/graphsetup.rst | 44 ++++++++++++++++++++++++++++++ docs/source/graphwindow.rst | 43 ++++++++++++++++++++++++++++- docs/source/index.rst | 30 ++++++++++++-------- docs/source/isotp_decoder.rst | 5 ++++ docs/source/mainscreen.rst | 2 -- docs/source/playbackwindow.rst | 3 +- docs/source/preferences.rst | 3 +- docs/source/rangestate.rst | 6 ++++ docs/source/scriptingwindow.rst | 6 ++++ docs/source/signaleditor.rst | 6 ++++ docs/source/sniffer.rst | 6 ++++ docs/source/uds_scanner.rst | 6 ++++ 22 files changed, 321 insertions(+), 33 deletions(-) create mode 100644 docs/source/bisector.rst create mode 100644 docs/source/dbc_editor.rst create mode 100644 docs/source/dbc_manager.rst create mode 100644 docs/source/fuzzingwindow.rst create mode 100644 docs/source/graphsetup.rst create mode 100644 docs/source/isotp_decoder.rst create mode 100644 docs/source/rangestate.rst create mode 100644 docs/source/scriptingwindow.rst create mode 100644 docs/source/signaleditor.rst create mode 100644 docs/source/sniffer.rst create mode 100644 docs/source/uds_scanner.rst diff --git a/docs/source/bisector.rst b/docs/source/bisector.rst new file mode 100644 index 0000000..fe1aa24 --- /dev/null +++ b/docs/source/bisector.rst @@ -0,0 +1,7 @@ +Bisector Window +================= + +. + +.. image:: ./images/Bisector.png + diff --git a/docs/source/conf.py b/docs/source/conf.py index 41babb8..5502388 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -55,9 +55,9 @@ author = u'Collin Kidder' # built documents. # # The short X.Y version. -version = '165' +version = '181' # The full version, including alpha/beta/rc tags. -release = '165' +release = '181' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/connectionwindow.rst b/docs/source/connectionwindow.rst index 039d1cc..b6f60b1 100644 --- a/docs/source/connectionwindow.rst +++ b/docs/source/connectionwindow.rst @@ -1,7 +1,7 @@ Connection Window -============================= +============================== -**Connection Management Window** +. .. image:: ./images/ConnectionWindow.png @@ -10,7 +10,7 @@ At this time GVRET compatible devices are: EVTVDue, EVTV CANDue (1.3/2/2.1/2.2), Connecting To A Dongle -============================= +============================== SavvyCAN is able to connect to GVRET compatible devices to capture new traffic. These devices will present as serial ports on the connected PC. To connect to a dongle select the proper serial port and click "Create New Connection". If a valid device is found on that serial port the first @@ -27,7 +27,7 @@ for details on configuring such devices. Debugging Connection Problems -============================= +============================== GVRET devices present as serial ports and have significant configuration options. However, the ability to configure so many things and the ability to compile the firmware yourself both come as a double edged sword. They present many opportunities for things to go wrong. Because of this there is a debugging console present on the connection window. Click a bus in the table then click "Enable Console" to cause it to start logging serial traffic. From this console you can see what is going on. It shows what SavvyCAN is sending and what it is getting back. It has extended status messages that might help to narrow down diff --git a/docs/source/customsender.rst b/docs/source/customsender.rst index 5962254..b72ff44 100644 --- a/docs/source/customsender.rst +++ b/docs/source/customsender.rst @@ -1,13 +1,13 @@ Custom Sender Window -==================== +===================== -**SavvyCAN Custom Frame Sender** +. .. image:: ./images/CustomSender.png General Overview -================= +==================== This window allows you to create custom frames that will be sent out on one of the can buses. The uses are endless. It can be used to generate valid traffic to control connected hardware. It can be used to test out various ideas @@ -16,7 +16,7 @@ modifications. Layout of the View -=================== +===================== This screen is laid out as a data grid. diff --git a/docs/source/dbc_editor.rst b/docs/source/dbc_editor.rst new file mode 100644 index 0000000..0b50abe --- /dev/null +++ b/docs/source/dbc_editor.rst @@ -0,0 +1,19 @@ +DBC Message Editor +=================== + +. + +.. image:: ./images/DBCEditor.png + +Working with Nodes +=================== + +In DBC files a node is a device on the CAN bus. For instance, the engine control unit (ECU) would be a node as would a motor controller, a battery charger, or any other device that is connected to the CAN bus. DBC files let you define nodes that are +set as either the sender or receiver of a message. This allows messages to be organized for more easy retrieval. To add +a new node click on the empty row beneath the last defined node and type a new name and optionally a comment. The comment is not used by SavvyCAN but can be filled out for your own reference. When a node is selected in the top list you will then see +in the bottom a listing of every message it sends. + +Working with Messages +===================== + +The bottom list is all of the messages that are sent by the selected node. A message is defined based on its message ID. The message ID is the CAN id used for this message. For normal DBC files this creates a one to one correspondance of ID to a given CAN ID. For J1939 messages special masking is done and so more than one actual CAN id will map to the given message ID but still only one specific J1939 PGN will come through. Once a message ID is entered in for a new message it will attempt to auto populate the Data Len column with the number of data bytes that message has. This is only for your information, it is not used by SavvyCAN. You can give the DBC message a meaningful name. The "Fg" and "Bg" columns can be clicked on to set a color. This will set the foreground and background color to use for this message. These colors will be used in the main frame view on the main screen when you click "Interpret Frames." Clicking on the "Signals" column will bring up the signals editor for that message so that you can edit, add, or remove signals from the message. The "Comments" column is once again not used by SavvyCAN and only for your viewing reference. diff --git a/docs/source/dbc_manager.rst b/docs/source/dbc_manager.rst new file mode 100644 index 0000000..e099e43 --- /dev/null +++ b/docs/source/dbc_manager.rst @@ -0,0 +1,17 @@ +DBC File Manager +================= + +. + +.. image:: ./images/DBCManager.png + +Working with DBC Files +======================= + +This screen allows you to load and save DBC files. SavvyCAN supports loading more than one DBC file at a time. It can even use more than one DBC file per bus. But, "Associated Bus" can be used to associate a given DBC file to only one bus. If you don't need to associate to any specific bus then set this value to -1 which means "any bus." The J1939 button causes SavvyCAN to mask out J1939 message IDs to conform to J1939 signalling. You can create a brand new DBC file by clicking "Create new DBC" button. It will be automatically named a unique name for you. You probably don't want that name though. Any time you save a DBC file its name will automatically update in the list. The "Load", "Save", "Remove", "Edit" buttons are all straight forward. You can also edit a DBC file by double clicking it in the list. + + +DBC File Ordering +=================== + +The "Move Up" and "Move Down" buttons can be used to change the order of DBC files. Why would you care? DBC files are accessed in the order they are in the list. When a frame is interpreted the system goes through the DBC files in order. It selects the first DBC file that is associated to the bus the message came in on and that imprements the correct message ID. So, if you have multiple DBC files it is possible that the order might matter. diff --git a/docs/source/filecomparison.rst b/docs/source/filecomparison.rst index 4e25cd5..eb34a3c 100644 --- a/docs/source/filecomparison.rst +++ b/docs/source/filecomparison.rst @@ -1,6 +1,32 @@ File Comparison Window -====================== +======================== -How to compare one file against one or more other files. +. + +.. image:: ./images/FileComparator.png + :align: left + + +The Purpose of the File Comparator +================================== + +This screen can be used to figure out what is different between a set of files. On one side you have a single file. This is called the "File of interest". On the other side you have any list of files. They're not listed any longer as actual files. The program can load frames from any number of files and dump them all into the same "bucket" of frames. You can thus load up a batch of files and compare them against the one "File of interest." The purpose of this is to figure out what is different. Are there IDs found only on one side? For IDs found on both sides are there bits set only on one side and not the other? This can be used to find stubborn data that you are having trouble locating. One use is to capture a large amount of traffic to use as "background noise" of sorts. Perhaps drive around for a long time or let the vehicle idle for some time but never do the thing you need to find. Then do another capture and do the thing you're missing a few times. Perhaps you're looking for a gear shift signal. You could capture a large batch of frames while idling. Then, in a second capture shift several times. Now, compare the two. Somewhere in the differences should be the gear selection you couldn't find. The list ought to be much more narrow than just "shooting in the dark" so to speak. + +The layout of the differences list +================================== + +In the differences list you'll find three main tree nodes: + +1. IDs found only in + + * In sub nodes you'll find every ID found only in the file of interest and not in any of the reference files. + +2. IDs found only in reference frames + + * In theory this should be a fairly small list. Here are any IDs never seen in the file of interest + +3. IDs found in both + + * Here is where the interesting information lies. The sub nodes here are found in both places. A list of all differences will be shown sub nodes of each ID node. Here you can see bits set only in one side or the other. You can also find values only found on one side or the other. These might be candidates for your mystery signal. diff --git a/docs/source/flowview.rst b/docs/source/flowview.rst index a0c8a24..2dbca97 100644 --- a/docs/source/flowview.rst +++ b/docs/source/flowview.rst @@ -1,5 +1,48 @@ Flow View Window -================ +================== -Go with the flow +. +.. image:: ./images/FlowView.png + +The Purpose of Flow View +========================= + +Flow view is meant to show a view of what "happens to" the data for a given ID as time goes on. The flow is a flow of time or messages going by. The goal is to visualize what is going on as time passes. The screen is very busy but everything has the same goal - to show the data bytes across the list of all frames with that ID. + +Selecting an ID to Flow +======================= + +Along the left most side of the window is a list of every frame ID captured so far. You can select any of these IDs. Once you select an ID you'll see the number of frames with that ID just to the right of the IDs list (in the bottom of the Playback Control box). + +Viewing the Flow +================= + +There are a variety of ways that the data bytes for the current frame are displayed. Toward the middle of the window there are 8 text boxes that show the current value of each data byte. At the right of the window are two visualizations. On the top there is an 8x8 grid that visualizes every possible bit in a CAN message. Bits which are white are currently 0 or off. Bits which are black are 1 or on. Bits that are green are newly on in this frame. They were 0/off in the reference. Bits which are red are newly off in this frame. Those bits were 1/on in the reference. + +Below the 8x8 grid view is a graph based view. The "+" in the center marks the "current" time. You can thus see both into the future and the past (relative to the current frame) in this view. All 8 data bytes are graphed according to their value. You can thus see in the graph what the value is doing as time ticks by. + +Between these three views you should have a very good idea of how the data bytes change over time. + +Controlling the Flow +===================== + +The screen has many ways to control the flow. The "Playback Control" box has 6 icons in a 3x2 grid. The upper icons mean (from left to right): Go back one frame, Stop, Go forward one frame. The bottom icons mean: Play backward, pause, Play forward. Playback speed is used to control how quickly the flow happens. You can raise and lower this value even as the flow is playing back and it will change the flow speed in realtime. You can select "Loop Playback" to keep looping over and over. + + +Additional control options +=========================== + +Below the "Playback Control" box is a set of three check boxes. "Live Mode" will cause the flow view to keep the current frame at the latest received frame from the capture hardware. This is thus a "real time" option where the flow will happen in real time as frames come in. "Synchronize windows" causes the flowing in this window to update the position in the main window so that the main window is always at the current position in flow playback. "Graph by timestamp" causes the "Time Axis" at the bottom of the graph view to be in seconds or microseconds. Deselecting this will cause that axis to instead be in frame number. + +Reference Values +================= + +Previously it was mentioned that bits in the 8x8 grid are colored based on whether they are +newly on/off or steady state compared to the reference. What is the reference? Well, look to the left of the 8x8 grid. The reference values here are used for reference with the 8x8 grid. You can set these values to something static and then see how bits compare to that static reference. Or, above the reference values is a checkbox called "Auto Reference" if this is clicked then the last frame is used as a reference for the current one. There are advantages to both options. A static reference can be used to see how things change compared to, say, the very first frame. Auto reference shows how the data changed from frame to frame. Either might yield interesting findings. + + +Seeking to Specific Values +=========================== + +Lastly, it is possible to seek to specific values. "Data Seek Values" normally default to -1. But, if a value other than -1 is found in one of these boxes then it will be used as a seek value. Any time the flow is playing back (either forward or backward) it will compare to the seek values. If there is a match then playback will automatically stop. This can be used to quickly play things back until you get to a specific value. One use would be to seek to a known value that precedes an important section you want to analyze in more depth. diff --git a/docs/source/framedetails.rst b/docs/source/framedetails.rst index de513d2..9309f12 100644 --- a/docs/source/framedetails.rst +++ b/docs/source/framedetails.rst @@ -1,5 +1,11 @@ Frame Details Window -==================== +====================== -Get all the juicy details about your frames +. +.. image:: ./images/FrameInfoWindow.png + +The Purpose of Frame Details Window +=================================== + +This window is used to get detailed statistics about frames. It provides information about a given frame ID across all frames with that ID. You can get such information as the number of frames, the number of data bytes that frame ID has, the average interval between frames with that ID, and the minimum and maximum interval. Also listed are detailed statistics for each data byte in that frame. Each byte has listed which bits changed, the range of values found, and a histogram both graphically (at the bottom of the window) and textually. The textual representation shows the number of times a specific value occurred. Also listed at the bottom is a histogram of each bit and how many times it was set. The graph is a histogram of all the bits and the number of times each bit was set. This can be used to quickly visually see where data has changed. All information can be saved to a text file for later analysis. diff --git a/docs/source/fuzzingwindow.rst b/docs/source/fuzzingwindow.rst new file mode 100644 index 0000000..36bdf48 --- /dev/null +++ b/docs/source/fuzzingwindow.rst @@ -0,0 +1,44 @@ +Fuzzing Window +=============== + +. + +.. image:: ./images/FuzzingWindow.png + +The Purpose of Fuzzing +====================== + +Some people are big fans of fuzzing, some people have no use for it. There usually isn't much in between. So, what is fuzzing and why would you want to do it? Fuzzing is intentionally sending random information to see what happens. It's pretty much the "shotgun" solution - you fire birdshot into the air and see if it hits anything. Does that sound a bit dangerous? It kind of is. So, why do it? It might help you to find frame IDs that control things. It might help you to find a data byte that controls something. Used carefully it can be used to figure out how different values affect things. + + +Fuzzing is Dangerous +==================== +You have now been warned. Sending random garbage over the CAN bus to see what happens could mess something up. It just might put your vehicle into gear and cause you to drive over a box full of kittens. Be careful! Never fuzz a car unless you're right there and you can stop it. Even better, don't do it unless your car is up on a hoist or something and can't drive over anyone. Even still, there is a small chance you could cause an adverse effect to your car. + +Controlling the Fuzzy Beast +=========================== + +So, you want to give it a try? Let's do it! First of all, you can set the delay between frames and the burst rate. The burst rate can cause the program to send one than one frame each interval. This is useful as a CAN bus could potentially support 2000 to 8000 frames per second. Then you can set the number of bytes to send. Ordinarily this would be the full 8 but you can experiment with smaller frames. You can set to send on a specific bus. That's all the simple settings. It gets a bit more complicated now. + +The "ID Scanning" box has two radio buttons: + +1. Sequential will go from "Start ID" to "End ID" then reset back to Start over and over. +2. Random will pick IDs at random in the range between Start and End + +But, perhaps you don't want to fuzz IDs like that? The next box is "ID Selection" and the choices are: + +1. Range of IDs - this uses the aforementioned Start and End IDs +2. Filter list - This causes it to pick frame IDs from the list below either sequentially or randomly according to the radio boxes under "ID Scanning" + +The last box is "Bit Scanning" + +1. Sequential causes it to scan bits in logically sequential order. That is, the first available fuzzing bit is set then the just the second, then the first two, etc. This causes all of the fuzzed bits to sequentially set in order. +2. Sweep causes the system to set the first one, then unset that one and set the second bit, then unset that, etc. Thus the fuzzed bit sweeps and only one fuzzed bit is set at once. +3. Random will randomly pick whether each fuzzed bit is set or not. + +In order to fuzz bits you need to set which bits to fuzz and which not to. As listed at the bottom of the window, there is a color code to the 8x8 grid. Clicking cells in the grid will toggle them between their various values. White bits are never set, black bits are always set no matter what, green bits follow the fuzzing pattern you specified in "Bit Scanning" + +Pulling the Trigger +=================== + +Once you've configured everything click "Start Fuzzing" to give it a shot. You will see the number of frames sent so far listed below the button. You can stop the fuzzing by pushing the button again. diff --git a/docs/source/graphsetup.rst b/docs/source/graphsetup.rst new file mode 100644 index 0000000..f755087 --- /dev/null +++ b/docs/source/graphsetup.rst @@ -0,0 +1,44 @@ +Graph Setup +============ + +. + +.. image:: ./images/GraphSetup.png + +Setting up a Graph +================== + +This same screen is used whether you are creating a new graph or editing an existing graph. If you are creating a new graph then you have two options. + + +Graphing a DBC Signal +===================== +If you want to graph a signal from a DBC file that you have loaded then pick the Message from the combo box. Picking a message will then allow you to pick a signal within that message. After selecting both the message and the signal then click the "Copy Signal Parameters" button. This will fill out the left hand side with the proper values for you automatically. + +Manual Signal Graphing (Or Editing) +=================================== + +If you want to manually create a signal or edit an existing signal then you will find the relevant fields on the left hand size of the window. + +"Name" is for your reference and will be shown on the Graphing Window. + +"ID" is the frame ID to use for this graph. You can enter in either decimal or hex. Hex values are preceded by 0x + +"Data Len" is used to specify how many bits are in the signal to graph. You can graph odd bit lengths such as 9, 11, or 15 bits. These are not as uncommon as you might think. + +"Little Endian" switches between little and big endian mode. This will change how the signal grabs bits from the frame. + +Once you've set both Data Len and Little Endian you can set the bits to use. The 8x8 grid above is used for this. Click on the start bit and the rest of the bits will automatically be selected for you based on Data Len and Little Endian. + +"Signed" can be used to select between signed and unsigned mode. + +"Mask" will apply a mask to the value before using it. + +"Bias" allows for setting an offset to the values to bring them to a different resting point + +"Scale" is used as a multiplier to change the scaling of the values + +"Stride" is not often used but will cause only every "x" values to actually be graphed. This can be used to graph a very dense set of data with less points to speed things up. + +"Color" changes the color of the graphed line. It is automatically randomly set for new graphs but if you don't like the random color you can click the color and select a better one. + diff --git a/docs/source/graphwindow.rst b/docs/source/graphwindow.rst index 8de907c..01159f2 100644 --- a/docs/source/graphwindow.rst +++ b/docs/source/graphwindow.rst @@ -1,4 +1,45 @@ Graphing Window =============== -Graphing the data +. + +.. image:: ./images/GraphingView.png + +Creating a new Graph +===================== +Right click in the graph window to bring up a popup menu. The last entry in the first section is "Add new graph". This brings up the Graph Setup Window. From there you can create a new graph. + +Selecting a Graph +================= + +You can select a graph either by clicking on it or by clicking its name in the list of graphs up that the top right. + +Editing a Graph +================= + +You can either double click its name in the list of graphs at the top right or select the graph, right click, and select "Edit Selected Graph" + +Deleting Graphs +================ + +There are two options. You can select a graph, right click, and select "Remove selected graph" or you can right click and select "Remove All Graphs" + +Moving Around +============== + +Left clicking and dragging in the graphing area will allow you to pan around. The mouse wheel (if you have one) will let you zoom in and out. If you select the numbers on either the X or Y axis then you'll be able to pan and zoom on just that axis leaving the other alone. This is useful in order to expand or shrink the time axis or to rescale the vertical axis to better fit the data in view. The "+" key will zoom in, the "-" key zooms out. You can also zoom in and out from the pop up window that appears when you right click. If you've messed up your view and can't figure out how to fix it then right click and select "Reset View" to get a nice view of all the data again. + +Loading and Saving Graphs +========================= + +It can be beneficial to create a set of graphs that can be used over and over. You can save the currently setup graphs to a file and then load it later. Right click on the graphing window and use "Save graph defintions to file" and "Load graph definitions from file" to do this. You can also save a picture of the graphing window. PDF, PNG, and JPG are supported. Lastly, you can save a spreadsheet of all the graphed points. + +Real Time Graphing +=================== + +Sometimes it is useful to graph while data are still being captured. When this is done it is additionally handy if the view follows the new data. In the right click pop up menu you will find "Follow end of graph". It is a checkbox. When it is on the current view will follow the end of the data captured. The "window" you've set up will scroll. That is, the zoom and vertical calibration will stay the same and only the "Time Axis" will scroll such that the end of the capture is always at the right hand side of the graphing window. + +Hidden Tricks +============== + +If you double click on a graphed line the main window will scroll and the frame that produced the nearest data point to where you clicked will be selected. Additionally, if you selected "Synchronize Windows" in Flow view then the graphing view will synchronize to Flow view as well. diff --git a/docs/source/index.rst b/docs/source/index.rst index 7ccd62d..75efd02 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,27 +1,33 @@ -Welcome to SavvyCAN's documentation! -==================================== +Welcome to SavvyCAN V181 documentation! +========================================= Contents: .. toctree:: - :maxdepth: 2 + :maxdepth: 1 + :titlesonly: + :numbered: mainscreen + connectionwindow preferences - flowview + dbc_manager + dbc_editor + signaleditor graphwindow + graphsetup + flowview + bisector + sniffer framedetails filecomparison + fuzzingwindow + isotp_decoder + rangestate + uds_scanner playbackwindow customsender - firmwareuploader - + scriptingwindow -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/isotp_decoder.rst b/docs/source/isotp_decoder.rst new file mode 100644 index 0000000..147649d --- /dev/null +++ b/docs/source/isotp_decoder.rst @@ -0,0 +1,5 @@ +ISO-TP Decoder +=============== + +.. image:: ./images/ISOTPDecoder.png + diff --git a/docs/source/mainscreen.rst b/docs/source/mainscreen.rst index 36bf14c..c54ba00 100644 --- a/docs/source/mainscreen.rst +++ b/docs/source/mainscreen.rst @@ -1,8 +1,6 @@ Main / Start Up Screen ====================== -**SavvyCAN main screen** - .. image:: ./images/MainScreen.png This screen embodies the core of the program. Here you will find the master list of all frames. Also, here you can navigate to the other aspects diff --git a/docs/source/playbackwindow.rst b/docs/source/playbackwindow.rst index 7254407..1acf3b2 100644 --- a/docs/source/playbackwindow.rst +++ b/docs/source/playbackwindow.rst @@ -1,5 +1,6 @@ Playback Window =============== -Play back that which was once captured +.. image:: ./images/Playback.png + diff --git a/docs/source/preferences.rst b/docs/source/preferences.rst index 9080b89..6fdb789 100644 --- a/docs/source/preferences.rst +++ b/docs/source/preferences.rst @@ -1,5 +1,6 @@ Preference Window ================= -So, what do you prefer? +.. image:: ./images/Preferences.png + diff --git a/docs/source/rangestate.rst b/docs/source/rangestate.rst new file mode 100644 index 0000000..626545f --- /dev/null +++ b/docs/source/rangestate.rst @@ -0,0 +1,6 @@ +Range State Window +=================== + +.. image:: ./images/RangeState.png + + diff --git a/docs/source/scriptingwindow.rst b/docs/source/scriptingwindow.rst new file mode 100644 index 0000000..2a291f4 --- /dev/null +++ b/docs/source/scriptingwindow.rst @@ -0,0 +1,6 @@ +Scripting Interface +==================== + +.. image:: ./images/ScriptingWindow.png + + diff --git a/docs/source/signaleditor.rst b/docs/source/signaleditor.rst new file mode 100644 index 0000000..43005b5 --- /dev/null +++ b/docs/source/signaleditor.rst @@ -0,0 +1,6 @@ +DBC Signal Editor +================= + +.. image:: ./images/SignalEditor.png + + diff --git a/docs/source/sniffer.rst b/docs/source/sniffer.rst new file mode 100644 index 0000000..e0169cb --- /dev/null +++ b/docs/source/sniffer.rst @@ -0,0 +1,6 @@ +Sniffer Window +================= + +.. image:: ./images/Sniffer.png + + diff --git a/docs/source/uds_scanner.rst b/docs/source/uds_scanner.rst new file mode 100644 index 0000000..e5876dd --- /dev/null +++ b/docs/source/uds_scanner.rst @@ -0,0 +1,6 @@ +UDS Scan Window +================= + +.. image:: ./images/UDS_Scanner.png + + From 7997ebc9660a789631ec7edcb4c73b9e848f4406 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 27 Nov 2017 21:49:17 -0500 Subject: [PATCH 07/33] More documentation has been filled out. --- docs/source/isotp_decoder.rst | 14 ++++++++++++ docs/source/playbackwindow.rst | 31 +++++++++++++++++++++++++++ docs/source/preferences.rst | 33 ++++++++++++++++++++++++++++ docs/source/rangestate.rst | 17 +++++++++++++++ docs/source/scriptingwindow.rst | 4 +++- docs/source/signaleditor.rst | 38 +++++++++++++++++++++++++++++++++ docs/source/sniffer.rst | 12 +++++++++++ docs/source/uds_scanner.rst | 15 +++++++++++++ 8 files changed, 163 insertions(+), 1 deletion(-) diff --git a/docs/source/isotp_decoder.rst b/docs/source/isotp_decoder.rst index 147649d..0d54a0c 100644 --- a/docs/source/isotp_decoder.rst +++ b/docs/source/isotp_decoder.rst @@ -1,5 +1,19 @@ ISO-TP Decoder =============== +. + .. image:: ./images/ISOTPDecoder.png +Using the ISO-TP Decoder +========================== + +This window scans the existing captured frames and newly captured frames to see if it can find CAN traffic that seems to conform to the ISO-TP standard. ISO-TP is used to send multi-frame messages and as an encoding standard that forms the base for other protocols such as UDS and ODBII (which is essentially itself a subset of UDS). + +The main list at the top shows any messages that seem to conform to ISO-TP. There will very likely be messages here which aren't really ISO-TP. You can deselect IDs that seem to generate false positives so that they quit showing up in this list. As you can see in the picture only the ids 0x7E0 through 0x7EA were selected. These IDs are standard for UDS communication. If you want to immediately recalculate the results to exclude the deselected IDs then push "Interpret Previously Captured Frames" to regenerate the whole list. Otherwise the effect of changing the ID selections will only happen for newly captured frames. + +The "Show incomplete and/or corrupted messages" checkbox will cause a lot of false positives and should only be used as a last resort if you suspect that you might have some dropped traffic. + +"Use extended addressing" will cause the decoder to assume that extended addressing is being used on this CAN bus. Extended addressing adds an additional byte of addressing that is found in the data bytes of the frame. This isn't that commonly used but is used on some vehicles and ISO-TP decoding won't work properly unless this setting is correct. If you find that decoding seems to have failed you might try toggling this setting to see if it helps. Remember to click "Interpret Previously Captured Frames" to recalculate things for previously captured traffic. + +Once you have messages in the table at the top of the window you can click on a message to get more details about it in the text box in the lower left. In the picture you can see that 0x7F 0x10 0x12 was interpreted as a UDS error response saying that the ECU does not support the requested sub-function passed to the diagnostic session control service. This is much easier than trying to remember what all those bytes mean off the top of your head! diff --git a/docs/source/playbackwindow.rst b/docs/source/playbackwindow.rst index 1acf3b2..88d19e9 100644 --- a/docs/source/playbackwindow.rst +++ b/docs/source/playbackwindow.rst @@ -1,6 +1,37 @@ Playback Window =============== +. + .. image:: ./images/Playback.png +Preparing Frames for Playback +============================= + +The first order of business is to load some CAN frames that you'd like to play back onto a CAN bus. In the lower left is a section titled "Playback Sequence". It is so named because this playback interface can play a chain of different CAN captures very configurably. It consists of a list of captures to playback along with how many times to play each sequence item. For instance, you could play a file twice then go to the next, then play a third one four times. A playback item can either come from a file (Load File) or from the current list of captured frames on the main window (Load Captured Data). If you load the currently captured frames it truly means "currently". That is, if more traffic comes in it will not play that new traffic back. A snapshot is taken at the time you push the button. Each sequence item has its own list of ID filters. In this way you can send only some of the frame IDs from the capture and this list can be different for each file or capture you load. The list of ID filters can be saved and loaded to make the process faster in the future. + +Once you've set up a sequence of frames to playback you can also decide whether you'd like to loop that sequence forever or not. Up above the Playback Sequence and ID Filtering sections is the "Loop Sequence" checkbox. + +Playing Back Frames +==================== + +The playback window can send frames on a specific bus, all buses (be careful with that!) or "From File." Some file formats store which bus each frame came in on. Also, the main window stores that info. So, captures that stored the bus properly could be used to send frames out multiple buses always to the proper bus for the frame in question. But, if you load a capture without this info it will default to bus 0 so bear that in mind. + +The next order of business is frame timing. There are two approaches possible here. If you click "Use original frame timing from captured frames" then frames will be sent out in approximately the same timing as they came in with. The word approximately is used because it is difficult to get 1ms timing precision on a desktop OS. Frames that come in rapidly might have a 2-3ms jitter. In practice this is almost always irrelevant. This setting is suitable for nearly all uses. + +Alternatively, it is also possible to send on a set schedule. With the "Use original" checkbox not checked you can set a playback speed in milliseconds and a burst rate. Burst means that it'll send that many frames every tick. So, if you have a burst of 5 and a timing of 10ms then every 10ms 5 frames will be sent. This mode can provide for a predictable number of frames per second and could be useful to test how quickly a device really requires traffic without faulting. But, it will potentially drastically alter the timing of frames compared to their timing when they were captured. + +The top of the window has a series of 6 icons all in a row: + +1. White Left Arrow - Play the last frame (just one frame) +2. Pause sign - Pause playback +3. Green Left Arrow - Play frames backward +4. Blue Stop Button - Stop playback and return to the first frame in the first capture in the sequence +5. Green Right Arrow - Play frames forward +6. White Right Arrow - Play the next frame (just one frame) + +Playback Status +================ + +Below the number spinners for Playback Speed and Burst Rate is text that displays the currently playing sequence item along with the current frame within that capture. diff --git a/docs/source/preferences.rst b/docs/source/preferences.rst index 6fdb789..c1b987a 100644 --- a/docs/source/preferences.rst +++ b/docs/source/preferences.rst @@ -1,6 +1,39 @@ Preference Window ================= +. + .. image:: ./images/Preferences.png +Setting Preferences +==================== +There are a variety of preferences that can be set in the program and persisted for future sessions. + +"Save/Restore window positions and sizes": If this is set then the size and placement of the various windows in this application will be saved when the program is closed and loaded when each window is brought back up in the future. This can be used to create your own preferred layout. If you'd rather things come up in their default state every time then you can uncheck this box. + +"Display values as hexadecimal": A lot of the time people who are doing CAN reverse engineering like to see values in hexadecimal (base 16) instead of the more familar decimal (base 10) system. Checking this box will cause most of the values in the application to show up in hex. This applies to CAN ids and data bytes. Unchecking this causes values to default to decimal instead. The reason for using hex is that each hex digit is 4 bits. Integers on a computer tend to be in multiples of 8 - 8, 16, 32, 64. So, hex digits have a direct mapping to the underlying binary. Decimal does not have this correspondance AT ALL. But, the choice is yours. + +"Require validation of GVRET connection": GVRET style devices run over a serial connection. Serial connections can be finicky sometimes and so the connection can be validated to prove that everything is really still operating and talking. There probably isn't any reason to turn this off except while debugging to see if it changes anything. Mostly just don't touch this. + +"Time Keeping": There are a variety of ways one could timestamp CAN frames as they come into the program. Selecting "Seconds" will cause the timestamp to be expressed as seconds since the frame list was last cleared. This tends to be an easy choice to work with. "Microseconds" will express the timestamp as millionths of a second since the last time the frame list was cleared. This is exactly like "Seconds" mode but without any decimal point. You might find this to be a bit hard to conceptualize. The last option is "System Clock" this will timestamp frames with the current system time when the frame came in. This is still very precise but now you'll get an absolute time stamp with the full date and time. The display of this mode can be changed by editing the "Time Format String" value. It defaults to an output that looks like "JAN-10 12:34:53.234" But you can set it to other values. Look here to find a reference for how you can create new format strings: http://doc.qt.io/qt-4.8/qdatetime.html#toString + +"Use filtered frames in sub-windows": The main window has a filtering interface where you can uncheck IDs to hide them. Ordinarily when you bring up one of the other windows it will still use the main unfiltered list. Sometimes you really do want to deal with the filtered list of frames even in the other windows. If this is checked then the other windows will see the filtered list and not the unfiltered actual list of frames that have been captured. + +"OpenGL Accelerated AntiAliased Graphing": A personal favorite of mine. Checking this will cause all of the graphs to use OpenGL 3D acceleration. Most modern machines have some form of 3D acceleration so this option should be OK to use. If you check this your graphs will look a lot better and on good hardware should also be faster. In the future other options are likely to be added to the graphing screen that will likely only be enabled if OpenGL mode is also enabled. Try enabling this and see if performance is still good. It's safe to leave it off if in doubt. + +"Autoscroll main frame window by default": If checked it will automatically check the relevant checkbox on the main screen when the program starts. This will cause the view to automatically scroll to the bottom by default. This is merely a convenience option if you'd prefer it to be the default. + +"Use timestamp mode by default": This is another convenience option. With this checked the Flow view will default to using time stamps on the graphing area instead of frame numbers. + +"Set Auto Reference by default": The Flow view can either use static referencing or dynamic referencing (see the Flow view documentation for more info). If you'd like to use dynamic referencing and automatically set the reference by default then check this option. + +"Loop by default": Set the playback window to default to looping infinitely by default. + +"Default playback speed (ms)": Set the default timing for playback + +"Default Sending Bus": Set a default for which bus to send frames on. + +"Auto expand all nodes": Both of the referenced windows have tree views that potentially have a large number of nodes. It's more neat not to expand them all by default but it also then requires more clicks if you have to expand them to view the information. So, you can set whether you'd like to expand them all by default or not. + +After changing preferences it is the best practice to close and reopen the application to ensure that all settings have taken effect. diff --git a/docs/source/rangestate.rst b/docs/source/rangestate.rst index 626545f..680b160 100644 --- a/docs/source/rangestate.rst +++ b/docs/source/rangestate.rst @@ -1,6 +1,23 @@ Range State Window =================== +. + .. image:: ./images/RangeState.png +Using the Range State Window +============================ +The purpose of this window is to search for signals that look like they might be important. That's a rather nebulous description. But, the idea is to find signals that seem to vary somewhat coherently. As you can see in the picture in this help, the displayed signal has some jumps but they look like they might "be something." That's the idea. It *will* generate a lot of false positives but it will still provide some decent ideas for where to look for signals. It is up to you to figure out if the signal is anything important or anything you can use. + +To use it first set up the follow things: + +1. The ID Filter list - Deselect any IDs you don't want to search. +2. Sensitivity - This is a subjective measurement. It doesn't affect the results a lot but changing this value back and forth can alter what the program thinks is a relevant signal. +3. Min Signal Size - The smallest signal you want to search for. You can search for signals all of the way down to 1 bit if you're feeling adventurous. +4. Max Signal Size - The largest signal you want to search for. The range between Min and Max changes how long the process will take. If you set Min to 8 and Max to 16 then it will search for signals with 8, 9, 10, 11, 12, 13, 14, 15, 16 bits. You will get duplicates as the same basic set of bits will be used for all of the sizes. +5. Granularity - Sets the bit jump width. What is bit jump width? The number of bits that we move over each time we search for a new signal. If you have a granularity of 1 and a minimum signal width of 8 then it will search starting at bit 0 for an 8 bit message then starting at bit 1 then bit 2, etc. If you set a granularity of 8 then it will search for an 8 bit signal at bit 0 then search at bit 8, then 16, etc. So this sets how finely we will search for signals. A lot of times signals will be found on byte edges so a granularity of 8 will cause all signal searches to start on byte boundaries and this will be OK for many things. But, some designers are more devious and place signals at uneven boundaries. You might need finer granularity to find such signals. +6. Signal Mode - For signals over 8 bits there is a choice to make. Signals over 8 bits can be either in big or little endian mode. This relates to whether bit 0 of a signal is the highest or lowest value. You can search for only big endian signals, only little endian, or try it both ways. *Usually* the developer of a CAN device will stick to one or the other but not always. +7. Signed Mode - Likewise, any signal over 1 bit could be either unsigned or signed. Signed signals have their highest bit as 1 for negative numbers and 0 for positive numbers. You can search for only unsigned signals, only signed, or try it both ways. There really isn't any rhyme or reason for when a signal would be signed or unsigned. It could easily be both ways so unless you're sure it's probably safest to allow the program to try it both ways and you can pick which looks best. + +Once you've got it all set up click "Recalculate Candidate Signals." Be prepared to wait depending on what options you selected. Once it is done processing you'll get a list of candidates in the upper list labeled "Candidate Signals." Here you can see all of the signals it found. You get the ID, the starting bit (remember, bits start at 0 and go through 63), the length, and whether it was signed/unsigned and big/little endian. If you click on or otherwise select a signal in this list then a graphical view of it will appear in the graphing area beneath. You might try the arrow keys Up and Down to move through the list. You can even hold down the arrow key and let it rapidly scroll. As it scrolls through the signals you can look at the graph and stop when you see a signal that catches your eye. This is useful as you can have hundreds of candidates and it is tedious to view them explicitly one at a time. diff --git a/docs/source/scriptingwindow.rst b/docs/source/scriptingwindow.rst index 2a291f4..45cd5fc 100644 --- a/docs/source/scriptingwindow.rst +++ b/docs/source/scriptingwindow.rst @@ -1,6 +1,8 @@ Scripting Interface ==================== +. + .. image:: ./images/ScriptingWindow.png - +Woah boy, this one needs some explaining! This will be a very long help file indeed! Leaving this for last! diff --git a/docs/source/signaleditor.rst b/docs/source/signaleditor.rst index 43005b5..1aa7873 100644 --- a/docs/source/signaleditor.rst +++ b/docs/source/signaleditor.rst @@ -1,6 +1,44 @@ DBC Signal Editor ================= +. + .. image:: ./images/SignalEditor.png +Defining and Editing Signals +============================ +If you're starting from scratch or otherwise adding a signal then you will need to right click in the list box in the upper left of the window. From there select "Add a New Signal." This will create a randomly named signal that you can then edit. + +Otherwise, select a signal to edit. The details of it will fill out the rest of the window. + +On the right side you can rename the signal and you'll see that it is renamed in the list as well. + +"Bit Length" - This sets how many bits the signal uses. Once you do this you'll see that that many bits are now highlighted in the 8x8 data grid above. The black bit is the "start" bit, green bits are the other bits in the signal. Gray bits are already used by another signal. You can still use them for the current signal too but doing so would be quite unusual. + +"Byte Order" - The way that the green bits are filled out is changed by this checkbox. Checking it selects little endian mode whereas deselecting chooses big endian mode. This will have an effect on any signal that crosses byte boundaries. + +"Type" can be: +1. UNSIGNED INTEGER - No sign bit, only positive numbers +2. SIGNED INTEGER - The top bit is used as a sign bit +3. SINGLE PRECISION - Floating point number (should be a 16 bit signal) +4. DOUBLE PRECISION - Floating point number (should be a 32 bit signal) +5. STRING - Directly turn the CAN bytes into a string + +"Scale" is used to multiply the signal by the value to scale it appropriately + +"Bias" is added to each value generated by the signal to set it at a different bias point + +"Min Value" is purely informational. It is just a reference to anyone else viewing the DBC information as to what you expect the lowest value to be. + +"Max Value" is likely informational. + +"Units Name" is displayed after the value when you interpret a signal on the main frames list. For instance, you could set the units name to V so that a voltage value reads something like "12.34V" when it is displayed. + +"Receiving Node" This is informational at the moment. You can set which node (out of all your defined nodes) is the one that receives this signal. + +"Multiplexing" This is a somewhat involved topic. DBC signals can be multiplexed which means that a given frame might have a range of data that is not always found in every frame. There is a key of sorts that specifies which piece of data this particular frame is sending. This leads to the concept of multiplexed signals and multiplexors. Multiplexors are the key. They provide a value that specifies which multiplexed data item is being sent. A multiplexed signal is then connected to a specific value of the multiplexor. Thus, a multiplexed signal requires that a multiplexor also exists. You would normally set all of this to "Not multiplexed" and skip all this complication. But, multiplexed signals do exist. In that case the message would have one multiplexor and one or more multiplexed signals. So, you'd set up a multiplexor for the message and then create additional multiplexed signals that are marked as "Multiplexed" and have filled out the "Multiplex Value" with something unique. + +"Comment" is purely informational. + +Signals that use either "UNSIGNED INTEGER" or "SIGNED INTEGER" as their type can define a Value Table. This table allows text strings to be substituted in place of integer values. For instance, if you know that a value of 0x10 means PARK then you can go to the next empty entry in the list, type 0x10 for the value and PARK for the Text. This will make the interpreted value read PARK any time the signal has a value of 0x10. This is used to make a more human friendly presentation. It should be noted that if the signal has a value not in the list then it will still be shown as it's integer value. But, known good values can be entered in the Value Table to make them easier to work with. diff --git a/docs/source/sniffer.rst b/docs/source/sniffer.rst index e0169cb..a5668e1 100644 --- a/docs/source/sniffer.rst +++ b/docs/source/sniffer.rst @@ -1,6 +1,18 @@ Sniffer Window ================= +. + .. image:: ./images/Sniffer.png +Using the Sniffer Window +========================= + +This window is essentially a graphical version of the linux can_utils. The general idea here is to display a list of frames such that you only see frames that are actively updating. If a given ID has not been seen in 4 seconds the ID portion will turn RED and then disappear from the list. In this way only frames that are updating are in the list. They are ordered by last update time. Bytes that have deincremented will be red and bytes that have incremented will be green. You can use the "Filters" area to mask away some IDs so that they never show up. This can help to declutter the list. + +Notching and Unnotching +======================== + +Honestly, I don't know. It seems that notching means to store the current value of the data bytes for each frame and then use that notch data for the comparison for increment / deincrement to color the bytes. Unnotching would then be clearing that out so that it uses the previous value from the last time the frame ID was seen. But, don't quote me on that. This should be figured out definitively and corrected. + diff --git a/docs/source/uds_scanner.rst b/docs/source/uds_scanner.rst index e5876dd..310974d 100644 --- a/docs/source/uds_scanner.rst +++ b/docs/source/uds_scanner.rst @@ -1,6 +1,21 @@ UDS Scan Window ================= +. + .. image:: ./images/UDS_Scanner.png +Purpose of the UDS Scan Window +=============================== +This is essentially another CAN fuzzing window but a very special one. This window is meant to search for UDS compliant (or nearly compliant) nodes on the CAN bus. It can also be used to do a blanket search for services, sub functions, and data items on a known UDS node. + + +Using the UDS Scan Window +========================== + +UDS queries are sent out on the bus from "Starting ID" to "Ending ID". Usually UDS compliant ECUs will respond to 0x7E0 through 0x7E7 which is why those are the defaults. Some vehicles use UDS "like" protocols on other IDs. Usually UDS nodes reply with an ID 8 higher than the request ID. This is thus the default in the program. However, some nodes cheat and do not do this. It is quite common for responses to come from an address 16 higher instead. To deal with this situation there is a checkbox "Allow adaptive reply offset." If this is checked then replies will be accepted no matter what address they come from. Deselecting this will cause only replies of the proper offset to be accepted. The offset defaults to 8 but can be changed with the "Reply Offset" selector. Additionally, you can select which bus to scan and set how long you want to wait for replies. + +You need to also set a type of scan to do. You can select more than one type. + +"Read By ID" - UDS allows one to read data from the ECU by an ID number. These are not defined anywhere and are custom to each ECU. But, you can use this to scan a range of IDs to see if you get a response to any of them. From c90d15b5bbba3241f1daf191ccde8e22de5e5ec7 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Wed, 29 Nov 2017 20:24:29 -0500 Subject: [PATCH 08/33] More documentation (should complete the whole batch) --- docs/source/bisector.rst | 17 +++++ docs/source/scriptingwindow.rst | 128 +++++++++++++++++++++++++++++++- docs/source/uds_scanner.rst | 18 ++++- 3 files changed, 160 insertions(+), 3 deletions(-) diff --git a/docs/source/bisector.rst b/docs/source/bisector.rst index fe1aa24..784a98c 100644 --- a/docs/source/bisector.rst +++ b/docs/source/bisector.rst @@ -5,3 +5,20 @@ Bisector Window .. image:: ./images/Bisector.png + +Using the Bisector Window +========================== + +The purpose of this window is obviously to split the list of frames into two pieces. You have many options for how to do this. You can split by: + +ID Range - Grab a set of frames between two values. Note that you cannot pick and choose frame IDs here but rather just use a list. If you want to pick and choose then use the filter interface on the main form and then save the filtered list from the File menu. + +Frame Number - You can split right at a given frame number. All frames up to that number will be on one side with all the rest on the other. + +Percentage - Pretty much just like the Frame Number option but in percentage instead in case that is more convenient. + +In all cases, you have the option of which side of the split you want to save. Click "Calculate Split" to process the split. You will see above the buttons a reference of how many frames there were in total and how many you would be saving after the split. From here you *should* be able to do one of two things: + +"Save split frames to a new file" - Save the new list of frames (after the split) to a file. You can save to any file format that SavvyCAN supports elsewhere. + +"Replace main list with split frames" - Were this to work it would replace the frames loaded in the rest of the application with the split list. I'm sure this would be a really nice thing to be able to do. Well, you can't right now. It's not implemented yet. So, just imagine you can do this. In the mean time you can save to a file then load that file. Sorry... diff --git a/docs/source/scriptingwindow.rst b/docs/source/scriptingwindow.rst index 45cd5fc..ad5f547 100644 --- a/docs/source/scriptingwindow.rst +++ b/docs/source/scriptingwindow.rst @@ -5,4 +5,130 @@ Scripting Interface .. image:: ./images/ScriptingWindow.png -Woah boy, this one needs some explaining! This will be a very long help file indeed! Leaving this for last! +Purpose of the Scripting Interface +================================== + +To give you an open ended place where you can write JavaScript files that do whatever you need them to do. You can load several files at once and they'll all work at the same time. Scripts can expose parameters that can then be edited by you while the program is running. They also update 4 times per second so they can be used to give feedback of the current state of the script as well. But, it is safer to give status in the "Log Window" instead. However, for values that might need to be seen and frequently updated it might be easiest to show them as "Public Variables". + +Managing Scripts +================= + +In the bottom left is the "Loaded Scripts" list. You can create a new script by clicking the "New" button below the list. The new script will have a random name until you save it. The "Del" button will delete the currently selected script but it will ask you first. The "Load" button will load a new script from a file. The "Save" button is above the main script view which is in the upper right of the window. "Revert" will revert the script to the last version that was compiled. Any changes you've made since compiling well be reverted. "Recompile" is used to compile the script and begin running the new version. + +Getting Script Status +====================== + +There are two places you can look for the status of a script. The "Log Window" is directly below the script source code editor. This window is shared between all scripts and shows the status of compiling scripts as well as log messages from each script. The script name that sent the log message is prepended. The number before the script name is the amount of time the scripting window had been open for when the message was sent. This unified interface can be used to keep an eye on all of the running scripts and to debug issues when a script is compiled. Any compile errors will show up in the log window. You can set the checkbox on "Auto Scroll Log Window" to make it continue to stay at the bottom of the log. You can clear the log at any time as well. + +The other way to see script status is to use the "Public Variables" interface. Here you will find variables that were registered by the current script. Each script has its own list so information that needs to be updated frequently and/or specific to a script and easily accessible should be registered here. But, public variables can have their value set by you, the user, as well. So, care should be taken not to edit variables used for script feedback and scripts shouldn't try to change the value of variables used for input to the program. + +Writing Scripts +================ + +You are more or less free to write JavaScript scripts but, of course, you aren't in a web browser so browser specific functions are just not there. In their place are a couple of JS objects that allow the script to interface with the CAN buses connected to SavvyCAN. Also, certain functions can be created to automatically register callbacks. + +Callback Functions +=================== + +These functions can be created in your scripts to enable certain functionality: + +setup () - If you create a function named setup then it will be called as soon as the script starts. Yes, you probably could just dump code into no function at all right into the file but that's bad form! + +tick () - If you registered to receive a periodic tick within your setup function then the script interface will call this function for every tick. You can do whatever you need to periodically do here. But, you get only one tick handler so if you need multiple tick rates you'll have to create a fast tick here and dispatch from this function at different rates yourself. + +gotCANFrame (bus, id, len, data) - A callback that will be called whenever a CAN frame comes in that you've registered for. You did register for frames in your setup function didn't you? Well, if you use one of the below callbacks you might not need this one. + +gotISOTPMessage (bus, id, len, data) - If you are instead looking for ISO-TP messages (which could have been multiple CAN frames in length) then you can create this function and it will automatically be registered with the system. But, you still will need to set which ISO-TP message IDs you want to receive. That is covered later on. + +gotUDSMessage (bus, id, service, subfunc, len, data) - UDS messages are transmitted over ISO-TP but with additional structure. If you're looking to interface directly at the UDS level then you can create this function to have it automatically registered. As with raw CAN and ISO-TP you still need to specify which messages IDs you are interested in. + +The host Object +================ + +The first object you can use is "host" This object handles setup of the tick timer as well as logging output and registration of public variables. + +host.setTickInterval(interval) - If the interval is more than 0 then your tick callback will be called every "interval" milliseconds. If a value of 0 is passed then the tick timer will be stopped. + +host.log(text) - Send text to the log window. It will be timestamped, marked according to which script sent it, and placed into the log window. + +host.addParameter("variablename") - Add the named variable to the list of public variables. From then on any changes that you make in the GUI will immediately show up in the script and any changes the script makes to a value will reflect in the GUI within 250ms. Remember to use quotes around the variable name. You want to pass the variable name, not its value. + +The can Object +=============== + +This object is your interface to raw CAN. It has the following functions: + +can.setFilter(id, mask, bus) - register to receive messages based on an ID, Mask, and Bus. It works like this. First the bus is compared. If it doesn't match the frame is not delivered to you. Then, the incoming frame has its ID ANDed with your mask. Let's say your mask is 0x7F0 and the incoming frame has an ID of 0x235. 0x235 AND 0x7F0 is 0x230. This value is compared to the ID you passed. So, if your filter ID is 0x230 then the frame is accepted and you will get a callback with the frame. Otherwise the frame is not delivered to you. This masking setup is very common in CAN bus interfaces. Basically, the mask allows a single filter to accept a range of IDs. 0x7F0 would accept 16 different IDs (0x230 through 0x23F in this case). 0x700 accepts 256 different IDs, etc. + +can.clearFilters() - remove all filters and revert to a clean state. You will no longer receive any CAN callbacks unless you create more filters with setFilter. + +can.sendFrame(bus, id, length, data) - Send a CAN frame out the given bus. The CAN id will be what you set as will the length. The length can thus be different from the actual length of "data" which should be a valid javascript array. The length can not exceed 8. The frame will be sent as soon as possible so long as that bus is connected and not in listen only mode. + +The isotp Object +================ + +isotp.setFilter(id, mask, bus) - Exactly like the raw CAN version in the can object. Allows you to register a filter so that you can receive ISO-TP traffic from the filtered addresses. It should be noted that you'll essentially only get traffic that seems to be able to be turned into ISO-TP traffic. Any CAN frames obviously not ISO-TP will be rejected. + +isotp.clearFilters() - Clear all ISO-TP filters and no longer receive ISO-TP traffic. + +isotp.sendISOTP(bus, id, length, data) - As in the can version. The difference here is that ISO-TP messages can be longer than 8 bytes and so might get turned into a multi-frame set of messages with flow control. This is handled for you by SavvyCAN so you needn't handle of the details of the exchange. + + +The uds Object +=============== + +uds.setFilter(id, mask, bus) - Exactly like the other two setFilter functions. Register for a set of IDs to be interpreted as UDS (if possible) and sent through to your callback. Any obviously not UDS traffic will be discarded. + +uds.clearFilter() - Remove all filters and quit receiving UDS traffic. + +uds.sendUDS(bus, id, service, sublen, subfunc, length, data) - Sends a UDS message out from the script. service must be between 0 and 255, subfunc can be larger than one byte if needed. data is only needed for extended payloads as the actual UDS protocol is handled by the service and subfunc parameters. + +A full example script +===================== + +`` +var newID = 0; //set this to the ID you want your RLEC to become + +function setup () +{ + host.log("RLEC ID Changer"); + can.setFilter(0x0, 0x0F, 0); + can.sendFrame(0, 0x7E0, 8, [0x0d, 1, 0, 0, 0, 0, 0, 0]); +} + +function gotCANFrame (bus, id, len, data) +{ + var dataBytes = []; + + if (len == 8) + { + if (data[0] == 0xd && data[1] == 1 && data[2] == 0xAA) + { + host.log("Got challenge: 0x" + data[3].toString(16) + data[4].toString(16)); + var notData3 = ~data[3]; + var notData4 = ~data[4]; + dataBytes[0] = 0xD; + dataBytes[1] = 2; + dataBytes[2] = ((notData4 & 0xF) << 4) + ((notData3 >> 4) & 0xF); + dataBytes[3] = ((notData4 >> 4) & 0xF) + ((notData3 & 0xF) << 4); + dataBytes[4] = 0; + dataBytes[5] = 0; + dataBytes[6] = 0; + dataBytes[7] = 0; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] == 0xd && data[1] == 2 && data[2] == 0xAA) + { + host.log("Passed security Check!"); + dataBytes[0] = 4; + dataBytes[1] = 0x15; + dataBytes[2] = newID; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] ==4 && data[1] == 0x15 && data[2] == 0xAA) + { + host.log("ID Reprogramming Successful!"); + } + } +} +`` diff --git a/docs/source/uds_scanner.rst b/docs/source/uds_scanner.rst index 310974d..ee44e62 100644 --- a/docs/source/uds_scanner.rst +++ b/docs/source/uds_scanner.rst @@ -16,6 +16,20 @@ Using the UDS Scan Window UDS queries are sent out on the bus from "Starting ID" to "Ending ID". Usually UDS compliant ECUs will respond to 0x7E0 through 0x7E7 which is why those are the defaults. Some vehicles use UDS "like" protocols on other IDs. Usually UDS nodes reply with an ID 8 higher than the request ID. This is thus the default in the program. However, some nodes cheat and do not do this. It is quite common for responses to come from an address 16 higher instead. To deal with this situation there is a checkbox "Allow adaptive reply offset." If this is checked then replies will be accepted no matter what address they come from. Deselecting this will cause only replies of the proper offset to be accepted. The offset defaults to 8 but can be changed with the "Reply Offset" selector. Additionally, you can select which bus to scan and set how long you want to wait for replies. -You need to also set a type of scan to do. You can select more than one type. +"Show tests with no Replies" - This checkbox does what it says. It is a personal preference whether you'd like to see an entry in the list for scans that returned no results. Sometimes an ECU will just plain ignore messages it doesn't like. In that case you have the option to see an entry in the list telling you that the message was ignored or whether you'd prefer to reduce clutter and just skip anything that had no reply. -"Read By ID" - UDS allows one to read data from the ECU by an ID number. These are not defined anywhere and are custom to each ECU. But, you can use this to scan a range of IDs to see if you get a response to any of them. +You need to also set a type of scan to do. You can select more than one type but if you don't set any then you aren't going to see any results. Keep that in mind as none are checked by default. + +"Read By ID" - UDS allows one to read data from the ECU by an ID number. These are not defined anywhere and are custom to each ECU. But, you can use this to scan a range of IDs to see if you get a response to any of them. There is no real standard for how many bytes the ID will be. It could be 1, it could be 2, 3, 4. It's likely to be around 2. You can set the number of subfunction bytes which will set the size of the ID. Then you can set the upper and lower bound to scan. + +"Read By Addr" - You can also read data by address. Like IDs the address could be different sizes depending on the hardware you are querying. This works the same as reading by ID but by address instead. + +"Session Ctrl" - UDS has the concept of session type. Some types are "normal" "extended diagnostics" "programmming". Scanning for session type will try them all and let you know which the device supports. However, note that you might get a response that indicates that conditions are not correct or that access was denied. This probably means that the mode is actually supported but you'd have to do the right things first. This is still useful information. This scan window is too simple to use for further cracking of such things but the scripting interface is the perfect thing to use instead. + +"ECU Reset" - The ECU might also support being reset by a UDS message. This scan type will try the various reset types and see which are supported. + +"Security Access" - When a device is first started and normally operating it will generally not allow you to do potentially dangerous or sensitive operations such as downloading firmware or changing parameters. To do these things you need to enter a different security level. The security access mechanism is used for this. There are a few different security levels that are likely to be supported. This scan type will attempt to find secutity levels and see if they are protected or not. That is, unfortunately for the casual cracker, most of the time the elevate security levels will be protected by a challenge/response system. The ECU will send you a challenge in the form of one or more random looking bytes. You are tasked with returning the proper response for those challenge bytes. You generally don't have very many guesses before your hands are slapped. Sometimes the C/R is actually fixed and you can just capture valid traffic once and then use the same response forever. Sometimes the C/R is stupidly easy or there are only a couple of different possible answers. Sometimes the ECU developer actually took more than 2 seconds to implement these features and your work will be cut out for you. This scan type will find which levels the ECU seems to support but is unlikely to actually unlock them. + +"Tester Present" - A scan that tries to see if tester present is supported. It almost certainly is. This scan can be used to sweep a wide range of addresses just to narrow down the list of addresses to scan more thoroughly. Normally tester present is sent periodically by a connected device just to let the ECU know that someone is still there. + +"Wildcard" - Allows for you to set a lower and upper range for the service byte as well as the number of subfunction bytes and the range there as well. This allows for UDS fuzzing by shooting the moon and trying a huge range of traffic just to see what is supported and what isn't. This test can take a VERY long time if you aren't careful but will thoroughly determine what the ECU will support and what it won't. From 3d5c4c55c6f1d905c67488ec379df435dace67e3 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Wed, 29 Nov 2017 20:28:43 -0500 Subject: [PATCH 09/33] Fix source formatting --- docs/source/scriptingwindow.rst | 88 +++++++++++++++++---------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/docs/source/scriptingwindow.rst b/docs/source/scriptingwindow.rst index ad5f547..22e427e 100644 --- a/docs/source/scriptingwindow.rst +++ b/docs/source/scriptingwindow.rst @@ -86,49 +86,51 @@ uds.sendUDS(bus, id, service, sublen, subfunc, length, data) - Sends a UDS messa A full example script ===================== -`` -var newID = 0; //set this to the ID you want your RLEC to become +:: -function setup () -{ - host.log("RLEC ID Changer"); - can.setFilter(0x0, 0x0F, 0); - can.sendFrame(0, 0x7E0, 8, [0x0d, 1, 0, 0, 0, 0, 0, 0]); -} + var newID = 0; //set this to the ID you want your RLEC to become + + function setup () + { + host.log("RLEC ID Changer"); + can.setFilter(0x0, 0x0F, 0); + can.sendFrame(0, 0x7E0, 8, [0x0d, 1, 0, 0, 0, 0, 0, 0]); + } + + function gotCANFrame (bus, id, len, data) + { + var dataBytes = []; + + if (len == 8) + { + if (data[0] == 0xd && data[1] == 1 && data[2] == 0xAA) + { + host.log("Got challenge: 0x" + data[3].toString(16) + data[4].toString(16)); + var notData3 = ~data[3]; + var notData4 = ~data[4]; + dataBytes[0] = 0xD; + dataBytes[1] = 2; + dataBytes[2] = ((notData4 & 0xF) << 4) + ((notData3 >> 4) & 0xF); + dataBytes[3] = ((notData4 >> 4) & 0xF) + ((notData3 & 0xF) << 4); + dataBytes[4] = 0; + dataBytes[5] = 0; + dataBytes[6] = 0; + dataBytes[7] = 0; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] == 0xd && data[1] == 2 && data[2] == 0xAA) + { + host.log("Passed security Check!"); + dataBytes[0] = 4; + dataBytes[1] = 0x15; + dataBytes[2] = newID; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] ==4 && data[1] == 0x15 && data[2] == 0xAA) + { + host.log("ID Reprogramming Successful!"); + } + } + } -function gotCANFrame (bus, id, len, data) -{ - var dataBytes = []; - if (len == 8) - { - if (data[0] == 0xd && data[1] == 1 && data[2] == 0xAA) - { - host.log("Got challenge: 0x" + data[3].toString(16) + data[4].toString(16)); - var notData3 = ~data[3]; - var notData4 = ~data[4]; - dataBytes[0] = 0xD; - dataBytes[1] = 2; - dataBytes[2] = ((notData4 & 0xF) << 4) + ((notData3 >> 4) & 0xF); - dataBytes[3] = ((notData4 >> 4) & 0xF) + ((notData3 & 0xF) << 4); - dataBytes[4] = 0; - dataBytes[5] = 0; - dataBytes[6] = 0; - dataBytes[7] = 0; - can.sendFrame(0, 0x7E0, 8, dataBytes); - } - if (data[0] == 0xd && data[1] == 2 && data[2] == 0xAA) - { - host.log("Passed security Check!"); - dataBytes[0] = 4; - dataBytes[1] = 0x15; - dataBytes[2] = newID; - can.sendFrame(0, 0x7E0, 8, dataBytes); - } - if (data[0] ==4 && data[1] == 0x15 && data[2] == 0xAA) - { - host.log("ID Reprogramming Successful!"); - } - } -} -`` From 9302c18c33575f694cc14af6a9af1a652ba62cd3 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 30 Nov 2017 21:02:16 -0500 Subject: [PATCH 10/33] Integrated help into the system. Most all the sub-screens that are actually complete and working have integrated help now. Press F1 to bring up help for a given window. --- SavvyCAN.pro | 11 ++-- bisectwindow.cpp | 21 +++++++ bisectwindow.h | 1 + connections/connectionwindow.cpp | 23 +++++++- connections/connectionwindow.h | 1 + frameplaybackwindow.cpp | 21 +++++++ frameplaybackwindow.h | 1 + framesenderwindow.cpp | 21 +++++++ framesenderwindow.h | 1 + helpwindow.cpp | 94 ++++++++++++++++++++++++++++++++ helpwindow.h | 31 +++++++++++ helpwindow.ui | 24 ++++++++ mainsettingsdialog.cpp | 22 ++++++++ mainsettingsdialog.h | 1 + mainwindow.cpp | 23 ++++++++ mainwindow.h | 1 + re/discretestatewindow.cpp | 21 +++++++ re/discretestatewindow.h | 1 + re/filecomparatorwindow.cpp | 23 +++++++- re/filecomparatorwindow.h | 1 + re/flowviewwindow.cpp | 4 ++ re/frameinfowindow.cpp | 21 +++++++ re/frameinfowindow.h | 1 + re/fuzzingwindow.cpp | 21 +++++++ re/fuzzingwindow.h | 1 + re/graphingwindow.cpp | 4 ++ re/isotp_interpreterwindow.cpp | 21 +++++++ re/isotp_interpreterwindow.h | 1 + re/newgraphdialog.cpp | 22 ++++++++ re/newgraphdialog.h | 2 + re/rangestatewindow.cpp | 22 ++++++++ re/rangestatewindow.h | 1 + re/sniffer/snifferwindow.cpp | 21 ++++++- re/sniffer/snifferwindow.h | 1 + re/udsscanwindow.cpp | 21 +++++++ re/udsscanwindow.h | 1 + scriptingwindow.cpp | 31 +++++++++-- scriptingwindow.h | 1 + signalviewerwindow.cpp | 1 + 39 files changed, 528 insertions(+), 13 deletions(-) create mode 100644 helpwindow.cpp create mode 100644 helpwindow.h create mode 100644 helpwindow.ui diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 1ccb096..b9507cf 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT = core gui printsupport qml serialbus serialport widgets +QT = core gui printsupport qml serialbus serialport widgets help CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT @@ -63,7 +63,8 @@ SOURCES += main.cpp\ bus_protocols/j1939_handler.cpp \ bus_protocols/uds_handler.cpp \ jsedit.cpp \ - frameplaybackobject.cpp + frameplaybackobject.cpp \ + helpwindow.cpp HEADERS += mainwindow.h \ can_structs.h \ @@ -117,7 +118,8 @@ HEADERS += mainwindow.h \ bus_protocols/uds_handler.h \ bus_protocols/isotp_message.h \ jsedit.h \ - frameplaybackobject.h + frameplaybackobject.h \ + helpwindow.h FORMS += ui/candatagrid.ui \ ui/connectionwindow.ui \ @@ -143,7 +145,8 @@ FORMS += ui/candatagrid.ui \ ui/snifferwindow.ui \ ui/udsscanwindow.ui \ ui/bisectwindow.ui \ - ui/signalviewerwindow.ui + ui/signalviewerwindow.ui \ + helpwindow.ui DISTFILES += diff --git a/bisectwindow.cpp b/bisectwindow.cpp index 50c0400..fc01e76 100644 --- a/bisectwindow.cpp +++ b/bisectwindow.cpp @@ -3,6 +3,7 @@ #include "mainwindow.h" #include "framefileio.h" +#include "helpwindow.h" #include #include @@ -23,10 +24,12 @@ BisectWindow::BisectWindow(const QVector *frames, QWidget *parent) : connect(ui->slidePercentage, &QSlider::sliderReleased, this, &BisectWindow::updatePercentText); connect(ui->editFrameNumber, &QLineEdit::editingFinished, this, &BisectWindow::updateFrameNumSlider); connect(ui->editPercentage, &QLineEdit::editingFinished, this, &BisectWindow::updatePercentSlider); + installEventFilter(this); } BisectWindow::~BisectWindow() { + removeEventFilter(this); delete ui; } @@ -39,6 +42,24 @@ void BisectWindow::showEvent(QShowEvent* event) updatePercentText(); } +bool BisectWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("bisector.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void BisectWindow::refreshIDList() { int id; diff --git a/bisectwindow.h b/bisectwindow.h index 77f3ebc..a308428 100644 --- a/bisectwindow.h +++ b/bisectwindow.h @@ -39,6 +39,7 @@ private: void refreshIDList(); void refreshFrameNumbers(); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // BISECTWINDOW_H diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index 6e9bd69..492a7aa 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -3,13 +3,12 @@ #include "connectionwindow.h" #include "mainwindow.h" +#include "helpwindow.h" #include "ui_connectionwindow.h" #include "connections/canconfactory.h" #include "connections/canconmanager.h" #include "canbus.h" - - ConnectionWindow::ConnectionWindow(QWidget *parent) : QDialog(parent), ui(new Ui::ConnectionWindow) @@ -88,6 +87,7 @@ void ConnectionWindow::showEvent(QShowEvent* event) { QDialog::showEvent(event); qDebug() << "Show connectionwindow"; + installEventFilter(this); readSettings(); ui->tableConnections->selectRow(0); currentRowChanged(ui->tableConnections->currentIndex(), ui->tableConnections->currentIndex()); @@ -97,9 +97,28 @@ void ConnectionWindow::showEvent(QShowEvent* event) void ConnectionWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); } +bool ConnectionWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("connectionwindow.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void ConnectionWindow::readSettings() { QSettings settings; diff --git a/connections/connectionwindow.h b/connections/connectionwindow.h index 104cbab..24bd0a8 100644 --- a/connections/connectionwindow.h +++ b/connections/connectionwindow.h @@ -80,6 +80,7 @@ private: void saveConnections(); void showEvent(QShowEvent *); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); }; diff --git a/frameplaybackwindow.cpp b/frameplaybackwindow.cpp index a44d661..7d74e24 100644 --- a/frameplaybackwindow.cpp +++ b/frameplaybackwindow.cpp @@ -5,6 +5,7 @@ #include #include #include "connections/canconmanager.h" +#include "helpwindow.h" /* * Notes about new functionality: @@ -93,14 +94,34 @@ FramePlaybackWindow::~FramePlaybackWindow() void FramePlaybackWindow::showEvent(QShowEvent *) { readSettings(); + installEventFilter(this); } void FramePlaybackWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); } +bool FramePlaybackWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("playbackwindow.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void FramePlaybackWindow::readSettings() { QSettings settings; diff --git a/frameplaybackwindow.h b/frameplaybackwindow.h index 996ac55..64bb149 100644 --- a/frameplaybackwindow.h +++ b/frameplaybackwindow.h @@ -66,6 +66,7 @@ private: void readSettings(); void writeSettings(); void calculateWhichBus(); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // FRAMEPLAYBACKWINDOW_H diff --git a/framesenderwindow.cpp b/framesenderwindow.cpp index 1108e20..4061e5e 100644 --- a/framesenderwindow.cpp +++ b/framesenderwindow.cpp @@ -5,6 +5,7 @@ #include #include #include "mainwindow.h" +#include "helpwindow.h" #include "connections/canconmanager.h" /* @@ -51,16 +52,36 @@ FrameSenderWindow::FrameSenderWindow(const QVector *frames, QWidget *p intervalTimer->start(); elapsedTimer.start(); + installEventFilter(this); } FrameSenderWindow::~FrameSenderWindow() { + removeEventFilter(this); delete ui; intervalTimer->stop(); delete intervalTimer; } +bool FrameSenderWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("customsender.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void FrameSenderWindow::createBlankRow() { int row = ui->tableSender->rowCount(); diff --git a/framesenderwindow.h b/framesenderwindow.h index 57642e8..fada888 100644 --- a/framesenderwindow.h +++ b/framesenderwindow.h @@ -53,6 +53,7 @@ private: void processCellChange(int line, int col); void buildFrameCache(); void processIncomingFrame(CANFrame *frame); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // FRAMESENDERWINDOW_H diff --git a/helpwindow.cpp b/helpwindow.cpp new file mode 100644 index 0000000..a07eb5d --- /dev/null +++ b/helpwindow.cpp @@ -0,0 +1,94 @@ +#include +#include "helpwindow.h" +#include "ui_helpwindow.h" + +HelpWindow* HelpWindow::self = 0; + +HelpWindow::HelpWindow(QWidget *parent) : + QDialog(parent), + ui(new Ui::HelpWindow) +{ + ui->setupUi(this); + + m_helpEngine = new QHelpEngineCore("SavvyCAN.qhc", this); + if (!m_helpEngine->setupData()) { + delete m_helpEngine; + m_helpEngine = 0; + qDebug() << "Could not load help file!"; + } + + readSettings(); +} + +HelpWindow::~HelpWindow() +{ + writeSettings(); + delete ui; +} + +void HelpWindow::closeEvent(QCloseEvent *event) +{ + Q_UNUSED(event); + writeSettings(); +} + +void HelpWindow::readSettings() +{ + QSettings settings; + if (settings.value("Main/SaveRestorePositions", false).toBool()) + { + resize(settings.value("HelpViewer/WindowSize", QSize(600, 700)).toSize()); + move(settings.value("HelpViewer/WindowPos", QPoint(50, 50)).toPoint()); + } +} + +void HelpWindow::writeSettings() +{ + QSettings settings; + + if (settings.value("Main/SaveRestorePositions", false).toBool()) + { + settings.setValue("HelpViewer/WindowSize", size()); + settings.setValue("HelpViewer/WindowPos", pos()); + } +} + +HelpWindow* HelpWindow::getRef() +{ + if (!self) + { + self = new HelpWindow(); + } + + return self; +} + +void HelpWindow::showHelp(QString help) +{ + if (m_helpEngine) { + qDebug() << "Searching for " << help; + QByteArray helpData = m_helpEngine->fileData(QUrl("qthelp://org.sphinx.savvycan.181/doc/" + help)); + ui->textHelp->setText(helpData); + } + else + { + qDebug() << "Help engine not loaded!"; + } + + readSettings(); + self->show(); +} +/* + +QVariant HelpBrowser::loadResource(int type, const QUrl &name) +{ +QByteArray ba; +if (type < 4 && m_helpEngine) { + QUrl url(name); + if (name.isRelative()) + url = source().resolved(url); + ba = m_helpEngine->fileData(url); +} +return ba; +} +*/ diff --git a/helpwindow.h b/helpwindow.h new file mode 100644 index 0000000..b5a9ef0 --- /dev/null +++ b/helpwindow.h @@ -0,0 +1,31 @@ +#ifndef HELPWINDOW_H +#define HELPWINDOW_H + +#include +#include + +namespace Ui { +class HelpWindow; +} + +class HelpWindow : public QDialog +{ + Q_OBJECT + +public: + explicit HelpWindow(QWidget *parent = 0); + ~HelpWindow(); + void showHelp(QString help); + static HelpWindow *getRef(); + +private: + void readSettings(); + void writeSettings(); + void closeEvent(QCloseEvent *event); + + Ui::HelpWindow *ui; + static HelpWindow *self; + QHelpEngineCore *m_helpEngine; +}; + +#endif // HELPWINDOW_H diff --git a/helpwindow.ui b/helpwindow.ui new file mode 100644 index 0000000..bef250c --- /dev/null +++ b/helpwindow.ui @@ -0,0 +1,24 @@ + + + HelpWindow + + + + 0 + 0 + 600 + 700 + + + + SavvyCAN Help + + + + + + + + + + diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index a6189e9..baf66af 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -1,5 +1,6 @@ #include "mainsettingsdialog.h" #include "ui_mainsettingsdialog.h" +#include "helpwindow.h" MainSettingsDialog::MainSettingsDialog(QWidget *parent) : QDialog(parent), @@ -73,6 +74,7 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : connect(ui->cbUseFiltered, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->lineClockFormat, SIGNAL(editingFinished()), this, SLOT(updateSettings())); connect(ui->cbUseOpenGL, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + installEventFilter(this); } MainSettingsDialog::~MainSettingsDialog() @@ -84,9 +86,29 @@ MainSettingsDialog::~MainSettingsDialog() void MainSettingsDialog::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); settings->sync(); } +bool MainSettingsDialog::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("preferences.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + + void MainSettingsDialog::updateSettings() { settings->setValue("Main/UseHex", ui->cbDisplayHex->isChecked()); diff --git a/mainsettingsdialog.h b/mainsettingsdialog.h index 62c24c9..7d375b0 100644 --- a/mainsettingsdialog.h +++ b/mainsettingsdialog.h @@ -27,6 +27,7 @@ private: QSettings *settings; void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // MAINSETTINGSDIALOG_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 964ed54..fb08d4c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -6,6 +6,7 @@ #include #include "connections/canconmanager.h" #include "connections/connectionwindow.h" +#include "helpwindow.h" #include "utility.h" /* @@ -130,6 +131,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionSignal_Viewer, &QAction::triggered, this, &MainWindow::showSignalViewer); connect(ui->actionSave_Continuous_Logfile, &QAction::triggered, this, &MainWindow::handleContinousLogging); + connect(CANConManager::getInstance(), &CANConManager::framesReceived, model, &CANFrameModel::addFrames); lbStatusConnected.setText(tr("Connected to 0 buses")); @@ -171,6 +173,7 @@ MainWindow::MainWindow(QWidget *parent) : connectionWindow = new ConnectionWindow(); connect(this, SIGNAL(suspendCapturing(bool)), connectionWindow, SLOT(setSuspendAll(bool))); + installEventFilter(this); } MainWindow::~MainWindow() @@ -235,10 +238,30 @@ void MainWindow::exitApp() void MainWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); exitApp(); } +bool MainWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("mainscreen.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + + void MainWindow::updateSettings() { readUpdateableSettings(); diff --git a/mainwindow.h b/mainwindow.h index fffe39f..5814211 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -176,6 +176,7 @@ private: void killWindow(QDialog *win); void readSettings(); void writeSettings(); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // MAINWINDOW_H diff --git a/re/discretestatewindow.cpp b/re/discretestatewindow.cpp index 82a03c9..5828a4b 100644 --- a/re/discretestatewindow.cpp +++ b/re/discretestatewindow.cpp @@ -1,6 +1,7 @@ #include "discretestatewindow.h" #include "ui_discretestatewindow.h" #include "mainwindow.h" +#include "helpwindow.h" DiscreteStateWindow::DiscreteStateWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -55,10 +56,12 @@ DiscreteStateWindow::DiscreteStateWindow(const QVector *frames, QWidge }); refreshFilterList(); + installEventFilter(this); } DiscreteStateWindow::~DiscreteStateWindow() { + removeEventFilter(this); timer->stop(); for (int i = 0; i < stateFrames.count(); i++) @@ -71,6 +74,24 @@ DiscreteStateWindow::~DiscreteStateWindow() delete ui; } +bool DiscreteStateWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("discretestate.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void DiscreteStateWindow::typeChanged() { if (ui->rbLogged->isChecked()) diff --git a/re/discretestatewindow.h b/re/discretestatewindow.h index e027cca..8e05ef4 100644 --- a/re/discretestatewindow.h +++ b/re/discretestatewindow.h @@ -53,6 +53,7 @@ private: void refreshFilterList(); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); void updateStateLabel(); diff --git a/re/filecomparatorwindow.cpp b/re/filecomparatorwindow.cpp index 9ab25f4..1ce1b85 100644 --- a/re/filecomparatorwindow.cpp +++ b/re/filecomparatorwindow.cpp @@ -1,6 +1,6 @@ #include "filecomparatorwindow.h" #include "ui_filecomparatorwindow.h" - +#include "helpwindow.h" #include FileComparatorWindow::FileComparatorWindow(QWidget *parent) : @@ -16,10 +16,13 @@ FileComparatorWindow::FileComparatorWindow(QWidget *parent) : ui->lblFirstFile->setText(""); ui->lblRefFrames->setText("0"); + + installEventFilter(this); } FileComparatorWindow::~FileComparatorWindow() { + removeEventFilter(this); delete ui; } @@ -34,6 +37,24 @@ void FileComparatorWindow::closeEvent(QCloseEvent *event) writeSettings(); } +bool FileComparatorWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("filecomparison.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void FileComparatorWindow::readSettings() { QSettings settings; diff --git a/re/filecomparatorwindow.h b/re/filecomparatorwindow.h index 8d678e7..d348255 100644 --- a/re/filecomparatorwindow.h +++ b/re/filecomparatorwindow.h @@ -43,6 +43,7 @@ private: void calculateDetails(); void showEvent(QShowEvent *); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); }; diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index e3514b1..f0a87a7 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -1,6 +1,7 @@ #include "flowviewwindow.h" #include "ui_flowviewwindow.h" #include "mainwindow.h" +#include "helpwindow.h" const QColor FlowViewWindow::graphColors[8] = {Qt::blue, Qt::green, Qt::black, Qt::red, //0 1 2 3 Qt::gray, Qt::yellow, Qt::cyan, Qt::darkMagenta}; //4 5 6 7 @@ -193,6 +194,9 @@ bool FlowViewWindow::eventFilter(QObject *obj, QEvent *event) case Qt::Key_Y: btnFwdOneClick(); break; + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("flowview.html"); + break; } return true; } else { diff --git a/re/frameinfowindow.cpp b/re/frameinfowindow.cpp index 53fdae7..b4461b0 100644 --- a/re/frameinfowindow.cpp +++ b/re/frameinfowindow.cpp @@ -1,6 +1,7 @@ #include "frameinfowindow.h" #include "ui_frameinfowindow.h" #include "mainwindow.h" +#include "helpwindow.h" #include FrameInfoWindow::FrameInfoWindow(const QVector *frames, QWidget *parent) : @@ -42,6 +43,7 @@ FrameInfoWindow::FrameInfoWindow(const QVector *frames, QWidget *paren ui->graphHistogram->setAntialiasedElements(QCP::aeNone); } + installEventFilter(this); } void FrameInfoWindow::showEvent(QShowEvent* event) @@ -56,8 +58,27 @@ void FrameInfoWindow::showEvent(QShowEvent* event) } } +bool FrameInfoWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("framedetails.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + FrameInfoWindow::~FrameInfoWindow() { + removeEventFilter(this); delete ui; } diff --git a/re/frameinfowindow.h b/re/frameinfowindow.h index a841de4..0f38edc 100644 --- a/re/frameinfowindow.h +++ b/re/frameinfowindow.h @@ -36,6 +36,7 @@ private: void refreshIDList(); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); void dumpNode(QTreeWidgetItem* item, QFile *file, int indent); diff --git a/re/fuzzingwindow.cpp b/re/fuzzingwindow.cpp index 6d96e68..58e6ec0 100644 --- a/re/fuzzingwindow.cpp +++ b/re/fuzzingwindow.cpp @@ -3,6 +3,7 @@ #include "utility.h" #include #include "mainwindow.h" +#include "helpwindow.h" #include "connections/canconmanager.h" FuzzingWindow::FuzzingWindow(const QVector *frames, QWidget *parent) : @@ -41,13 +42,33 @@ FuzzingWindow::FuzzingWindow(const QVector *frames, QWidget *parent) : for (int n = 0; n < numBuses; n++) ui->cbBuses->addItem(QString::number(n)); ui->cbBuses->addItem(tr("All")); + installEventFilter(this); } FuzzingWindow::~FuzzingWindow() { + removeEventFilter(this); delete ui; } +bool FuzzingWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("fuzzingwindow.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void FuzzingWindow::updatedFrames(int numFrames) { int id; diff --git a/re/fuzzingwindow.h b/re/fuzzingwindow.h index 724d84c..d920bc3 100644 --- a/re/fuzzingwindow.h +++ b/re/fuzzingwindow.h @@ -64,6 +64,7 @@ private: void calcNextID(); void calcNextBitPattern(); void redrawGrid(); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // FUZZINGWINDOW_H diff --git a/re/graphingwindow.cpp b/re/graphingwindow.cpp index 0370071..ec97149 100644 --- a/re/graphingwindow.cpp +++ b/re/graphingwindow.cpp @@ -2,6 +2,7 @@ #include "ui_graphingwindow.h" #include "newgraphdialog.h" #include "mainwindow.h" +#include "helpwindow.h" #include GraphingWindow::GraphingWindow(const QVector *frames, QWidget *parent) : @@ -397,6 +398,9 @@ bool GraphingWindow::eventFilter(QObject *obj, QEvent *event) case Qt::Key_Minus: zoomOut(); break; + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("graphwindow.html"); + break; } return true; } else if (event->type() == QEvent::TouchBegin) diff --git a/re/isotp_interpreterwindow.cpp b/re/isotp_interpreterwindow.cpp index 0393ce6..8fba992 100644 --- a/re/isotp_interpreterwindow.cpp +++ b/re/isotp_interpreterwindow.cpp @@ -1,6 +1,7 @@ #include "isotp_interpreterwindow.h" #include "ui_isotp_interpreterwindow.h" #include "mainwindow.h" +#include "helpwindow.h" ISOTP_InterpreterWindow::ISOTP_InterpreterWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -60,14 +61,34 @@ void ISOTP_InterpreterWindow::showEvent(QShowEvent* event) QDialog::showEvent(event); readSettings(); decoder->updatedFrames(-2); + installEventFilter(this); } void ISOTP_InterpreterWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); } +bool ISOTP_InterpreterWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("isotp_decoder.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void ISOTP_InterpreterWindow::readSettings() { QSettings settings; diff --git a/re/isotp_interpreterwindow.h b/re/isotp_interpreterwindow.h index 753347f..14167de 100644 --- a/re/isotp_interpreterwindow.h +++ b/re/isotp_interpreterwindow.h @@ -43,6 +43,7 @@ private: QHash idFilters; void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); diff --git a/re/newgraphdialog.cpp b/re/newgraphdialog.cpp index 6807152..0297a39 100644 --- a/re/newgraphdialog.cpp +++ b/re/newgraphdialog.cpp @@ -2,6 +2,7 @@ #include "ui_newgraphdialog.h" #include #include "utility.h" +#include "helpwindow.h" NewGraphDialog::NewGraphDialog(DBCHandler *handler, QWidget *parent) : QDialog(parent), @@ -33,10 +34,13 @@ NewGraphDialog::NewGraphDialog(DBCHandler *handler, QWidget *parent) : dataLen = 1; loadMessages(); + + installEventFilter(this); } NewGraphDialog::~NewGraphDialog() { + removeEventFilter(this); delete ui; } @@ -48,6 +52,24 @@ void NewGraphDialog::showEvent(QShowEvent* event) qDebug() << "S" << ui->gridData->geometry(); } +bool NewGraphDialog::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("graphsetup.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void NewGraphDialog::addButtonClicked() { accept(); diff --git a/re/newgraphdialog.h b/re/newgraphdialog.h index 85ce74c..365456d 100644 --- a/re/newgraphdialog.h +++ b/re/newgraphdialog.h @@ -32,6 +32,8 @@ private slots: void copySignalToParamsUI(); private: + bool eventFilter(QObject *obj, QEvent *event); + Ui::NewGraphDialog *ui; DBCHandler *dbcHandler; int startBit, dataLen; diff --git a/re/rangestatewindow.cpp b/re/rangestatewindow.cpp index 16d1b4b..511e9ab 100644 --- a/re/rangestatewindow.cpp +++ b/re/rangestatewindow.cpp @@ -2,6 +2,7 @@ #include "ui_rangestatewindow.h" #include "mainwindow.h" #include "utility.h" +#include "helpwindow.h" RangeStateWindow::RangeStateWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -88,14 +89,35 @@ void RangeStateWindow::showEvent(QShowEvent* event) readSettings(); refreshFilterList(); + + installEventFilter(this); } void RangeStateWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); } +bool RangeStateWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("rangestate.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void RangeStateWindow::readSettings() { QSettings settings; diff --git a/re/rangestatewindow.h b/re/rangestatewindow.h index 4f59457..193e052 100644 --- a/re/rangestatewindow.h +++ b/re/rangestatewindow.h @@ -36,6 +36,7 @@ private: void signalsFactory(); bool processSignal(int startBit, int bitLength, int sensitivity, bool bigEndian, bool isSigned); void createGraph(QVector values); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // RANGESTATEWINDOW_H diff --git a/re/sniffer/snifferwindow.cpp b/re/sniffer/snifferwindow.cpp index cab2a88..685a850 100644 --- a/re/sniffer/snifferwindow.cpp +++ b/re/sniffer/snifferwindow.cpp @@ -2,6 +2,7 @@ #include #include "snifferwindow.h" #include "ui_snifferwindow.h" +#include "helpwindow.h" #include "connections/canconmanager.h" SnifferWindow::SnifferWindow(QWidget *parent) : @@ -50,7 +51,7 @@ void SnifferWindow::showEvent(QShowEvent* event) QDialog::showEvent(event); connect(CANConManager::getInstance(), &CANConManager::framesReceived, &mModel, &SnifferModel::update); mTimer.start(); - + installEventFilter(this); qDebug() << "show"; } @@ -69,8 +70,26 @@ void SnifferWindow::closeEvent(QCloseEvent *event) mMap.clear(); /* reset filtering */ mFilter = false; + removeEventFilter(this); } +bool SnifferWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("sniffer.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} void SnifferWindow::update() { diff --git a/re/sniffer/snifferwindow.h b/re/sniffer/snifferwindow.h index 2d2cb1d..cebd059 100644 --- a/re/sniffer/snifferwindow.h +++ b/re/sniffer/snifferwindow.h @@ -45,6 +45,7 @@ public slots: private: void filter(bool pFilter); + bool eventFilter(QObject *obj, QEvent *event); Ui::snifferWindow* ui; SnifferModel mModel; diff --git a/re/udsscanwindow.cpp b/re/udsscanwindow.cpp index e138950..619691b 100644 --- a/re/udsscanwindow.cpp +++ b/re/udsscanwindow.cpp @@ -4,6 +4,7 @@ #include "connections/canconmanager.h" #include "bus_protocols/uds_handler.h" #include "utility.h" +#include "helpwindow.h" UDSScanWindow::UDSScanWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -39,16 +40,36 @@ UDSScanWindow::UDSScanWindow(const QVector *frames, QWidget *parent) : int numBuses = CANConManager::getInstance()->getNumBuses(); for (int n = 0; n < numBuses; n++) ui->cbBuses->addItem(QString::number(n)); + installEventFilter(this); } UDSScanWindow::~UDSScanWindow() { + removeEventFilter(this); delete ui; waitTimer->stop(); delete waitTimer; delete udsHandler; } +bool UDSScanWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("uds_scanner.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void UDSScanWindow::adaptiveToggled() { if (ui->cbAllowAdaptiveOffset->isChecked()) ui->spinReplyOffset->setEnabled(false); diff --git a/re/udsscanwindow.h b/re/udsscanwindow.h index 35629a6..6b7d022 100644 --- a/re/udsscanwindow.h +++ b/re/udsscanwindow.h @@ -51,5 +51,6 @@ private: void sendOnBuses(UDS_MESSAGE frame, int buses); void setupNodes(); void dumpNode(QTreeWidgetItem* item, QFile *file, int indent); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // UDSSCANWINDOW_H diff --git a/scriptingwindow.cpp b/scriptingwindow.cpp index c71c5a1..1ea6e36 100644 --- a/scriptingwindow.cpp +++ b/scriptingwindow.cpp @@ -6,6 +6,7 @@ #include #include "connections/canconmanager.h" +#include "helpwindow.h" ScriptingWindow::ScriptingWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -88,12 +89,37 @@ void ScriptingWindow::updatedValue(int row, int col) } } +void ScriptingWindow::showEvent(QShowEvent* event) +{ + QDialog::showEvent(event); + installEventFilter(this); +} + void ScriptingWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + removeEventFilter(this); writeSettings(); } +bool ScriptingWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("scriptingwindow.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void ScriptingWindow::readSettings() { QSettings settings; @@ -115,11 +141,6 @@ void ScriptingWindow::writeSettings() } } -void ScriptingWindow::showEvent(QShowEvent* event) -{ - QDialog::showEvent(event); -} - void ScriptingWindow::changeCurrentScript() { ui->tableVariables->clear(); diff --git a/scriptingwindow.h b/scriptingwindow.h index fbdad5a..156a72e 100644 --- a/scriptingwindow.h +++ b/scriptingwindow.h @@ -49,6 +49,7 @@ private: void closeEvent(QCloseEvent *event); void readSettings(); void writeSettings(); + bool eventFilter(QObject *obj, QEvent *event); Ui::ScriptingWindow *ui; JSEdit *editor; diff --git a/signalviewerwindow.cpp b/signalviewerwindow.cpp index 49c2440..e67ab55 100644 --- a/signalviewerwindow.cpp +++ b/signalviewerwindow.cpp @@ -1,5 +1,6 @@ #include "signalviewerwindow.h" #include "ui_signalviewerwindow.h" +#include "helpwindow.h" SignalViewerWindow::SignalViewerWindow(QWidget *parent) : QDialog(parent), From a31d56ce2f86025d38f6a4b3167bc240cbc04291 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 30 Nov 2017 21:22:56 -0500 Subject: [PATCH 11/33] Add integrated help to DBC windows as well - they were forgotten in last commit Increment version too to show that progress has been made. --- config.h | 2 +- dbc/dbcloadsavewindow.cpp | 22 ++++++++++++++++++++++ dbc/dbcloadsavewindow.h | 1 + dbc/dbcmaineditor.cpp | 23 +++++++++++++++++++++++ dbc/dbcmaineditor.h | 1 + dbc/dbcsignaleditor.cpp | 22 ++++++++++++++++++++++ dbc/dbcsignaleditor.h | 1 + 7 files changed, 71 insertions(+), 1 deletion(-) diff --git a/config.h b/config.h index a7ebdb6..a9d8673 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG #define CONFIG -#define VERSION 181 +#define VERSION 182 //try to keep this in sync. //SavvyCAN will complain if you connect a GVRET board with a revision diff --git a/dbc/dbcloadsavewindow.cpp b/dbc/dbcloadsavewindow.cpp index df3eb9e..d43d658 100644 --- a/dbc/dbcloadsavewindow.cpp +++ b/dbc/dbcloadsavewindow.cpp @@ -1,6 +1,7 @@ #include "dbcloadsavewindow.h" #include "ui_dbcloadsavewindow.h" #include +#include "helpwindow.h" DBCLoadSaveWindow::DBCLoadSaveWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -32,13 +33,34 @@ DBCLoadSaveWindow::DBCLoadSaveWindow(const QVector *frames, QWidget *p connect(ui->tableFiles, &QTableWidget::cellDoubleClicked, this, &DBCLoadSaveWindow::cellDoubleClicked); editorWindow = new DBCMainEditor(frames); + + installEventFilter(this); } DBCLoadSaveWindow::~DBCLoadSaveWindow() { + removeEventFilter(this); delete ui; } +bool DBCLoadSaveWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("dbc_manager.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void DBCLoadSaveWindow::newFile() { int idx = dbcHandler->createBlankFile(); diff --git a/dbc/dbcloadsavewindow.h b/dbc/dbcloadsavewindow.h index 5bbc3ff..6e41e0c 100644 --- a/dbc/dbcloadsavewindow.h +++ b/dbc/dbcloadsavewindow.h @@ -38,6 +38,7 @@ private: void swapTableRows(bool up); QList takeRow(int row); void setRow(int row, const QList& rowItems); + bool eventFilter(QObject *obj, QEvent *event); }; #endif // DBCLOADSAVEWINDOW_H diff --git a/dbc/dbcmaineditor.cpp b/dbc/dbcmaineditor.cpp index 1b041b6..2afe9cc 100644 --- a/dbc/dbcmaineditor.cpp +++ b/dbc/dbcmaineditor.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "helpwindow.h" DBCMainEditor::DBCMainEditor( const QVector *frames, QWidget *parent) : QDialog(parent), @@ -49,6 +50,8 @@ DBCMainEditor::DBCMainEditor( const QVector *frames, QWidget *parent) ui->MessagesTable->setContextMenuPolicy(Qt::CustomContextMenu); sigEditor = new DBCSignalEditor(); + + installEventFilter(this); } void DBCMainEditor::showEvent(QShowEvent* event) @@ -66,10 +69,29 @@ void DBCMainEditor::showEvent(QShowEvent* event) DBCMainEditor::~DBCMainEditor() { + removeEventFilter(this); delete ui; delete sigEditor; } +bool DBCMainEditor::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("dbc_editor.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void DBCMainEditor::setFileIdx(int idx) { if (idx < 0 || idx > dbcHandler->getFileCount() - 1) return; @@ -374,6 +396,7 @@ void DBCMainEditor::onCellClickedMessage(int row, int col) DBC_MESSAGE *message = dbcFile->messageHandler->findMsgByID(Utility::ParseStringToNum(idString)); sigEditor->setMessageRef(message); sigEditor->setFileIdx(fileIdx); + sigEditor->setWindowModality(Qt::WindowModal); sigEditor->exec(); //blocks this window from being active until we're done //now update the displayed # of signals inhibitCellChanged = true; diff --git a/dbc/dbcmaineditor.h b/dbc/dbcmaineditor.h index 055d512..b92815d 100644 --- a/dbc/dbcmaineditor.h +++ b/dbc/dbcmaineditor.h @@ -44,6 +44,7 @@ private: void refreshMessagesTable(const DBC_NODE *node); void showEvent(QShowEvent* event); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); void insertBlankRow(); diff --git a/dbc/dbcsignaleditor.cpp b/dbc/dbcsignaleditor.cpp index b8c660d..1eb4977 100644 --- a/dbc/dbcsignaleditor.cpp +++ b/dbc/dbcsignaleditor.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "helpwindow.h" DBCSignalEditor::DBCSignalEditor(QWidget *parent) : QDialog(parent), @@ -205,10 +206,13 @@ DBCSignalEditor::DBCSignalEditor(QWidget *parent) : if (dbcMessage->multiplexorSignal == currentSignal) dbcMessage->multiplexorSignal = NULL; } }); + + installEventFilter(this); } DBCSignalEditor::~DBCSignalEditor() { + removeEventFilter(this); delete ui; } @@ -218,6 +222,24 @@ void DBCSignalEditor::closeEvent(QCloseEvent *event) writeSettings(); } +bool DBCSignalEditor::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyRelease) { + QKeyEvent *keyEvent = static_cast(event); + switch (keyEvent->key()) + { + case Qt::Key_F1: + HelpWindow::getRef()->showHelp("signaleditor.html"); + break; + } + return true; + } else { + // standard event processing + return QObject::eventFilter(obj, event); + } + return false; +} + void DBCSignalEditor::setFileIdx(int idx) { if (idx < 0 || idx > dbcHandler->getFileCount() - 1) return; diff --git a/dbc/dbcsignaleditor.h b/dbc/dbcsignaleditor.h index a3b47cd..97b883f 100644 --- a/dbc/dbcsignaleditor.h +++ b/dbc/dbcsignaleditor.h @@ -44,6 +44,7 @@ private: void generateUsedBits(); void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); void readSettings(); void writeSettings(); }; From 9859c586bd74407d3ba0a12eee5203dfb8dd917c Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 10 Dec 2017 11:15:58 -0500 Subject: [PATCH 12/33] Add some scripting examples --- examples/CaptureAllMsgTypes.js | 30 +++++++++++++++++++++++ examples/GetCANandTick.js | 17 +++++++++++++ examples/RLEC.js | 44 ++++++++++++++++++++++++++++++++++ examples/UpdateParameter.js | 12 ++++++++++ 4 files changed, 103 insertions(+) create mode 100644 examples/CaptureAllMsgTypes.js create mode 100644 examples/GetCANandTick.js create mode 100644 examples/RLEC.js create mode 100644 examples/UpdateParameter.js diff --git a/examples/CaptureAllMsgTypes.js b/examples/CaptureAllMsgTypes.js new file mode 100644 index 0000000..b89c101 --- /dev/null +++ b/examples/CaptureAllMsgTypes.js @@ -0,0 +1,30 @@ +function setup () +{ + host.log("Example script 1.0"); + host.setTickInterval(20000); + can.sendFrame(0, 0x200, 4, [1,30,20,10]); + uds.sendUDS(0, 0x604, 0x3E, 1, 0, 0, 0); + can.setFilter(0x100, 0x700, 0); + uds.setFilter(0x600, 0x7F0, 0); + +} + +function gotCANFrame (bus, id, len, data) +{ + host.log("Bus: " + bus + " id: " + id.toString(16)); +} + +function gotISOTPMessage(bus, id, len, data) +{ + host.log("ISOTP bus " + bus + " ID: " + id.toString(16)); +} + +function gotUDSMessage(bus, id, service, subFunc, len, data) +{ + host.log("UDS Bus: " + bus + " ID: " + id.toString(16) + " Sv: " + service.toString(16)); +} + +function tick() +{ + host.log("TICK!"); +} \ No newline at end of file diff --git a/examples/GetCANandTick.js b/examples/GetCANandTick.js new file mode 100644 index 0000000..38a857a --- /dev/null +++ b/examples/GetCANandTick.js @@ -0,0 +1,17 @@ +function setup () +{ + host.log("Example script 1.0"); + host.setTickInterval(20000); + can.sendFrame(0, 0x7E0, 8, [0x0d, 1, 0, 0, 0, 0, 0, 0]); + + can.setFilter(0x100, 0x700, 0); +} + +function gotCANFrame (bus, id, len, data) +{ + host.log("Bus: " + bus + " id: " + id.toString(16)); +} +function tick() +{ + host.log("TICK!"); +} \ No newline at end of file diff --git a/examples/RLEC.js b/examples/RLEC.js new file mode 100644 index 0000000..320ad65 --- /dev/null +++ b/examples/RLEC.js @@ -0,0 +1,44 @@ +var newID = 0; + +function setup () +{ + host.log("RLEC ID Changer"); + can.setFilter(0x0, 0x0F, 0); + can.sendFrame(0, 0x7E0, 8, [0x0d, 1, 0, 0, 0, 0, 0, 0]); +} + +function gotCANFrame (bus, id, len, data) +{ + var dataBytes = []; + + if (len == 8) + { + if (data[0] == 0xd && data[1] == 1 && data[2] == 0xAA) + { + host.log("Got challenge: 0x" + data[3].toString(16) + data[4].toString(16)); + var notData3 = ~data[3]; + var notData4 = ~data[4]; + dataBytes[0] = 0xD; + dataBytes[1] = 2; + dataBytes[2] = ((notData4 & 0xF) << 4) + ((notData3 >> 4) & 0xF); + dataBytes[3] = ((notData4 >> 4) & 0xF) + ((notData3 & 0xF) << 4); + dataBytes[4] = 0; + dataBytes[5] = 0; + dataBytes[6] = 0; + dataBytes[7] = 0; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] == 0xd && data[1] == 2 && data[2] == 0xAA) + { + host.log("Passed security Check!"); + dataBytes[0] = 4; + dataBytes[1] = 0x15; + dataBytes[2] = newID; + can.sendFrame(0, 0x7E0, 8, dataBytes); + } + if (data[0] ==4 && data[1] == 0x15 && data[2] == 0xAA) + { + host.log("ID Reprogramming Successful!"); + } + } +} \ No newline at end of file diff --git a/examples/UpdateParameter.js b/examples/UpdateParameter.js new file mode 100644 index 0000000..6dda11a --- /dev/null +++ b/examples/UpdateParameter.js @@ -0,0 +1,12 @@ +var testingVar = 10; + +function setup() +{ + host.addParameter("testingVar"); + host.setTickInterval(2000); +} + +function tick() +{ + testingVar++; +} \ No newline at end of file From 842f5fe0bcddcda399eef6e5005504c2666bf1fd Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 10 Dec 2017 17:11:39 -0500 Subject: [PATCH 13/33] Add ASCII representation to main window --- canframemodel.cpp | 25 +++++++++++++++++++++---- mainwindow.cpp | 15 ++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index b5be4e5..d467a71 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -40,7 +40,7 @@ int CANFrameModel::totalFrameCount() int CANFrameModel::columnCount(const QModelIndex &index) const { Q_UNUSED(index); - return 7; + return 8; } CANFrameModel::CANFrameModel(QObject *parent) @@ -222,7 +222,8 @@ enum class Column { Direction = 3, ///< Whether the frame was transmitted or received Bus = 4, ///< The bus where the frame was transmitted or received Length = 5, ///< The frames payload data length - Data = 6 ///< The frames payload data + ASCII = 6, ///< The payload interpreted as ASCII characters + Data = 7 ///< The frames payload data }; QVariant CANFrameModel::data(const QModelIndex &index, int role) const @@ -282,13 +283,27 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const return QString::number(thisFrame.bus); case Column::Length: return QString::number(thisFrame.len); - case Column::Data: + case Column::ASCII: dLen = thisFrame.len; if (dLen < 0) dLen = 0; if (dLen > 8) dLen = 8; for (int i = 0; i < dLen; i++) { - tempString.append(Utility::formatNumber(thisFrame.data[i])); + quint8 byt = thisFrame.data[i]; + if (byt < 0x20) byt = 0x2E; //A dot + if (byt > 0x7E) byt = 0x2E; + tempString.append(QString::fromUtf8((char *)&byt, 1)); + } + return tempString; + case Column::Data: + dLen = thisFrame.len; + if (dLen < 0) dLen = 0; + if (dLen > 8) dLen = 8; + //if (useHexMode) tempString.append("0x "); + for (int i = 0; i < dLen; i++) + { + if (useHexMode) tempString.append( QString::number(thisFrame.data[i], 16).toUpper().rightJustified(2, '0')); + else tempString.append(QString::number(thisFrame.data[i], 10)); tempString.append(" "); } //now, if we're supposed to interpret the data and the DBC handler is loaded then use it @@ -339,6 +354,8 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation, return QString(tr("Bus")); case Column::Length: return QString(tr("Len")); + case Column::ASCII: + return QString(tr("ASCII")); case Column::Data: return QString(tr("Data")); } diff --git a/mainwindow.cpp b/mainwindow.cpp index fb08d4c..20b05b2 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -50,13 +50,14 @@ MainWindow::MainWindow(QWidget *parent) : readSettings(); - ui->canFramesView->setColumnWidth(0, 150); - ui->canFramesView->setColumnWidth(1, 70); - ui->canFramesView->setColumnWidth(2, 40); - ui->canFramesView->setColumnWidth(3, 40); - ui->canFramesView->setColumnWidth(4, 40); - ui->canFramesView->setColumnWidth(5, 40); - ui->canFramesView->setColumnWidth(6, 225); + ui->canFramesView->setColumnWidth(0, 150); //time stamp + ui->canFramesView->setColumnWidth(1, 70); //frame ID + ui->canFramesView->setColumnWidth(2, 40); //extended + ui->canFramesView->setColumnWidth(3, 40); //direction + ui->canFramesView->setColumnWidth(4, 40); //bus + ui->canFramesView->setColumnWidth(5, 40); //length + ui->canFramesView->setColumnWidth(6, 50); //ascii + ui->canFramesView->setColumnWidth(7, 225); //data QHeaderView *HorzHdr = ui->canFramesView->horizontalHeader(); HorzHdr->setStretchLastSection(true); //causes the data column to automatically fill the tableview connect(HorzHdr, SIGNAL(sectionClicked(int)), this, SLOT(headerClicked(int))); From 60242ece70b5144f3cea647ad4618505f762804d Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 10 Dec 2017 19:18:15 -0500 Subject: [PATCH 14/33] Small fix to ensure that settings are saved to their default values when you first run the program. --- mainsettingsdialog.h | 2 +- mainwindow.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mainsettingsdialog.h b/mainsettingsdialog.h index 7d375b0..d3ef3a5 100644 --- a/mainsettingsdialog.h +++ b/mainsettingsdialog.h @@ -19,7 +19,7 @@ public: signals: void updatedSettings(); -private slots: +public slots: void updateSettings(); private: diff --git a/mainwindow.cpp b/mainwindow.cpp index 20b05b2..febf2bf 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -48,6 +48,9 @@ MainWindow::MainWindow(QWidget *parent) : ui->canFramesView->setModel(proxyModel); + settingsDialog = new MainSettingsDialog(); //instantiate the settings dialog so it can initialize settings if this is the first run or the config file was deleted. + settingsDialog->updateSettings(); //write out all the settings. If this is the first run it'll write defaults out. + readSettings(); ui->canFramesView->setColumnWidth(0, 150); //time stamp From d25c01ed1ab90f6361c210e93f561ff1a3b521b6 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 10 Dec 2017 19:25:50 -0500 Subject: [PATCH 15/33] Allow saving the column widths on the main screen and restoring them on next execution of the program. This will happen if you have the prefs setting for saving window sizes and positions checked. --- mainwindow.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index febf2bf..6c0b47d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -53,14 +53,6 @@ MainWindow::MainWindow(QWidget *parent) : readSettings(); - ui->canFramesView->setColumnWidth(0, 150); //time stamp - ui->canFramesView->setColumnWidth(1, 70); //frame ID - ui->canFramesView->setColumnWidth(2, 40); //extended - ui->canFramesView->setColumnWidth(3, 40); //direction - ui->canFramesView->setColumnWidth(4, 40); //bus - ui->canFramesView->setColumnWidth(5, 40); //length - ui->canFramesView->setColumnWidth(6, 50); //ascii - ui->canFramesView->setColumnWidth(7, 225); //data QHeaderView *HorzHdr = ui->canFramesView->horizontalHeader(); HorzHdr->setStretchLastSection(true); //causes the data column to automatically fill the tableview connect(HorzHdr, SIGNAL(sectionClicked(int)), this, SLOT(headerClicked(int))); @@ -279,6 +271,14 @@ void MainWindow::readSettings() { resize(settings.value("Main/WindowSize", QSize(800, 750)).toSize()); move(settings.value("Main/WindowPos", QPoint(100, 100)).toPoint()); + ui->canFramesView->setColumnWidth(0, settings.value("Main/TimeColumn", 150).toUInt()); //time stamp + ui->canFramesView->setColumnWidth(1, settings.value("Main/IDColumn", 70).toUInt()); //frame ID + ui->canFramesView->setColumnWidth(2, settings.value("Main/ExtColumn", 40).toUInt()); //extended + ui->canFramesView->setColumnWidth(3, settings.value("Main/DirColumn", 40).toUInt()); //direction + ui->canFramesView->setColumnWidth(4, settings.value("Main/BusColumn", 40).toUInt()); //bus + ui->canFramesView->setColumnWidth(5, settings.value("Main/LengthColumn", 40).toUInt()); //length + ui->canFramesView->setColumnWidth(6, settings.value("Main/AsciiColumn", 50).toUInt()); //ascii + ui->canFramesView->setColumnWidth(7, settings.value("Main/DataColumn", 225).toUInt()); //data } if (settings.value("Main/AutoScroll", false).toBool()) { @@ -311,6 +311,14 @@ void MainWindow::writeSettings() { settings.setValue("Main/WindowSize", size()); settings.setValue("Main/WindowPos", pos()); + settings.setValue("Main/TimeColumn", ui->canFramesView->columnWidth(0)); + settings.setValue("Main/IDColumn", ui->canFramesView->columnWidth(1)); + settings.setValue("Main/ExtColumn", ui->canFramesView->columnWidth(2)); + settings.setValue("Main/DirColumn", ui->canFramesView->columnWidth(3)); + settings.setValue("Main/BusColumn", ui->canFramesView->columnWidth(4)); + settings.setValue("Main/LengthColumn", ui->canFramesView->columnWidth(5)); + settings.setValue("Main/AsciiColumn", ui->canFramesView->columnWidth(6)); + settings.setValue("Main/DataColumn", ui->canFramesView->columnWidth(7)); } } From f4474badc5e4d12191491e18c0d226bcb583554b Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 10 Dec 2017 20:02:11 -0500 Subject: [PATCH 16/33] Added ability to change the font size. It mostly works. It's a little wonky sometimes but it will mostly change all fonts in the application to the size you set. --- main.cpp | 7 +++++++ mainsettingsdialog.cpp | 4 ++++ mainwindow.cpp | 4 ++++ ui/mainsettingsdialog.ui | 24 +++++++++++++++++++++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index dac3ecc..688ff1d 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,13 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); MainWindow w; + + QSettings settings; + int fontSize = settings.value("Main/FontSize", 9).toUInt(); + QFont sysFont = QFont(); //get default font + sysFont.setPointSize(fontSize); + a.setFont(sysFont); + w.show(); return a.exec(); diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index baf66af..8703855 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -29,6 +29,8 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->spinPlaybackSpeed->setValue(settings->value("Playback/DefSpeed", 5).toInt()); ui->lineClockFormat->setText(settings->value("Main/TimeFormat", "MMM-dd HH:mm:ss.zzz").toString()); + ui->spinFontSize->setValue(settings->value("Main/FontSize", ui->cbDisplayHex->font().pointSize()).toUInt()); + bool secondsMode = settings->value("Main/TimeSeconds", false).toBool(); bool clockMode = settings->value("Main/TimeClock", false).toBool(); if (clockMode) @@ -87,6 +89,7 @@ void MainSettingsDialog::closeEvent(QCloseEvent *event) { Q_UNUSED(event); removeEventFilter(this); + updateSettings(); settings->sync(); } @@ -126,6 +129,7 @@ void MainSettingsDialog::updateSettings() settings->setValue("Main/UseFiltered", ui->cbUseFiltered->isChecked()); settings->setValue("Main/UseOpenGL", ui->cbUseOpenGL->isChecked()); settings->setValue("Main/TimeFormat", ui->lineClockFormat->text()); + settings->setValue("Main/FontSize", ui->spinFontSize->value()); settings->sync(); emit updatedSettings(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 6c0b47d..8b6c833 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -284,6 +284,10 @@ void MainWindow::readSettings() { ui->cbAutoScroll->setChecked(true); } + int fontSize = settings.value("Main/FontSize", 9).toUInt(); + QFont newFont = QFont(ui->canFramesView->font()); + newFont.setPointSize(fontSize); + ui->canFramesView->setFont(newFont); readUpdateableSettings(); } diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index 94199bd..c1e2fb8 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -7,7 +7,7 @@ 0 0 400 - 743 + 850 @@ -123,6 +123,28 @@ + + + + Font Size + + + + + + 7 + + + 15 + + + 9 + + + + + + From f7f9096a724172c95b49324f283b792d569925bf Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 14 Dec 2017 18:42:40 -0500 Subject: [PATCH 17/33] Add 0x prefix to some more fields on UDS Scanner Window. Fix ability to use 4 subfunction bytes --- re/udsscanwindow.cpp | 2 +- ui/udsscanwindow.ui | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/re/udsscanwindow.cpp b/re/udsscanwindow.cpp index 619691b..9ff8a7d 100644 --- a/re/udsscanwindow.cpp +++ b/re/udsscanwindow.cpp @@ -117,7 +117,7 @@ void UDSScanWindow::readByToggled() void UDSScanWindow::numBytesChanged() { - uint64_t upperBound = (1 << (8 * ui->spinNumBytes->value())) - 1; + uint64_t upperBound = (1ull << (8ull * ui->spinNumBytes->value())) - 1; if (upperBound > 0x7FFFFFFF) upperBound = 0x7FFFFFFF; ui->spinUpperSubfunc->setMaximum(upperBound); } diff --git a/ui/udsscanwindow.ui b/ui/udsscanwindow.ui index f0f8195..cae150e 100644 --- a/ui/udsscanwindow.ui +++ b/ui/udsscanwindow.ui @@ -260,6 +260,9 @@ false + + 0x + 255 @@ -280,6 +283,9 @@ false + + 0x + 255 @@ -330,6 +336,9 @@ false + + 0x + 255 @@ -350,6 +359,9 @@ false + + 0x + 255 From a3a21863576aed5350c034a716c9b66f80bd6204 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 14 Dec 2017 19:43:38 -0500 Subject: [PATCH 18/33] Fix crash when loading grid in custom sender. Fix a few other issues while working on that form. --- framesenderwindow.cpp | 45 ++++++++++++++++++++++++++++--------------- framesenderwindow.h | 1 + 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/framesenderwindow.cpp b/framesenderwindow.cpp index 4061e5e..e3bed0d 100644 --- a/framesenderwindow.cpp +++ b/framesenderwindow.cpp @@ -27,18 +27,7 @@ FrameSenderWindow::FrameSenderWindow(const QVector *frames, QWidget *p intervalTimer->setTimerType(Qt::PreciseTimer); intervalTimer->setInterval(1); - QStringList headers; - headers << "En" << "Bus" << "ID" << "Len" << "Data" << "Trigger" << "Modifications" << "Count"; - ui->tableSender->setColumnCount(8); - ui->tableSender->setColumnWidth(0, 50); - ui->tableSender->setColumnWidth(1, 50); - ui->tableSender->setColumnWidth(2, 50); - ui->tableSender->setColumnWidth(3, 50); - ui->tableSender->setColumnWidth(4, 220); - ui->tableSender->setColumnWidth(5, 220); - ui->tableSender->setColumnWidth(6, 220); - ui->tableSender->setColumnWidth(7, 80); - ui->tableSender->setHorizontalHeaderLabels(headers); + setupGrid(); createBlankRow(); connect(ui->tableSender, SIGNAL(cellChanged(int,int)), this, SLOT(onCellChanged(int,int))); @@ -55,6 +44,22 @@ FrameSenderWindow::FrameSenderWindow(const QVector *frames, QWidget *p installEventFilter(this); } +void FrameSenderWindow::setupGrid() +{ + QStringList headers; + headers << "En" << "Bus" << "ID" << "Len" << "Data" << "Trigger" << "Modifications" << "Count"; + ui->tableSender->setColumnCount(8); + ui->tableSender->setColumnWidth(0, 50); + ui->tableSender->setColumnWidth(1, 50); + ui->tableSender->setColumnWidth(2, 50); + ui->tableSender->setColumnWidth(3, 50); + ui->tableSender->setColumnWidth(4, 220); + ui->tableSender->setColumnWidth(5, 220); + ui->tableSender->setColumnWidth(6, 220); + ui->tableSender->setColumnWidth(7, 80); + ui->tableSender->setHorizontalHeaderLabels(headers); +} + FrameSenderWindow::~FrameSenderWindow() { removeEventFilter(this); @@ -88,7 +93,7 @@ void FrameSenderWindow::createBlankRow() ui->tableSender->insertRow(row); QTableWidgetItem *item = new QTableWidgetItem(); - item->setFlags(item->flags() |Qt::ItemIsUserCheckable); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(Qt::Unchecked); inhibitChanged = true; ui->tableSender->setItem(row, 0, item); @@ -262,6 +267,8 @@ void FrameSenderWindow::loadGrid() loadSenderFile(filename); } } + + setupGrid(); } void FrameSenderWindow::saveSenderFile(QString filename) @@ -309,22 +316,30 @@ void FrameSenderWindow::loadSenderFile(QString filename) } ui->tableSender->clear(); + while (ui->tableSender->rowCount() > 0) ui->tableSender->removeRow(0); sendingData.clear(); while (!inFile->atEnd()) { + inhibitChanged = true; line = inFile->readLine().simplified(); if (line.length() > 2) { QList tokens = line.split('#'); int row = ui->tableSender->rowCount(); ui->tableSender->insertRow(row); - ui->tableSender->item(row, 0)->setFlags(Qt::ItemIsUserCheckable); + QTableWidgetItem *item = new QTableWidgetItem(); + ui->tableSender->setItem(row, 0, item); + ui->tableSender->item(row, 0)->setFlags(item->flags() | Qt::ItemIsUserCheckable); if (tokens[0] == "T") { ui->tableSender->item(row, 0)->setCheckState(Qt::Checked); } else ui->tableSender->item(row, 0)->setCheckState(Qt::Unchecked); - for (int i = 0; i < 7; i++) ui->tableSender->item(row, i)->setText(tokens[i]); + for (int i = 1; i < 7; i++) + { + ui->tableSender->setItem(row, i, new QTableWidgetItem(QString(tokens[i]))); + } + inhibitChanged = false; for (int k = 0; k < 7; k++) processCellChange(row, k); } diff --git a/framesenderwindow.h b/framesenderwindow.h index fada888..d4f399c 100644 --- a/framesenderwindow.h +++ b/framesenderwindow.h @@ -54,6 +54,7 @@ private: void buildFrameCache(); void processIncomingFrame(CANFrame *frame); bool eventFilter(QObject *obj, QEvent *event); + void setupGrid(); }; #endif // FRAMESENDERWINDOW_H From b7e842922224ed8ca868045d81ca5784a2123460 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 14 Dec 2017 21:47:18 -0500 Subject: [PATCH 19/33] Add a circle on the selected graph where you double clicked on it. Also show text with the coordinates at the clicked graph location --- re/graphingwindow.cpp | 31 +++++++++++++++++++++++++++++++ re/graphingwindow.h | 3 +++ 2 files changed, 34 insertions(+) diff --git a/re/graphingwindow.cpp b/re/graphingwindow.cpp index ec97149..51bd09e 100644 --- a/re/graphingwindow.cpp +++ b/re/graphingwindow.cpp @@ -42,11 +42,24 @@ GraphingWindow::GraphingWindow(const QVector *frames, QWidget *parent) ui->graphingView->legend->setSelectedFont(legendSelectedFont); ui->graphingView->legend->setSelectableParts(QCPLegend::spItems); // legend box shall not be selectable, only legend items + locationText = new QCPItemText(ui->graphingView); + locationText->position->setType(QCPItemPosition::ptAxisRectRatio); + locationText->position->setCoords(QPointF(0.16, 0.03)); + locationText->setText("X: 0 Y: 0"); + locationText->setFont(legendSelectedFont); + + itemTracer = new QCPItemTracer(ui->graphingView); + itemTracer->setInterpolating(true); + itemTracer->setVisible(false); //no graph selected yet + itemTracer->setStyle(QCPItemTracer::tsCircle); + itemTracer->setSize(20); + // connect slot that ties some axis selections together (especially opposite axes): connect(ui->graphingView, SIGNAL(selectionChangedByUser()), this, SLOT(selectionChanged())); //connect up the mouse controls connect(ui->graphingView, SIGNAL(mousePress(QMouseEvent*)), this, SLOT(mousePress())); connect(ui->graphingView, SIGNAL(plottableDoubleClick(QCPAbstractPlottable*,int,QMouseEvent*)), this, SLOT(plottableDoubleClick(QCPAbstractPlottable*,int,QMouseEvent*))); + connect(ui->graphingView, SIGNAL(plottableClick(QCPAbstractPlottable*,int,QMouseEvent*)), this, SLOT(plottableClick(QCPAbstractPlottable*,int,QMouseEvent*))); connect(ui->graphingView, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(mouseWheel())); // make bottom and left axes transfer their ranges to top and right axes: @@ -208,6 +221,15 @@ void GraphingWindow::updatedFrames(int numFrames) } } +void GraphingWindow::plottableClick(QCPAbstractPlottable* plottable, int dataIdx, QMouseEvent* event) +{ + qDebug() << "plottableClick"; + double x, y; + QCPGraph *graph = reinterpret_cast(plottable); + graph->pixelsToCoords(event->localPos(), x, y); + locationText->setText("X: " + QString::number(x, 'f', 3) + " Y: " + QString::number(y, 'f', 3)); +} + void GraphingWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, int dataIdx, QMouseEvent* event) { Q_UNUSED(dataIdx); @@ -218,6 +240,15 @@ void GraphingWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, int d id = plottable->property("id").toInt(); if (secondsMode) emit sendCenterTimeID(id, coord); else emit sendCenterTimeID(id, coord / 1000000.0); + + double x, y; + QCPGraph *graph = reinterpret_cast(plottable); + graph->pixelsToCoords(event->localPos(), x, y); + locationText->setText("X: " + QString::number(x) + " Y: " + QString::number(y)); + + itemTracer->setGraph(graph); + itemTracer->setVisible(true); + itemTracer->setGraphKey(x); } void GraphingWindow::gotCenterTimeID(int32_t ID, double timestamp) diff --git a/re/graphingwindow.h b/re/graphingwindow.h index 795780b..cc79cbc 100644 --- a/re/graphingwindow.h +++ b/re/graphingwindow.h @@ -46,6 +46,7 @@ private slots: void legendDoubleClick(QCPLegend* legend, QCPAbstractLegendItem* item); void legendSingleClick(QCPLegend* legend, QCPAbstractLegendItem* item); void plottableDoubleClick(QCPAbstractPlottable* plottable,int dataIdx, QMouseEvent* event); + void plottableClick(QCPAbstractPlottable* plottable, int dataIdx, QMouseEvent* event); void selectionChanged(); void mousePress(); void mouseWheel(); @@ -79,6 +80,8 @@ private: QList graphParams; QPen selectedPen; QCPSelectionDecorator *selDecorator; + QCPItemText *locationText; + QCPItemTracer *itemTracer; bool needScaleSetup; //do we need to set x,y graphing extents? bool secondsMode; bool useOpenGL; From 0833b56b4f2a63ed13037a38abab6e4d45eeafa4 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 11 Jan 2018 19:38:20 -0500 Subject: [PATCH 20/33] Fix overwrite mode so that selectively interpreting frames works properly. --- mainwindow.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 8b6c833..be5883c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -98,7 +98,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->action_Playback, &QAction::triggered, this, &MainWindow::showPlaybackWindow); connect(ui->actionFlow_View, &QAction::triggered, this, &MainWindow::showFlowViewWindow); connect(ui->action_Custom, &QAction::triggered, this, &MainWindow::showFrameSenderWindow); - connect(ui->canFramesView, &QAbstractItemView::clicked, this, &MainWindow::gridClicked); + connect(ui->canFramesView, &QAbstractItemView::pressed, this, &MainWindow::gridClicked); connect(ui->canFramesView, &QAbstractItemView::doubleClicked, this, &MainWindow::gridDoubleClicked); connect(ui->cbInterpret, &QAbstractButton::toggled, this, &MainWindow::interpretToggled); connect(ui->cbOverwrite, &QAbstractButton::toggled, this, &MainWindow::overwriteToggled); @@ -127,7 +127,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionSignal_Viewer, &QAction::triggered, this, &MainWindow::showSignalViewer); connect(ui->actionSave_Continuous_Logfile, &QAction::triggered, this, &MainWindow::handleContinousLogging); - connect(CANConManager::getInstance(), &CANConManager::framesReceived, model, &CANFrameModel::addFrames); lbStatusConnected.setText(tr("Connected to 0 buses")); @@ -247,9 +246,10 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) { case Qt::Key_F1: HelpWindow::getRef()->showHelp("mainscreen.html"); + return true; break; } - return true; + return false; } else { // standard event processing return QObject::eventFilter(obj, event); @@ -350,6 +350,7 @@ void MainWindow::headerClicked(int logicalIndex) void MainWindow::gridClicked(QModelIndex idx) { + //qDebug() << "Grid Clicked"; if (ui->canFramesView->rowHeight(idx.row()) > normalRowHeight) { ui->canFramesView->setRowHeight(idx.row(), normalRowHeight); @@ -361,6 +362,7 @@ void MainWindow::gridClicked(QModelIndex idx) void MainWindow::gridDoubleClicked(QModelIndex idx) { + //qDebug() << "Grid double clicked"; //grab ID and timestamp and send them away CANFrame frame = model->getListReference()->at(idx.row()); emit sendCenterTimeID(frame.ID, frame.timestamp / 1000000.0); From 80d7b8a993e7b45db62feca99b5beaf99f60cdc7 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 15 Jan 2018 22:44:20 -0500 Subject: [PATCH 21/33] Refactored DBC loading code a bit to get some of the complication out of the main loop. Fixed loading DBC files where the nodes are on separate lines. Updated version num. --- config.h | 2 +- dbc/dbchandler.cpp | 829 ++++++++++++++++++++++++--------------------- dbc/dbchandler.h | 5 + 3 files changed, 455 insertions(+), 381 deletions(-) diff --git a/config.h b/config.h index a9d8673..c4884fb 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG #define CONFIG -#define VERSION 182 +#define VERSION 183 //try to keep this in sync. //SavvyCAN will complain if you connect a GVRET board with a revision diff --git a/dbc/dbchandler.cpp b/dbc/dbchandler.cpp index 76c5e1f..7e76550 100644 --- a/dbc/dbchandler.cpp +++ b/dbc/dbchandler.cpp @@ -326,16 +326,348 @@ void DBCFile::findAttributesByType(DBC_ATTRIBUTE_TYPE typ, QList } } +DBC_MESSAGE* DBCFile::parseMessageLine(QString line) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + DBC_MESSAGE *msgPtr; + + qDebug() << "Found a BO line"; + regex.setPattern("^BO\\_ (\\w+) (\\w+) *: (\\w+) (\\w+)"); + match = regex.match(line); + //captured 1 = the ID in decimal + //captured 2 = The message name + //captured 3 = the message length + //captured 4 = the NODE responsible for this message + if (match.hasMatch()) + { + DBC_MESSAGE msg; + msg.ID = match.captured(1).toULong() & 0x7FFFFFFFul; //the ID is always stored in decimal format + msg.name = match.captured(2); + msg.len = match.captured(3).toInt(); + msg.sender = findNodeByName(match.captured(4)); + messageHandler->addMessage(msg); + msgPtr = messageHandler->findMsgByID(msg.ID); + } + else msgPtr = nullptr; + return msgPtr; +} + +DBC_SIGNAL* DBCFile::parseSignalLine(QString line, DBC_MESSAGE *msg) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + int offset = 0; + bool isMultiplexor = false; + //bool isMultiplexed = false; + DBC_SIGNAL sig; + + sig.multiplexValue = 0; + sig.isMultiplexed = false; + sig.isMultiplexor = false; + + qDebug() << "Found a SG line"; + regex.setPattern("^SG\\_ *(\\w+) +M *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); + + match = regex.match(line); + if (match.hasMatch()) + { + qDebug() << "Multiplexor signal"; + isMultiplexor = true; + sig.isMultiplexor = true; + } + else + { + regex.setPattern("^SG\\_ *(\\w+) +m(\\d+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); + match = regex.match(line); + if (match.hasMatch()) + { + qDebug() << "Multiplexed signal"; + //isMultiplexed = true; + sig.isMultiplexed = true; + sig.multiplexValue = match.captured(2).toInt(); + offset = 1; + } + else + { + qDebug() << "standard signal"; + regex.setPattern("^SG\\_ *(\\w+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); + match = regex.match(line); + sig.isMultiplexed = false; + sig.isMultiplexor = false; + } + } + + //captured 1 is the signal name + //captured 2 would be multiplex value if this is a multiplex signal. Then offset the rest of these by 1 + //captured 2 is the starting bit + //captured 3 is the length in bits + //captured 4 is the byte order / value type + //captured 5 specifies signed/unsigned for ints + //captured 6 is the scaling factor + //captured 7 is the offset + //captured 8 is the minimum value + //captured 9 is the maximum value + //captured 10 is the unit + //captured 11 is the receiving node + + if (match.hasMatch()) + { + sig.name = match.captured(1); + sig.startBit = match.captured(2 + offset).toInt(); + sig.signalSize = match.captured(3 + offset).toInt(); + int val = match.captured(4 + offset).toInt(); + if (val < 2) + { + if (match.captured(5 + offset) == "+") sig.valType = UNSIGNED_INT; + else sig.valType = SIGNED_INT; + } + switch (val) + { + case 0: //big endian mode + sig.intelByteOrder = false; + break; + case 1: //little endian mode + sig.intelByteOrder = true; + break; + case 2: + sig.valType = SP_FLOAT; + break; + case 3: + sig.valType = DP_FLOAT; + break; + case 4: + sig.valType = STRING; + break; + } + sig.factor = match.captured(6 + offset).toDouble(); + sig.bias = match.captured(7 + offset).toDouble(); + sig.min = match.captured(8 + offset).toDouble(); + sig.max = match.captured(9 + offset).toDouble(); + sig.unitName = match.captured(10 + offset); + if (match.captured(11 + offset).contains(',')) + { + QString tmp = match.captured(11 + offset).split(',')[0]; + sig.receiver = findNodeByName(tmp); + } + else sig.receiver = findNodeByName(match.captured(11 + offset)); + sig.parentMessage = msg; + msg->sigHandler->addSignal(sig); + if (isMultiplexor) msg->multiplexorSignal = msg->sigHandler->findSignalByName(sig.name); + return msg->sigHandler->findSignalByName(sig.name); + } + + return nullptr; +} + +bool DBCFile::parseValueLine(QString line) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + qDebug() << "Found a value definition line"; + regex.setPattern("^VAL\\_ (\\w+) (\\w+) (.*);"); + match = regex.match(line); + //captured 1 is the ID to match against + //captured 2 is the signal name to match against + //captured 3 is a series of values in the form (number "text") that is, all sep'd by spaces + if (match.hasMatch()) + { + //qDebug() << "Data was: " << match.captured(3); + DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); + if (msg != NULL) + { + DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(match.captured(2)); + if (sig != NULL) + { + QString tokenString = match.captured(3); + DBC_VAL_ENUM_ENTRY val; + while (tokenString.length() > 2) + { + regex.setPattern("(\\d+) \\\"(.*?)\\\"(.*)"); + match = regex.match(tokenString); + if (match.hasMatch()) + { + val.value = match.captured(1).toInt(); + val.descript = match.captured(2); + //qDebug() << "sig val " << val.value << " desc " <valList.append(val); + int rightSize = tokenString.length() - match.captured(1).length() - match.captured(2).length() - 4; + if (rightSize > 0) tokenString = tokenString.right(rightSize); + else tokenString = ""; + //qDebug() << "New token string: " << tokenString; + } + else tokenString = ""; + } + return true; + } + } + } + return false; +} + +bool DBCFile::parseAttributeLine(QString line) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* BO\\_ (\\d+) \\\"*([#\\w]+)\\\"*"); + match = regex.match(line); + //captured 1 is the attribute name + //captured 2 is the message ID number (frame ID) + //captured 3 is the attribute value + if (match.hasMatch()) + { + qDebug() << "Found an attribute setting line for a message"; + DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); + if (foundAttr) + { + qDebug() << "That attribute does exist"; + DBC_MESSAGE *foundMsg = messageHandler->findMsgByID(match.captured(2).toInt()); + if (foundMsg) + { + qDebug() << "It references a valid, registered message"; + DBC_ATTRIBUTE_VALUE *foundAttrVal = foundMsg->findAttrValByName(match.captured(1)); + if (foundAttrVal) { + foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); + } + else + { + DBC_ATTRIBUTE_VALUE val; + val.attrName = match.captured(1); + val.value = processAttributeVal(match.captured(3), foundAttr->valType); + foundMsg->attributes.append(val); + } + } + } + } + + regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* SG\\_ (\\d+) \\\"*(\\w+)\\\"* \\\"*([#\\w]+)\\\"*"); + match = regex.match(line); + //captured 1 is the attribute name + //captured 2 is the message ID number (frame ID) + //captured 3 is the signal name to bind to + //captured 4 is the attribute value + if (match.hasMatch()) + { + qDebug() << "Found an attribute setting line for a signal"; + DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); + if (foundAttr) + { + qDebug() << "That attribute does exist"; + DBC_MESSAGE *foundMsg = messageHandler->findMsgByID(match.captured(2).toInt()); + if (foundMsg) + { + qDebug() << "It references a valid, registered message"; + DBC_SIGNAL *foundSig = foundMsg->sigHandler->findSignalByName(match.captured(3)); + if (foundSig) + { + DBC_ATTRIBUTE_VALUE *foundAttrVal = foundSig->findAttrValByName(match.captured(1)); + if (foundAttrVal) foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); + else + { + DBC_ATTRIBUTE_VALUE val; + val.attrName = match.captured(1); + val.value = processAttributeVal(match.captured(3), foundAttr->valType); + foundSig->attributes.append(val); + } + } + } + } + } + + regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* BU\\_ \\\"*(\\w+)\\\"* \\\"*([#\\w]+)\\\"*"); + match = regex.match(line); + //captured 1 is the attribute name + //captured 2 is the name of the node + //captured 3 is the attribute value + if (match.hasMatch()) + { + qDebug() << "Found an attribute setting line for a node"; + DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); + if (foundAttr) + { + qDebug() << "That attribute does exist"; + DBC_NODE *foundNode = findNodeByName(match.captured(2)); + if (foundNode) + { + qDebug() << "References a valid node name"; + DBC_ATTRIBUTE_VALUE *foundAttrVal = foundNode->findAttrValByName(match.captured(1)); + if (foundAttrVal) foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); + else + { + DBC_ATTRIBUTE_VALUE val; + val.attrName = match.captured(1); + val.value = processAttributeVal(match.captured(3), foundAttr->valType); + foundNode->attributes.append(val); + } + } + return true; + } + } + + return false; +} + +bool DBCFile::parseDefaultAttrLine(QString line) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + regex.setPattern("^BA\\_DEF\\_DEF\\_ \\\"*(\\w+)\\\"* \\\"*([#\\w]*)\\\"*"); + match = regex.match(line); + //captured 1 is the name of the attribute + //captured 2 is the default value for that attribute + if (match.hasMatch()) + { + qDebug() << "Found an attribute default value line, searching for an attribute named " << match.captured(1) << "with data " << match.captured(2); + DBC_ATTRIBUTE *found = findAttributeByName(match.captured(1)); + if (found) + { + switch (found->valType) + { + case QSTRING: + found->defaultValue = match.captured(2); + break; + case QFLOAT: + found->defaultValue = match.captured(2).toFloat(); + break; + case QINT: + found->defaultValue = match.captured(2).toInt(); + break; + case ENUM: + QString temp = match.captured(2); + found->defaultValue = 0; + for (int x = 0; x < found->enumVals.count(); x++) + { + if (!found->enumVals[x].compare(temp, Qt::CaseInsensitive)) + { + found->defaultValue = x; + break; + } + } + } + qDebug() << "Matched an attribute. Setting default value to " << found->defaultValue; + return true; + } + } + return false; +} + void DBCFile::loadFile(QString fileName) { QFile *inFile = new QFile(fileName); - QString line; + QString line, rawLine; QRegularExpression regex; QRegularExpressionMatch match; DBC_MESSAGE *currentMessage = NULL; DBC_ATTRIBUTE attr; int numSigFaults = 0, numMsgFaults = 0; + bool inMultilineBU = false; + qDebug() << "DBC File: " << fileName; if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) @@ -355,420 +687,159 @@ void DBCFile::loadFile(QString fileName) dbc_nodes.append(falseNode); while (!inFile->atEnd()) { - line = QString(inFile->readLine().simplified()); - if (line.startsWith("BO_ ")) //defines a message + rawLine = QString(inFile->readLine()); + line = rawLine.simplified(); + + if (inMultilineBU) { - qDebug() << "Found a BO line"; - regex.setPattern("^BO\\_ (\\w+) (\\w+) *: (\\w+) (\\w+)"); - match = regex.match(line); - //captured 1 = the ID in decimal - //captured 2 = The message name - //captured 3 = the message length - //captured 4 = the NODE responsible for this message - if (match.hasMatch()) + if (rawLine.startsWith("\t") || rawLine.startsWith(" ")) { - DBC_MESSAGE msg; - msg.ID = match.captured(1).toULong() & 0x7FFFFFFFul; //the ID is always stored in decimal format - msg.name = match.captured(2); - msg.len = match.captured(3).toInt(); - msg.sender = findNodeByName(match.captured(4)); - messageHandler->addMessage(msg); - currentMessage = messageHandler->findMsgByID(msg.ID); + DBC_NODE node; + node.name = line; + dbc_nodes.append(node); } - else numMsgFaults++; + else inMultilineBU = false; } - if (line.startsWith("SG_ ")) //defines a signal + + if (!inMultilineBU) { - int offset = 0; - bool isMultiplexor = false; - //bool isMultiplexed = false; - DBC_SIGNAL sig; - - sig.multiplexValue = 0; - sig.isMultiplexed = false; - sig.isMultiplexor = false; - - qDebug() << "Found a SG line"; - regex.setPattern("^SG\\_ *(\\w+) +M *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); - - match = regex.match(line); - if (match.hasMatch()) + if (line.startsWith("BO_ ")) //defines a message { - qDebug() << "Multiplexor signal"; - isMultiplexor = true; - sig.isMultiplexor = true; + currentMessage = parseMessageLine(line); + if (currentMessage == nullptr) numMsgFaults++; } - else + if (line.startsWith("SG_ ")) //defines a signal { - regex.setPattern("^SG\\_ *(\\w+) +m(\\d+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); + if (!parseSignalLine(line, currentMessage)) numSigFaults++; + } + if (line.startsWith("BU_:")) //line specifies the nodes on this canbus + { + qDebug() << "Found a BU line"; + regex.setPattern("^BU\\_\\:(.*)"); match = regex.match(line); + //captured 1 = a list of node names separated by spaces. No idea how many yet if (match.hasMatch()) { - qDebug() << "Multiplexed signal"; - //isMultiplexed = true; - sig.isMultiplexed = true; - sig.multiplexValue = match.captured(2).toInt(); - offset = 1; - } - else - { - qDebug() << "standard signal"; - regex.setPattern("^SG\\_ *(\\w+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)"); - match = regex.match(line); - sig.isMultiplexed = false; - sig.isMultiplexor = false; - } - } - - //captured 1 is the signal name - //captured 2 would be multiplex value if this is a multiplex signal. Then offset the rest of these by 1 - //captured 2 is the starting bit - //captured 3 is the length in bits - //captured 4 is the byte order / value type - //captured 5 specifies signed/unsigned for ints - //captured 6 is the scaling factor - //captured 7 is the offset - //captured 8 is the minimum value - //captured 9 is the maximum value - //captured 10 is the unit - //captured 11 is the receiving node - - if (match.hasMatch()) - { - sig.name = match.captured(1); - sig.startBit = match.captured(2 + offset).toInt(); - sig.signalSize = match.captured(3 + offset).toInt(); - int val = match.captured(4 + offset).toInt(); - if (val < 2) - { - if (match.captured(5 + offset) == "+") sig.valType = UNSIGNED_INT; - else sig.valType = SIGNED_INT; - } - switch (val) - { - case 0: //big endian mode - sig.intelByteOrder = false; - break; - case 1: //little endian mode - sig.intelByteOrder = true; - break; - case 2: - sig.valType = SP_FLOAT; - break; - case 3: - sig.valType = DP_FLOAT; - break; - case 4: - sig.valType = STRING; - break; - } - sig.factor = match.captured(6 + offset).toDouble(); - sig.bias = match.captured(7 + offset).toDouble(); - sig.min = match.captured(8 + offset).toDouble(); - sig.max = match.captured(9 + offset).toDouble(); - sig.unitName = match.captured(10 + offset); - if (match.captured(11 + offset).contains(',')) - { - QString tmp = match.captured(11 + offset).split(',')[0]; - sig.receiver = findNodeByName(tmp); - } - else sig.receiver = findNodeByName(match.captured(11 + offset)); - sig.parentMessage = currentMessage; - currentMessage->sigHandler->addSignal(sig); - if (isMultiplexor) currentMessage->multiplexorSignal = currentMessage->sigHandler->findSignalByName(sig.name); - } - else numSigFaults++; - } - if (line.startsWith("BU_:")) //line specifies the nodes on this canbus - { - qDebug() << "Found a BU line"; - regex.setPattern("^BU\\_\\:(.*)"); - match = regex.match(line); - //captured 1 = a list of node names separated by spaces. No idea how many yet - if (match.hasMatch()) - { - QStringList nodeStrings = match.captured(1).split(' '); - qDebug() << "Found " << nodeStrings.count() << " node names"; - for (int i = 0; i < nodeStrings.count(); i++) - { - //qDebug() << nodeStrings[i]; - if (nodeStrings[i].length() > 1) + QStringList nodeStrings = match.captured(1).split(' '); + qDebug() << "Found " << nodeStrings.count() << " node names"; + for (int i = 0; i < nodeStrings.count(); i++) { - DBC_NODE node; - node.name = nodeStrings[i]; - dbc_nodes.append(node); - } - } - } - } - if (line.startsWith("CM_ SG_ ")) - { - qDebug() << "Found an SG comment line"; - regex.setPattern("^CM\\_ SG\\_ *(\\w+) *(\\w+) *\\\"(.*)\\\";"); - match = regex.match(line); - //captured 1 is the ID to match against to get to the message - //captured 2 is the signal name from that message - //captured 3 is the comment itself - if (match.hasMatch()) - { - //qDebug() << "Comment was: " << match.captured(3); - DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); - if (msg != NULL) - { - DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(match.captured(2)); - if (sig != NULL) - { - sig->comment = match.captured(3); - } - } - } - } - if (line.startsWith("CM_ BO_ ")) - { - qDebug() << "Found a BO comment line"; - regex.setPattern("^CM\\_ BO\\_ *(\\w+) *\\\"(.*)\\\";"); - match = regex.match(line); - //captured 1 is the ID to match against to get to the message - //captured 2 is the comment itself - if (match.hasMatch()) - { - //qDebug() << "Comment was: " << match.captured(2); - DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); - if (msg != NULL) - { - msg->comment = match.captured(2); - } - } - } - if (line.startsWith("CM_ BU_ ")) - { - qDebug() << "Found a BU comment line"; - regex.setPattern("^CM\\_ BU\\_ *(\\w+) *\\\"(.*)\\\";"); - match = regex.match(line); - //captured 1 is the Node name - //captured 2 is the comment itself - if (match.hasMatch()) - { - //qDebug() << "Comment was: " << match.captured(2); - DBC_NODE *node = findNodeByName(match.captured(1)); - if (node != NULL) - { - node->comment = match.captured(2); - } - } - } - //VAL_ (1090) (VCUPresentParkLightOC) (1 "Error present" 0 "Error not present") ; - if (line.startsWith("VAL_ ")) - { - qDebug() << "Found a value definition line"; - regex.setPattern("^VAL\\_ (\\w+) (\\w+) (.*);"); - match = regex.match(line); - //captured 1 is the ID to match against - //captured 2 is the signal name to match against - //captured 3 is a series of values in the form (number "text") that is, all sep'd by spaces - if (match.hasMatch()) - { - //qDebug() << "Data was: " << match.captured(3); - DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); - if (msg != NULL) - { - DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(match.captured(2)); - if (sig != NULL) - { - QString tokenString = match.captured(3); - DBC_VAL_ENUM_ENTRY val; - while (tokenString.length() > 2) + //qDebug() << nodeStrings[i]; + if (nodeStrings[i].length() > 1) { - regex.setPattern("(\\d+) \\\"(.*?)\\\"(.*)"); - match = regex.match(tokenString); - if (match.hasMatch()) - { - val.value = match.captured(1).toInt(); - val.descript = match.captured(2); - //qDebug() << "sig val " << val.value << " desc " <valList.append(val); - int rightSize = tokenString.length() - match.captured(1).length() - match.captured(2).length() - 4; - if (rightSize > 0) tokenString = tokenString.right(rightSize); - else tokenString = ""; - //qDebug() << "New token string: " << tokenString; - } - else tokenString = ""; + DBC_NODE node; + node.name = nodeStrings[i]; + dbc_nodes.append(node); } } + inMultilineBU = true; //we might be... Need to check next line. } } - } - - if (line.startsWith("BA_DEF_ SG_ ")) - { - qDebug() << "Found a SG attribute line"; - - if (parseAttribute(line.right(line.length() - 12), attr)) + if (line.startsWith("CM_ SG_ ")) { - qDebug() << "Success"; - attr.attrType = SIG; - dbc_attributes.append(attr); - } - } - if (line.startsWith("BA_DEF_ BO_ ")) //definition of a message attribute - { - qDebug() << "Found a BO attribute line"; - - if (parseAttribute(line.right(line.length() - 12), attr)) - { - qDebug() << "Success"; - attr.attrType = MESSAGE; - dbc_attributes.append(attr); - } - } - if (line.startsWith("BA_DEF_ BU_ ")) //definition of a node attribute - { - qDebug() << "Found a BU attribute line"; - - if (parseAttribute(line.right(line.length() - 12), attr)) - { - qDebug() << "Success"; - attr.attrType = NODE; - dbc_attributes.append(attr); - } - } - - if (line.startsWith("BA_DEF_DEF_ ")) //definition of default value for an attribute - { - regex.setPattern("^BA\\_DEF\\_DEF\\_ \\\"*(\\w+)\\\"* \\\"*([#\\w]*)\\\"*"); - match = regex.match(line); - //captured 1 is the name of the attribute - //captured 2 is the default value for that attribute - if (match.hasMatch()) - { - qDebug() << "Found an attribute default value line, searching for an attribute named " << match.captured(1) << "with data " << match.captured(2); - DBC_ATTRIBUTE *found = findAttributeByName(match.captured(1)); - if (found) + qDebug() << "Found an SG comment line"; + regex.setPattern("^CM\\_ SG\\_ *(\\w+) *(\\w+) *\\\"(.*)\\\";"); + match = regex.match(line); + //captured 1 is the ID to match against to get to the message + //captured 2 is the signal name from that message + //captured 3 is the comment itself + if (match.hasMatch()) { - switch (found->valType) + //qDebug() << "Comment was: " << match.captured(3); + DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); + if (msg != NULL) { - case QSTRING: - found->defaultValue = match.captured(2); - break; - case QFLOAT: - found->defaultValue = match.captured(2).toFloat(); - break; - case QINT: - found->defaultValue = match.captured(2).toInt(); - break; - case ENUM: - QString temp = match.captured(2); - found->defaultValue = 0; - for (int x = 0; x < found->enumVals.count(); x++) + DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(match.captured(2)); + if (sig != NULL) { - if (!found->enumVals[x].compare(temp, Qt::CaseInsensitive)) - { - found->defaultValue = x; - break; - } - } - } - qDebug() << "Matched an attribute. Setting default value to " << found->defaultValue; - } - } - } - - //BA_ "GenMsgCycleTime" BO_ 101 100; - if (line.startsWith("BA_ ")) //set value of attribute - { - regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* BO\\_ (\\d+) \\\"*([#\\w]+)\\\"*"); - match = regex.match(line); - //captured 1 is the attribute name - //captured 2 is the message ID number (frame ID) - //captured 3 is the attribute value - if (match.hasMatch()) - { - qDebug() << "Found an attribute setting line for a message"; - DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); - if (foundAttr) - { - qDebug() << "That attribute does exist"; - DBC_MESSAGE *foundMsg = messageHandler->findMsgByID(match.captured(2).toInt()); - if (foundMsg) - { - qDebug() << "It references a valid, registered message"; - DBC_ATTRIBUTE_VALUE *foundAttrVal = foundMsg->findAttrValByName(match.captured(1)); - if (foundAttrVal) { - foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); - } - else - { - DBC_ATTRIBUTE_VALUE val; - val.attrName = match.captured(1); - val.value = processAttributeVal(match.captured(3), foundAttr->valType); - foundMsg->attributes.append(val); + sig->comment = match.captured(3); } } } } - - regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* SG\\_ (\\d+) \\\"*(\\w+)\\\"* \\\"*([#\\w]+)\\\"*"); - match = regex.match(line); - //captured 1 is the attribute name - //captured 2 is the message ID number (frame ID) - //captured 3 is the signal name to bind to - //captured 4 is the attribute value - if (match.hasMatch()) + if (line.startsWith("CM_ BO_ ")) { - qDebug() << "Found an attribute setting line for a signal"; - DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); - if (foundAttr) + qDebug() << "Found a BO comment line"; + regex.setPattern("^CM\\_ BO\\_ *(\\w+) *\\\"(.*)\\\";"); + match = regex.match(line); + //captured 1 is the ID to match against to get to the message + //captured 2 is the comment itself + if (match.hasMatch()) { - qDebug() << "That attribute does exist"; - DBC_MESSAGE *foundMsg = messageHandler->findMsgByID(match.captured(2).toInt()); - if (foundMsg) + //qDebug() << "Comment was: " << match.captured(2); + DBC_MESSAGE *msg = messageHandler->findMsgByID(match.captured(1).toInt()); + if (msg != NULL) { - qDebug() << "It references a valid, registered message"; - DBC_SIGNAL *foundSig = foundMsg->sigHandler->findSignalByName(match.captured(3)); - if (foundSig) - { - DBC_ATTRIBUTE_VALUE *foundAttrVal = foundSig->findAttrValByName(match.captured(1)); - if (foundAttrVal) foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); - else - { - DBC_ATTRIBUTE_VALUE val; - val.attrName = match.captured(1); - val.value = processAttributeVal(match.captured(3), foundAttr->valType); - foundSig->attributes.append(val); - } - } + msg->comment = match.captured(2); } } } - - regex.setPattern("^BA\\_ \\\"*(\\w+)\\\"* BU\\_ \\\"*(\\w+)\\\"* \\\"*([#\\w]+)\\\"*"); - match = regex.match(line); - //captured 1 is the attribute name - //captured 2 is the name of the node - //captured 3 is the attribute value - if (match.hasMatch()) + if (line.startsWith("CM_ BU_ ")) { - qDebug() << "Found an attribute setting line for a node"; - DBC_ATTRIBUTE *foundAttr = findAttributeByName(match.captured(1)); - if (foundAttr) + qDebug() << "Found a BU comment line"; + regex.setPattern("^CM\\_ BU\\_ *(\\w+) *\\\"(.*)\\\";"); + match = regex.match(line); + //captured 1 is the Node name + //captured 2 is the comment itself + if (match.hasMatch()) { - qDebug() << "That attribute does exist"; - DBC_NODE *foundNode = findNodeByName(match.captured(2)); - if (foundNode) + //qDebug() << "Comment was: " << match.captured(2); + DBC_NODE *node = findNodeByName(match.captured(1)); + if (node != NULL) { - qDebug() << "References a valid node name"; - DBC_ATTRIBUTE_VALUE *foundAttrVal = foundNode->findAttrValByName(match.captured(1)); - if (foundAttrVal) foundAttrVal->value = processAttributeVal(match.captured(3), foundAttr->valType); - else - { - DBC_ATTRIBUTE_VALUE val; - val.attrName = match.captured(1); - val.value = processAttributeVal(match.captured(3), foundAttr->valType); - foundNode->attributes.append(val); - } + node->comment = match.captured(2); } } + } + //VAL_ (1090) (VCUPresentParkLightOC) (1 "Error present" 0 "Error not present") ; + if (line.startsWith("VAL_ ")) + { + parseValueLine(line); + } + if (line.startsWith("BA_DEF_ SG_ ")) + { + qDebug() << "Found a SG attribute line"; + + if (parseAttribute(line.right(line.length() - 12), attr)) + { + qDebug() << "Success"; + attr.attrType = SIG; + dbc_attributes.append(attr); + } + } + if (line.startsWith("BA_DEF_ BO_ ")) //definition of a message attribute + { + qDebug() << "Found a BO attribute line"; + + if (parseAttribute(line.right(line.length() - 12), attr)) + { + qDebug() << "Success"; + attr.attrType = MESSAGE; + dbc_attributes.append(attr); + } + } + if (line.startsWith("BA_DEF_ BU_ ")) //definition of a node attribute + { + qDebug() << "Found a BU attribute line"; + + if (parseAttribute(line.right(line.length() - 12), attr)) + { + qDebug() << "Success"; + attr.attrType = NODE; + dbc_attributes.append(attr); + } + } + + if (line.startsWith("BA_DEF_DEF_ ")) //definition of default value for an attribute + { + parseDefaultAttrLine(line); + } + + //BA_ "GenMsgCycleTime" BO_ 101 100; + if (line.startsWith("BA_ ")) //set value of attribute + { + parseAttributeLine(line); } } } @@ -818,8 +889,6 @@ void DBCFile::loadFile(QString fileName) DBC_ATTRIBUTE_VALUE *thisBG; DBC_ATTRIBUTE_VALUE *thisFG; - - for (int x = 0; x < messageHandler->getCount(); x++) { DBC_MESSAGE *msg = messageHandler->findMsgByIdx(x); diff --git a/dbc/dbchandler.h b/dbc/dbchandler.h index 8fdcdb5..eb4a32b 100644 --- a/dbc/dbchandler.h +++ b/dbc/dbchandler.h @@ -79,6 +79,11 @@ private: bool parseAttribute(QString inpString, DBC_ATTRIBUTE &attr); QVariant processAttributeVal(QString input, DBC_ATTRIBUTE_VAL_TYPE typ); + DBC_SIGNAL* parseSignalLine(QString line, DBC_MESSAGE *msg); + DBC_MESSAGE* parseMessageLine(QString line); + bool parseValueLine(QString line); + bool parseAttributeLine(QString line); + bool parseDefaultAttrLine(QString line); }; class DBCHandler: public QObject From 028a10816940a4265852b652e25af98d0d7db107 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 4 Feb 2018 18:10:37 -0500 Subject: [PATCH 22/33] Added ability to decode MARK frames from the CAN stream. These are used just to mark where you've done something. M2RET devices currently support this, more support to come later on. --- canframemodel.cpp | 6 ++++++ config.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index d467a71..021f681 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -284,6 +284,12 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const case Column::Length: return QString::number(thisFrame.len); case Column::ASCII: + if (thisFrame.ID >= 0x7FFFFFF0ull) + { + tempString.append("MARK "); + tempString.append(QString::number(thisFrame.ID & 0x7)); + return tempString; + } dLen = thisFrame.len; if (dLen < 0) dLen = 0; if (dLen > 8) dLen = 8; diff --git a/config.h b/config.h index c4884fb..789c649 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG #define CONFIG -#define VERSION 183 +#define VERSION 184 //try to keep this in sync. //SavvyCAN will complain if you connect a GVRET board with a revision From 96b73bd1caf09b8039e5c3e129ab9115ca789095 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 4 Feb 2018 18:11:25 -0500 Subject: [PATCH 23/33] ISOTP and Scripting bug fixes --- bus_protocols/isotp_handler.cpp | 8 +++- bus_protocols/isotp_handler.h | 1 + scriptcontainer.cpp | 72 ++++++++++++++++++++++++--------- scriptcontainer.h | 3 +- scriptingwindow.cpp | 9 ++++- 5 files changed, 70 insertions(+), 23 deletions(-) diff --git a/bus_protocols/isotp_handler.cpp b/bus_protocols/isotp_handler.cpp index a376e1d..67d3f83 100644 --- a/bus_protocols/isotp_handler.cpp +++ b/bus_protocols/isotp_handler.cpp @@ -9,6 +9,7 @@ ISOTP_HANDLER::ISOTP_HANDLER() processAll = false; lastSenderBus = 0; lastSenderID = 0; + issuedMultiFrame = false; modelFrames = MainWindow::getReference()->getCANFrameModel()->getListReference(); @@ -60,6 +61,7 @@ void ISOTP_HANDLER::sendISOTPFrame(int bus, int ID, QVector data) if (data.length() < 8) { + issuedMultiFrame = false; frame.bus = bus; frame.extended = false; frame.ID = ID; @@ -71,6 +73,7 @@ void ISOTP_HANDLER::sendISOTPFrame(int bus, int ID, QVector data) } else //need to send a multi-part ISO_TP message - Respects timing and frame number based flow control { + issuedMultiFrame = true; frame.bus = bus; frame.ID = ID; frame.extended = false; @@ -200,6 +203,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) msg.ID = ID; msg.timestamp = frame.timestamp; msg.isReceived = frame.isReceived; + issuedMultiFrame = true; frameLen = frameLen << 8; if (useExtendedAddressing) { @@ -220,7 +224,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) messageBuffer.append(msg); //The sending ID is set to the last ID we used to send from this class which is //very likely to be correct. But, caution, there is a chance that it isn't. Beware. - if (issueFlowMsgs && lastSenderID > 0) + if (issueFlowMsgs && lastSenderID > 0 && issuedMultiFrame) { CANFrame outFrame; outFrame.bus = lastSenderBus; @@ -260,6 +264,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) if (pMsg->len <= pMsg->data.count()) { //qDebug() << "Emitting multiframe ISOTP message"; + issuedMultiFrame = false; emit newISOMessage(*pMsg); } break; @@ -300,6 +305,7 @@ void ISOTP_HANDLER::checkNeedFlush(uint64_t ID) //used to pass by reference but now newISOMessage should pass by value which makes it easier to use cross thread //qDebug() << "Flushing a partial frame"; emit newISOMessage(messageBuffer[i]); + issuedMultiFrame = false; messageBuffer.removeAt(i); return; } diff --git a/bus_protocols/isotp_handler.h b/bus_protocols/isotp_handler.h index 611f63a..1aa4652 100644 --- a/bus_protocols/isotp_handler.h +++ b/bus_protocols/isotp_handler.h @@ -46,6 +46,7 @@ private: int framesUntilFlow; bool processAll; bool issueFlowMsgs; + bool issuedMultiFrame; QTimer frameTimer; uint32_t lastSenderID; uint32_t lastSenderBus; diff --git a/scriptcontainer.cpp b/scriptcontainer.cpp index cf5f285..6d004c0 100644 --- a/scriptcontainer.cpp +++ b/scriptcontainer.cpp @@ -6,15 +6,47 @@ ScriptContainer::ScriptContainer() { - canHelper = new CANScriptHelper(&scriptEngine); - isoHelper = new ISOTPScriptHelper(&scriptEngine); - udsHelper = new UDSScriptHelper(&scriptEngine); + qDebug() << "Script Container Constructor"; + scriptEngine = new QJSEngine(); + canHelper = new CANScriptHelper(scriptEngine); + isoHelper = new ISOTPScriptHelper(scriptEngine); + udsHelper = new UDSScriptHelper(scriptEngine); connect(&timer, SIGNAL(timeout()), this, SLOT(tick())); } +ScriptContainer::~ScriptContainer() +{ + qDebug() << "Script Container Destructor " << (uint64_t)this << "c: " << (uint64_t)canHelper; + timer.stop(); + disconnect(&timer, SIGNAL(timeout()), this, SLOT(tick())); + if (scriptEngine) + { + scriptText = ""; + compileScript(); + //delete scriptEngine; //doing this here seems to cause a crash. No crash if you don't. + //scriptEngine = NULL; + } + if (canHelper) + { + delete canHelper; + canHelper = NULL; + } + if (isoHelper) + { + delete isoHelper; + isoHelper = NULL; + } + if (udsHelper) + { + delete udsHelper; + udsHelper = NULL; + } + qDebug() << "end of destruct"; +} + void ScriptContainer::compileScript() { - QJSValue result = scriptEngine.evaluate(scriptText, fileName); + QJSValue result = scriptEngine->evaluate(scriptText, fileName); emit sendLog("Compiling script..."); @@ -37,22 +69,22 @@ void ScriptContainer::compileScript() //Add a bunch of helper objects into javascript that the scripts //can use to interact with the CAN buses - QJSValue hostObj = scriptEngine.newQObject(this); - scriptEngine.globalObject().setProperty("host", hostObj); - QJSValue canObj = scriptEngine.newQObject(canHelper); - scriptEngine.globalObject().setProperty("can", canObj); - QJSValue isoObj = scriptEngine.newQObject(isoHelper); - scriptEngine.globalObject().setProperty("isotp", isoObj); - QJSValue udsObj = scriptEngine.newQObject(udsHelper); - scriptEngine.globalObject().setProperty("uds", udsObj); + QJSValue hostObj = scriptEngine->newQObject(this); + scriptEngine->globalObject().setProperty("host", hostObj); + QJSValue canObj = scriptEngine->newQObject(canHelper); + scriptEngine->globalObject().setProperty("can", canObj); + QJSValue isoObj = scriptEngine->newQObject(isoHelper); + scriptEngine->globalObject().setProperty("isotp", isoObj); + QJSValue udsObj = scriptEngine->newQObject(udsHelper); + scriptEngine->globalObject().setProperty("uds", udsObj); //Find out which callbacks the script has created. - setupFunction = scriptEngine.globalObject().property("setup"); - canHelper->setRxCallback(scriptEngine.globalObject().property("gotCANFrame")); - isoHelper->setRxCallback(scriptEngine.globalObject().property("gotISOTPMessage")); - udsHelper->setRxCallback(scriptEngine.globalObject().property("gotUDSMessage")); + setupFunction = scriptEngine->globalObject().property("setup"); + canHelper->setRxCallback(scriptEngine->globalObject().property("gotCANFrame")); + isoHelper->setRxCallback(scriptEngine->globalObject().property("gotISOTPMessage")); + udsHelper->setRxCallback(scriptEngine->globalObject().property("gotUDSMessage")); - tickFunction = scriptEngine.globalObject().property("tick"); + tickFunction = scriptEngine->globalObject().property("tick"); if (setupFunction.isCallable()) { @@ -117,7 +149,7 @@ void ScriptContainer::updateValuesTable(QTableWidget *widget) foreach (QString paramName, scriptParams) { - valu = scriptEngine.globalObject().property(paramName).toString(); + valu = scriptEngine->globalObject().property(paramName).toString(); qDebug() << paramName << " - " << valu; bool found = false; for (int i = 0; i < widget->rowCount(); i++) @@ -152,7 +184,7 @@ void ScriptContainer::updateParameter(QString name, QString value) { qDebug() << name << " * " << value; QJSValue val(value); - scriptEngine.globalObject().setProperty(name, val); + scriptEngine->globalObject().setProperty(name, val); } @@ -249,6 +281,7 @@ ISOTPScriptHelper::ISOTPScriptHelper(QJSEngine *engine) handler = new ISOTP_HANDLER; connect(handler, SIGNAL(newISOMessage(ISOTP_MESSAGE)), this, SLOT(newISOMessage(ISOTP_MESSAGE))); handler->setReception(true); + handler->setFlowCtrl(true); } void ISOTPScriptHelper::clearFilters() @@ -319,6 +352,7 @@ UDSScriptHelper::UDSScriptHelper(QJSEngine *engine) handler = new UDS_HANDLER; connect(handler, SIGNAL(newUDSMessage(UDS_MESSAGE)), this, SLOT(newUDSMessage(UDS_MESSAGE))); handler->setReception(true); + handler->setFlowCtrl(true); } void UDSScriptHelper::clearFilters() diff --git a/scriptcontainer.h b/scriptcontainer.h index 04d10f4..ec9f4c8 100644 --- a/scriptcontainer.h +++ b/scriptcontainer.h @@ -77,6 +77,7 @@ class ScriptContainer : public QObject public: ScriptContainer(); + virtual ~ScriptContainer(); void setScriptWindow(ScriptingWindow *win); QString fileName; @@ -102,7 +103,7 @@ private slots: void tick(); private: - QJSEngine scriptEngine; + QJSEngine *scriptEngine; QJSValue compiledScript; QJSValue setupFunction; QJSValue tickFunction; diff --git a/scriptingwindow.cpp b/scriptingwindow.cpp index 1ea6e36..5b1fbf9 100644 --- a/scriptingwindow.cpp +++ b/scriptingwindow.cpp @@ -204,7 +204,7 @@ void ScriptingWindow::loadNewScript() QString justFileName = fileList[fileList.length() - 1]; ui->listLoadedScripts->addItem(justFileName); - container = new ScriptContainer; + container = new ScriptContainer(); container->fileName = justFileName; container->filePath = filename; container->scriptText = contents; @@ -223,7 +223,7 @@ void ScriptingWindow::createNewScript() { ScriptContainer *container; - container = new ScriptContainer; + container = new ScriptContainer(); container->fileName = "UNNAMED_" + QString::number((qrand() % 10000)) + ".js"; container->filePath = QString(); @@ -238,6 +238,8 @@ void ScriptingWindow::createNewScript() void ScriptingWindow::deleteCurrentScript() { + ScriptContainer* thisScript; + int sel = ui->listLoadedScripts->currentRow(); if (sel < 0) return; @@ -250,7 +252,10 @@ void ScriptingWindow::deleteCurrentScript() { case QMessageBox::Yes: ui->listLoadedScripts->takeItem(sel); + thisScript = scripts.at(sel); scripts.removeAt(sel); + delete thisScript; //causes a seg fault. Seems to be due to currently running javascript code. No idea how to stop code from running + thisScript = NULL; currentScript = NULL; if (ui->listLoadedScripts->count() > 0) From be97380bbf2f8ffa95b5a0b829566c3bc9a8a6d6 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Wed, 7 Feb 2018 16:23:54 -0500 Subject: [PATCH 24/33] Add PCAN log ver 2 file loading as well as loading of CANalyzer ASC logs --- framefileio.cpp | 139 ++++++++++++++++++++++++++++++++++++++++++------ framefileio.h | 1 + 2 files changed, 125 insertions(+), 15 deletions(-) diff --git a/framefileio.cpp b/framefileio.cpp index 7d27c07..f0f17bc 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -137,6 +137,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache filters.append(QString(tr("PCAN Viewer (*.trc *.TRC)"))); filters.append(QString(tr("Kvaser Log Decimal (*.txt *.TXT)"))); filters.append(QString(tr("Kvaser Log Hex (*.txt *.TXT)"))); + filters.append(QString(tr("CANalyzer Ascii Log (*.asc *.ASC)"))); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setNameFilters(filters); @@ -169,6 +170,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache if (dialog.selectedNameFilter() == filters[10]) result = loadPCANFile(filename, frameCache); if (dialog.selectedNameFilter() == filters[11]) result = loadKvaserFile(filename, frameCache, false); if (dialog.selectedNameFilter() == filters[12]) result = loadKvaserFile(filename, frameCache, true); + if (dialog.selectedNameFilter() == filters[13]) result = loadCanalyzerASC(filename, frameCache); progress.cancel(); @@ -416,6 +418,8 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector* frames } +/*Fixed length lines + Version 1.1 //; Message Number //; | Time Offset (ms) //; | | Type @@ -424,14 +428,27 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector* frames //; | | | | | Data Bytes (hex) ... //; | | | | | | //;---+-- ----+---- --+-- ----+--- + -+ -- -- -- -- -- -- -- -// 0-6 10-18 21-25 28-35 38 41-? -//Fixed length lines +// 0-6 10-18 21-25 28-35 38 41-? two chars each + space + + Version 2.0 +; Message Time Type ID Rx/Tx +; Number Offset | [hex] | Data Length +; | [ms] | | | | Data [hex] ... +; | | | | | | | +;---+-- ------+------ +- --+----- +- +- +- +- -- -- -- -- -- -- -- + 0-6 8-20 22-23 25-32 34-35 37-38 40-? two chars each + space + + Both versions are supported now but rather lazily. Very many aspects of the file are ignored. + It seems as if Version 2 files might be able to store other protocols like ISO-TP or J1939 +*/ + bool FrameFileIO::loadPCANFile(QString filename, QVector* frames) { QFile *inFile = new QFile(filename); CANFrame thisFrame; QByteArray line; int lineCounter = 0; + int fileVersion = 1; bool foundErrors = false; if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) @@ -448,27 +465,54 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector* frames) lineCounter = 0; } line = inFile->readLine(); + if (line.startsWith(";$FILEVERSION=2.0")) fileVersion = 2; if (line.startsWith(';')) continue; if (line.length() > 2) { - thisFrame.timestamp = line.mid(10, 8).simplified().toFloat() * 1000ull; - thisFrame.ID = line.mid(28, 8).simplified().toUInt(NULL, 16); - if (thisFrame.ID < 0x1FFFFFFF) + if (fileVersion == 1) { - thisFrame.len = line.mid(38,1).toInt(); - thisFrame.isReceived = true; - thisFrame.bus = 0; - thisFrame.extended = false; - QList tokens = line.mid(41, thisFrame.len * 3).split(' '); - for (unsigned int d = 0; d < thisFrame.len; d++) + thisFrame.timestamp = (uint32_t)(line.mid(10, 8).simplified().toFloat() * 1000.0); + thisFrame.ID = line.mid(28, 8).simplified().toUInt(NULL, 16); + if (thisFrame.ID < 0x1FFFFFFF) { - if (tokens[d] != "") + thisFrame.len = line.mid(38,1).toInt(); + thisFrame.isReceived = true; + thisFrame.bus = 0; + thisFrame.extended = false; + QList tokens = line.mid(41, thisFrame.len * 3).split(' '); + for (unsigned int d = 0; d < thisFrame.len; d++) { - thisFrame.data[d] = tokens[d].toInt(NULL, 16); + if (tokens[d] != "") + { + thisFrame.data[d] = tokens[d].toInt(NULL, 16); + } + else thisFrame.data[d] = 0; } - else thisFrame.data[d] = 0; + frames->append(thisFrame); + } + } + else if (fileVersion == 2) + { + thisFrame.timestamp = (uint32_t)(line.mid(8, 13).simplified().toFloat() * 1000.0); + thisFrame.ID = line.mid(25, 8).simplified().toUInt(NULL, 16); + if (thisFrame.ID < 0x1FFFFFFF) + { + thisFrame.len = line.mid(37,2).trimmed().toInt(); + qDebug() << thisFrame.len; + thisFrame.isReceived = true; + thisFrame.bus = 0; + thisFrame.extended = false; + QList tokens = line.mid(40, thisFrame.len * 3).split(' '); + for (unsigned int d = 0; d < thisFrame.len; d++) + { + if (tokens[d] != "") + { + thisFrame.data[d] = tokens[d].toInt(NULL, 16); + } + else thisFrame.data[d] = 0; + } + frames->append(thisFrame); } - frames->append(thisFrame); } } //else foundErrors = true; @@ -478,6 +522,71 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector* frames) return !foundErrors; } +//There tends to be four lines of header first. The last of which starts with // so first burn off lines +//until a line starting with // is seen, then the rest are formatted like this: +// 47.971842 2 248 Rx d 8 FF FF FF FF FF FF FF FF +//That can be simplified to look like this: +//47.971842 2 248 Rx d 8 FF FF FF FF FF FF FF FF +//Which is then easy to parse by splitting on the spaces +//Time bus id dir ? len databytes +bool FrameFileIO::loadCanalyzerASC(QString filename, QVector* frames) +{ + QFile *inFile = new QFile(filename); + CANFrame thisFrame; + QByteArray line; + int lineCounter = 0; + bool foundErrors = false; + bool inHeader = true; + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + { + delete inFile; + return false; + } + + while (!inFile->atEnd()) { + lineCounter++; + if (lineCounter > 100) + { + qApp->processEvents(); + lineCounter = 0; + } + line = inFile->readLine(); + if (line.startsWith("//")) + { + inHeader = false; + continue; + } + if (inHeader) continue; + if (line.length() > 2) + { + QList tokens = line.simplified().split(' '); + thisFrame.timestamp = (uint32_t)(tokens[0].toFloat() * 1000000.0); + thisFrame.ID = tokens[2].toUInt(NULL, 16); + thisFrame.len = tokens[5].toUInt(); + thisFrame.isReceived = tokens[3].toUpper().contains("RX"); + thisFrame.bus = tokens[1].toUInt(); + thisFrame.extended = (thisFrame.ID > 0x7FF); + for (unsigned int d = 6; d < (6 + thisFrame.len); d++) + { + if (tokens.count() > d) + { + thisFrame.data[d - 6] = tokens[d].toInt(NULL, 16); + } + else //expected byte wasn't there to read. Set it zero and set error flag + { + thisFrame.data[d - 6] = 0; + foundErrors = true; + } + } + frames->append(thisFrame); + } + //else foundErrors = true; + } + inFile->close(); + delete inFile; + return !foundErrors; +} //The "native" file format for this program bool FrameFileIO::loadNativeCSVFile(QString filename, QVector* frames) diff --git a/framefileio.h b/framefileio.h index 07b15c7..2081bfd 100644 --- a/framefileio.h +++ b/framefileio.h @@ -42,6 +42,7 @@ public: static bool loadCanDumpFile(QString, QVector*); static bool loadPCANFile(QString, QVector*); static bool loadKvaserFile(QString, QVector*, bool); + static bool loadCanalyzerASC(QString, QVector*); static bool saveCRTDFile(QString, const QVector*); static bool saveNativeCSVFile(QString, const QVector*); static bool saveGenericCSVFile(QString, const QVector*); From c60eac7364cd6a561db422bfb8c91b47007e59a8 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 8 Feb 2018 20:47:13 -0500 Subject: [PATCH 25/33] Add support for loading BLF files. Only loads CAN frames at this point. --- SavvyCAN.pro | 6 ++-- blfhandler.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ blfhandler.h | 78 ++++++++++++++++++++++++++++++++++++++++++++ framefileio.cpp | 9 ++++++ framefileio.h | 1 + 5 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 blfhandler.cpp create mode 100644 blfhandler.h diff --git a/SavvyCAN.pro b/SavvyCAN.pro index b9507cf..84b6308 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -64,7 +64,8 @@ SOURCES += main.cpp\ bus_protocols/uds_handler.cpp \ jsedit.cpp \ frameplaybackobject.cpp \ - helpwindow.cpp + helpwindow.cpp \ + blfhandler.cpp HEADERS += mainwindow.h \ can_structs.h \ @@ -119,7 +120,8 @@ HEADERS += mainwindow.h \ bus_protocols/isotp_message.h \ jsedit.h \ frameplaybackobject.h \ - helpwindow.h + helpwindow.h \ + blfhandler.h FORMS += ui/candatagrid.ui \ ui/connectionwindow.ui \ diff --git a/blfhandler.cpp b/blfhandler.cpp new file mode 100644 index 0000000..a86a0d5 --- /dev/null +++ b/blfhandler.cpp @@ -0,0 +1,86 @@ +#include "blfhandler.h" +#include +#include +#include +#include + +BLFHandler::BLFHandler() +{ + +} + + +/* + Written while peeking at source code here: +https://python-can.readthedocs.io/en/latest/_modules/can/io/blf.html + +All the code actually below is freshly written though. +*/ +bool BLFHandler::loadBLF(QString filename, QVector* frames) +{ + BLF_OBJ_HEADER objHeader; + QByteArray fileData; + QByteArray uncompressedData; + QByteArray junk; + BLF_OBJECT obj; + uint32_t pos; + BLF_CAN_OBJ canObject; + + QFile *inFile = new QFile(filename); + + if (!inFile->open(QIODevice::ReadOnly)) + { + delete inFile; + return false; + } + inFile->read((char *)&header, sizeof(header)); + if (qFromLittleEndian(header.sig) == 0x47474F4C) + { + } + else return false; + + while (!inFile->atEnd()) + { + inFile->read((char *)&objHeader, sizeof(objHeader)); + if (qFromLittleEndian(objHeader.sig) == 0x4A424F4C) + { + int readSize = objHeader.objSize - sizeof(BLF_OBJ_HEADER); + fileData = inFile->read(readSize); + junk = inFile->read(readSize % 4); //file is padded so sizes must always end up on even multiple of 4 + if (objHeader.objType == BLF_CONTAINER) + { + fileData.prepend(objHeader.uncompSize & 0xFF); + fileData.prepend((objHeader.uncompSize >> 8) & 0xFF); + fileData.prepend((objHeader.uncompSize >> 16) & 0xFF); + fileData.prepend((objHeader.uncompSize >> 24) & 0xFF); + uncompressedData += qUncompress(fileData); + pos = 0; + while (pos + sizeof(BLF_OBJ_HEADER) < uncompressedData.count()) + { + memcpy(&obj.header, uncompressedData.mid(pos, sizeof(BLF_OBJ_HEADER)).constData(), sizeof(BLF_OBJ_HEADER)); + if (qFromLittleEndian(objHeader.sig) == 0x4A424F4C) + { + fileData = uncompressedData.mid(pos + sizeof(BLF_OBJ_HEADER), obj.header.objSize - sizeof(BLF_OBJ_HEADER)); + if (obj.header.objType == BLF_CAN_MSG) + { + memcpy(&canObject, fileData.constData(), sizeof(BLF_CAN_OBJ)); + CANFrame frame; + frame.bus = canObject.channel; + frame.extended = (canObject.id & 0x80000000ull)?true:false; + frame.ID = canObject.id & 0x1FFFFFFFull; + frame.isReceived = true; + frame.len = canObject.dlc; + frame.timestamp = obj.header.uncompSize / 1000000.0; //uncompsize field also used for timestamp oddly enough + for (int i = 0; i < 8; i++) frame.data[i] = canObject.data[i]; + frames->append(frame); + } + pos += obj.header.objSize + (obj.header.objSize % 4); + } + } + uncompressedData.remove(0, pos); + } + } + else return false; + } + return false; +} diff --git a/blfhandler.h b/blfhandler.h new file mode 100644 index 0000000..15394c6 --- /dev/null +++ b/blfhandler.h @@ -0,0 +1,78 @@ +#ifndef BLFHANDLER_H +#define BLFHANDLER_H + +#include +#include +#include +#include "can_structs.h" + +enum +{ + BLF_CAN_MSG = 1, + BLF_CAN_ERR = 2, + BLF_CONTAINER = 10, + BLF_GLOBAL_MARKER = 96, +}; + +struct BLF_FILE_HEADER +{ + uint32_t sig; + uint32_t headerSize; + uint8_t appID; + uint8_t appVerMajor; + uint8_t appVerMinor; + uint8_t appVerBuild; + uint8_t binLogVerMajor; + uint8_t binLogVerMinor; + uint8_t binLogVerBuild; + uint8_t binLogVerPatch; + uint64_t fileSize; + uint64_t uncompressedFileSize; + uint32_t countObjs; + uint32_t countObjsRead; + uint8_t startTime[16]; + uint8_t stopTime[16]; + uint8_t unused[72]; +}; //144 bytes + +struct BLF_OBJ_HEADER +{ + uint32_t sig; + uint16_t headerSize; + uint16_t headerVersion; + uint32_t objSize; + uint32_t objType; + uint32_t flags; + uint16_t nothing; + uint16_t objVer; + uint64_t uncompSize; +}; //32 bytes + +struct BLF_OBJECT +{ + BLF_OBJ_HEADER header; + QByteArray data; +}; + +struct BLF_CAN_OBJ +{ + uint16_t channel; + uint8_t flags; + uint8_t dlc; + uint32_t id; + uint8_t data[8]; +}; + + +class BLFHandler +{ +public: + BLFHandler(); + bool loadBLF(QString filename, QVector* frames); + +private: + BLF_FILE_HEADER header; + QList objects; +}; + +#endif // BLFHANDLER_H diff --git a/framefileio.cpp b/framefileio.cpp index f0f17bc..c4b9d35 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -6,6 +6,7 @@ #include #include "utility.h" +#include "blfhandler.h" QFile FrameFileIO::continuousFile; @@ -138,6 +139,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache filters.append(QString(tr("Kvaser Log Decimal (*.txt *.TXT)"))); filters.append(QString(tr("Kvaser Log Hex (*.txt *.TXT)"))); filters.append(QString(tr("CANalyzer Ascii Log (*.asc *.ASC)"))); + filters.append(QString(tr("CANalyzer Binary Log Files (*.blf *.BLF)"))); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setNameFilters(filters); @@ -171,6 +173,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache if (dialog.selectedNameFilter() == filters[11]) result = loadKvaserFile(filename, frameCache, false); if (dialog.selectedNameFilter() == filters[12]) result = loadKvaserFile(filename, frameCache, true); if (dialog.selectedNameFilter() == filters[13]) result = loadCanalyzerASC(filename, frameCache); + if (dialog.selectedNameFilter() == filters[14]) result = loadCanalyzerBLF(filename, frameCache); progress.cancel(); @@ -588,6 +591,12 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector* frames) return !foundErrors; } +bool FrameFileIO::loadCanalyzerBLF(QString filename, QVector *frames) +{ + BLFHandler blf; + blf.loadBLF(filename, frames); +} + //The "native" file format for this program bool FrameFileIO::loadNativeCSVFile(QString filename, QVector* frames) { diff --git a/framefileio.h b/framefileio.h index 2081bfd..5015782 100644 --- a/framefileio.h +++ b/framefileio.h @@ -43,6 +43,7 @@ public: static bool loadPCANFile(QString, QVector*); static bool loadKvaserFile(QString, QVector*, bool); static bool loadCanalyzerASC(QString, QVector*); + static bool loadCanalyzerBLF(QString, QVector*); static bool saveCRTDFile(QString, const QVector*); static bool saveNativeCSVFile(QString, const QVector*); static bool saveGenericCSVFile(QString, const QVector*); From 59e75d9637c798be8790baea2154cd8f85ae0353 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Fri, 9 Feb 2018 21:49:32 -0500 Subject: [PATCH 26/33] Update QCustomPlot version. --- qcustomplot.cpp | 5670 +++++++++++++++++++++++++---------------------- qcustomplot.h | 1482 +++++++------ 2 files changed, 3770 insertions(+), 3382 deletions(-) diff --git a/qcustomplot.cpp b/qcustomplot.cpp index 4c912f4..154576a 100644 --- a/qcustomplot.cpp +++ b/qcustomplot.cpp @@ -1,7 +1,7 @@ /*************************************************************************** ** ** ** QCustomPlot, an easy to use, modern plotting widget for Qt ** -** Copyright (C) 2011-2016 Emanuel Eichhammer ** +** Copyright (C) 2011-2017 Emanuel Eichhammer ** ** ** ** This program is free software: you can redistribute it and/or modify ** ** it under the terms of the GNU General Public License as published by ** @@ -19,15 +19,15 @@ **************************************************************************** ** Author: Emanuel Eichhammer ** ** Website/Contact: http://www.qcustomplot.com/ ** -** Date: 13.09.16 ** -** Version: 2.0.0-beta ** +** Date: 04.09.17 ** +** Version: 2.0.0 ** ****************************************************************************/ #include "qcustomplot.h" /* including file 'src/vector2d.cpp', size 7340 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPVector2D @@ -35,7 +35,7 @@ /*! \class QCPVector2D \brief Represents two doubles as a mathematical 2D vector - + This class acts as a replacement for QVector2D with the advantage of double precision instead of single, and some convenience methods tailored for the QCustomPlot library. */ @@ -43,63 +43,63 @@ /* start documentation of inline functions */ /*! \fn void QCPVector2D::setX(double x) - + Sets the x coordinate of this vector to \a x. - + \see setY */ /*! \fn void QCPVector2D::setY(double y) - + Sets the y coordinate of this vector to \a y. - + \see setX */ /*! \fn double QCPVector2D::length() const - + Returns the length of this vector. - + \see lengthSquared */ /*! \fn double QCPVector2D::lengthSquared() const - + Returns the squared length of this vector. In some situations, e.g. when just trying to find the shortest vector of a group, this is faster than calculating \ref length, because it avoids calculation of a square root. - + \see length */ /*! \fn QPoint QCPVector2D::toPoint() const - + Returns a QPoint which has the x and y coordinates of this vector, truncating any floating point information. - + \see toPointF */ /*! \fn QPointF QCPVector2D::toPointF() const - + Returns a QPointF which has the x and y coordinates of this vector. - + \see toPoint */ /*! \fn bool QCPVector2D::isNull() const - + Returns whether this vector is null. A vector is null if \c qIsNull returns true for both x and y coordinates, i.e. if both are binary equal to 0. */ /*! \fn QCPVector2D QCPVector2D::perpendicular() const - + Returns a vector perpendicular to this vector, with the same length. */ /*! \fn double QCPVector2D::dot() const - + Returns the dot/scalar product of this vector with the specified vector \a vec. */ @@ -146,7 +146,7 @@ QCPVector2D::QCPVector2D(const QPointF &point) : /*! Normalizes this vector. After this operation, the length of the vector is equal to 1. - + \see normalized, length, lengthSquared */ void QCPVector2D::normalize() @@ -158,7 +158,7 @@ void QCPVector2D::normalize() /*! Returns a normalized version of this vector. The length of the returned vector is equal to 1. - + \see normalize, length, lengthSquared */ QCPVector2D QCPVector2D::normalized() const @@ -169,10 +169,10 @@ QCPVector2D QCPVector2D::normalized() const } /*! \overload - + Returns the squared shortest distance of this vector (interpreted as a point) to the finite line segment given by \a start and \a end. - + \see distanceToStraightLine */ double QCPVector2D::distanceSquaredToLine(const QCPVector2D &start, const QCPVector2D &end) const @@ -193,10 +193,10 @@ double QCPVector2D::distanceSquaredToLine(const QCPVector2D &start, const QCPVec } /*! \overload - + Returns the squared shortest distance of this vector (interpreted as a point) to the finite line segment given by \a line. - + \see distanceToStraightLine */ double QCPVector2D::distanceSquaredToLine(const QLineF &line) const @@ -207,7 +207,7 @@ double QCPVector2D::distanceSquaredToLine(const QLineF &line) const /*! Returns the shortest distance of this vector (interpreted as a point) to the infinite straight line given by a \a base point and a \a direction vector. - + \see distanceSquaredToLine */ double QCPVector2D::distanceToStraightLine(const QCPVector2D &base, const QCPVector2D &direction) const @@ -260,7 +260,7 @@ QCPVector2D &QCPVector2D::operator-=(const QCPVector2D &vector) /* including file 'src/painter.cpp', size 8670 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPPainter @@ -268,11 +268,11 @@ QCPVector2D &QCPVector2D::operator-=(const QCPVector2D &vector) /*! \class QCPPainter \brief QPainter subclass used internally - + This QPainter subclass is used to provide some extended functionality e.g. for tweaking position consistency between antialiased and non-antialiased painting. Further it provides workarounds for QPainter quirks. - + \warning This class intentionally hides non-virtual functions of QPainter, e.g. setPen, save and restore. So while it is possible to pass a QCPPainter instance to a function that expects a QPainter pointer, some of the workarounds and tweaks will be unavailable to the function (because @@ -294,7 +294,7 @@ QCPPainter::QCPPainter() : /*! Creates a new QCPPainter instance on the specified paint \a device and sets default values. Just like the analogous QPainter constructor, begins painting on \a device immediately. - + Like \ref begin, this method sets QPainter::NonCosmeticDefaultPen in Qt versions before Qt5. */ QCPPainter::QCPPainter(QPaintDevice *device) : @@ -311,7 +311,7 @@ QCPPainter::QCPPainter(QPaintDevice *device) : /*! Sets the pen of the painter and applies certain fixes to it, depending on the mode of this QCPPainter. - + \note this function hides the non-virtual base class implementation. */ void QCPPainter::setPen(const QPen &pen) @@ -322,10 +322,10 @@ void QCPPainter::setPen(const QPen &pen) } /*! \overload - + Sets the pen (by color) of the painter and applies certain fixes to it, depending on the mode of this QCPPainter. - + \note this function hides the non-virtual base class implementation. */ void QCPPainter::setPen(const QColor &color) @@ -336,10 +336,10 @@ void QCPPainter::setPen(const QColor &color) } /*! \overload - + Sets the pen (by style) of the painter and applies certain fixes to it, depending on the mode of this QCPPainter. - + \note this function hides the non-virtual base class implementation. */ void QCPPainter::setPen(Qt::PenStyle penStyle) @@ -350,11 +350,11 @@ void QCPPainter::setPen(Qt::PenStyle penStyle) } /*! \overload - + Works around a Qt bug introduced with Qt 4.8 which makes drawing QLineF unpredictable when antialiasing is disabled. Thus when antialiasing is disabled, it rounds the \a line to integer coordinates and then passes it to the original drawLine. - + \note this function hides the non-virtual base class implementation. */ void QCPPainter::drawLine(const QLineF &line) @@ -401,10 +401,10 @@ void QCPPainter::setModes(QCPPainter::PainterModes modes) device. This is necessary to get cosmetic pen consistency across Qt versions, because since Qt5, all pens are non-cosmetic by default, and in Qt4 this render hint must be set to get that behaviour. - + The Constructor \ref QCPPainter(QPaintDevice *device) which directly starts painting also sets the render hint as appropriate. - + \note this function hides the non-virtual base class implementation. */ bool QCPPainter::begin(QPaintDevice *device) @@ -418,7 +418,7 @@ bool QCPPainter::begin(QPaintDevice *device) } /*! \overload - + Sets the mode of the painter. This controls whether the painter shall adjust its fixes/workarounds optimized for certain output devices. */ @@ -433,9 +433,9 @@ void QCPPainter::setMode(QCPPainter::PainterMode mode, bool enabled) /*! Saves the painter (see QPainter::save). Since QCPPainter adds some new internal state to QPainter, the save/restore functions are reimplemented to also save/restore those members. - + \note this function hides the non-virtual base class implementation. - + \see restore */ void QCPPainter::save() @@ -447,9 +447,9 @@ void QCPPainter::save() /*! Restores the painter (see QPainter::restore). Since QCPPainter adds some new internal state to QPainter, the save/restore functions are reimplemented to also save/restore those members. - + \note this function hides the non-virtual base class implementation. - + \see save */ void QCPPainter::restore() @@ -478,7 +478,7 @@ void QCPPainter::makeNonCosmetic() /* including file 'src/paintbuffer.cpp', size 18502 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAbstractPaintBuffer @@ -753,7 +753,7 @@ QCPPainter *QCPPaintBufferGlPbuffer::startPainting() qDebug() << Q_FUNC_INFO << "OpenGL frame buffer object doesn't exist, reallocateBuffer was not called?"; return 0; } - + QCPPainter *result = new QCPPainter(mGlPBuffer); result->setRenderHint(QPainter::HighQualityAntialiasing); return result; @@ -793,7 +793,7 @@ void QCPPaintBufferGlPbuffer::reallocateBuffer() { if (mGlPBuffer) delete mGlPBuffer; - + QGLFormat format; format.setAlpha(true); format.setSamples(mMultisamples); @@ -855,7 +855,7 @@ QCPPainter *QCPPaintBufferGlFbo::startPainting() qDebug() << Q_FUNC_INFO << "OpenGL frame buffer object doesn't exist, reallocateBuffer was not called?"; return 0; } - + if (QOpenGLContext::currentContext() != mGlContext.data()) mGlContext.data()->makeCurrent(mGlContext.data()->surface()); mGlFrameBuffer->bind(); @@ -902,7 +902,7 @@ void QCPPaintBufferGlFbo::clear(const QColor &color) qDebug() << Q_FUNC_INFO << "OpenGL frame buffer object doesn't exist, reallocateBuffer was not called?"; return; } - + if (QOpenGLContext::currentContext() != mGlContext.data()) mGlContext.data()->makeCurrent(mGlContext.data()->surface()); mGlFrameBuffer->bind(); @@ -922,7 +922,7 @@ void QCPPaintBufferGlFbo::reallocateBuffer() delete mGlFrameBuffer; mGlFrameBuffer = 0; } - + if (mGlContext.isNull()) { qDebug() << Q_FUNC_INFO << "OpenGL context doesn't exist"; @@ -933,7 +933,7 @@ void QCPPaintBufferGlFbo::reallocateBuffer() qDebug() << Q_FUNC_INFO << "OpenGL paint device doesn't exist"; return; } - + // create new fbo with appropriate size: mGlContext.data()->makeCurrent(mGlContext.data()->surface()); QOpenGLFramebufferObjectFormat frameBufferFormat; @@ -951,7 +951,7 @@ void QCPPaintBufferGlFbo::reallocateBuffer() /* including file 'src/layer.cpp', size 37064 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPLayer @@ -1016,16 +1016,16 @@ void QCPPaintBufferGlFbo::reallocateBuffer() /* start documentation of inline functions */ /*! \fn QList QCPLayer::children() const - + Returns a list of all layerables on this layer. The order corresponds to the rendering order: layerables with higher indices are drawn above layerables with lower indices. */ /*! \fn int QCPLayer::index() const - + Returns the index this layer has in the QCustomPlot. The index is the integer number by which this layer can be accessed via \ref QCustomPlot::layer. - + Layers with higher indices will be drawn above layers with lower indices. */ @@ -1033,9 +1033,9 @@ void QCPPaintBufferGlFbo::reallocateBuffer() /*! Creates a new QCPLayer instance. - + Normally you shouldn't directly instantiate layers, use \ref QCustomPlot::addLayer instead. - + \warning It is not checked that \a layerName is actually a unique layer name in \a parentPlot. This check is only performed by \ref QCustomPlot::addLayer. */ @@ -1057,10 +1057,10 @@ QCPLayer::~QCPLayer() // then invalid layer once they get deleted/moved themselves. This only happens when layers are deleted // directly, like in the QCustomPlot destructor. (The regular layer removal procedure for the user is to // call QCustomPlot::removeLayer, which moves all layerables off this layer before deleting it.) - + while (!mChildren.isEmpty()) mChildren.last()->setLayer(0); // removes itself from mChildren via removeChild() - + if (mParentPlot->currentLayer() == this) qDebug() << Q_FUNC_INFO << "The parent plot's mCurrentLayer will be a dangling pointer. Should have been set to a valid layer or 0 beforehand."; } @@ -1186,13 +1186,13 @@ void QCPLayer::replot() } /*! \internal - + Adds the \a layerable to the list of this layer. If \a prepend is set to true, the layerable will be prepended to the list, i.e. be drawn beneath the other layerables already in the list. - + This function does not change the \a mLayer member of \a layerable to this layer. (Use QCPLayerable::setLayer to change the layer of an object, not this function.) - + \see removeChild */ void QCPLayer::addChild(QCPLayerable *layerable, bool prepend) @@ -1210,12 +1210,12 @@ void QCPLayer::addChild(QCPLayerable *layerable, bool prepend) } /*! \internal - + Removes the \a layerable from the list of this layer. - + This function does not change the \a mLayer member of \a layerable. (Use QCPLayerable::setLayer to change the layer of an object, not this function.) - + \see addChild */ void QCPLayer::removeChild(QCPLayerable *layerable) @@ -1235,27 +1235,27 @@ void QCPLayer::removeChild(QCPLayerable *layerable) /*! \class QCPLayerable \brief Base class for all drawable objects - + This is the abstract base class most visible objects derive from, e.g. plottables, axes, grid etc. Every layerable is on a layer (QCPLayer) which allows controlling the rendering order by stacking the layers accordingly. - + For details about the layering mechanism, see the QCPLayer documentation. */ /* start documentation of inline functions */ /*! \fn QCPLayerable *QCPLayerable::parentLayerable() const - + Returns the parent layerable of this layerable. The parent layerable is used to provide visibility hierarchies in conjunction with the method \ref realVisibility. This way, layerables only get drawn if their parent layerables are visible, too. - + Note that a parent layerable is not necessarily also the QObject parent for memory management. Further, a layerable doesn't always have a parent layerable, so this function may return 0. - + A parent layerable is set implicitly when placed inside layout elements and doesn't need to be set manually by the user. */ @@ -1265,7 +1265,7 @@ void QCPLayer::removeChild(QCPLayerable *layerable) /*! \fn virtual void QCPLayerable::applyDefaultAntialiasingHint(QCPPainter *painter) const = 0 \internal - + This function applies the default antialiasing setting to the specified \a painter, using the function \ref applyAntialiasingHint. It is the antialiasing state the painter is put in, when \ref draw is called on the layerable. If the layerable has multiple entities whose antialiasing @@ -1273,7 +1273,7 @@ void QCPLayer::removeChild(QCPLayerable *layerable) most prominent entity. In this case however, the \ref draw function usually calls the specialized versions of this function before drawing each entity, effectively overriding the setting of the default antialiasing hint. - + First example: QCPGraph has multiple entities that have an antialiasing setting: The graph line, fills and scatters. Those can be configured via QCPGraph::setAntialiased, QCPGraph::setAntialiasedFill and QCPGraph::setAntialiasedScatters. Consequently, there isn't only @@ -1281,7 +1281,7 @@ void QCPLayer::removeChild(QCPLayerable *layerable) antialiasing), but specialized ones like QCPGraph::applyFillAntialiasingHint and QCPGraph::applyScattersAntialiasingHint. So before drawing one of those entities, QCPGraph::draw calls the respective specialized applyAntialiasingHint function. - + Second example: QCPItemLine consists only of a line so there is only one antialiasing setting which can be controlled with QCPItemLine::setAntialiased. (This function is inherited by all layerables. The specialized functions, as seen on QCPGraph, must be added explicitly to the @@ -1294,10 +1294,10 @@ void QCPLayer::removeChild(QCPLayerable *layerable) /*! \fn virtual void QCPLayerable::draw(QCPPainter *painter) const = 0 \internal - + This function draws the layerable with the specified \a painter. It is only called by QCustomPlot, if the layerable is visible (\ref setVisible). - + Before this function is called, the painter's antialiasing state is set via \ref applyDefaultAntialiasingHint, see the documentation there. Further, the clipping rectangle was set to \ref clipRect. @@ -1307,10 +1307,10 @@ void QCPLayer::removeChild(QCPLayerable *layerable) /* start documentation of signals */ /*! \fn void QCPLayerable::layerChanged(QCPLayer *newLayer); - + This signal is emitted when the layer of this layerable changes, i.e. this layerable is moved to a different layer. - + \see setLayer */ @@ -1318,17 +1318,17 @@ void QCPLayer::removeChild(QCPLayerable *layerable) /*! Creates a new QCPLayerable instance. - + Since QCPLayerable is an abstract base class, it can't be instantiated directly. Use one of the derived classes. - + If \a plot is provided, it automatically places itself on the layer named \a targetLayer. If \a targetLayer is an empty string, it places itself on the current layer of the plot (see \ref QCustomPlot::setCurrentLayer). - + It is possible to provide 0 as \a plot. In that case, you should assign a parent plot at a later time with \ref initializeParentPlot. - + The layerable's parent layerable is set to \a parentLayerable, if provided. Direct layerable parents are mainly used to control visibility in a hierarchy of layerables. This means a layerable is only drawn, if all its ancestor layerables are also visible. Note that \a @@ -1375,10 +1375,10 @@ void QCPLayerable::setVisible(bool on) /*! Sets the \a layer of this layerable object. The object will be placed on top of the other objects already on \a layer. - + If \a layer is 0, this layerable will not be on any layer and thus not appear in the plot (or interact/receive events). - + Returns true if the layer of this layerable was successfully changed to \a layer. */ bool QCPLayerable::setLayer(QCPLayer *layer) @@ -1388,7 +1388,7 @@ bool QCPLayerable::setLayer(QCPLayer *layer) /*! \overload Sets the layer of this layerable object by name - + Returns true on success, i.e. if \a layerName is a valid layer name. */ bool QCPLayerable::setLayer(const QString &layerName) @@ -1410,7 +1410,7 @@ bool QCPLayerable::setLayer(const QString &layerName) /*! Sets whether this object will be drawn antialiased or not. - + Note that antialiasing settings may be overridden by QCustomPlot::setAntialiasedElements and QCustomPlot::setNotAntialiasedElements. */ @@ -1423,7 +1423,7 @@ void QCPLayerable::setAntialiased(bool enabled) Returns whether this layerable is visible, taking the visibility of the layerable parent and the visibility of this layerable's layer into account. This is the method that is consulted to decide whether a layerable shall be drawn or not. - + If this layerable has a direct layerable parent (usually set via hierarchies implemented in subclasses, like in the case of \ref QCPLayoutElement), this function returns true only if this layerable has its visibility set to true and the parent layerable's \ref realVisibility returns @@ -1446,15 +1446,15 @@ bool QCPLayerable::realVisibility() const bars of a \ref QCPBars plottable, a click inside the area should also be considered a hit. In these cases this function thus returns a constant value greater zero but still below the parent plot's selection tolerance. (typically the selectionTolerance multiplied by 0.99). - + Providing a constant value for area objects allows selecting line objects even when they are obscured by such area objects, by clicking close to the lines (i.e. closer than 0.99*selectionTolerance). - + The actual setting of the selection state is not done by this function. This is handled by the parent QCustomPlot when the mouseReleaseEvent occurs, and the finally selected object is notified via the \ref selectEvent/\ref deselectEvent methods. - + \a details is an optional output parameter. Every layerable subclass may place any information in \a details. This information will be passed to \ref selectEvent when the parent QCustomPlot decides on the basis of this selectTest call, that the object was successfully selected. The @@ -1463,9 +1463,9 @@ bool QCPLayerable::realVisibility() const is only done once in \ref selectTest. The result (i.e. the actually clicked part) can then be placed in \a details. So in the subsequent \ref selectEvent, the decision which part was selected doesn't have to be done a second time for a single selection operation. - + You may pass 0 as \a details to indicate that you are not interested in those selection details. - + \see selectEvent, deselectEvent, mousePressEvent, wheelEvent, QCustomPlot::setInteractions */ double QCPLayerable::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const @@ -1477,18 +1477,18 @@ double QCPLayerable::selectTest(const QPointF &pos, bool onlySelectable, QVarian } /*! \internal - + Sets the parent plot of this layerable. Use this function once to set the parent plot if you have passed 0 in the constructor. It can not be used to move a layerable from one QCustomPlot to another one. - + Note that, unlike when passing a non-null parent plot in the constructor, this function does not make \a parentPlot the QObject-parent of this layerable. If you want this, call QObject::setParent(\a parentPlot) in addition to this function. - + Further, you will probably want to set a layer (\ref setLayer) after calling this function, to make the layerable appear on the QCustomPlot. - + The parent plot change will be propagated to subclasses via a call to \ref parentPlotInitialized so they can react accordingly (e.g. also initialize the parent plot of child layerables, like QCPLayout does). @@ -1500,23 +1500,23 @@ void QCPLayerable::initializeParentPlot(QCustomPlot *parentPlot) qDebug() << Q_FUNC_INFO << "called with mParentPlot already initialized"; return; } - + if (!parentPlot) qDebug() << Q_FUNC_INFO << "called with parentPlot zero"; - + mParentPlot = parentPlot; parentPlotInitialized(mParentPlot); } /*! \internal - + Sets the parent layerable of this layerable to \a parentLayerable. Note that \a parentLayerable does not become the QObject-parent (for memory management) of this layerable. - + The parent layerable has influence on the return value of the \ref realVisibility method. Only layerables with a fully visible parent tree will return true for \ref realVisibility, and thus be drawn. - + \see realVisibility */ void QCPLayerable::setParentLayerable(QCPLayerable *parentLayerable) @@ -1525,11 +1525,11 @@ void QCPLayerable::setParentLayerable(QCPLayerable *parentLayerable) } /*! \internal - + Moves this layerable object to \a layer. If \a prepend is true, this object will be prepended to the new layer's list, i.e. it will be drawn below the objects already on the layer. If it is false, the object will be appended. - + Returns true on success, i.e. if \a layer is a valid layer. */ bool QCPLayerable::moveToLayer(QCPLayer *layer, bool prepend) @@ -1544,7 +1544,7 @@ bool QCPLayerable::moveToLayer(QCPLayer *layer, bool prepend) qDebug() << Q_FUNC_INFO << "layer" << layer->name() << "is not in same QCustomPlot as this layerable"; return false; } - + QCPLayer *oldLayer = mLayer; if (mLayer) mLayer->removeChild(this); @@ -1578,15 +1578,15 @@ void QCPLayerable::applyAntialiasingHint(QCPPainter *painter, bool localAntialia This function is called by \ref initializeParentPlot, to allow subclasses to react on the setting of a parent plot. This is the case when 0 was passed as parent plot in the constructor, and the parent plot is set at a later time. - + For example, QCPLayoutElement/QCPLayout hierarchies may be created independently of any QCustomPlot at first. When they are then added to a layout inside the QCustomPlot, the top level element of the hierarchy gets its parent plot initialized with \ref initializeParentPlot. To propagate the parent plot to all the children of the hierarchy, the top level element then uses this function to pass the parent plot on to its child elements. - + The default implementation does nothing. - + \see initializeParentPlot */ void QCPLayerable::parentPlotInitialized(QCustomPlot *parentPlot) @@ -1599,10 +1599,10 @@ void QCPLayerable::parentPlotInitialized(QCustomPlot *parentPlot) Returns the selection category this layerable shall belong to. The selection category is used in conjunction with \ref QCustomPlot::setInteractions to control which objects are selectable and which aren't. - + Subclasses that don't fit any of the normal \ref QCP::Interaction values can use \ref QCP::iSelectOther. This is what the default implementation returns. - + \see QCustomPlot::setInteractions */ QCP::Interaction QCPLayerable::selectionCategory() const @@ -1611,11 +1611,11 @@ QCP::Interaction QCPLayerable::selectionCategory() const } /*! \internal - + Returns the clipping rectangle of this layerable object. By default, this is the viewport of the parent QCustomPlot. Specific subclasses may reimplement this function to provide different clipping rects. - + The returned clipping rect is set on the painter before the draw function of the respective object is called. */ @@ -1628,16 +1628,16 @@ QRect QCPLayerable::clipRect() const } /*! \internal - + This event is called when the layerable shall be selected, as a consequence of a click by the user. Subclasses should react to it by setting their selection state appropriately. The default implementation does nothing. - + \a event is the mouse event that caused the selection. \a additive indicates, whether the user was holding the multi-select-modifier while performing the selection (see \ref QCustomPlot::setMultiSelectModifier). if \a additive is true, the selection state must be toggled (i.e. become selected when unselected and unselected when selected). - + Every selectEvent is preceded by a call to \ref selectTest, which has returned positively (i.e. returned a value greater than 0 and less than the selection tolerance of the parent QCustomPlot). The \a details data you output from \ref selectTest is fed back via \a details here. You may @@ -1645,14 +1645,14 @@ QRect QCPLayerable::clipRect() const selectEvent. Usually \a details is used to transfer which part was clicked, if it is a layerable that has multiple individually selectable parts (like QCPAxis). This way selectEvent doesn't need to do the calculation again to find out which part was actually clicked. - + \a selectionStateChanged is an output parameter. If the pointer is non-null, this function must set the value either to true or false, depending on whether the selection state of this layerable was actually changed. For layerables that only are selectable as a whole and not in parts, this is simple: if \a additive is true, \a selectionStateChanged must also be set to true, because the selection toggles. If \a additive is false, \a selectionStateChanged is only set to true, if the layerable was previously unselected and now is switched to the selected state. - + \see selectTest, deselectEvent */ void QCPLayerable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) @@ -1664,15 +1664,15 @@ void QCPLayerable::selectEvent(QMouseEvent *event, bool additive, const QVariant } /*! \internal - + This event is called when the layerable shall be deselected, either as consequence of a user interaction or a call to \ref QCustomPlot::deselectAll. Subclasses should react to it by unsetting their selection appropriately. - + just as in \ref selectEvent, the output parameter \a selectionStateChanged (if non-null), must return true or false when the selection state of this layerable has changed or not changed, respectively. - + \see selectTest, selectEvent */ void QCPLayerable::deselectEvent(bool *selectionStateChanged) @@ -1804,17 +1804,17 @@ void QCPLayerable::wheelEvent(QWheelEvent *event) /* including file 'src/axis/range.cpp', size 12221 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPRange //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPRange \brief Represents the range an axis is encompassing. - + contains a \a lower and \a upper double value and provides convenience input, output and modification functions. - + \see QCPAxis::setRange */ @@ -1990,7 +1990,7 @@ QCPRange QCPRange::expanded(double includeCoord) const /*! Returns this range, possibly modified to not exceed the bounds provided as \a lowerBound and \a upperBound. If possible, the size of the current range is preserved in the process. - + If the range shall only be bounded at the lower side, you can set \a upperBound to \ref QCPRange::maxRange. If it shall only be bounded at the upper side, set \a lowerBound to -\ref QCPRange::maxRange. @@ -1999,7 +1999,7 @@ QCPRange QCPRange::bounded(double lowerBound, double upperBound) const { if (lowerBound > upperBound) qSwap(lowerBound, upperBound); - + QCPRange result(lower, upper); if (result.lower < lowerBound) { @@ -2014,7 +2014,7 @@ QCPRange QCPRange::bounded(double lowerBound, double upperBound) const if (result.lower < lowerBound || qFuzzyCompare(size(), upperBound-lowerBound)) result.lower = lowerBound; } - + return result; } @@ -2022,7 +2022,7 @@ QCPRange QCPRange::bounded(double lowerBound, double upperBound) const Returns a sanitized version of the range. Sanitized means for logarithmic scales, that the range won't span the positive and negative sign domain, i.e. contain zero. Further \a lower will always be numerically smaller (or equal) to \a upper. - + If the original range does span positive and negative sign domains or contains zero, the returned range will try to approximate the original range as good as possible. If the positive interval of the original range is wider than the negative interval, the @@ -2125,8 +2125,8 @@ bool QCPRange::validRange(const QCPRange &range) /* end of 'src/axis/range.cpp' */ -/* including file 'src/selection.cpp', size 21898 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/selection.cpp', size 21906 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPDataRange @@ -2134,25 +2134,25 @@ bool QCPRange::validRange(const QCPRange &range) /*! \class QCPDataRange \brief Describes a data range given by begin and end index - + QCPDataRange holds two integers describing the begin (\ref setBegin) and end (\ref setEnd) index of a contiguous set of data points. The end index points to the data point above the last data point that's part of the data range, similarly to the nomenclature used in standard iterators. - + Data Ranges are not bound to a certain plottable, thus they can be freely exchanged, created and modified. If a non-contiguous data set shall be described, the class \ref QCPDataSelection is used, which holds and manages multiple instances of \ref QCPDataRange. In most situations, \ref QCPDataSelection is thus used. - + Both \ref QCPDataRange and \ref QCPDataSelection offer convenience methods to work with them, e.g. \ref bounded, \ref expanded, \ref intersects, \ref intersection, \ref adjusted, \ref contains. Further, addition and subtraction operators (defined in \ref QCPDataSelection) can be used to join/subtract data ranges and data selections (or mixtures), to retrieve a corresponding \ref QCPDataSelection. - + %QCustomPlot's \ref dataselection "data selection mechanism" is based on \ref QCPDataSelection and QCPDataRange. - + \note Do not confuse \ref QCPDataRange with \ref QCPRange. A \ref QCPRange describes an interval in floating point plot coordinates, e.g. the current axis range. */ @@ -2160,43 +2160,43 @@ bool QCPRange::validRange(const QCPRange &range) /* start documentation of inline functions */ /*! \fn int QCPDataRange::size() const - + Returns the number of data points described by this data range. This is equal to the end index minus the begin index. - + \see length */ /*! \fn int QCPDataRange::length() const - + Returns the number of data points described by this data range. Equivalent to \ref size. */ /*! \fn void QCPDataRange::setBegin(int begin) - + Sets the begin of this data range. The \a begin index points to the first data point that is part of the data range. - + No checks or corrections are made to ensure the resulting range is valid (\ref isValid). - + \see setEnd */ /*! \fn void QCPDataRange::setEnd(int end) - + Sets the end of this data range. The \a end index points to the data point just above the last data point that is part of the data range. - + No checks or corrections are made to ensure the resulting range is valid (\ref isValid). - + \see setBegin */ /*! \fn bool QCPDataRange::isValid() const - + Returns whether this range is valid. A valid range has a begin index greater or equal to 0, and an end index greater or equal to the begin index. - + \note Invalid ranges should be avoided and are never the result of any of QCustomPlot's methods (unless they are themselves fed with invalid ranges). Do not pass invalid ranges to QCustomPlot's methods. The invalid range is not inherently prevented in QCPDataRange, to allow temporary @@ -2205,14 +2205,14 @@ bool QCPRange::validRange(const QCPRange &range) */ /*! \fn bool QCPDataRange::isEmpty() const - + Returns whether this range is empty, i.e. whether its begin index equals its end index. - + \see size, length */ /*! \fn QCPDataRange QCPDataRange::adjusted(int changeBegin, int changeEnd) const - + Returns a data range where \a changeBegin and \a changeEnd were added to the begin and end indices, respectively. */ @@ -2230,7 +2230,7 @@ QCPDataRange::QCPDataRange() : /*! Creates a QCPDataRange, initialized with the specified \a begin and \a end. - + No checks or corrections are made to ensure the resulting range is valid (\ref isValid). */ QCPDataRange::QCPDataRange(int begin, int end) : @@ -2242,7 +2242,7 @@ QCPDataRange::QCPDataRange(int begin, int end) : /*! Returns a data range that matches this data range, except that parts exceeding \a other are excluded. - + This method is very similar to \ref intersection, with one distinction: If this range and the \a other range share no intersection, the returned data range will be empty with begin and end set to the respective boundary side of \a other, at which this range is residing. (\ref intersection @@ -2271,12 +2271,12 @@ QCPDataRange QCPDataRange::expanded(const QCPDataRange &other) const /*! Returns the data range which is contained in both this data range and \a other. - + This method is very similar to \ref bounded, with one distinction: If this range and the \a other range share no intersection, the returned data range will be empty with begin and end set to 0. (\ref bounded would return a range with begin and end set to one of the boundaries of \a other, depending on which side this range is on.) - + \see QCPDataSelection::intersection */ QCPDataRange QCPDataRange::intersection(const QCPDataRange &other) const @@ -2290,7 +2290,7 @@ QCPDataRange QCPDataRange::intersection(const QCPDataRange &other) const /*! Returns whether this data range and \a other share common data points. - + \see intersection, contains */ bool QCPDataRange::intersects(const QCPDataRange &other) const @@ -2301,7 +2301,7 @@ bool QCPDataRange::intersects(const QCPDataRange &other) const /*! Returns whether all data points described by this data range are also in \a other. - + \see intersects */ bool QCPDataRange::contains(const QCPDataRange &other) const @@ -2317,14 +2317,14 @@ bool QCPDataRange::contains(const QCPDataRange &other) const /*! \class QCPDataSelection \brief Describes a data set by holding multiple QCPDataRange instances - + QCPDataSelection manages multiple instances of QCPDataRange in order to represent any (possibly disjoint) set of data selection. - + The data selection can be modified with addition and subtraction operators which take QCPDataSelection and QCPDataRange instances, as well as methods such as \ref addDataRange and \ref clear. Read access is provided by \ref dataRange, \ref dataRanges, \ref dataRangeCount, etc. - + The method \ref simplify is used to join directly adjacent or even overlapping QCPDataRange instances. QCPDataSelection automatically simplifies when using the addition/subtraction operators. The only case when \ref simplify is left to the user, is when calling \ref @@ -2332,46 +2332,46 @@ bool QCPDataRange::contains(const QCPDataRange &other) const ranges will be added to the selection successively and the overhead for simplifying after each iteration shall be avoided. In this case, you should make sure to call \ref simplify after completing the operation. - + Use \ref enforceType to bring the data selection into a state complying with the constraints for selections defined in \ref QCP::SelectionType. - + %QCustomPlot's \ref dataselection "data selection mechanism" is based on QCPDataSelection and QCPDataRange. - + \section qcpdataselection-iterating Iterating over a data selection - + As an example, the following code snippet calculates the average value of a graph's data \ref QCPAbstractPlottable::selection "selection": - + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpdataselection-iterating-1 - + */ /* start documentation of inline functions */ /*! \fn int QCPDataSelection::dataRangeCount() const - + Returns the number of ranges that make up the data selection. The ranges can be accessed by \ref dataRange via their index. - + \see dataRange, dataPointCount */ /*! \fn QList QCPDataSelection::dataRanges() const - + Returns all data ranges that make up the data selection. If the data selection is simplified (the usual state of the selection, see \ref simplify), the ranges are sorted by ascending data point index. - + \see dataRange */ /*! \fn bool QCPDataSelection::isEmpty() const - + Returns true if there are no data ranges, and thus no data points, in this QCPDataSelection instance. - + \see dataRangeCount */ @@ -2433,24 +2433,24 @@ QCPDataSelection &QCPDataSelection::operator+=(const QCPDataRange &other) } /*! - Removes all data point indices that are described by \a other from this data range. + Removes all data point indices that are described by \a other from this data selection. */ QCPDataSelection &QCPDataSelection::operator-=(const QCPDataSelection &other) { for (int i=0; i= other.end()) break; // since data ranges are sorted after the simplify() call, no ranges which contain other will come after this - + if (thisEnd > other.begin()) // ranges which don't fulfill this are entirely before other and can be ignored { if (thisBegin >= other.begin()) // range leading segment is encompassed @@ -2485,7 +2485,7 @@ QCPDataSelection &QCPDataSelection::operator-=(const QCPDataRange &other) } ++i; } - + return *this; } @@ -2503,10 +2503,10 @@ int QCPDataSelection::dataPointCount() const /*! Returns the data range with the specified \a index. - + If the data selection is simplified (the usual state of the selection, see \ref simplify), the ranges are sorted by ascending data point index. - + \see dataRangeCount */ QCPDataRange QCPDataSelection::dataRange(int index) const @@ -2548,7 +2548,7 @@ void QCPDataSelection::addDataRange(const QCPDataRange &dataRange, bool simplify /*! Removes all data ranges. The data selection then contains no data points. - + \ref isEmpty */ void QCPDataSelection::clear() @@ -2575,10 +2575,10 @@ void QCPDataSelection::simplify() } if (mDataRanges.isEmpty()) return; - + // sort ranges by starting value, ascending: std::sort(mDataRanges.begin(), mDataRanges.end(), lessThanDataRangeBegin); - + // join overlapping/contiguous ranges: int i = 1; while (i < mDataRanges.size()) @@ -2595,11 +2595,11 @@ void QCPDataSelection::simplify() /*! Makes sure this data selection conforms to the specified \a type selection type. Before the type is enforced, \ref simplify is called. - + Depending on \a type, enforcing means adding new data points that were previously not part of the selection, or removing data points from the selection. If the current selection already conforms to \a type, the data selection is not changed. - + \see QCP::SelectionType */ void QCPDataSelection::enforceType(QCP::SelectionType type) @@ -2645,13 +2645,13 @@ void QCPDataSelection::enforceType(QCP::SelectionType type) /*! Returns true if the data selection \a other is contained entirely in this data selection, i.e. all data point indices that are in \a other are also in this data selection. - + \see QCPDataRange::contains */ bool QCPDataSelection::contains(const QCPDataSelection &other) const { if (other.isEmpty()) return false; - + int otherIndex = 0; int thisIndex = 0; while (thisIndex < mDataRanges.size() && otherIndex < other.mDataRanges.size()) @@ -2708,7 +2708,7 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const if (isEmpty()) return QCPDataSelection(outerRange); QCPDataRange fullRange = outerRange.expanded(span()); - + QCPDataSelection result; // first unselected segment: if (mDataRanges.first().begin() != fullRange.begin()) @@ -2726,7 +2726,7 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const /* including file 'src/selectionrect.cpp', size 9224 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionRect @@ -2734,19 +2734,19 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const /*! \class QCPSelectionRect \brief Provides rect/rubber-band data selection and range zoom interaction - + QCPSelectionRect is used by QCustomPlot when the \ref QCustomPlot::setSelectionRectMode is not \ref QCP::srmNone. When the user drags the mouse across the plot, the current selection rect instance (\ref QCustomPlot::setSelectionRect) is forwarded these events and makes sure an according rect shape is drawn. At the begin, during, and after completion of the interaction, it emits the corresponding signals \ref started, \ref changed, \ref canceled, and \ref accepted. - + The QCustomPlot instance connects own slots to the current selection rect instance, in order to react to an accepted selection rect interaction accordingly. - + \ref isActive can be used to check whether the selection rect is currently active. An ongoing selection interaction can be cancelled programmatically via calling \ref cancel at any time. - + The appearance of the selection rect can be controlled via \ref setPen and \ref setBrush. If you wish to provide custom behaviour, e.g. a different visual representation of the selection @@ -2757,10 +2757,10 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const /* start of documentation of inline functions */ /*! \fn bool QCPSelectionRect::isActive() const - + Returns true if there is currently a selection going on, i.e. the user has started dragging a selection rect, but hasn't released the mouse button yet. - + \see cancel */ @@ -2768,37 +2768,37 @@ QCPDataSelection QCPDataSelection::inverse(const QCPDataRange &outerRange) const /* start documentation of signals */ /*! \fn void QCPSelectionRect::started(QMouseEvent *event); - + This signal is emitted when a selection rect interaction was initiated, i.e. the user just started dragging the selection rect with the mouse. */ /*! \fn void QCPSelectionRect::changed(const QRect &rect, QMouseEvent *event); - + This signal is emitted while the selection rect interaction is ongoing and the \a rect has changed its size due to the user moving the mouse. - + Note that \a rect may have a negative width or height, if the selection is being dragged to the upper or left side of the selection rect origin. */ /*! \fn void QCPSelectionRect::canceled(const QRect &rect, QInputEvent *event); - + This signal is emitted when the selection interaction was cancelled. Note that \a event is 0 if the selection interaction was cancelled programmatically, by a call to \ref cancel. - + The user may cancel the selection interaction by pressing the escape key. In this case, \a event holds the respective input event. - + Note that \a rect may have a negative width or height, if the selection is being dragged to the upper or left side of the selection rect origin. */ /*! \fn void QCPSelectionRect::accepted(const QRect &rect, QMouseEvent *event); - + This signal is emitted when the selection interaction was completed by the user releasing the mouse button. - + Note that \a rect may have a negative width or height, if the selection is being dragged to the upper or left side of the selection rect origin. */ @@ -2844,7 +2844,7 @@ QCPRange QCPSelectionRect::range(const QCPAxis *axis) const /*! Sets the pen that will be used to draw the selection rect outline. - + \see setBrush */ void QCPSelectionRect::setPen(const QPen &pen) @@ -2855,7 +2855,7 @@ void QCPSelectionRect::setPen(const QPen &pen) /*! Sets the brush that will be used to fill the selection rect. By default the selection rect is not filled, i.e. \a brush is Qt::NoBrush. - + \see setPen */ void QCPSelectionRect::setBrush(const QBrush &brush) @@ -2877,7 +2877,7 @@ void QCPSelectionRect::cancel() } /*! \internal - + This method is called by QCustomPlot to indicate that a selection rect interaction was initiated. The default implementation sets the selection rect to active, initializes the selection rect geometry and emits the \ref started signal. @@ -2890,7 +2890,7 @@ void QCPSelectionRect::startSelection(QMouseEvent *event) } /*! \internal - + This method is called by QCustomPlot to indicate that an ongoing selection rect interaction needs to update its geometry. The default implementation updates the rect and emits the \ref changed signal. @@ -2903,7 +2903,7 @@ void QCPSelectionRect::moveSelection(QMouseEvent *event) } /*! \internal - + This method is called by QCustomPlot to indicate that an ongoing selection rect interaction has finished by the user releasing the mouse button. The default implementation deactivates the selection rect and emits the \ref accepted signal. @@ -2916,7 +2916,7 @@ void QCPSelectionRect::endSelection(QMouseEvent *event) } /*! \internal - + This method is called by QCustomPlot when a key has been pressed by the user while the selection rect interaction is active. The default implementation allows to \ref cancel the interaction by hitting the escape key. @@ -2937,9 +2937,9 @@ void QCPSelectionRect::applyDefaultAntialiasingHint(QCPPainter *painter) const } /*! \internal - + If the selection rect is active (\ref isActive), draws the selection rect defined by \a mRect. - + \seebaseclassmethod */ void QCPSelectionRect::draw(QCPPainter *painter) @@ -2954,8 +2954,8 @@ void QCPSelectionRect::draw(QCPPainter *painter) /* end of 'src/selectionrect.cpp' */ -/* including file 'src/layout.cpp', size 74302 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layout.cpp', size 79064 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPMarginGroup @@ -2963,27 +2963,27 @@ void QCPSelectionRect::draw(QCPPainter *painter) /*! \class QCPMarginGroup \brief A margin group allows synchronization of margin sides if working with multiple layout elements. - + QCPMarginGroup allows you to tie a margin side of two or more layout elements together, such that they will all have the same size, based on the largest required margin in the group. - + \n \image html QCPMarginGroup.png "Demonstration of QCPMarginGroup" \n - + In certain situations it is desirable that margins at specific sides are synchronized across layout elements. For example, if one QCPAxisRect is below another one in a grid layout, it will provide a cleaner look to the user if the left and right margins of the two axis rects are of the same size. The left axis of the top axis rect will then be at the same horizontal position as the left axis of the lower axis rect, making them appear aligned. The same applies for the right axes. This is what QCPMarginGroup makes possible. - + To add/remove a specific side of a layout element to/from a margin group, use the \ref QCPLayoutElement::setMarginGroup method. To completely break apart the margin group, either call \ref clear, or just delete the margin group. - + \section QCPMarginGroup-example Example - + First create a margin group: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpmargingroup-creation-1 Then set this group on the layout element sides: @@ -2995,7 +2995,7 @@ void QCPSelectionRect::draw(QCPPainter *painter) /* start documentation of inline functions */ /*! \fn QList QCPMarginGroup::elements(QCP::MarginSide side) const - + Returns a list of all layout elements that have their margin \a side associated with this margin group. */ @@ -3054,10 +3054,10 @@ void QCPMarginGroup::clear() } /*! \internal - + Returns the synchronized common margin for \a side. This is the margin value that will be used by the layout element on the respective side, if it is part of this margin group. - + The common margin is calculated by requesting the automatic margin (\ref QCPLayoutElement::calculateAutoMargin) of each element associated with \a side in this margin group, and choosing the largest returned value. (QCPLayoutElement::minimumMargins is taken into @@ -3080,9 +3080,9 @@ int QCPMarginGroup::commonMargin(QCP::MarginSide side) const } /*! \internal - + Adds \a element to the internal list of child elements, for the margin \a side. - + This function does not modify the margin group property of \a element. */ void QCPMarginGroup::addChild(QCP::MarginSide side, QCPLayoutElement *element) @@ -3094,9 +3094,9 @@ void QCPMarginGroup::addChild(QCP::MarginSide side, QCPLayoutElement *element) } /*! \internal - + Removes \a element from the internal list of child elements, for the margin \a side. - + This function does not modify the margin group property of \a element. */ void QCPMarginGroup::removeChild(QCP::MarginSide side, QCPLayoutElement *element) @@ -3112,20 +3112,20 @@ void QCPMarginGroup::removeChild(QCP::MarginSide side, QCPLayoutElement *element /*! \class QCPLayoutElement \brief The abstract base class for all objects that form \ref thelayoutsystem "the layout system". - + This is an abstract base class. As such, it can't be instantiated directly, rather use one of its subclasses. - + A Layout element is a rectangular object which can be placed in layouts. It has an outer rect (QCPLayoutElement::outerRect) and an inner rect (\ref QCPLayoutElement::rect). The difference between outer and inner rect is called its margin. The margin can either be set to automatic or manual (\ref setAutoMargins) on a per-side basis. If a side is set to manual, that margin can be set explicitly with \ref setMargins and will stay fixed at that value. If it's set to automatic, the layout element subclass will control the value itself (via \ref calculateAutoMargin). - + Layout elements can be placed in layouts (base class QCPLayout) like QCPLayoutGrid. The top level layout is reachable via \ref QCustomPlot::plotLayout, and is a \ref QCPLayoutGrid. Since \ref QCPLayout itself derives from \ref QCPLayoutElement, layouts can be nested. - + Thus in QCustomPlot one can divide layout elements into two categories: The ones that are invisible by themselves, because they don't draw anything. Their only purpose is to manage the position and size of other layout elements. This category of layout elements usually use @@ -3139,21 +3139,32 @@ void QCPMarginGroup::removeChild(QCP::MarginSide side, QCPLayoutElement *element /* start documentation of inline functions */ /*! \fn QCPLayout *QCPLayoutElement::layout() const - + Returns the parent layout of this layout element. */ /*! \fn QRect QCPLayoutElement::rect() const - - Returns the inner rect of this layout element. The inner rect is the outer rect (\ref + + Returns the inner rect of this layout element. The inner rect is the outer rect (\ref outerRect, \ref setOuterRect) shrinked by the margins (\ref setMargins, \ref setAutoMargins). - + In some cases, the area between outer and inner rect is left blank. In other cases the margin area is used to display peripheral graphics while the main content is in the inner rect. This is where automatic margin calculation becomes interesting because it allows the layout element to adapt the margins to the peripheral graphics it wants to draw. For example, \ref QCPAxisRect draws the axis labels and tick labels in the margin area, thus needs to adjust the margins (if \ref setAutoMargins is enabled) according to the space required by the labels of the axes. + + \see outerRect +*/ + +/*! \fn QRect QCPLayoutElement::outerRect() const + + Returns the outer rect of this layout element. The outer rect is the inner rect expanded by the + margins (\ref setMargins, \ref setAutoMargins). The outer rect is used (and set via \ref + setOuterRect) by the parent \ref QCPLayout to control the size of this layout element. + + \see rect */ /* end documentation of inline functions */ @@ -3166,6 +3177,7 @@ QCPLayoutElement::QCPLayoutElement(QCustomPlot *parentPlot) : mParentLayout(0), mMinimumSize(), mMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX), + mSizeConstraintRect(scrInnerRect), mRect(0, 0, 0, 0), mOuterRect(0, 0, 0, 0), mMargins(0, 0, 0, 0), @@ -3185,12 +3197,12 @@ QCPLayoutElement::~QCPLayoutElement() /*! Sets the outer rect of this layout element. If the layout element is inside a layout, the layout sets the position and size of this layout element using this function. - + Calling this function externally has no effect, since the layout will overwrite any changes to the outer rect upon the next replot. - + The layout element will adapt its inner \ref rect by applying the margins inward to the outer rect. - + \see rect */ void QCPLayoutElement::setOuterRect(const QRect &rect) @@ -3206,11 +3218,11 @@ void QCPLayoutElement::setOuterRect(const QRect &rect) Sets the margins of this layout element. If \ref setAutoMargins is disabled for some or all sides, this function is used to manually set the margin on those sides. Sides that are still set to be handled automatically are ignored and may have any value in \a margins. - + The margin is the distance between the outer rect (controlled by the parent layout via \ref setOuterRect) and the inner \ref rect (which usually contains the main content of this layout element). - + \see setAutoMargins */ void QCPLayoutElement::setMargins(const QMargins &margins) @@ -3225,10 +3237,10 @@ void QCPLayoutElement::setMargins(const QMargins &margins) /*! If \ref setAutoMargins is enabled on some or all margins, this function is used to provide minimum values for those margins. - + The minimum values are not enforced on margin sides that were set to be under manual control via \ref setAutoMargins. - + \see setAutoMargins */ void QCPLayoutElement::setMinimumMargins(const QMargins &margins) @@ -3243,10 +3255,10 @@ void QCPLayoutElement::setMinimumMargins(const QMargins &margins) Sets on which sides the margin shall be calculated automatically. If a side is calculated automatically, a minimum margin value may be provided with \ref setMinimumMargins. If a side is set to be controlled manually, the value may be specified with \ref setMargins. - + Margin sides that are under automatic control may participate in a \ref QCPMarginGroup (see \ref setMarginGroup), to synchronize (align) it with other layout elements in the plot. - + \see setMinimumMargins, setMargins, QCP::MarginSide */ void QCPLayoutElement::setAutoMargins(QCP::MarginSides sides) @@ -3255,13 +3267,16 @@ void QCPLayoutElement::setAutoMargins(QCP::MarginSides sides) } /*! - Sets the minimum size for the inner \ref rect of this layout element. A parent layout tries to - respect the \a size here by changing row/column sizes in the layout accordingly. - + Sets the minimum size of this layout element. A parent layout tries to respect the \a size here + by changing row/column sizes in the layout accordingly. + If the parent layout size is not sufficient to satisfy all minimum size constraints of its child layout elements, the layout may set a size that is actually smaller than \a size. QCustomPlot propagates the layout's size constraints to the outside by setting its own minimum QWidget size accordingly, so violations of \a size should be exceptions. + + Whether this constraint applies to the inner or the outer rect can be specified with \ref + setSizeConstraintRect (see \ref rect and \ref outerRect). */ void QCPLayoutElement::setMinimumSize(const QSize &size) { @@ -3274,8 +3289,11 @@ void QCPLayoutElement::setMinimumSize(const QSize &size) } /*! \overload - - Sets the minimum size for the inner \ref rect of this layout element. + + Sets the minimum size of this layout element. + + Whether this constraint applies to the inner or the outer rect can be specified with \ref + setSizeConstraintRect (see \ref rect and \ref outerRect). */ void QCPLayoutElement::setMinimumSize(int width, int height) { @@ -3283,8 +3301,11 @@ void QCPLayoutElement::setMinimumSize(int width, int height) } /*! - Sets the maximum size for the inner \ref rect of this layout element. A parent layout tries to - respect the \a size here by changing row/column sizes in the layout accordingly. + Sets the maximum size of this layout element. A parent layout tries to respect the \a size here + by changing row/column sizes in the layout accordingly. + + Whether this constraint applies to the inner or the outer rect can be specified with \ref + setSizeConstraintRect (see \ref rect and \ref outerRect). */ void QCPLayoutElement::setMaximumSize(const QSize &size) { @@ -3297,8 +3318,11 @@ void QCPLayoutElement::setMaximumSize(const QSize &size) } /*! \overload - - Sets the maximum size for the inner \ref rect of this layout element. + + Sets the maximum size of this layout element. + + Whether this constraint applies to the inner or the outer rect can be specified with \ref + setSizeConstraintRect (see \ref rect and \ref outerRect). */ void QCPLayoutElement::setMaximumSize(int width, int height) { @@ -3306,16 +3330,35 @@ void QCPLayoutElement::setMaximumSize(int width, int height) } /*! - Sets the margin \a group of the specified margin \a sides. + Sets to which rect of a layout element the size constraints apply. Size constraints can be set + via \ref setMinimumSize and \ref setMaximumSize. + + The outer rect (\ref outerRect) includes the margins (e.g. in the case of a QCPAxisRect the axis + labels), whereas the inner rect (\ref rect) does not. + + \see setMinimumSize, setMaximumSize +*/ +void QCPLayoutElement::setSizeConstraintRect(SizeConstraintRect constraintRect) +{ + if (mSizeConstraintRect != constraintRect) + { + mSizeConstraintRect = constraintRect; + if (mParentLayout) + mParentLayout->sizeConstraintsChanged(); + } +} +/*! + Sets the margin \a group of the specified margin \a sides. + Margin groups allow synchronizing specified margins across layout elements, see the documentation of \ref QCPMarginGroup. - + To unset the margin group of \a sides, set \a group to 0. - + Note that margin groups only work for margin sides that are set to automatic (\ref setAutoMargins). - + \see QCP::MarginSide */ void QCPLayoutElement::setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group) @@ -3325,7 +3368,7 @@ void QCPLayoutElement::setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *gr if (sides.testFlag(QCP::msRight)) sideVector.append(QCP::msRight); if (sides.testFlag(QCP::msTop)) sideVector.append(QCP::msTop); if (sides.testFlag(QCP::msBottom)) sideVector.append(QCP::msBottom); - + for (int i=0; iremoveChild(side, this); - + if (!group) // if setting to 0, remove hash entry. Else set hash entry to new group and register there { mMarginGroups.remove(side); @@ -3352,10 +3395,10 @@ void QCPLayoutElement::setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *gr replot by the parent layout element. It is called multiple times, once for every \ref UpdatePhase. The phases are run through in the order of the enum values. For details about what happens at the different phases, see the documentation of \ref UpdatePhase. - + Layout elements that have child elements should call the \ref update method of their child elements, and pass the current \a phase unchanged. - + The default implementation executes the automatic margin mechanism in the \ref upMargins phase. Subclasses should make sure to call the base class implementation. */ @@ -3387,33 +3430,47 @@ void QCPLayoutElement::update(UpdatePhase phase) } /*! - Returns the minimum size this layout element (the inner \ref rect) may be compressed to. + Returns the suggested minimum size this layout element (the \ref outerRect) may be compressed to, + if no manual minimum size is set. + + if a minimum size (\ref setMinimumSize) was not set manually, parent layouts use the returned size + (usually indirectly through \ref QCPLayout::getFinalMinimumOuterSize) to determine the minimum + allowed size of this layout element. - if a minimum size (\ref setMinimumSize) was not set manually, parent layouts consult this - function to determine the minimum allowed size of this layout element. (A manual minimum size is - considered set if it is non-zero.) + A manual minimum size is considered set if it is non-zero. + + The default implementation simply returns the sum of the horizontal margins for the width and the + sum of the vertical margins for the height. Reimplementations may use their detailed knowledge + about the layout element's content to provide size hints. */ -QSize QCPLayoutElement::minimumSizeHint() const +QSize QCPLayoutElement::minimumOuterSizeHint() const { - return mMinimumSize; + return QSize(mMargins.left()+mMargins.right(), mMargins.top()+mMargins.bottom()); } /*! - Returns the maximum size this layout element (the inner \ref rect) may be expanded to. + Returns the suggested maximum size this layout element (the \ref outerRect) may be expanded to, + if no manual maximum size is set. + + if a maximum size (\ref setMaximumSize) was not set manually, parent layouts use the returned + size (usually indirectly through \ref QCPLayout::getFinalMaximumOuterSize) to determine the + maximum allowed size of this layout element. - if a maximum size (\ref setMaximumSize) was not set manually, parent layouts consult this - function to determine the maximum allowed size of this layout element. (A manual maximum size is - considered set if it is smaller than Qt's QWIDGETSIZE_MAX.) + A manual maximum size is considered set if it is smaller than Qt's \c QWIDGETSIZE_MAX. + + The default implementation simply returns \c QWIDGETSIZE_MAX for both width and height, implying + no suggested maximum size. Reimplementations may use their detailed knowledge about the layout + element's content to provide size hints. */ -QSize QCPLayoutElement::maximumSizeHint() const +QSize QCPLayoutElement::maximumOuterSizeHint() const { - return mMaximumSize; + return QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); } /*! Returns a list of all child elements in this layout element. If \a recursive is true, all sub-child elements are included in the list, too. - + \warning There may be entries with value 0 in the returned list. (For example, QCPLayoutGrid may have empty cells which yield 0 at the respective index.) */ @@ -3428,19 +3485,19 @@ QList QCPLayoutElement::elements(bool recursive) const rect, this method returns a value corresponding to 0.99 times the parent plot's selection tolerance. However, layout elements are not selectable by default. So if \a onlySelectable is true, -1.0 is returned. - + See \ref QCPLayerable::selectTest for a general explanation of this virtual method. - + QCPLayoutElement subclasses may reimplement this method to provide more specific selection test behaviour. */ double QCPLayoutElement::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const { Q_UNUSED(details) - + if (onlySelectable) return -1; - + if (QRectF(mOuterRect).contains(pos)) { if (mParentPlot) @@ -3455,7 +3512,7 @@ double QCPLayoutElement::selectTest(const QPointF &pos, bool onlySelectable, QVa } /*! \internal - + propagates the parent plot initialization to all child elements, by calling \ref QCPLayerable::initializeParentPlot on them. */ @@ -3469,11 +3526,11 @@ void QCPLayoutElement::parentPlotInitialized(QCustomPlot *parentPlot) } /*! \internal - + Returns the margin size for this \a side. It is used if automatic margins is enabled for this \a side (see \ref setAutoMargins). If a minimum margin was set with \ref setMinimumMargins, the returned value will not be smaller than the specified minimum margin. - + The default implementation just returns the respective manual margin (\ref setMargins) or the minimum margin, whichever is larger. */ @@ -3483,14 +3540,14 @@ int QCPLayoutElement::calculateAutoMargin(QCP::MarginSide side) } /*! \internal - + This virtual method is called when this layout element was moved to a different QCPLayout, or when this layout element has changed its logical position (e.g. row and/or column) within the same QCPLayout. Subclasses may use this to react accordingly. - + Since this method is called after the completion of the move, you can access the new parent layout via \ref layout(). - + The default implementation does nothing. */ void QCPLayoutElement::layoutChanged() @@ -3503,23 +3560,23 @@ void QCPLayoutElement::layoutChanged() /*! \class QCPLayout \brief The abstract base class for layouts - + This is an abstract base class for layout elements whose main purpose is to define the position and size of other child layout elements. In most cases, layouts don't draw anything themselves (but there are exceptions to this, e.g. QCPLegend). - + QCPLayout derives from QCPLayoutElement, and thus can itself be nested in other layouts. - + QCPLayout introduces a common interface for accessing and manipulating the child elements. Those functions are most notably \ref elementCount, \ref elementAt, \ref takeAt, \ref take, \ref simplify, \ref removeAt, \ref remove and \ref clear. Individual subclasses may add more functions to this interface which are more specialized to the form of the layout. For example, \ref QCPLayoutGrid adds functions that take row and column indices to access cells of the layout grid more conveniently. - + Since this is an abstract base class, you can't instantiate it directly. Rather use one of its subclasses like QCPLayoutGrid or QCPLayoutInset. - + For a general introduction to the layout system, see the dedicated documentation page \ref thelayoutsystem "The Layout System". */ @@ -3527,44 +3584,44 @@ void QCPLayoutElement::layoutChanged() /* start documentation of pure virtual functions */ /*! \fn virtual int QCPLayout::elementCount() const = 0 - + Returns the number of elements/cells in the layout. - + \see elements, elementAt */ /*! \fn virtual QCPLayoutElement* QCPLayout::elementAt(int index) const = 0 - + Returns the element in the cell with the given \a index. If \a index is invalid, returns 0. - + Note that even if \a index is valid, the respective cell may be empty in some layouts (e.g. QCPLayoutGrid), so this function may return 0 in those cases. You may use this function to check whether a cell is empty or not. - + \see elements, elementCount, takeAt */ /*! \fn virtual QCPLayoutElement* QCPLayout::takeAt(int index) = 0 - + Removes the element with the given \a index from the layout and returns it. - + If the \a index is invalid or the cell with that index is empty, returns 0. - + Note that some layouts don't remove the respective cell right away but leave an empty cell after successful removal of the layout element. To collapse empty cells, use \ref simplify. - + \see elementAt, take */ /*! \fn virtual bool QCPLayout::take(QCPLayoutElement* element) = 0 - + Removes the specified \a element from the layout and returns true on success. - + If the \a element isn't in this layout, returns false. - + Note that some layouts don't remove the respective cell right away but leave an empty cell after successful removal of the layout element. To collapse empty cells, use \ref simplify. - + \see takeAt */ @@ -3579,21 +3636,22 @@ QCPLayout::QCPLayout() } /*! - First calls the QCPLayoutElement::update base class implementation to update the margins on this - layout. - - Then calls \ref updateLayout which subclasses reimplement to reposition and resize their cells. - - Finally, \ref update is called on all child elements. + If \a phase is \ref upLayout, calls \ref updateLayout, which subclasses may reimplement to + reposition and resize their cells. + + Finally, the call is propagated down to all child \ref QCPLayoutElement "QCPLayoutElements". + + For details about this method and the update phases, see the documentation of \ref + QCPLayoutElement::update. */ void QCPLayout::update(UpdatePhase phase) { QCPLayoutElement::update(phase); - + // set child element rects according to layout: if (phase == upLayout) updateLayout(); - + // propagate update call to child elements: const int elCount = elementCount(); for (int i=0; i QCPLayout::elements(bool recursive) const /*! Simplifies the layout by collapsing empty cells. The exact behavior depends on subclasses, the default implementation does nothing. - + Not all layouts need simplification. For example, QCPLayoutInset doesn't use explicit simplification while QCPLayoutGrid does. */ @@ -3638,12 +3696,12 @@ void QCPLayout::simplify() /*! Removes and deletes the element at the provided \a index. Returns true on success. If \a index is invalid or points to an empty cell, returns false. - + This function internally uses \ref takeAt to remove the element from the layout and then deletes the returned element. Note that some layouts don't remove the respective cell right away but leave an empty cell after successful removal of the layout element. To collapse empty cells, use \ref simplify. - + \see remove, takeAt */ bool QCPLayout::removeAt(int index) @@ -3659,12 +3717,12 @@ bool QCPLayout::removeAt(int index) /*! Removes and deletes the provided \a element. Returns true on success. If \a element is not in the layout, returns false. - + This function internally uses \ref takeAt to remove the element from the layout and then deletes the element. Note that some layouts don't remove the respective cell right away but leave an empty cell after successful removal of the layout element. To collapse empty cells, use \ref simplify. - + \see removeAt, take */ bool QCPLayout::remove(QCPLayoutElement *element) @@ -3680,7 +3738,7 @@ bool QCPLayout::remove(QCPLayoutElement *element) /*! Removes and deletes all layout elements in this layout. Finally calls \ref simplify to make sure all empty cells are collapsed. - + \see remove, removeAt */ void QCPLayout::clear() @@ -3695,7 +3753,7 @@ void QCPLayout::clear() /*! Subclasses call this method to report changed (minimum/maximum) size constraints. - + If the parent of this layout is again a QCPLayout, forwards the call to the parent's \ref sizeConstraintsChanged. If the parent is a QWidget (i.e. is the \ref QCustomPlot::plotLayout of QCustomPlot), calls QWidget::updateGeometry, so if the QCustomPlot widget is inside a Qt QLayout, @@ -3710,15 +3768,15 @@ void QCPLayout::sizeConstraintsChanged() const } /*! \internal - + Subclasses reimplement this method to update the position and sizes of the child elements/cells via calling their \ref QCPLayoutElement::setOuterRect. The default implementation does nothing. - + The geometry used as a reference is the inner \ref rect of this layout. Child elements should stay within that rect. - + \ref getSectionSizes may help with the reimplementation of this function. - + \see update */ void QCPLayout::updateLayout() @@ -3727,13 +3785,13 @@ void QCPLayout::updateLayout() /*! \internal - + Associates \a el with this layout. This is done by setting the \ref QCPLayoutElement::layout, the \ref QCPLayerable::parentLayerable and the QObject parent to this layout. - + Further, if \a el didn't previously have a parent plot, calls \ref QCPLayerable::initializeParentPlot on \a el to set the paret plot. - + This method is used by subclass specific methods that add elements to the layout. Note that this method only changes properties in \a el. The removal from the old layout and the insertion into the new layout must be done additionally. @@ -3753,11 +3811,11 @@ void QCPLayout::adoptElement(QCPLayoutElement *el) } /*! \internal - + Disassociates \a el from this layout. This is done by setting the \ref QCPLayoutElement::layout and the \ref QCPLayerable::parentLayerable to zero. The QObject parent is set to the parent QCustomPlot. - + This method is used by subclass specific methods that remove elements from the layout (e.g. \ref take or \ref takeAt). Note that this method only changes properties in \a el. The removal from the old layout must be done additionally. @@ -3775,32 +3833,32 @@ void QCPLayout::releaseElement(QCPLayoutElement *el) } /*! \internal - + This is a helper function for the implementation of \ref updateLayout in subclasses. - + It calculates the sizes of one-dimensional sections with provided constraints on maximum section sizes, minimum section sizes, relative stretch factors and the final total size of all sections. - + The QVector entries refer to the sections. Thus all QVectors must have the same size. - + \a maxSizes gives the maximum allowed size of each section. If there shall be no maximum size imposed, set all vector values to Qt's QWIDGETSIZE_MAX. - + \a minSizes gives the minimum allowed size of each section. If there shall be no minimum size imposed, set all vector values to zero. If the \a minSizes entries add up to a value greater than \a totalSize, sections will be scaled smaller than the proposed minimum sizes. (In other words, not exceeding the allowed total size is taken to be more important than not going below minimum section sizes.) - + \a stretchFactors give the relative proportions of the sections to each other. If all sections shall be scaled equally, set all values equal. If the first section shall be double the size of each individual other section, set the first number of \a stretchFactors to double the value of the other individual values (e.g. {2, 1, 1, 1}). - + \a totalSize is the value that the final section sizes will add up to. Due to rounding, the actual sum may differ slightly. If you want the section sizes to sum up to exactly that value, you could distribute the remaining difference on the sections. - + The return value is a QVector containing the section sizes. */ QVector QCPLayout::getSectionSizes(QVector maxSizes, QVector minSizes, QVector stretchFactors, int totalSize) const @@ -3827,13 +3885,13 @@ QVector QCPLayout::getSectionSizes(QVector maxSizes, QVector minS minSizes[i] = 0; } } - + QList minimumLockedSections; QList unfinishedSections; for (int i=0; i QCPLayout::getSectionSizes(QVector maxSizes, QVector minS } if (innerIterations == sectionCount*2) qDebug() << Q_FUNC_INFO << "Exceeded maximum expected inner iteration count, layouting aborted. Input was:" << maxSizes << minSizes << stretchFactors << totalSize; - + // now check whether the resulting section sizes violate minimum restrictions: bool foundMinimumViolation = false; for (int i=0; i QCPLayout::getSectionSizes(QVector maxSizes, QVector minS } if (outerIterations == sectionCount*2) qDebug() << Q_FUNC_INFO << "Exceeded maximum expected outer iteration count, layouting aborted. Input was:" << maxSizes << minSizes << stretchFactors << totalSize; - + QVector result(sectionCount); for (int i=0; iminimumOuterSizeHint(); + QSize minOuter = el->minimumSize(); // depending on sizeConstraitRect this might be with respect to inner rect, so possibly add margins in next four lines (preserving unset minimum of 0) + if (minOuter.width() > 0 && el->sizeConstraintRect() == QCPLayoutElement::scrInnerRect) + minOuter.rwidth() += el->margins().left() + el->margins().right(); + if (minOuter.height() > 0 && el->sizeConstraintRect() == QCPLayoutElement::scrInnerRect) + minOuter.rheight() += el->margins().top() + el->margins().bottom(); + + return QSize(minOuter.width() > 0 ? minOuter.width() : minOuterHint.width(), + minOuter.height() > 0 ? minOuter.height() : minOuterHint.height());; +} + +/*! \internal + + This is a helper function for the implementation of subclasses. + + It returns the maximum size that should finally be used for the outer rect of the passed layout + element \a el. + + It takes into account whether a manual maximum size is set (\ref + QCPLayoutElement::setMaximumSize), which size constraint is set (\ref + QCPLayoutElement::setSizeConstraintRect), as well as the maximum size hint, if no manual maximum + size was set (\ref QCPLayoutElement::maximumOuterSizeHint). +*/ +QSize QCPLayout::getFinalMaximumOuterSize(const QCPLayoutElement *el) +{ + QSize maxOuterHint = el->maximumOuterSizeHint(); + QSize maxOuter = el->maximumSize(); // depending on sizeConstraitRect this might be with respect to inner rect, so possibly add margins in next four lines (preserving unset maximum of QWIDGETSIZE_MAX) + if (maxOuter.width() < QWIDGETSIZE_MAX && el->sizeConstraintRect() == QCPLayoutElement::scrInnerRect) + maxOuter.rwidth() += el->margins().left() + el->margins().right(); + if (maxOuter.height() < QWIDGETSIZE_MAX && el->sizeConstraintRect() == QCPLayoutElement::scrInnerRect) + maxOuter.rheight() += el->margins().top() + el->margins().bottom(); + + return QSize(maxOuter.width() < QWIDGETSIZE_MAX ? maxOuter.width() : maxOuterHint.width(), + maxOuter.height() < QWIDGETSIZE_MAX ? maxOuter.height() : maxOuterHint.height()); +} + //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPLayoutGrid @@ -3979,10 +4087,10 @@ QCPLayoutGrid::~QCPLayoutGrid() /*! Returns the element in the cell in \a row and \a column. - + Returns 0 if either the row/column is invalid or if the cell is empty. In those cases, a qDebug message is printed. To check whether a cell exists and isn't empty, use \ref hasElement. - + \see addElement, hasElement */ QCPLayoutElement *QCPLayoutGrid::element(int row, int column) const @@ -4076,7 +4184,7 @@ bool QCPLayoutGrid::addElement(QCPLayoutElement *element) /*! Returns whether the cell at \a row and \a column exists and contains a valid element, i.e. isn't empty. - + \see element */ bool QCPLayoutGrid::hasElement(int row, int column) @@ -4089,13 +4197,14 @@ bool QCPLayoutGrid::hasElement(int row, int column) /*! Sets the stretch \a factor of \a column. - + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond - their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref - QCPLayoutElement::setMaximumSize), regardless of the stretch factor. - + their minimum and maximum widths/heights, regardless of the stretch factor. (see \ref + QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize, \ref + QCPLayoutElement::setSizeConstraintRect.) + The default stretch factor of newly created rows/columns is 1. - + \see setColumnStretchFactors, setRowStretchFactor */ void QCPLayoutGrid::setColumnStretchFactor(int column, double factor) @@ -4112,13 +4221,14 @@ void QCPLayoutGrid::setColumnStretchFactor(int column, double factor) /*! Sets the stretch \a factors of all columns. \a factors must have the size \ref columnCount. - + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond - their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref - QCPLayoutElement::setMaximumSize), regardless of the stretch factor. - + their minimum and maximum widths/heights, regardless of the stretch factor. (see \ref + QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize, \ref + QCPLayoutElement::setSizeConstraintRect.) + The default stretch factor of newly created rows/columns is 1. - + \see setColumnStretchFactor, setRowStretchFactors */ void QCPLayoutGrid::setColumnStretchFactors(const QList &factors) @@ -4140,13 +4250,14 @@ void QCPLayoutGrid::setColumnStretchFactors(const QList &factors) /*! Sets the stretch \a factor of \a row. - + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond - their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref - QCPLayoutElement::setMaximumSize), regardless of the stretch factor. - + their minimum and maximum widths/heights, regardless of the stretch factor. (see \ref + QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize, \ref + QCPLayoutElement::setSizeConstraintRect.) + The default stretch factor of newly created rows/columns is 1. - + \see setColumnStretchFactors, setRowStretchFactor */ void QCPLayoutGrid::setRowStretchFactor(int row, double factor) @@ -4163,13 +4274,14 @@ void QCPLayoutGrid::setRowStretchFactor(int row, double factor) /*! Sets the stretch \a factors of all rows. \a factors must have the size \ref rowCount. - + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond - their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref - QCPLayoutElement::setMaximumSize), regardless of the stretch factor. - + their minimum and maximum widths/heights, regardless of the stretch factor. (see \ref + QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize, \ref + QCPLayoutElement::setSizeConstraintRect.) + The default stretch factor of newly created rows/columns is 1. - + \see setRowStretchFactor, setColumnStretchFactors */ void QCPLayoutGrid::setRowStretchFactors(const QList &factors) @@ -4191,7 +4303,7 @@ void QCPLayoutGrid::setRowStretchFactors(const QList &factors) /*! Sets the gap that is left blank between columns to \a pixels. - + \see setRowSpacing */ void QCPLayoutGrid::setColumnSpacing(int pixels) @@ -4201,7 +4313,7 @@ void QCPLayoutGrid::setColumnSpacing(int pixels) /*! Sets the gap that is left blank between rows to \a pixels. - + \see setColumnSpacing */ void QCPLayoutGrid::setRowSpacing(int pixels) @@ -4215,7 +4327,7 @@ void QCPLayoutGrid::setRowSpacing(int pixels) on \ref setFillOrder, whether rows or columns are wrapped. If \a count is set to zero, no wrapping will ever occur. - + If you wish to re-wrap the elements currently in the layout, call \ref setFillOrder with \a rearrange set to true (the actual fill order doesn't need to be changed for the rearranging to be done). @@ -4242,7 +4354,7 @@ void QCPLayoutGrid::setWrap(int count) If you want to have all current elements arranged in the new order, set \a rearrange to true. The elements will be rearranged in a way that tries to preserve their linear index. However, empty - cells are skipped during build-up of the new cell order, which shifts the succeding element's + cells are skipped during build-up of the new cell order, which shifts the succeeding element's index. The rearranging is performed even if the specified \a order is already the current fill order. Thus this method can be used to re-wrap the current elements. @@ -4283,15 +4395,15 @@ void QCPLayoutGrid::setFillOrder(FillOrder order, bool rearrange) /*! Expands the layout to have \a newRowCount rows and \a newColumnCount columns. So the last valid row index will be \a newRowCount-1, the last valid column index will be \a newColumnCount-1. - + If the current column/row count is already larger or equal to \a newColumnCount/\a newRowCount, this function does nothing in that dimension. - + Newly created cells are empty, new rows and columns have the stretch factor 1. - + Note that upon a call to \ref addElement, the layout is expanded automatically to contain the specified row and column, using this function. - + \see simplify */ void QCPLayoutGrid::expandTo(int newRowCount, int newColumnCount) @@ -4316,7 +4428,7 @@ void QCPLayoutGrid::expandTo(int newRowCount, int newColumnCount) /*! Inserts a new row with empty cells at the row index \a newIndex. Valid values for \a newIndex range from 0 (inserts a row at the top) to \a rowCount (appends a row at the bottom). - + \see insertColumn */ void QCPLayoutGrid::insertRow(int newIndex) @@ -4326,12 +4438,12 @@ void QCPLayoutGrid::insertRow(int newIndex) expandTo(1, 1); return; } - + if (newIndex < 0) newIndex = 0; if (newIndex > rowCount()) newIndex = rowCount(); - + mRowStretchFactors.insert(newIndex, 1); QList newRow; for (int col=0; col columnCount()) newIndex = columnCount(); - + mColumnStretchFactors.insert(newIndex, 1); for (int row=0; row= elementCount()) { qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; return; } - + switch (mFillOrder) { case foRowsFirst: { - column = index / rowCount(); - row = index % rowCount(); + column = index / nRows; + row = index % nRows; break; } case foColumnsFirst: { - row = index / columnCount(); - column = index % columnCount(); + row = index / nCols; + column = index % nCols; break; } } @@ -4444,12 +4559,12 @@ void QCPLayoutGrid::updateLayout() QVector minColWidths, minRowHeights, maxColWidths, maxRowHeights; getMinimumRowColSizes(&minColWidths, &minRowHeights); getMaximumRowColSizes(&maxColWidths, &maxRowHeights); - + int totalRowSpacing = (rowCount()-1) * mRowSpacing; int totalColSpacing = (columnCount()-1) * mColumnSpacing; QVector colWidths = getSectionSizes(maxColWidths, minColWidths, mColumnStretchFactors.toVector(), mRect.width()-totalColSpacing); QVector rowHeights = getSectionSizes(maxRowHeights, minRowHeights, mRowStretchFactors.toVector(), mRect.height()-totalRowSpacing); - + // go through cells and set rects accordingly: int yOffset = mRect.top(); for (int row=0; row=0; --col) { @@ -4598,7 +4713,7 @@ void QCPLayoutGrid::simplify() } /* inherits documentation from base class */ -QSize QCPLayoutGrid::minimumSizeHint() const +QSize QCPLayoutGrid::minimumOuterSizeHint() const { QVector minColWidths, minRowHeights; getMinimumRowColSizes(&minColWidths, &minRowHeights); @@ -4607,37 +4722,46 @@ QSize QCPLayoutGrid::minimumSizeHint() const result.rwidth() += minColWidths.at(i); for (int i=0; i maxColWidths, maxRowHeights; getMaximumRowColSizes(&maxColWidths, &maxRowHeights); - + QSize result(0, 0); for (int i=0; i QWIDGETSIZE_MAX) + result.setHeight(QWIDGETSIZE_MAX); + if (result.width() > QWIDGETSIZE_MAX) + result.setWidth(QWIDGETSIZE_MAX); return result; } /*! \internal - + Places the minimum column widths and row heights into \a minColWidths and \a minRowHeights respectively. - - The minimum height of a row is the largest minimum height of any element in that row. The minimum - width of a column is the largest minimum width of any element in that column. - + + The minimum height of a row is the largest minimum height of any element's outer rect in that + row. The minimum width of a column is the largest minimum width of any element's outer rect in + that column. + This is a helper function for \ref updateLayout. - + \see getMaximumRowColSizes */ void QCPLayoutGrid::getMinimumRowColSizes(QVector *minColWidths, QVector *minRowHeights) const @@ -4648,30 +4772,29 @@ void QCPLayoutGrid::getMinimumRowColSizes(QVector *minColWidths, QVectorminimumSizeHint(); - QSize min = mElements.at(row).at(col)->minimumSize(); - QSize final(min.width() > 0 ? min.width() : minHint.width(), min.height() > 0 ? min.height() : minHint.height()); - if (minColWidths->at(col) < final.width()) - (*minColWidths)[col] = final.width(); - if (minRowHeights->at(row) < final.height()) - (*minRowHeights)[row] = final.height(); + QSize minSize = getFinalMinimumOuterSize(el); + if (minColWidths->at(col) < minSize.width()) + (*minColWidths)[col] = minSize.width(); + if (minRowHeights->at(row) < minSize.height()) + (*minRowHeights)[row] = minSize.height(); } } } } /*! \internal - + Places the maximum column widths and row heights into \a maxColWidths and \a maxRowHeights respectively. - - The maximum height of a row is the smallest maximum height of any element in that row. The - maximum width of a column is the smallest maximum width of any element in that column. - + + The maximum height of a row is the smallest maximum height of any element's outer rect in that + row. The maximum width of a column is the smallest maximum width of any element's outer rect in + that column. + This is a helper function for \ref updateLayout. - + \see getMinimumRowColSizes */ void QCPLayoutGrid::getMaximumRowColSizes(QVector *maxColWidths, QVector *maxRowHeights) const @@ -4682,15 +4805,13 @@ void QCPLayoutGrid::getMaximumRowColSizes(QVector *maxColWidths, QVectormaximumSizeHint(); - QSize max = mElements.at(row).at(col)->maximumSize(); - QSize final(max.width() < QWIDGETSIZE_MAX ? max.width() : maxHint.width(), max.height() < QWIDGETSIZE_MAX ? max.height() : maxHint.height()); - if (maxColWidths->at(col) > final.width()) - (*maxColWidths)[col] = final.width(); - if (maxRowHeights->at(row) > final.height()) - (*maxRowHeights)[row] = final.height(); + QSize maxSize = getFinalMaximumOuterSize(el); + if (maxColWidths->at(col) > maxSize.width()) + (*maxColWidths)[col] = maxSize.width(); + if (maxRowHeights->at(row) > maxSize.height()) + (*maxRowHeights)[row] = maxSize.height(); } } } @@ -4702,7 +4823,7 @@ void QCPLayoutGrid::getMaximumRowColSizes(QVector *maxColWidths, QVector *maxColWidths, QVectorminimumSizeHint(); - QSize maxSizeHint = mElements.at(i)->maximumSizeHint(); - finalMinSize.setWidth(mElements.at(i)->minimumSize().width() > 0 ? mElements.at(i)->minimumSize().width() : minSizeHint.width()); - finalMinSize.setHeight(mElements.at(i)->minimumSize().height() > 0 ? mElements.at(i)->minimumSize().height() : minSizeHint.height()); - finalMaxSize.setWidth(mElements.at(i)->maximumSize().width() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().width() : maxSizeHint.width()); - finalMaxSize.setHeight(mElements.at(i)->maximumSize().height() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().height() : maxSizeHint.height()); + QSize finalMinSize = getFinalMinimumOuterSize(el); + QSize finalMaxSize = getFinalMaximumOuterSize(el); if (mInsetPlacement.at(i) == ipFree) { insetRect = QRect(rect().x()+rect().width()*mInsetRect.at(i).x(), @@ -4934,7 +5051,7 @@ bool QCPLayoutInset::take(QCPLayoutElement *element) pos, this method returns a value corresponding to 0.99 times the parent plot's selection tolerance. The inset layout is not selectable itself by default. So if \a onlySelectable is true, -1.0 is returned. - + See \ref QCPLayerable::selectTest for a general explanation of this virtual method. */ double QCPLayoutInset::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const @@ -4942,7 +5059,7 @@ double QCPLayoutInset::selectTest(const QPointF &pos, bool onlySelectable, QVari Q_UNUSED(details) if (onlySelectable) return -1; - + for (int i=0; ipen(); QBrush brushBackup = painter->brush(); QPen miterPen = penBackup; @@ -5296,7 +5413,7 @@ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, const QCPV /*! \internal \overload - + Draws the line ending. The direction is controlled with the \a angle parameter in radians. */ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, double angle) const @@ -5307,19 +5424,19 @@ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, double ang /* including file 'src/axis/axisticker.cpp', size 18664 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTicker //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTicker \brief The base class tick generator used by QCPAxis to create tick positions and tick labels - + Each QCPAxis has an internal QCPAxisTicker (or a subclass) in order to generate tick positions and tick labels for the current axis range. The ticker of an axis can be set via \ref QCPAxis::setTicker. Since that method takes a QSharedPointer, multiple axes can share the same ticker instance. - + This base class generates normal tick coordinates and numeric labels for linear axes. It picks a reasonable tick step (the separation between ticks) which results in readable tick labels. The number of ticks that should be approximately generated can be set via \ref setTickCount. @@ -5327,10 +5444,10 @@ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, double ang sacrifices readability to better match the specified tick count (\ref QCPAxisTicker::tssMeetTickCount) or relaxes the tick count in favor of better tick steps (\ref QCPAxisTicker::tssReadability), which is the default. - + The following more specialized axis ticker subclasses are available, see details in the respective class documentation: - +

@@ -5342,25 +5459,25 @@ void QCPLineEnding::draw(QCPPainter *painter, const QCPVector2D &pos, double ang \image html axisticker-time2.png
QCPAxisTickerFixed\image html axisticker-fixed.png
- + \section axisticker-subclassing Creating own axis tickers - + Creating own axis tickers can be achieved very easily by sublassing QCPAxisTicker and reimplementing some or all of the available virtual methods. In the simplest case you might wish to just generate different tick steps than the other tickers, so you only reimplement the method \ref getTickStep. If you additionally want control over the string that will be shown as tick label, reimplement \ref getTickLabel. - + If you wish to have complete control, you can generate the tick vectors and tick label vectors yourself by reimplementing \ref createTickVector and \ref createLabelVector. The default implementations use the previously mentioned virtual methods \ref getTickStep and \ref getTickLabel, but your reimplementations don't necessarily need to do so. For example in the case of unequal tick steps, the method \ref getTickStep loses its usefulness and can be ignored. - + The sub tick count between major ticks can be controlled with \ref getSubTickCount. Full sub tick placement control is obtained by reimplementing \ref createSubTickVector. - + See the documentation of all these virtual methods in QCPAxisTicker for detailed information about the parameters and expected return values. */ @@ -5378,7 +5495,7 @@ QCPAxisTicker::QCPAxisTicker() : QCPAxisTicker::~QCPAxisTicker() { - + } /*! @@ -5409,7 +5526,7 @@ void QCPAxisTicker::setTickCount(int count) /*! Sets the mathematical coordinate (or "offset") of the zeroth tick. This tick coordinate is just a concept and doesn't need to be inside the currently visible axis range. - + By default \a origin is zero, which for example yields ticks {-5, 0, 5, 10, 15,...} when the tick step is five. If \a origin is now set to 1 instead, the correspondingly generated ticks would be {-4, 1, 6, 11, 16,...}. @@ -5422,11 +5539,11 @@ void QCPAxisTicker::setTickOrigin(double origin) /*! This is the method called by QCPAxis in order to actually generate tick coordinates (\a ticks), tick label strings (\a tickLabels) and sub tick coordinates (\a subTicks). - + The ticks are generated for the specified \a range. The generated labels typically follow the specified \a locale, \a formatChar and number \a precision, however this might be different (or even irrelevant) for certain QCPAxisTicker subclasses. - + The output parameter \a ticks is filled with the generated tick positions in axis coordinates. The output parameters \a subTicks and \a tickLabels are optional (set them to 0 if not needed) and are respectively filled with sub tick coordinates, and tick label strings belonging to \a @@ -5438,7 +5555,7 @@ void QCPAxisTicker::generate(const QCPRange &range, const QLocale &locale, QChar double tickStep = getTickStep(range); ticks = createTickVector(tickStep, range); trimTicks(range, ticks, true); // trim ticks to visible range plus one outer tick on each side (incase a subclass createTickVector creates more) - + // generate sub ticks between major ticks: if (subTicks) { @@ -5449,7 +5566,7 @@ void QCPAxisTicker::generate(const QCPRange &range, const QLocale &locale, QChar } else *subTicks = QVector(); } - + // finally trim also outliers (no further clipping happens in axis drawing): trimTicks(range, ticks, false); // generate labels for visible ticks if requested: @@ -5458,11 +5575,11 @@ void QCPAxisTicker::generate(const QCPRange &range, const QLocale &locale, QChar } /*! \internal - + Takes the entire currently visible axis range and returns a sensible tick step in order to provide readable tick labels as well as a reasonable number of tick counts (see \ref setTickCount, \ref setTickStepStrategy). - + If a QCPAxisTicker subclass only wants a different tick step behaviour than the default implementation, it should reimplement this method. See \ref cleanMantissa for a possible helper function. @@ -5474,23 +5591,23 @@ double QCPAxisTicker::getTickStep(const QCPRange &range) } /*! \internal - + Takes the \a tickStep, i.e. the distance between two consecutive ticks, and returns an appropriate number of sub ticks for that specific tick step. - + Note that a returned sub tick count of e.g. 4 will split each tick interval into 5 sections. */ int QCPAxisTicker::getSubTickCount(double tickStep) { int result = 1; // default to 1, if no proper value can be found - + // separate integer and fractional part of mantissa: double epsilon = 0.01; double intPartf; int intPart; double fracPart = modf(getMantissa(tickStep), &intPartf); intPart = intPartf; - + // handle cases with (almost) integer mantissa: if (fracPart < epsilon || 1.0-fracPart < epsilon) { @@ -5528,16 +5645,16 @@ int QCPAxisTicker::getSubTickCount(double tickStep) } // if mantissa fraction isn't 0.0 or 0.5, don't bother finding good sub tick marks, leave default } - + return result; } /*! \internal - + This method returns the tick label string as it should be printed under the \a tick coordinate. If a textual number is returned, it should respect the provided \a locale, \a formatChar and \a precision. - + If the returned value contains exponentials of the form "2e5" and beautifully typeset powers is enabled in the QCPAxis number format (\ref QCPAxis::setNumberFormat), the exponential part will be formatted accordingly using multiplication symbol and superscript during rendering of the @@ -5549,10 +5666,10 @@ QString QCPAxisTicker::getTickLabel(double tick, const QLocale &locale, QChar fo } /*! \internal - + Returns a vector containing all coordinates of sub ticks that should be drawn. It generates \a subTickCount sub ticks between each tick pair given in \a ticks. - + If a QCPAxisTicker subclass needs maximal control over the generated sub ticks, it should reimplement this method. Depending on the purpose of the subclass it doesn't necessarily need to base its result on \a subTickCount or \a ticks. @@ -5562,7 +5679,7 @@ QVector QCPAxisTicker::createSubTickVector(int subTickCount, const QVect QVector result; if (subTickCount <= 0 || ticks.size() < 2) return result; - + result.reserve((ticks.size()-1)*subTickCount); for (int i=1; i QCPAxisTicker::createSubTickVector(int subTickCount, const QVect } /*! \internal - + Returns a vector containing all coordinates of ticks that should be drawn. The default implementation generates ticks with a spacing of \a tickStep (mathematically starting at the tick step origin, see \ref setTickOrigin) distributed over the passed \a range. - + In order for the axis ticker to generate proper sub ticks, it is necessary that the first and last tick coordinates returned by this method are just below/above the provided \a range. Otherwise the outer intervals won't contain any sub ticks. - + If a QCPAxisTicker subclass needs maximal control over the generated ticks, it should reimplement this method. Depending on the purpose of the subclass it doesn't necessarily need to base its result on \a tickStep, e.g. when the ticks are spaced unequally like in the case of @@ -5603,11 +5720,11 @@ QVector QCPAxisTicker::createTickVector(double tickStep, const QCPRange } /*! \internal - + Returns a vector containing all tick label strings corresponding to the tick coordinates provided in \a ticks. The default implementation calls \ref getTickLabel to generate the respective strings. - + It is possible but uncommon for QCPAxisTicker subclasses to reimplement this method, as reimplementing \ref getTickLabel often achieves the intended result easier. */ @@ -5621,10 +5738,10 @@ QVector QCPAxisTicker::createLabelVector(const QVector &ticks, } /*! \internal - + Removes tick coordinates from \a ticks which lie outside the specified \a range. If \a keepOneOutlier is true, it preserves one tick just outside the range on both sides, if present. - + The passed \a ticks must be sorted in ascending order. */ void QCPAxisTicker::trimTicks(const QCPRange &range, QVector &ticks, bool keepOneOutlier) const @@ -5633,7 +5750,7 @@ void QCPAxisTicker::trimTicks(const QCPRange &range, QVector &ticks, boo bool highFound = false; int lowIndex = 0; int highIndex = -1; - + for (int i=0; i < ticks.size(); ++i) { if (ticks.at(i) >= range.lower) @@ -5652,7 +5769,7 @@ void QCPAxisTicker::trimTicks(const QCPRange &range, QVector &ticks, boo break; } } - + if (highFound && lowFound) { int trimFront = qMax(0, lowIndex-(keepOneOutlier ? 1 : 0)); @@ -5664,9 +5781,9 @@ void QCPAxisTicker::trimTicks(const QCPRange &range, QVector &ticks, boo } /*! \internal - + Returns the coordinate contained in \a candidates which is closest to the provided \a target. - + This method assumes \a candidates is not empty and sorted in ascending order. */ double QCPAxisTicker::pickClosest(double target, const QVector &candidates) const @@ -5683,10 +5800,10 @@ double QCPAxisTicker::pickClosest(double target, const QVector &candidat } /*! \internal - + Returns the decimal mantissa of \a input. Optionally, if \a magnitude is not set to zero, it also returns the magnitude of \a input as a power of 10. - + For example, an input of 142.6 will return a mantissa of 1.426 and a magnitude of 100. */ double QCPAxisTicker::getMantissa(double input, double *magnitude) const @@ -5697,7 +5814,7 @@ double QCPAxisTicker::getMantissa(double input, double *magnitude) const } /*! \internal - + Returns a number that is close to \a input but has a clean, easier human readable mantissa. How strongly the mantissa is altered, and thus how strong the result deviates from the original \a input, depends on the current tick step strategy (see \ref setTickStepStrategy). @@ -5727,16 +5844,16 @@ double QCPAxisTicker::cleanMantissa(double input) const /* including file 'src/axis/axistickerdatetime.cpp', size 14443 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerDateTime //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerDateTime \brief Specialized axis ticker for calendar dates and times as axis ticks - + \image html axisticker-datetime.png - + This QCPAxisTicker subclass generates ticks that correspond to real calendar dates and times. The plot axis coordinate is interpreted as Unix Time, so seconds since Epoch (January 1, 1970, 00:00 UTC). This is also used for example by QDateTime in the toTime_t()/setTime_t() methods @@ -5744,25 +5861,25 @@ double QCPAxisTicker::cleanMantissa(double input) const by using QDateTime::fromMSecsSinceEpoch()/1000.0. The static methods \ref dateTimeToKey and \ref keyToDateTime conveniently perform this conversion achieving a precision of one millisecond on all Qt versions. - + The format of the date/time display in the tick labels is controlled with \ref setDateTimeFormat. If a different time spec (time zone) shall be used, see \ref setDateTimeSpec. - + This ticker produces unequal tick spacing in order to provide intuitive date and time-of-day ticks. For example, if the axis range spans a few years such that there is one tick per year, ticks will be positioned on 1. January of every year. This is intuitive but, due to leap years, will result in slightly unequal tick intervals (visually unnoticeable). The same can be seen in the image above: even though the number of days varies month by month, this ticker generates ticks on the same day of each month. - + If you would like to change the date/time that is used as a (mathematical) starting date for the ticks, use the \ref setTickOrigin(const QDateTime &origin) method overload, which takes a QDateTime. If you pass 15. July, 9:45 to this method, the yearly ticks will end up on 15. July at 9:45 of every year. - + The ticker can be created and assigned to an axis like this: \snippet documentation/doc-image-generator/mainwindow.cpp axistickerdatetime-creation - + \note If you rather wish to display relative times in terms of days, hours, minutes, seconds and milliseconds, and are not interested in the intricacies of real calendar dates with months and (leap) years, have a look at QCPAxisTickerTime instead. @@ -5783,9 +5900,9 @@ QCPAxisTickerDateTime::QCPAxisTickerDateTime() : /*! Sets the format in which dates and times are displayed as tick labels. For details about the \a format string, see the documentation of QDateTime::toString(). - + Newlines can be inserted with "\n". - + \see setDateTimeSpec */ void QCPAxisTickerDateTime::setDateTimeFormat(const QString &format) @@ -5800,7 +5917,7 @@ void QCPAxisTickerDateTime::setDateTimeFormat(const QString &format) Qt::LocalTime. However, if the date time values passed to QCustomPlot (e.g. in the form of axis ranges or keys of a plottable) are given in the UTC spec, set \a spec to Qt::UTC to get the correct axis labels. - + \see setDateTimeFormat */ void QCPAxisTickerDateTime::setDateTimeSpec(Qt::TimeSpec spec) @@ -5812,7 +5929,7 @@ void QCPAxisTickerDateTime::setDateTimeSpec(Qt::TimeSpec spec) Sets the tick origin (see \ref QCPAxisTicker::setTickOrigin) in seconds since Epoch (1. Jan 1970, 00:00 UTC). For the date time ticker it might be more intuitive to use the overload which directly takes a QDateTime, see \ref setTickOrigin(const QDateTime &origin). - + This is useful to define the month/day/time recurring at greater tick interval steps. For example, If you pass 15. July, 9:45 to this method and the tick interval happens to be one tick per year, the ticks will end up on 15. July at 9:45 of every year. @@ -5824,7 +5941,7 @@ void QCPAxisTickerDateTime::setTickOrigin(double origin) /*! Sets the tick origin (see \ref QCPAxisTicker::setTickOrigin) as a QDateTime \a origin. - + This is useful to define the month/day/time recurring at greater tick interval steps. For example, If you pass 15. July, 9:45 to this method and the tick interval happens to be one tick per year, the ticks will end up on 15. July at 9:45 of every year. @@ -5835,22 +5952,22 @@ void QCPAxisTickerDateTime::setTickOrigin(const QDateTime &origin) } /*! \internal - + Returns a sensible tick step with intervals appropriate for a date-time-display, such as weekly, monthly, bi-monthly, etc. - + Note that this tick step isn't used exactly when generating the tick vector in \ref createTickVector, but only as a guiding value requiring some correction for each individual tick interval. Otherwise this would lead to unintuitive date displays, e.g. jumping between first day in the month to the last day in the previous month from tick to tick, due to the non-uniform length of months. The same problem arises with leap years. - + \seebaseclassmethod */ double QCPAxisTickerDateTime::getTickStep(const QCPRange &range) { double result = range.size()/(double)(mTickCount+1e-10); // mTickCount ticks on average, the small addition is to prevent jitter on exact integers - + mDateStrategy = dsNone; if (result < 1) // ideal tick step is below 1 second -> use normal clean mantissa algorithm in units of seconds { @@ -5875,10 +5992,10 @@ double QCPAxisTickerDateTime::getTickStep(const QCPRange &range) } /*! \internal - + Returns a sensible sub tick count with intervals appropriate for a date-time-display, such as weekly, monthly, bi-monthly, etc. - + \seebaseclassmethod */ int QCPAxisTickerDateTime::getSubTickCount(double tickStep) @@ -5910,10 +6027,10 @@ int QCPAxisTickerDateTime::getSubTickCount(double tickStep) } /*! \internal - + Generates a date/time tick label for tick coordinate \a tick, based on the currently set format (\ref setDateTimeFormat) and time spec (\ref setDateTimeSpec). - + \seebaseclassmethod */ QString QCPAxisTickerDateTime::getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) @@ -5924,10 +6041,10 @@ QString QCPAxisTickerDateTime::getTickLabel(double tick, const QLocale &locale, } /*! \internal - + Uses the passed \a tickStep as a guiding value and applies corrections in order to obtain non-uniform tick intervals but intuitive tick labels, e.g. falling on the same day of each month. - + \seebaseclassmethod */ QVector QCPAxisTickerDateTime::createTickVector(double tickStep, const QCPRange &range) @@ -5969,10 +6086,10 @@ QVector QCPAxisTickerDateTime::createTickVector(double tickStep, const Q /*! A convenience method which turns \a key (in seconds since Epoch 1. Jan 1970, 00:00 UTC) into a QDateTime object. This can be used to turn axis coordinates to actual QDateTimes. - + The accuracy achieved by this method is one millisecond, irrespective of the used Qt version (it works around the lack of a QDateTime::fromMSecsSinceEpoch in Qt 4.6) - + \see dateTimeToKey */ QDateTime QCPAxisTickerDateTime::keyToDateTime(double key) @@ -5985,14 +6102,14 @@ QDateTime QCPAxisTickerDateTime::keyToDateTime(double key) } /*! \overload - + A convenience method which turns a QDateTime object into a double value that corresponds to seconds since Epoch (1. Jan 1970, 00:00 UTC). This is the format used as axis coordinates by QCPAxisTickerDateTime. - + The accuracy achieved by this method is one millisecond, irrespective of the used Qt version (it works around the lack of a QDateTime::toMSecsSinceEpoch in Qt 4.6) - + \see keyToDateTime */ double QCPAxisTickerDateTime::dateTimeToKey(const QDateTime dateTime) @@ -6005,11 +6122,11 @@ double QCPAxisTickerDateTime::dateTimeToKey(const QDateTime dateTime) } /*! \overload - + A convenience method which turns a QDate object into a double value that corresponds to seconds since Epoch (1. Jan 1970, 00:00 UTC). This is the format used as axis coordinates by QCPAxisTickerDateTime. - + \see keyToDateTime */ double QCPAxisTickerDateTime::dateTimeToKey(const QDate date) @@ -6024,23 +6141,23 @@ double QCPAxisTickerDateTime::dateTimeToKey(const QDate date) /* including file 'src/axis/axistickertime.cpp', size 11747 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerTime //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerTime \brief Specialized axis ticker for time spans in units of milliseconds to days - + \image html axisticker-time.png - + This QCPAxisTicker subclass generates ticks that corresponds to time intervals. - + The format of the time display in the tick labels is controlled with \ref setTimeFormat and \ref setFieldWidth. The time coordinate is in the unit of seconds with respect to the time coordinate zero. Unlike with QCPAxisTickerDateTime, the ticks don't correspond to a specific calendar date and time. - + The time can be displayed in milliseconds, seconds, minutes, hours and days. Depending on the largest available unit in the format specified with \ref setTimeFormat, any time spans above will be carried in that largest unit. So for example if the format string is "%m:%s" and a tick at @@ -6048,19 +6165,19 @@ double QCPAxisTickerDateTime::dateTimeToKey(const QDate date) label will show "130:15" (130 minutes, 15 seconds). If the format string is "%h:%m:%s", the hour unit will be used and the label will thus be "02:10:15". Negative times with respect to the axis zero will carry a leading minus sign. - + The ticker can be created and assigned to an axis like this: \snippet documentation/doc-image-generator/mainwindow.cpp axistickertime-creation - + Here is an example of a time axis providing time information in days, hours and minutes. Due to the axis range spanning a few days and the wanted tick count (\ref setTickCount), the ticker decided to use tick steps of 12 hours: - + \image html axisticker-time2.png - + The format string for this example is \snippet documentation/doc-image-generator/mainwindow.cpp axistickertime-creation-2 - + \note If you rather wish to display calendar dates and times, have a look at QCPAxisTickerDateTime instead. */ @@ -6080,7 +6197,7 @@ QCPAxisTickerTime::QCPAxisTickerTime() : mFieldWidth[tuMinutes] = 2; mFieldWidth[tuHours] = 2; mFieldWidth[tuDays] = 1; - + mFormatPattern[tuMilliseconds] = QLatin1String("%z"); mFormatPattern[tuSeconds] = QLatin1String("%s"); mFormatPattern[tuMinutes] = QLatin1String("%m"); @@ -6090,16 +6207,16 @@ QCPAxisTickerTime::QCPAxisTickerTime() : /*! Sets the format that will be used to display time in the tick labels. - + The available patterns are: - %%z for milliseconds - %%s for seconds - %%m for minutes - %%h for hours - %%d for days - + The field width (zero padding) can be controlled for each unit with \ref setFieldWidth. - + The largest unit that appears in \a format will carry all the remaining time of a certain tick coordinate, even if it overflows the natural limit of the unit. For example, if %%m is the largest unit it might become larger than 59 in order to consume larger time values. If on the @@ -6109,7 +6226,7 @@ QCPAxisTickerTime::QCPAxisTickerTime() : void QCPAxisTickerTime::setTimeFormat(const QString &format) { mTimeFormat = format; - + // determine smallest and biggest unit in format, to optimize unit replacement and allow biggest // unit to consume remaining time of a tick value and grow beyond its modulo (e.g. min > 59) mSmallestUnit = tuMilliseconds; @@ -6134,7 +6251,7 @@ void QCPAxisTickerTime::setTimeFormat(const QString &format) Sets the field widh of the specified \a unit to be \a width digits, when displayed in the tick label. If the number for the specific unit is shorter than \a width, it will be padded with an according number of zeros to the left in order to reach the field width. - + \see setTimeFormat */ void QCPAxisTickerTime::setFieldWidth(QCPAxisTickerTime::TimeUnit unit, int width) @@ -6148,13 +6265,13 @@ void QCPAxisTickerTime::setFieldWidth(QCPAxisTickerTime::TimeUnit unit, int widt smallest available time unit in the current format (\ref setTimeFormat). For example if the unit of seconds isn't available in the format, this method will not generate steps (like 2.5 minutes) that require sub-minute precision to be displayed correctly. - + \seebaseclassmethod */ double QCPAxisTickerTime::getTickStep(const QCPRange &range) { double result = range.size()/(double)(mTickCount+1e-10); // mTickCount ticks on average, the small addition is to prevent jitter on exact integers - + if (result < 1) // ideal tick step is below 1 second -> use normal clean mantissa algorithm in units of seconds { if (mSmallestUnit == tuMilliseconds) @@ -6199,7 +6316,7 @@ double QCPAxisTickerTime::getTickStep(const QCPRange &range) /*! \internal Returns the sub tick count appropriate for the provided \a tickStep and time displays. - + \seebaseclassmethod */ int QCPAxisTickerTime::getSubTickCount(double tickStep) @@ -6222,10 +6339,10 @@ int QCPAxisTickerTime::getSubTickCount(double tickStep) } /*! \internal - + Returns the tick label corresponding to the provided \a tick and the configured format and field widths (\ref setTimeFormat, \ref setFieldWidth). - + \seebaseclassmethod */ QString QCPAxisTickerTime::getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) @@ -6237,14 +6354,14 @@ QString QCPAxisTickerTime::getTickLabel(double tick, const QLocale &locale, QCha if (negative) tick *= -1; double values[tuDays+1]; // contains the msec/sec/min/... value with its respective modulo (e.g. minute 0..59) double restValues[tuDays+1]; // contains the msec/sec/min/... value as if it's the largest available unit and thus consumes the remaining time - + restValues[tuMilliseconds] = tick*1000; values[tuMilliseconds] = modf(restValues[tuMilliseconds]/1000, &restValues[tuSeconds])*1000; values[tuSeconds] = modf(restValues[tuSeconds]/60, &restValues[tuMinutes])*60; values[tuMinutes] = modf(restValues[tuMinutes]/60, &restValues[tuHours])*60; values[tuHours] = modf(restValues[tuHours]/24, &restValues[tuDays])*24; // no need to set values[tuDays] because days are always a rest value (there is no higher unit so it consumes all remaining time) - + QString result = mTimeFormat; for (int i = mSmallestUnit; i <= mBiggestUnit; ++i) { @@ -6257,7 +6374,7 @@ QString QCPAxisTickerTime::getTickLabel(double tick, const QLocale &locale, QCha } /*! \internal - + Replaces all occurrences of the format pattern belonging to \a unit in \a text with the specified \a value, using the field width as specified with \ref setFieldWidth for the \a unit. */ @@ -6266,34 +6383,34 @@ void QCPAxisTickerTime::replaceUnit(QString &text, QCPAxisTickerTime::TimeUnit u QString valueStr = QString::number(value); while (valueStr.size() < mFieldWidth.value(unit)) valueStr.prepend(QLatin1Char('0')); - + text.replace(mFormatPattern.value(unit), valueStr); } /* end of 'src/axis/axistickertime.cpp' */ /* including file 'src/axis/axistickerfixed.cpp', size 5583 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerFixed //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerFixed \brief Specialized axis ticker with a fixed tick step - + \image html axisticker-fixed.png - + This QCPAxisTicker subclass generates ticks with a fixed tick step set with \ref setTickStep. It is also possible to allow integer multiples and integer powers of the specified tick step with \ref setScaleStrategy. - + A typical application of this ticker is to make an axis only display integers, by setting the tick step of the ticker to 1.0 and the scale strategy to \ref ssMultiples. - + Another case is when a certain number has a special meaning and axis ticks should only appear at multiples of that value. In this case you might also want to consider \ref QCPAxisTickerPi because despite the name it is not limited to only pi symbols/values. - + The ticker can be created and assigned to an axis like this: \snippet documentation/doc-image-generator/mainwindow.cpp axistickerfixed-creation */ @@ -6310,7 +6427,7 @@ QCPAxisTickerFixed::QCPAxisTickerFixed() : /*! Sets the fixed tick interval to \a step. - + The axis ticker will only use this tick step when generating axis ticks. This might cause a very high tick density and overlapping labels if the axis range is zoomed out. Using \ref setScaleStrategy it is possible to relax the fixed step and also allow multiples or powers of \a @@ -6329,7 +6446,7 @@ void QCPAxisTickerFixed::setTickStep(double step) Sets whether the specified tick step (\ref setTickStep) is absolutely fixed or whether modifications may be applied to it before calculating the finally used tick step, such as permitting multiples or powers. See \ref ScaleStrategy for details. - + The default strategy is \ref ssNone, which means the tick step is absolutely fixed. */ void QCPAxisTickerFixed::setScaleStrategy(QCPAxisTickerFixed::ScaleStrategy strategy) @@ -6338,13 +6455,13 @@ void QCPAxisTickerFixed::setScaleStrategy(QCPAxisTickerFixed::ScaleStrategy stra } /*! \internal - + Determines the actually used tick step from the specified tick step and scale strategy (\ref setTickStep, \ref setScaleStrategy). - + This method either returns the specified tick step exactly, or, if the scale strategy is not \ref ssNone, a modification of it to allow varying the number of ticks in the current axis range. - + \seebaseclassmethod */ double QCPAxisTickerFixed::getTickStep(const QCPRange &range) @@ -6375,27 +6492,27 @@ double QCPAxisTickerFixed::getTickStep(const QCPRange &range) /* including file 'src/axis/axistickertext.cpp', size 8653 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerText //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerText \brief Specialized axis ticker which allows arbitrary labels at specified coordinates - + \image html axisticker-text.png - + This QCPAxisTicker subclass generates ticks which can be directly specified by the user as coordinates and associated strings. They can be passed as a whole with \ref setTicks or one at a time with \ref addTick. Alternatively you can directly access the internal storage via \ref ticks and modify the tick/label data there. - + This is useful for cases where the axis represents categories rather than numerical values. - + If you are updating the ticks of this ticker regularly and in a dynamic fasion (e.g. dependent on the axis range), it is a sign that you should probably create an own ticker by subclassing QCPAxisTicker, instead of using this one. - + The ticker can be created and assigned to an axis like this: \snippet documentation/doc-image-generator/mainwindow.cpp axistickertext-creation */ @@ -6403,7 +6520,7 @@ double QCPAxisTickerFixed::getTickStep(const QCPRange &range) /* start of documentation of inline functions */ /*! \fn QMap &QCPAxisTickerText::ticks() - + Returns a non-const reference to the internal map which stores the tick coordinates and their labels. @@ -6423,13 +6540,13 @@ QCPAxisTickerText::QCPAxisTickerText() : } /*! \overload - + Sets the ticks that shall appear on the axis. The map key of \a ticks corresponds to the axis coordinate, and the map value is the string that will appear as tick label. - + An alternative to manipulate ticks is to directly access the internal storage with the \ref ticks getter. - + \see addTicks, addTick, clear */ void QCPAxisTickerText::setTicks(const QMap &ticks) @@ -6438,11 +6555,11 @@ void QCPAxisTickerText::setTicks(const QMap &ticks) } /*! \overload - + Sets the ticks that shall appear on the axis. The entries of \a positions correspond to the axis coordinates, and the entries of \a labels are the respective strings that will appear as tick labels. - + \see addTicks, addTick, clear */ void QCPAxisTickerText::setTicks(const QVector &positions, const QVector labels) @@ -6466,10 +6583,10 @@ void QCPAxisTickerText::setSubTickCount(int subTicks) /*! Clears all ticks. - + An alternative to manipulate ticks is to directly access the internal storage with the \ref ticks getter. - + \see setTicks, addTicks, addTick */ void QCPAxisTickerText::clear() @@ -6480,7 +6597,7 @@ void QCPAxisTickerText::clear() /*! Adds a single tick to the axis at the given axis coordinate \a position, with the provided tick \a label. - + \see addTicks, setTicks, clear */ void QCPAxisTickerText::addTick(double position, QString label) @@ -6489,13 +6606,13 @@ void QCPAxisTickerText::addTick(double position, QString label) } /*! \overload - + Adds the provided \a ticks to the ones already existing. The map key of \a ticks corresponds to the axis coordinate, and the map value is the string that will appear as tick label. - + An alternative to manipulate ticks is to directly access the internal storage with the \ref ticks getter. - + \see addTick, setTicks, clear */ void QCPAxisTickerText::addTicks(const QMap &ticks) @@ -6504,14 +6621,14 @@ void QCPAxisTickerText::addTicks(const QMap &ticks) } /*! \overload - + Adds the provided ticks to the ones already existing. The entries of \a positions correspond to the axis coordinates, and the entries of \a labels are the respective strings that will appear as tick labels. - + An alternative to manipulate ticks is to directly access the internal storage with the \ref ticks getter. - + \see addTick, setTicks, clear */ void QCPAxisTickerText::addTicks(const QVector &positions, const QVector &labels) @@ -6525,7 +6642,7 @@ void QCPAxisTickerText::addTicks(const QVector &positions, const QVector /*! Since the tick coordinates are provided externally, this method implementation does nothing. - + \seebaseclassmethod */ double QCPAxisTickerText::getTickStep(const QCPRange &range) @@ -6537,7 +6654,7 @@ double QCPAxisTickerText::getTickStep(const QCPRange &range) /*! Returns the sub tick count that was configured with \ref setSubTickCount. - + \seebaseclassmethod */ int QCPAxisTickerText::getSubTickCount(double tickStep) @@ -6549,7 +6666,7 @@ int QCPAxisTickerText::getSubTickCount(double tickStep) /*! Returns the tick label which corresponds to the key \a tick in the internal tick storage. Since the labels are provided externally, \a locale, \a formatChar, and \a precision are ignored. - + \seebaseclassmethod */ QString QCPAxisTickerText::getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) @@ -6564,7 +6681,7 @@ QString QCPAxisTickerText::getTickLabel(double tick, const QLocale &locale, QCha Returns the externally provided tick coordinates which are in the specified \a range. If available, one tick above and below the range is provided in addition, to allow possible sub tick calculation. The parameter \a tickStep is ignored. - + \seebaseclassmethod */ QVector QCPAxisTickerText::createTickVector(double tickStep, const QCPRange &range) @@ -6573,7 +6690,7 @@ QVector QCPAxisTickerText::createTickVector(double tickStep, const QCPRa QVector result; if (mTicks.isEmpty()) return result; - + QMap::const_iterator start = mTicks.lowerBound(range.lower); QMap::const_iterator end = mTicks.upperBound(range.upper); // this method should try to give one tick outside of range so proper subticks can be generated: @@ -6581,30 +6698,30 @@ QVector QCPAxisTickerText::createTickVector(double tickStep, const QCPRa if (end != mTicks.constEnd()) ++end; for (QMap::const_iterator it = start; it != end; ++it) result.append(it.key()); - + return result; } /* end of 'src/axis/axistickertext.cpp' */ /* including file 'src/axis/axistickerpi.cpp', size 11170 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerPi //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerPi \brief Specialized axis ticker to display ticks in units of an arbitrary constant, for example pi - + \image html axisticker-pi.png - + This QCPAxisTicker subclass generates ticks that are expressed with respect to a given symbolic constant with a numerical value specified with \ref setPiValue and an appearance in the tick labels specified with \ref setPiSymbol. - + Ticks may be generated at fractions of the symbolic constant. How these fractions appear in the tick label can be configured with \ref setFractionStyle. - + The ticker can be created and assigned to an axis like this: \snippet documentation/doc-image-generator/mainwindow.cpp axistickerpi-creation */ @@ -6626,7 +6743,7 @@ QCPAxisTickerPi::QCPAxisTickerPi() : /*! Sets how the symbol part (which is always a suffix to the number) shall appear in the axis tick label. - + If a space shall appear between the number and the symbol, make sure the space is contained in \a symbol. */ @@ -6649,9 +6766,9 @@ void QCPAxisTickerPi::setPiValue(double pi) /*! Sets whether the axis labels shall appear periodicly and if so, at which multiplicity of the symbolic constant. - + To disable periodicity, set \a multiplesOfPi to zero. - + For example, an axis that identifies 0 with 2pi would set \a multiplesOfPi to two. */ void QCPAxisTickerPi::setPeriodicity(int multiplesOfPi) @@ -6669,11 +6786,11 @@ void QCPAxisTickerPi::setFractionStyle(QCPAxisTickerPi::FractionStyle style) } /*! \internal - + Returns the tick step, using the constant's value (\ref setPiValue) as base unit. In consequence the numerical/fractional part preceding the symbolic constant is made to have a readable mantissa. - + \seebaseclassmethod */ double QCPAxisTickerPi::getTickStep(const QCPRange &range) @@ -6684,11 +6801,11 @@ double QCPAxisTickerPi::getTickStep(const QCPRange &range) } /*! \internal - + Returns the sub tick count, using the constant's value (\ref setPiValue) as base unit. In consequence the sub ticks divide the numerical/fractional part preceding the symbolic constant reasonably, and not the total tick coordinate. - + \seebaseclassmethod */ int QCPAxisTickerPi::getSubTickCount(double tickStep) @@ -6697,11 +6814,11 @@ int QCPAxisTickerPi::getSubTickCount(double tickStep) } /*! \internal - + Returns the tick label as a fractional/numerical part and a symbolic string as suffix. The formatting of the fraction is done according to the specified \ref setFractionStyle. The appended symbol is specified with \ref setPiSymbol. - + \seebaseclassmethod */ QString QCPAxisTickerPi::getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) @@ -6709,7 +6826,7 @@ QString QCPAxisTickerPi::getTickLabel(double tick, const QLocale &locale, QChar double tickInPis = tick/mPiValue; if (mPeriodicity > 0) tickInPis = fmod(tickInPis, mPeriodicity); - + if (mFractionStyle != fsFloatingPoint && mPiTickStep > 0.09 && mPiTickStep < 50) { // simply construct fraction from decimal like 1.234 -> 1234/1000 and then simplify fraction, smaller digits are irrelevant due to mPiTickStep conditional above @@ -6734,7 +6851,7 @@ QString QCPAxisTickerPi::getTickLabel(double tick, const QLocale &locale, QChar } /*! \internal - + Takes the fraction given by \a numerator and \a denominator and modifies the values to make sure the fraction is in irreducible form, i.e. numerator and denominator don't share any common factors which could be cancelled. @@ -6743,7 +6860,7 @@ void QCPAxisTickerPi::simplifyFraction(int &numerator, int &denominator) const { if (numerator == 0 || denominator == 0) return; - + int num = numerator; int denom = denominator; while (denom != 0) // euclidean gcd algorithm @@ -6758,10 +6875,10 @@ void QCPAxisTickerPi::simplifyFraction(int &numerator, int &denominator) const } /*! \internal - + Takes the fraction given by \a numerator and \a denominator and returns a string representation. The result depends on the configured fraction style (\ref setFractionStyle). - + This method is used to format the numerical/fractional part when generating tick labels. It simplifies the passed fraction to an irreducible form using \ref simplifyFraction and factors out any integer parts of the fraction (e.g. "10/4" becomes "2 1/2"). @@ -6781,7 +6898,7 @@ QString QCPAxisTickerPi::fractionToString(int numerator, int denominator) const int sign = numerator*denominator < 0 ? -1 : 1; numerator = qAbs(numerator); denominator = qAbs(denominator); - + if (denominator == 1) { return QString::number(sign*numerator); @@ -6814,11 +6931,11 @@ QString QCPAxisTickerPi::fractionToString(int numerator, int denominator) const } /*! \internal - + Returns the unicode string representation of the fraction given by \a numerator and \a denominator. This is the representation used in \ref fractionToString when the fraction style (\ref setFractionStyle) is \ref fsUnicodeFractions. - + This method doesn't use the single-character common fractions but builds each fraction from a superscript unicode number, the unicode fraction character, and a subscript unicode number. */ @@ -6828,7 +6945,7 @@ QString QCPAxisTickerPi::unicodeFraction(int numerator, int denominator) const } /*! \internal - + Returns the unicode string representing \a number as superscript. This is used to build unicode fractions in \ref unicodeFraction. */ @@ -6836,7 +6953,7 @@ QString QCPAxisTickerPi::unicodeSuperscript(int number) const { if (number == 0) return QString(QChar(0x2070)); - + QString result; while (number > 0) { @@ -6854,7 +6971,7 @@ QString QCPAxisTickerPi::unicodeSuperscript(int number) const } /*! \internal - + Returns the unicode string representing \a number as subscript. This is used to build unicode fractions in \ref unicodeFraction. */ @@ -6862,7 +6979,7 @@ QString QCPAxisTickerPi::unicodeSubscript(int number) const { if (number == 0) return QString(QChar(0x2080)); - + QString result; while (number > 0) { @@ -6875,25 +6992,25 @@ QString QCPAxisTickerPi::unicodeSubscript(int number) const /* including file 'src/axis/axistickerlog.cpp', size 7106 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAxisTickerLog //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCPAxisTickerLog \brief Specialized axis ticker suited for logarithmic axes - + \image html axisticker-log.png - + This QCPAxisTicker subclass generates ticks with unequal tick intervals suited for logarithmic axis scales. The ticks are placed at powers of the specified log base (\ref setLogBase). - + Especially in the case of a log base equal to 10 (the default), it might be desirable to have tick labels in the form of powers of ten without mantissa display. To achieve this, set the number precision (\ref QCPAxis::setNumberPrecision) to zero and the number format (\ref QCPAxis::setNumberFormat) to scientific (exponential) display with beautifully typeset decimal powers, so a format string of "eb". This will result in the following axis tick labels: - + \image html axisticker-log-powers.png The ticker can be created and assigned to an axis like this: @@ -6929,7 +7046,7 @@ void QCPAxisTickerLog::setLogBase(double base) Sets the number of sub ticks in a tick interval. Within each interval, the sub ticks are spaced linearly to provide a better visual guide, so the sub tick density increases toward the higher tick. - + Note that \a subTicks is the number of sub ticks (not sub intervals) in one tick interval. So in the case of logarithm base 10 an intuitive sub tick spacing would be achieved with eight sub ticks (the default). This means e.g. between the ticks 10 and 100 there will be eight ticks, @@ -6944,10 +7061,10 @@ void QCPAxisTickerLog::setSubTickCount(int subTicks) } /*! \internal - + Since logarithmic tick steps are necessarily different for each tick interval, this method does nothing in the case of QCPAxisTickerLog - + \seebaseclassmethod */ double QCPAxisTickerLog::getTickStep(const QCPRange &range) @@ -6958,10 +7075,10 @@ double QCPAxisTickerLog::getTickStep(const QCPRange &range) } /*! \internal - + Returns the sub tick count specified in \ref setSubTickCount. For QCPAxisTickerLog, there is no automatic sub tick count calculation necessary. - + \seebaseclassmethod */ int QCPAxisTickerLog::getSubTickCount(double tickStep) @@ -6971,12 +7088,12 @@ int QCPAxisTickerLog::getSubTickCount(double tickStep) } /*! \internal - + Creates ticks with a spacing given by the logarithm base and an increasing integer power in the provided \a range. The step in which the power increases tick by tick is chosen in order to keep the total number of ticks as close as possible to the tick count (\ref setTickCount). The parameter \a tickStep is ignored for QCPAxisTickerLog - + \seebaseclassmethod */ QVector QCPAxisTickerLog::createTickVector(double tickStep, const QCPRange &range) @@ -7009,14 +7126,14 @@ QVector QCPAxisTickerLog::createTickVector(double tickStep, const QCPRan { qDebug() << Q_FUNC_INFO << "Invalid range for logarithmic plot: " << range.lower << ".." << range.upper; } - + return result; } /* end of 'src/axis/axistickerlog.cpp' */ -/* including file 'src/axis/axis.cpp', size 94458 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/axis/axis.cpp', size 99397 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -7025,11 +7142,11 @@ QVector QCPAxisTickerLog::createTickVector(double tickStep, const QCPRan /*! \class QCPGrid \brief Responsible for drawing the grid of a QCPAxis. - + This class is tightly bound to QCPAxis. Every axis owns a grid instance and uses it to draw the grid lines, sub grid lines and zero-line. You can interact with the grid of an axis via \ref QCPAxis::grid. Normally, you don't need to create an instance of QCPGrid yourself. - + The axis and grid drawing was split into two classes to allow them to be placed on different layers (both QCPAxis and QCPGrid inherit from QCPLayerable). Thus it is possible to have the grid in the background and the axes in the foreground, and any plottables/items in between. This @@ -7038,7 +7155,7 @@ QVector QCPAxisTickerLog::createTickVector(double tickStep, const QCPRan /*! Creates a QCPGrid instance and sets default values. - + You shouldn't instantiate grids on their own, since every QCPAxis brings its own QCPGrid. */ QCPGrid::QCPGrid(QCPAxis *parentAxis) : @@ -7058,7 +7175,7 @@ QCPGrid::QCPGrid(QCPAxis *parentAxis) : /*! Sets whether grid lines at sub tick marks are drawn. - + \see setSubGridPen */ void QCPGrid::setSubGridVisible(bool visible) @@ -7100,7 +7217,7 @@ void QCPGrid::setSubGridPen(const QPen &pen) /*! Sets the pen with which zero lines are drawn. - + Zero lines are lines at value coordinate 0 which may be drawn with a different pen than other grid lines. To disable zero lines and just draw normal grid lines at zero, set \a pen to Qt::NoPen. */ @@ -7115,11 +7232,11 @@ void QCPGrid::setZeroLinePen(const QPen &pen) before drawing the major grid lines. This is the antialiasing state the painter passed to the \ref draw method is in by default. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \see setAntialiased */ void QCPGrid::applyDefaultAntialiasingHint(QCPPainter *painter) const @@ -7128,29 +7245,29 @@ void QCPGrid::applyDefaultAntialiasingHint(QCPPainter *painter) const } /*! \internal - + Draws grid lines and sub grid lines at the positions of (sub) ticks of the parent axis, spanning over the complete axis rect. Also draws the zero line, if appropriate (\ref setZeroLinePen). */ void QCPGrid::draw(QCPPainter *painter) { if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } - + if (mParentAxis->subTicks() && mSubGridVisible) drawSubGridLines(painter); drawGridLines(painter); } /*! \internal - + Draws the main grid lines and possibly a zero line with the specified painter. - + This is a helper function called by \ref draw. */ void QCPGrid::drawGridLines(QCPPainter *painter) const { if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } - + const int tickCount = mParentAxis->mTickVector.size(); double t; // helper variable, result of coordinate-to-pixel transforms if (mParentAxis->orientation() == Qt::Horizontal) @@ -7215,15 +7332,15 @@ void QCPGrid::drawGridLines(QCPPainter *painter) const } /*! \internal - + Draws the sub grid lines with the specified painter. - + This is a helper function called by \ref draw. */ void QCPGrid::drawSubGridLines(QCPPainter *painter) const { if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } - + applyAntialiasingHint(painter, mAntialiasedSubGrid, QCP::aeSubGrid); double t; // helper variable, result of coordinate-to-pixel transforms painter->setPen(mSubGridPen); @@ -7255,16 +7372,16 @@ void QCPGrid::drawSubGridLines(QCPPainter *painter) const Usually doesn't need to be instantiated externally. Access %QCustomPlot's default four axes via QCustomPlot::xAxis (bottom), QCustomPlot::yAxis (left), QCustomPlot::xAxis2 (top) and QCustomPlot::yAxis2 (right). - + Axes are always part of an axis rect, see QCPAxisRect. \image html AxisNamesOverview.png
Naming convention of axis parts
\n - + \image html AxisRectSpacingOverview.png
Overview of the spacings and paddings that define the geometry of an axis. The dashed gray line on the left represents the QCustomPlot widget border.
- + Each axis holds an instance of QCPAxisTicker which is used to generate the tick coordinates and tick labels. You can access the currently installed \ref ticker or set a new one (possibly one of the specialized subclasses, or your own subclass) via \ref setTicker. For details, see the @@ -7282,7 +7399,7 @@ void QCPGrid::drawSubGridLines(QCPPainter *painter) const */ /*! \fn QCPGrid *QCPAxis::grid() const - + Returns the \ref QCPGrid instance belonging to this axis. Access it to set details about the way the grid is displayed. */ @@ -7337,7 +7454,7 @@ void QCPGrid::drawSubGridLines(QCPPainter *painter) const This signal is emitted when the range of this axis has changed. You can connect it to the \ref setRange slot of another axis to communicate the new range to the other axis, in order for it to be synchronized. - + You may also manipulate/correct the range with \ref setRange in a slot connected to this signal. This is useful if for example a maximum range span shall not be exceeded, or if the lower/upper range shouldn't go beyond certain values (see \ref QCPRange::bounded). For example, the following @@ -7349,24 +7466,24 @@ void QCPGrid::drawSubGridLines(QCPPainter *painter) const /*! \fn void QCPAxis::rangeChanged(const QCPRange &newRange, const QCPRange &oldRange) \overload - + Additionally to the new range, this signal also provides the previous range held by the axis as \a oldRange. */ /*! \fn void QCPAxis::scaleTypeChanged(QCPAxis::ScaleType scaleType); - + This signal is emitted when the scale type changes, by calls to \ref setScaleType */ /*! \fn void QCPAxis::selectionChanged(QCPAxis::SelectableParts selection) - + This signal is emitted when the selection state of this axis has changed, either by user interaction or by a direct call to \ref setSelectedParts. */ /*! \fn void QCPAxis::selectableChanged(const QCPAxis::SelectableParts &parts); - + This signal is emitted when the selectability changes, by calls to \ref setSelectableParts */ @@ -7374,7 +7491,7 @@ void QCPGrid::drawSubGridLines(QCPPainter *painter) const /*! Constructs an Axis instance of Type \a type for the axis rect \a parent. - + Usually it isn't necessary to instantiate axes directly, because you can let QCustomPlot create them for you with \ref QCPAxisRect::addAxis. If you want to use own QCPAxis-subclasses however, create them manually and then inject them also via \ref QCPAxisRect::addAxis. @@ -7427,7 +7544,7 @@ QCPAxis::QCPAxis(QCPAxisRect *parent, AxisType type) : mGrid->setVisible(false); setAntialiased(false); setLayer(mParentPlot->currentLayer()); // it's actually on that layer already, but we want it in front of the grid, so we place it on there again - + if (type == atTop) { setTickLabelPadding(3); @@ -7535,12 +7652,12 @@ QCPLineEnding QCPAxis::upperEnding() const /*! Sets whether the axis uses a linear scale or a logarithmic scale. - + Note that this method controls the coordinate transformation. You will likely also want to use a logarithmic tick spacing and labeling, which can be achieved by setting an instance of \ref QCPAxisTickerLog via \ref setTicker. See the documentation of \ref QCPAxisTickerLog about the details of logarithmic axis tick creation. - + \ref setNumberPrecision */ void QCPAxis::setScaleType(QCPAxis::ScaleType type) @@ -7557,17 +7674,17 @@ void QCPAxis::setScaleType(QCPAxis::ScaleType type) /*! Sets the range of the axis. - + This slot may be connected with the \ref rangeChanged signal of another axis so this axis is always synchronized with the other axis range, when it changes. - + To invert the direction of an axis, use \ref setRangeReversed. */ void QCPAxis::setRange(const QCPRange &range) { if (range.lower == mRange.lower && range.upper == mRange.upper) return; - + if (!QCPRange::validRange(range)) return; QCPRange oldRange = mRange; if (mScaleType == stLogarithmic) @@ -7584,11 +7701,11 @@ void QCPAxis::setRange(const QCPRange &range) /*! Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface. (When \ref QCustomPlot::setInteractions contains iSelectAxes.) - + However, even when \a selectable is set to a value not allowing the selection of a specific part, it is still possible to set the selection of this part manually, by calling \ref setSelectedParts directly. - + \see SelectablePart, setSelectedParts */ void QCPAxis::setSelectableParts(const SelectableParts &selectable) @@ -7603,15 +7720,15 @@ void QCPAxis::setSelectableParts(const SelectableParts &selectable) /*! Sets the selected state of the respective axis parts described by \ref SelectablePart. When a part is selected, it uses a different pen/font. - + The entire selection mechanism for axes is handled automatically when \ref QCustomPlot::setInteractions contains iSelectAxes. You only need to call this function when you wish to change the selection state manually. - + This function can change the selection state of a part, independent of the \ref setSelectableParts setting. - + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. - + \see SelectablePart, setSelectableParts, selectTest, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen, setSelectedTickLabelFont, setSelectedLabelFont, setSelectedTickLabelColor, setSelectedLabelColor */ @@ -7626,18 +7743,18 @@ void QCPAxis::setSelectedParts(const SelectableParts &selected) /*! \overload - + Sets the lower and upper bound of the axis range. - + To invert the direction of an axis, use \ref setRangeReversed. - + There is also a slot to set a range, see \ref setRange(const QCPRange &range). */ void QCPAxis::setRange(double lower, double upper) { if (lower == mRange.lower && upper == mRange.upper) return; - + if (!QCPRange::validRange(lower, upper)) return; QCPRange oldRange = mRange; mRange.lower = lower; @@ -7655,9 +7772,9 @@ void QCPAxis::setRange(double lower, double upper) /*! \overload - + Sets the range of the axis. - + The \a position coordinate indicates together with the \a alignment parameter, where the new range will be positioned. \a size defines the size of the new axis range. \a alignment may be Qt::AlignLeft, Qt::AlignRight or Qt::AlignCenter. This will cause the left border, right border, @@ -7682,7 +7799,7 @@ void QCPAxis::setRangeLower(double lower) { if (mRange.lower == lower) return; - + QCPRange oldRange = mRange; mRange.lower = lower; if (mScaleType == stLogarithmic) @@ -7704,7 +7821,7 @@ void QCPAxis::setRangeUpper(double upper) { if (mRange.upper == upper) return; - + QCPRange oldRange = mRange; mRange.upper = upper; if (mScaleType == stLogarithmic) @@ -7735,14 +7852,14 @@ void QCPAxis::setRangeReversed(bool reversed) /*! The axis ticker is responsible for generating the tick positions and tick labels. See the documentation of QCPAxisTicker for details on how to work with axis tickers. - + You can change the tick positioning/labeling behaviour of this axis by setting a different QCPAxisTicker subclass using this method. If you only wish to modify the currently installed axis ticker, access it via \ref ticker. - + Since the ticker is stored in the axis as a shared pointer, multiple axes may share the same axis ticker simply by passing the same shared pointer to multiple axes. - + \see ticker */ void QCPAxis::setTicker(QSharedPointer ticker) @@ -7759,7 +7876,7 @@ void QCPAxis::setTicker(QSharedPointer ticker) Note that setting \a show to false does not imply that tick labels are invisible, too. To achieve that, see \ref setTickLabels. - + \see setSubTicks */ void QCPAxis::setTicks(bool show) @@ -7800,7 +7917,7 @@ void QCPAxis::setTickLabelPadding(int padding) /*! Sets the font of the tick labels. - + \see setTickLabels, setTickLabelColor */ void QCPAxis::setTickLabelFont(const QFont &font) @@ -7814,7 +7931,7 @@ void QCPAxis::setTickLabelFont(const QFont &font) /*! Sets the color of the tick labels. - + \see setTickLabels, setTickLabelFont */ void QCPAxis::setTickLabelColor(const QColor &color) @@ -7826,7 +7943,7 @@ void QCPAxis::setTickLabelColor(const QColor &color) Sets the rotation of the tick labels. If \a degrees is zero, the labels are drawn normally. Else, the tick labels are drawn rotated by \a degrees clockwise. The specified angle is bound to values from -90 to 90 degrees. - + If \a degrees is exactly -90, 0 or 90, the tick labels are centered on the tick coordinate. For other angles, the label is drawn with an offset such that it seems to point toward or away from the tick mark. @@ -7842,7 +7959,7 @@ void QCPAxis::setTickLabelRotation(double degrees) /*! Sets whether the tick labels (numbers) shall appear inside or outside the axis rect. - + The usual and default setting is \ref lsOutside. Very compact plots sometimes require tick labels to be inside the axis rect, to save space. If \a side is set to \ref lsInside, the tick labels appear on the inside are additionally clipped to the axis rect. @@ -7857,11 +7974,11 @@ void QCPAxis::setTickLabelSide(LabelSide side) Sets the number format for the numbers in tick labels. This \a formatCode is an extended version of the format code used e.g. by QString::number() and QLocale::toString(). For reference about that, see the "Argument Formats" section in the detailed description of the QString class. - + \a formatCode is a string of one, two or three characters. The first character is identical to the normal format code used by Qt. In short, this means: 'e'/'E' scientific format, 'f' fixed format, 'g'/'G' scientific or fixed, whichever is shorter. - + The second and third characters are optional and specific to QCustomPlot:\n If the first char was 'e' or 'g', numbers are/might be displayed in the scientific format, e.g. "5.5e9", which is ugly in a plot. So when the second char of \a formatCode is set to 'b' (for @@ -7870,7 +7987,7 @@ void QCPAxis::setTickLabelSide(LabelSide side) If instead a cross should be shown (as is usual in the USA), the third char of \a formatCode can be set to 'c'. The inserted multiplication signs are the UTF-8 characters 215 (0xD7) for the cross and 183 (0xB7) for the dot. - + Examples for \a formatCode: \li \c g normal format code behaviour. If number is small, fixed format is used, if number is large, normal scientific format is used @@ -7891,7 +8008,7 @@ void QCPAxis::setNumberFormat(const QString &formatCode) return; } mCachedMarginValid = false; - + // interpret first char as number format char: QString allowedFormatChars(QLatin1String("eEfgG")); if (allowedFormatChars.contains(formatCode.at(0))) @@ -7908,7 +8025,7 @@ void QCPAxis::setNumberFormat(const QString &formatCode) mAxisPainter->numberMultiplyCross = false; return; } - + // interpret second char as indicator for beautiful decimal powers: if (formatCode.at(1) == QLatin1Char('b') && (mNumberFormatChar == QLatin1Char('e') || mNumberFormatChar == QLatin1Char('g'))) { @@ -7923,7 +8040,7 @@ void QCPAxis::setNumberFormat(const QString &formatCode) mAxisPainter->numberMultiplyCross = false; return; } - + // interpret third char as indicator for dot or cross multiplication symbol: if (formatCode.at(2) == QLatin1Char('c')) { @@ -7957,7 +8074,7 @@ void QCPAxis::setNumberPrecision(int precision) plot and \a outside is the length they will reach outside the plot. If \a outside is greater than zero, the tick labels and axis label will increase their distance to the axis accordingly, so they won't collide with the ticks. - + \see setSubTickLength, setTickLengthIn, setTickLengthOut */ void QCPAxis::setTickLength(int inside, int outside) @@ -7969,7 +8086,7 @@ void QCPAxis::setTickLength(int inside, int outside) /*! Sets the length of the inward ticks in pixels. \a inside is the length the ticks will reach inside the plot. - + \see setTickLengthOut, setTickLength, setSubTickLength */ void QCPAxis::setTickLengthIn(int inside) @@ -7984,7 +8101,7 @@ void QCPAxis::setTickLengthIn(int inside) Sets the length of the outward ticks in pixels. \a outside is the length the ticks will reach outside the plot. If \a outside is greater than zero, the tick labels and axis label will increase their distance to the axis accordingly, so they won't collide with the ticks. - + \see setTickLengthIn, setTickLength, setSubTickLength */ void QCPAxis::setTickLengthOut(int outside) @@ -7998,9 +8115,9 @@ void QCPAxis::setTickLengthOut(int outside) /*! Sets whether sub tick marks are displayed. - + Sub ticks are only potentially visible if (major) ticks are also visible (see \ref setTicks) - + \see setTicks */ void QCPAxis::setSubTicks(bool show) @@ -8017,7 +8134,7 @@ void QCPAxis::setSubTicks(bool show) the plot and \a outside is the length they will reach outside the plot. If \a outside is greater than zero, the tick labels and axis label will increase their distance to the axis accordingly, so they won't collide with the ticks. - + \see setTickLength, setSubTickLengthIn, setSubTickLengthOut */ void QCPAxis::setSubTickLength(int inside, int outside) @@ -8029,7 +8146,7 @@ void QCPAxis::setSubTickLength(int inside, int outside) /*! Sets the length of the inward subticks in pixels. \a inside is the length the subticks will reach inside the plot. - + \see setSubTickLengthOut, setSubTickLength, setTickLength */ void QCPAxis::setSubTickLengthIn(int inside) @@ -8044,7 +8161,7 @@ void QCPAxis::setSubTickLengthIn(int inside) Sets the length of the outward subticks in pixels. \a outside is the length the subticks will reach outside the plot. If \a outside is greater than zero, the tick labels will increase their distance to the axis accordingly, so they won't collide with the ticks. - + \see setSubTickLengthIn, setSubTickLength, setTickLength */ void QCPAxis::setSubTickLengthOut(int outside) @@ -8058,7 +8175,7 @@ void QCPAxis::setSubTickLengthOut(int outside) /*! Sets the pen, the axis base line is drawn with. - + \see setTickPen, setSubTickPen */ void QCPAxis::setBasePen(const QPen &pen) @@ -8068,7 +8185,7 @@ void QCPAxis::setBasePen(const QPen &pen) /*! Sets the pen, tick marks will be drawn with. - + \see setTickLength, setBasePen */ void QCPAxis::setTickPen(const QPen &pen) @@ -8078,7 +8195,7 @@ void QCPAxis::setTickPen(const QPen &pen) /*! Sets the pen, subtick marks will be drawn with. - + \see setSubTickCount, setSubTickLength, setBasePen */ void QCPAxis::setSubTickPen(const QPen &pen) @@ -8088,7 +8205,7 @@ void QCPAxis::setSubTickPen(const QPen &pen) /*! Sets the font of the axis label. - + \see setLabelColor */ void QCPAxis::setLabelFont(const QFont &font) @@ -8102,7 +8219,7 @@ void QCPAxis::setLabelFont(const QFont &font) /*! Sets the color of the axis label. - + \see setLabelFont */ void QCPAxis::setLabelColor(const QColor &color) @@ -8125,7 +8242,7 @@ void QCPAxis::setLabel(const QString &str) /*! Sets the distance between the tick labels and the axis label. - + \see setTickLabelPadding, setPadding */ void QCPAxis::setLabelPadding(int padding) @@ -8142,9 +8259,9 @@ void QCPAxis::setLabelPadding(int padding) When \ref QCPAxisRect::setAutoMargins is enabled, the padding is the additional outer most space, that is left blank. - + The axis padding has no meaning if \ref QCPAxisRect::setAutoMargins is disabled. - + \see setLabelPadding, setTickLabelPadding */ void QCPAxis::setPadding(int padding) @@ -8158,7 +8275,7 @@ void QCPAxis::setPadding(int padding) /*! Sets the offset the axis has to its axis rect side. - + If an axis rect side has multiple axes and automatic margin calculation is enabled for that side, only the offset of the inner most axis has meaning (even if it is set to be invisible). The offset of the other, outer axes is controlled automatically, to place them at appropriate @@ -8171,7 +8288,7 @@ void QCPAxis::setOffset(int offset) /*! Sets the font that is used for tick labels when they are selected. - + \see setTickLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedTickLabelFont(const QFont &font) @@ -8185,7 +8302,7 @@ void QCPAxis::setSelectedTickLabelFont(const QFont &font) /*! Sets the font that is used for the axis label when it is selected. - + \see setLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedLabelFont(const QFont &font) @@ -8196,7 +8313,7 @@ void QCPAxis::setSelectedLabelFont(const QFont &font) /*! Sets the color that is used for tick labels when they are selected. - + \see setTickLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedTickLabelColor(const QColor &color) @@ -8209,7 +8326,7 @@ void QCPAxis::setSelectedTickLabelColor(const QColor &color) /*! Sets the color that is used for the axis label when it is selected. - + \see setLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedLabelColor(const QColor &color) @@ -8219,7 +8336,7 @@ void QCPAxis::setSelectedLabelColor(const QColor &color) /*! Sets the pen that is used to draw the axis base line when selected. - + \see setBasePen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedBasePen(const QPen &pen) @@ -8229,7 +8346,7 @@ void QCPAxis::setSelectedBasePen(const QPen &pen) /*! Sets the pen that is used to draw the (major) ticks when selected. - + \see setTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedTickPen(const QPen &pen) @@ -8239,7 +8356,7 @@ void QCPAxis::setSelectedTickPen(const QPen &pen) /*! Sets the pen that is used to draw the subticks when selected. - + \see setSubTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions */ void QCPAxis::setSelectedSubTickPen(const QPen &pen) @@ -8250,11 +8367,11 @@ void QCPAxis::setSelectedSubTickPen(const QPen &pen) /*! Sets the style for the lower axis ending. See the documentation of QCPLineEnding for available styles. - + For horizontal axes, this method refers to the left ending, for vertical axes the bottom ending. Note that this meaning does not change when the axis range is reversed with \ref setRangeReversed. - + \see setUpperEnding */ void QCPAxis::setLowerEnding(const QCPLineEnding &ending) @@ -8265,11 +8382,11 @@ void QCPAxis::setLowerEnding(const QCPLineEnding &ending) /*! Sets the style for the upper axis ending. See the documentation of QCPLineEnding for available styles. - + For horizontal axes, this method refers to the right ending, for vertical axes the top ending. Note that this meaning does not change when the axis range is reversed with \ref setRangeReversed. - + \see setLowerEnding */ void QCPAxis::setUpperEnding(const QCPLineEnding &ending) @@ -8280,7 +8397,7 @@ void QCPAxis::setUpperEnding(const QCPLineEnding &ending) /*! If the scale type (\ref setScaleType) is \ref stLinear, \a diff is added to the lower and upper bounds of the range. The range is simply moved by \a diff. - + If the scale type is \ref stLogarithmic, the range bounds are multiplied by \a diff. This corresponds to an apparent "linear" move in logarithmic scaling by a distance of log(diff). */ @@ -8365,17 +8482,17 @@ void QCPAxis::scaleRange(double factor, double center) void QCPAxis::setScaleRatio(const QCPAxis *otherAxis, double ratio) { int otherPixelSize, ownPixelSize; - + if (otherAxis->orientation() == Qt::Horizontal) otherPixelSize = otherAxis->axisRect()->width(); else otherPixelSize = otherAxis->axisRect()->height(); - + if (orientation() == Qt::Horizontal) ownPixelSize = axisRect()->width(); else ownPixelSize = axisRect()->height(); - + double newRangeSize = ratio*otherAxis->range().size()*ownPixelSize/(double)otherPixelSize; setRange(range().center(), newRangeSize, Qt::AlignCenter); } @@ -8383,7 +8500,7 @@ void QCPAxis::setScaleRatio(const QCPAxis *otherAxis, double ratio) /*! Changes the axis range such that all plottables associated with this axis are fully visible in that dimension. - + \see QCPAbstractPlottable::rescaleAxes, QCustomPlot::rescaleAxes */ void QCPAxis::rescale(bool onlyVisiblePlottables) @@ -8485,9 +8602,9 @@ double QCPAxis::coordToPixel(double value) const return (mRange.upper-value)/mRange.size()*mAxisRect->width()+mAxisRect->left(); } else // mScaleType == stLogarithmic { - if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range + if (value >= 0.0 && mRange.upper < 0.0) // invalid value for logarithmic scale, just draw it outside visible range return !mRangeReversed ? mAxisRect->right()+200 : mAxisRect->left()-200; - else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range + else if (value <= 0.0 && mRange.upper >= 0.0) // invalid value for logarithmic scale, just draw it outside visible range return !mRangeReversed ? mAxisRect->left()-200 : mAxisRect->right()+200; else { @@ -8507,9 +8624,9 @@ double QCPAxis::coordToPixel(double value) const return mAxisRect->bottom()-(mRange.upper-value)/mRange.size()*mAxisRect->height(); } else // mScaleType == stLogarithmic { - if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range + if (value >= 0.0 && mRange.upper < 0.0) // invalid value for logarithmic scale, just draw it outside visible range return !mRangeReversed ? mAxisRect->top()-200 : mAxisRect->bottom()+200; - else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range + else if (value <= 0.0 && mRange.upper >= 0.0) // invalid value for logarithmic scale, just draw it outside visible range return !mRangeReversed ? mAxisRect->bottom()+200 : mAxisRect->top()-200; else { @@ -8526,16 +8643,16 @@ double QCPAxis::coordToPixel(double value) const Returns the part of the axis that is hit by \a pos (in pixels). The return value of this function is independent of the user-selectable parts defined with \ref setSelectableParts. Further, this function does not change the current selection state of the axis. - + If the axis is not visible (\ref setVisible), this function always returns \ref spNone. - + \see setSelectedParts, setSelectableParts, QCustomPlot::setInteractions */ QCPAxis::SelectablePart QCPAxis::getPartAt(const QPointF &pos) const { if (!mVisible) return spNone; - + if (mAxisPainter->axisSelectionBox().contains(pos.toPoint())) return spAxis; else if (mAxisPainter->tickLabelsSelectionBox().contains(pos.toPoint())) @@ -8553,7 +8670,7 @@ double QCPAxis::selectTest(const QPointF &pos, bool onlySelectable, QVariant *de SelectablePart part = getPartAt(pos); if ((onlySelectable && !mSelectableParts.testFlag(part)) || part == spNone) return -1; - + if (details) details->setValue(part); return mParentPlot->selectionTolerance()*0.99; @@ -8561,16 +8678,16 @@ double QCPAxis::selectTest(const QPointF &pos, bool onlySelectable, QVariant *de /*! Returns a list of all the plottables that have this axis as key or value axis. - + If you are only interested in plottables of type QCPGraph, see \ref graphs. - + \see graphs, items */ QList QCPAxis::plottables() const { QList result; if (!mParentPlot) return result; - + for (int i=0; imPlottables.size(); ++i) { if (mParentPlot->mPlottables.at(i)->keyAxis() == this ||mParentPlot->mPlottables.at(i)->valueAxis() == this) @@ -8581,14 +8698,14 @@ QList QCPAxis::plottables() const /*! Returns a list of all the graphs that have this axis as key or value axis. - + \see plottables, items */ QList QCPAxis::graphs() const { QList result; if (!mParentPlot) return result; - + for (int i=0; imGraphs.size(); ++i) { if (mParentPlot->mGraphs.at(i)->keyAxis() == this || mParentPlot->mGraphs.at(i)->valueAxis() == this) @@ -8600,14 +8717,14 @@ QList QCPAxis::graphs() const /*! Returns a list of all the items that are associated with this axis. An item is considered associated with an axis if at least one of its positions uses the axis as key or value axis. - + \see plottables, graphs */ QList QCPAxis::items() const { QList result; if (!mParentPlot) return result; - + for (int itemId=0; itemIdmItems.size(); ++itemId) { QList positions = mParentPlot->mItems.at(itemId)->positions(); @@ -8679,19 +8796,150 @@ void QCPAxis::deselectEvent(bool *selectionStateChanged) *selectionStateChanged = mSelectedParts != selBefore; } +/*! \internal + + This mouse event reimplementation provides the functionality to let the user drag individual axes + exclusively, by startig the drag on top of the axis. + + For the axis to accept this event and perform the single axis drag, the parent \ref QCPAxisRect + must be configured accordingly, i.e. it must allow range dragging in the orientation of this axis + (\ref QCPAxisRect::setRangeDrag) and this axis must be a draggable axis (\ref + QCPAxisRect::setRangeDragAxes) + + \seebaseclassmethod + + \note The dragging of possibly multiple axes at once by starting the drag anywhere in the axis + rect is handled by the axis rect's mouse event, e.g. \ref QCPAxisRect::mousePressEvent. +*/ +void QCPAxis::mousePressEvent(QMouseEvent *event, const QVariant &details) +{ + Q_UNUSED(details) + if (!mParentPlot->interactions().testFlag(QCP::iRangeDrag) || + !mAxisRect->rangeDrag().testFlag(orientation()) || + !mAxisRect->rangeDragAxes(orientation()).contains(this)) + { + event->ignore(); + return; + } + + if (event->buttons() & Qt::LeftButton) + { + mDragging = true; + // initialize antialiasing backup in case we start dragging: + if (mParentPlot->noAntialiasingOnDrag()) + { + mAADragBackup = mParentPlot->antialiasedElements(); + mNotAADragBackup = mParentPlot->notAntialiasedElements(); + } + // Mouse range dragging interaction: + if (mParentPlot->interactions().testFlag(QCP::iRangeDrag)) + mDragStartRange = mRange; + } +} + +/*! \internal + + This mouse event reimplementation provides the functionality to let the user drag individual axes + exclusively, by startig the drag on top of the axis. + + \seebaseclassmethod + + \note The dragging of possibly multiple axes at once by starting the drag anywhere in the axis + rect is handled by the axis rect's mouse event, e.g. \ref QCPAxisRect::mousePressEvent. + + \see QCPAxis::mousePressEvent +*/ +void QCPAxis::mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) +{ + if (mDragging) + { + const double startPixel = orientation() == Qt::Horizontal ? startPos.x() : startPos.y(); + const double currentPixel = orientation() == Qt::Horizontal ? event->pos().x() : event->pos().y(); + if (mScaleType == QCPAxis::stLinear) + { + const double diff = pixelToCoord(startPixel) - pixelToCoord(currentPixel); + setRange(mDragStartRange.lower+diff, mDragStartRange.upper+diff); + } else if (mScaleType == QCPAxis::stLogarithmic) + { + const double diff = pixelToCoord(startPixel) / pixelToCoord(currentPixel); + setRange(mDragStartRange.lower*diff, mDragStartRange.upper*diff); + } + + if (mParentPlot->noAntialiasingOnDrag()) + mParentPlot->setNotAntialiasedElements(QCP::aeAll); + mParentPlot->replot(QCustomPlot::rpQueuedReplot); + } +} + +/*! \internal + + This mouse event reimplementation provides the functionality to let the user drag individual axes + exclusively, by startig the drag on top of the axis. + + \seebaseclassmethod + + \note The dragging of possibly multiple axes at once by starting the drag anywhere in the axis + rect is handled by the axis rect's mouse event, e.g. \ref QCPAxisRect::mousePressEvent. + + \see QCPAxis::mousePressEvent +*/ +void QCPAxis::mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) +{ + Q_UNUSED(event) + Q_UNUSED(startPos) + mDragging = false; + if (mParentPlot->noAntialiasingOnDrag()) + { + mParentPlot->setAntialiasedElements(mAADragBackup); + mParentPlot->setNotAntialiasedElements(mNotAADragBackup); + } +} + +/*! \internal + + This mouse event reimplementation provides the functionality to let the user zoom individual axes + exclusively, by performing the wheel event on top of the axis. + + For the axis to accept this event and perform the single axis zoom, the parent \ref QCPAxisRect + must be configured accordingly, i.e. it must allow range zooming in the orientation of this axis + (\ref QCPAxisRect::setRangeZoom) and this axis must be a zoomable axis (\ref + QCPAxisRect::setRangeZoomAxes) + + \seebaseclassmethod + + \note The zooming of possibly multiple axes at once by performing the wheel event anywhere in the + axis rect is handled by the axis rect's mouse event, e.g. \ref QCPAxisRect::wheelEvent. +*/ +void QCPAxis::wheelEvent(QWheelEvent *event) +{ + // Mouse range zooming interaction: + if (!mParentPlot->interactions().testFlag(QCP::iRangeZoom) || + !mAxisRect->rangeZoom().testFlag(orientation()) || + !mAxisRect->rangeZoomAxes(orientation()).contains(this)) + { + event->ignore(); + return; + } + + const double wheelSteps = event->delta()/120.0; // a single step delta is +/-120 usually + const double factor = qPow(mAxisRect->rangeZoomFactor(orientation()), wheelSteps); + scaleRange(factor, pixelToCoord(orientation() == Qt::Horizontal ? event->pos().x() : event->pos().y())); + mParentPlot->replot(); +} + /*! \internal A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter before drawing axis lines. This is the antialiasing state the painter passed to the \ref draw method is in by default. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \seebaseclassmethod - + \see setAntialiased */ void QCPAxis::applyDefaultAntialiasingHint(QCPPainter *painter) const @@ -8700,7 +8948,7 @@ void QCPAxis::applyDefaultAntialiasingHint(QCPPainter *painter) const } /*! \internal - + Draws the axis with the specified \a painter, using the internal QCPAxisPainterPrivate instance. \seebaseclassmethod @@ -8713,7 +8961,7 @@ void QCPAxis::draw(QCPPainter *painter) tickPositions.reserve(mTickVector.size()); tickLabels.reserve(mTickVector.size()); subTickPositions.reserve(mSubTickVector.size()); - + if (mTicks) { for (int i=0; itype = mAxisType; @@ -8754,10 +9002,10 @@ void QCPAxis::draw(QCPPainter *painter) } /*! \internal - + Prepares the internal tick vector, sub tick vector and tick label vector. This is done by calling QCPAxisTicker::generate on the currently installed ticker. - + If a change in the label text/count is detected, the cached axis margin is invalidated to make sure the next margin calculation recalculates the label sizes and returns an up-to-date value. */ @@ -8765,14 +9013,14 @@ void QCPAxis::setupTickVectors() { if (!mParentPlot) return; if ((!mTicks && !mTickLabels && !mGrid->visible()) || mRange.size() <= 0) return; - + QVector oldLabels = mTickVectorLabels; mTicker->generate(mRange, mParentPlot->locale(), mNumberFormatChar, mNumberPrecision, mTickVector, mSubTicks ? &mSubTickVector : 0, mTickLabels ? &mTickVectorLabels : 0); mCachedMarginValid &= mTickVectorLabels == oldLabels; // if labels have changed, margin might have changed, too } /*! \internal - + Returns the pen that is used to draw the axis base line. Depending on the selection state, this is either mSelectedBasePen or mBasePen. */ @@ -8782,7 +9030,7 @@ QPen QCPAxis::getBasePen() const } /*! \internal - + Returns the pen that is used to draw the (major) ticks. Depending on the selection state, this is either mSelectedTickPen or mTickPen. */ @@ -8792,7 +9040,7 @@ QPen QCPAxis::getTickPen() const } /*! \internal - + Returns the pen that is used to draw the subticks. Depending on the selection state, this is either mSelectedSubTickPen or mSubTickPen. */ @@ -8802,7 +9050,7 @@ QPen QCPAxis::getSubTickPen() const } /*! \internal - + Returns the font that is used to draw the tick labels. Depending on the selection state, this is either mSelectedTickLabelFont or mTickLabelFont. */ @@ -8812,7 +9060,7 @@ QFont QCPAxis::getTickLabelFont() const } /*! \internal - + Returns the font that is used to draw the axis label. Depending on the selection state, this is either mSelectedLabelFont or mLabelFont. */ @@ -8822,7 +9070,7 @@ QFont QCPAxis::getLabelFont() const } /*! \internal - + Returns the color that is used to draw the tick labels. Depending on the selection state, this is either mSelectedTickLabelColor or mTickLabelColor. */ @@ -8832,7 +9080,7 @@ QColor QCPAxis::getTickLabelColor() const } /*! \internal - + Returns the color that is used to draw the axis label. Depending on the selection state, this is either mSelectedLabelColor or mLabelColor. */ @@ -8842,16 +9090,16 @@ QColor QCPAxis::getLabelColor() const } /*! \internal - + Returns the appropriate outward margin for this axis. It is needed if \ref QCPAxisRect::setAutoMargins is set to true on the parent axis rect. An axis with axis type \ref atLeft will return an appropriate left margin, \ref atBottom will return an appropriate bottom margin and so forth. For the calculation, this function goes through similar steps as \ref draw, so changing one function likely requires the modification of the other one as well. - + The margin consists of the outward tick length, tick label padding, tick label size, label padding, label size, and padding. - + The margin is cached internally, so repeated calls while leaving the axis range, fonts, etc. unchanged are very fast. */ @@ -8859,18 +9107,18 @@ int QCPAxis::calculateMargin() { if (!mVisible) // if not visible, directly return 0, don't cache 0 because we can't react to setVisible in QCPAxis return 0; - + if (mCachedMarginValid) return mCachedMargin; - + // run through similar steps as QCPAxis::draw, and calculate margin needed to fit axis and its labels int margin = 0; - + QVector tickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter QVector tickLabels; // the final vector passed to QCPAxisPainter tickPositions.reserve(mTickVector.size()); tickLabels.reserve(mTickVector.size()); - + if (mTicks) { for (int i=0; idrawLine(baseLine); - + // draw ticks: if (!tickPositions.isEmpty()) { @@ -9013,7 +9261,7 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) painter->drawLine(QLineF(origin.x()-tickLengthOut*tickDir+xCor, tickPositions.at(i)+yCor, origin.x()+tickLengthIn*tickDir+xCor, tickPositions.at(i)+yCor)); } } - + // draw subticks: if (!subTickPositions.isEmpty()) { @@ -9031,7 +9279,7 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) } } margin += qMax(0, qMax(tickLengthOut, subTickLengthOut)); - + // draw axis base endings: bool antialiasingBackup = painter->antialiasing(); painter->setAntialiasing(true); // always want endings to be antialiased, even if base and ticks themselves aren't @@ -9042,7 +9290,7 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) if (upperEnding.style() != QCPLineEnding::esNone) upperEnding.draw(painter, QCPVector2D(baseLine.p2())+baseLineVector.normalized()*upperEnding.realLength()*(upperEnding.inverted()?-1:1), baseLineVector); painter->setAntialiasing(antialiasingBackup); - + // tick labels: QRect oldClipRect; if (tickLabelSide == QCPAxis::lsInside) // if using inside labels, clip them to the axis rect @@ -9068,7 +9316,7 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) } if (tickLabelSide == QCPAxis::lsInside) painter->setClipRect(oldClipRect); - + // axis label: QRect labelBounds; if (!label.isEmpty()) @@ -9098,7 +9346,7 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) else if (type == QCPAxis::atBottom) painter->drawText(origin.x(), origin.y()+margin, axisRect.width(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label); } - + // set selection boxes: int selectionTolerance = 0; if (mParentPlot) @@ -9150,18 +9398,18 @@ void QCPAxisPainterPrivate::draw(QCPPainter *painter) } /*! \internal - + Returns the size ("margin" in QCPAxisRect context, so measured perpendicular to the axis backbone direction) needed to fit the axis. */ int QCPAxisPainterPrivate::size() const { int result = 0; - + // get length of tick marks pointing outwards: if (!tickPositions.isEmpty()) result += qMax(0, qMax(tickLengthOut, subTickLengthOut)); - + // calculate size of tick labels: if (tickLabelSide == QCPAxis::lsOutside) { @@ -9174,7 +9422,7 @@ int QCPAxisPainterPrivate::size() const result += tickLabelPadding; } } - + // calculate size of axis label (only height needed, because left/right labels are rotated by 90 degrees): if (!label.isEmpty()) { @@ -9183,12 +9431,12 @@ int QCPAxisPainterPrivate::size() const bounds = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip | Qt::AlignHCenter | Qt::AlignVCenter, label); result += bounds.height() + labelPadding; } - + return result; } /*! \internal - + Clears the internal label cache. Upon the next \ref draw, all labels will be created new. This method is called automatically in \ref draw, if any parameters have changed that invalidate the cached labels, such as font, color, etc. @@ -9199,7 +9447,7 @@ void QCPAxisPainterPrivate::clearCache() } /*! \internal - + Returns a hash that allows uniquely identifying whether the label parameters have changed such that the cached labels must be refreshed (\ref clearCache). It is used in \ref draw. If the return value of this method hasn't changed since the last redraw, the respective label parameters @@ -9219,20 +9467,20 @@ QByteArray QCPAxisPainterPrivate::generateLabelParameterHash() const } /*! \internal - + Draws a single tick label with the provided \a painter, utilizing the internal label cache to significantly speed up drawing of labels that were drawn in previous calls. The tick label is always bound to an axis, the distance to the axis is controllable via \a distanceToAxis in pixels. The pixel position in the axis direction is passed in the \a position parameter. Hence for the bottom axis, \a position would indicate the horizontal pixel position (not coordinate), at which the label should be drawn. - + In order to later draw the axis label in a place that doesn't overlap with the tick labels, the largest tick label size is needed. This is acquired by passing a \a tickLabelsSize to the \ref drawTickLabel calls during the process of drawing all tick labels of one axis. In every call, \a tickLabelsSize is expanded, if the drawn label exceeds the value \a tickLabelsSize currently holds. - + The label is drawn with the font and pen that are currently set on the \a painter. To draw superscripted powers, the font is temporarily made smaller by a fixed factor (see \ref getTickLabelData). @@ -9309,7 +9557,7 @@ void QCPAxisPainterPrivate::placeTickLabel(QCPPainter *painter, double position, finalSize = labelData.rotatedTotalBounds.size(); } } - + // expand passed tickLabelsSize if current tick label is larger: if (finalSize.width() > tickLabelsSize->width()) tickLabelsSize->setWidth(finalSize.width()); @@ -9318,9 +9566,9 @@ void QCPAxisPainterPrivate::placeTickLabel(QCPPainter *painter, double position, } /*! \internal - + This is a \ref placeTickLabel helper function. - + Draws the tick label specified in \a labelData with \a painter at the pixel positions \a x and \a y. This function is used by \ref placeTickLabel to create new tick labels for the cache, or to directly draw the labels on the QCustomPlot surface when label caching is disabled, i.e. when @@ -9331,12 +9579,12 @@ void QCPAxisPainterPrivate::drawTickLabel(QCPPainter *painter, double x, double // backup painter settings that we're about to change: QTransform oldTransform = painter->transform(); QFont oldFont = painter->font(); - + // transform painter to position/rotation: painter->translate(x, y); if (!qFuzzyIsNull(tickLabelRotation)) painter->rotate(tickLabelRotation); - + // draw text: if (!labelData.expPart.isEmpty()) // indicator that beautiful powers must be used { @@ -9351,16 +9599,16 @@ void QCPAxisPainterPrivate::drawTickLabel(QCPPainter *painter, double x, double painter->setFont(labelData.baseFont); painter->drawText(0, 0, labelData.totalBounds.width(), labelData.totalBounds.height(), Qt::TextDontClip | Qt::AlignHCenter, labelData.basePart); } - + // reset painter settings to what it was before: painter->setTransform(oldTransform); painter->setFont(oldFont); } /*! \internal - + This is a \ref placeTickLabel helper function. - + Transforms the passed \a text and \a font to a tickLabelData structure that can then be further processed by \ref getTickLabelDrawOffset and \ref drawTickLabel. It splits the text into base and exponent if necessary (member substituteExponent) and calculates appropriate bounding boxes. @@ -9368,7 +9616,7 @@ void QCPAxisPainterPrivate::drawTickLabel(QCPPainter *painter, double x, double QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(const QFont &font, const QString &text) const { TickLabelData result; - + // determine whether beautiful decimal powers should be used bool useBeautifulPowers = false; int ePos = -1; // first index of exponent part, text before that will be basePart, text until eLast will be expPart @@ -9385,7 +9633,7 @@ QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(con useBeautifulPowers = true; } } - + // calculate text bounding rects and do string preparation for beautiful decimal powers: result.baseFont = font; if (result.baseFont.pointSizeF() > 0) // might return -1 if specified with setPixelSize, in that case we can't do correction in next line @@ -9424,7 +9672,7 @@ QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(con result.totalBounds = QFontMetrics(result.baseFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip | Qt::AlignHCenter, result.basePart); } result.totalBounds.moveTopLeft(QPoint(0, 0)); // want bounding box aligned top left at origin, independent of how it was created, to make further processing simpler - + // calculate possibly different bounding rect after rotation: result.rotatedTotalBounds = result.totalBounds; if (!qFuzzyIsNull(tickLabelRotation)) @@ -9433,17 +9681,17 @@ QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(con transform.rotate(tickLabelRotation); result.rotatedTotalBounds = transform.mapRect(result.rotatedTotalBounds); } - + return result; } /*! \internal - + This is a \ref placeTickLabel helper function. - + Calculates the offset at which the top left corner of the specified tick label shall be drawn. The offset is relative to a point right next to the tick the label belongs to. - + This function is thus responsible for e.g. centering tick labels under ticks and positioning them appropriately when they are rotated. */ @@ -9536,12 +9784,12 @@ QPointF QCPAxisPainterPrivate::getTickLabelDrawOffset(const TickLabelData &label y = 0; } } - + return QPointF(x, y); } /*! \internal - + Simulates the steps done by \ref placeTickLabel by calculating bounding boxes of the text label to be drawn, depending on number format etc. Since only the largest tick label is wanted for the margin calculation, the passed \a tickLabelsSize is only expanded, if it's currently set to a @@ -9560,7 +9808,7 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString TickLabelData labelData = getTickLabelData(font, text); finalSize = labelData.rotatedTotalBounds.size(); } - + // expand passed tickLabelsSize if current tick label is larger: if (finalSize.width() > tickLabelsSize->width()) tickLabelsSize->setWidth(finalSize.width()); @@ -9570,8 +9818,8 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString /* end of 'src/axis/axis.cpp' */ -/* including file 'src/scatterstyle.cpp', size 17420 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/scatterstyle.cpp', size 17450 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPScatterStyle @@ -9579,33 +9827,33 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString /*! \class QCPScatterStyle \brief Represents the visual appearance of scatter points - + This class holds information about shape, color and size of scatter points. In plottables like QCPGraph it is used to store how scatter points shall be drawn. For example, \ref QCPGraph::setScatterStyle takes a QCPScatterStyle instance. - + A scatter style consists of a shape (\ref setShape), a line color (\ref setPen) and possibly a fill (\ref setBrush), if the shape provides a fillable area. Further, the size of the shape can be controlled with \ref setSize. \section QCPScatterStyle-defining Specifying a scatter style - + You can set all these configurations either by calling the respective functions on an instance: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-1 - + Or you can use one of the various constructors that take different parameter combinations, making it easy to specify a scatter style in a single call, like so: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-2 - + \section QCPScatterStyle-undefinedpen Leaving the color/pen up to the plottable - + There are two constructors which leave the pen undefined: \ref QCPScatterStyle() and \ref QCPScatterStyle(ScatterShape shape, double size). If those constructors are used, a call to \ref isPenDefined will return false. It leads to scatter points that inherit the pen from the plottable that uses the scatter style. Thus, if such a scatter style is passed to QCPGraph, the line color of the graph (\ref QCPGraph::setPen) will be used by the scatter points. This makes it very convenient to set up typical scatter settings: - + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-shortcreation Notice that it wasn't even necessary to explicitly call a QCPScatterStyle constructor. This works @@ -9613,15 +9861,15 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString into a QCPScatterStyle instance (that's the \ref QCPScatterStyle(ScatterShape shape, double size) constructor with a default for \a size). In those cases, C++ allows directly supplying a \ref ScatterShape, where actually a QCPScatterStyle is expected. - + \section QCPScatterStyle-custompath-and-pixmap Custom shapes and pixmaps - + QCPScatterStyle supports drawing custom shapes and arbitrary pixmaps as scatter points. For custom shapes, you can provide a QPainterPath with the desired shape to the \ref setCustomPath function or call the constructor that takes a painter path. The scatter shape will automatically be set to \ref ssCustom. - + For pixmaps, you call \ref setPixmap with the desired QPixmap. Alternatively you can use the constructor that takes a QPixmap. The scatter shape will automatically be set to \ref ssPixmap. Note that \ref setSize does not influence the appearance of the pixmap. @@ -9630,23 +9878,23 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString /* start documentation of inline functions */ /*! \fn bool QCPScatterStyle::isNone() const - + Returns whether the scatter shape is \ref ssNone. - + \see setShape */ /*! \fn bool QCPScatterStyle::isPenDefined() const - + Returns whether a pen has been defined for this scatter style. - + The pen is undefined if a constructor is called that does not carry \a pen as parameter. Those are \ref QCPScatterStyle() and \ref QCPScatterStyle(ScatterShape shape, double size). If the pen is undefined, the pen of the respective plottable will be used for drawing scatters. - + If a pen was defined for this scatter style instance, and you now wish to undefine the pen, call \ref undefinePen. - + \see setPen */ @@ -9654,7 +9902,7 @@ void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString /*! Creates a new QCPScatterStyle instance with size set to 6. No shape, pen or brush is defined. - + Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited from the plottable that uses this scatter style. */ @@ -9670,7 +9918,7 @@ QCPScatterStyle::QCPScatterStyle() : /*! Creates a new QCPScatterStyle instance with shape set to \a shape and size to \a size. No pen or brush is defined. - + Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited from the plottable that uses this scatter style. */ @@ -9712,7 +9960,7 @@ QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QColor &color, const /*! Creates a new QCPScatterStyle instance with shape set to \a shape, the pen set to \a pen, the brush to \a brush, and size to \a size. - + \warning In some cases it might be tempting to directly use a pen style like Qt::NoPen as \a pen and a color like Qt::blue as \a brush. Notice however, that the corresponding call\n QCPScatterStyle(QCPScatterShape::ssCircle, Qt::NoPen, Qt::blue, 5)\n @@ -9750,11 +9998,11 @@ QCPScatterStyle::QCPScatterStyle(const QPixmap &pixmap) : /*! Creates a new QCPScatterStyle instance with a custom shape that is defined via \a customPath. The scatter shape is set to \ref ssCustom. - + The custom shape line will be drawn with \a pen and filled with \a brush. The size has a slightly different meaning than for built-in scatter points: The custom path will be drawn scaled by a - factor of \a size/6.0. Since the default \a size is 6, the custom path will appear at a its - natural size by default. To double the size of the path for example, set \a size to 12. + factor of \a size/6.0. Since the default \a size is 6, the custom path will appear in its + original size by default. To for example double the size of the path, set \a size to 12. */ QCPScatterStyle::QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush, double size) : mSize(size), @@ -9793,7 +10041,7 @@ void QCPScatterStyle::setFromOther(const QCPScatterStyle &other, ScatterProperti /*! Sets the size (pixel diameter) of the drawn scatter points to \a size. - + \see setShape */ void QCPScatterStyle::setSize(double size) @@ -9803,10 +10051,10 @@ void QCPScatterStyle::setSize(double size) /*! Sets the shape to \a shape. - + Note that the calls \ref setPixmap and \ref setCustomPath automatically set the shape to \ref ssPixmap and \ref ssCustom, respectively. - + \see setSize */ void QCPScatterStyle::setShape(QCPScatterStyle::ScatterShape shape) @@ -9816,11 +10064,11 @@ void QCPScatterStyle::setShape(QCPScatterStyle::ScatterShape shape) /*! Sets the pen that will be used to draw scatter points to \a pen. - + If the pen was previously undefined (see \ref isPenDefined), the pen is considered defined after a call to this function, even if \a pen is Qt::NoPen. If you have defined a pen previously by calling this function and now wish to undefine the pen, call \ref undefinePen. - + \see setBrush */ void QCPScatterStyle::setPen(const QPen &pen) @@ -9832,7 +10080,7 @@ void QCPScatterStyle::setPen(const QPen &pen) /*! Sets the brush that will be used to fill scatter points to \a brush. Note that not all scatter shapes have fillable areas. For example, \ref ssPlus does not while \ref ssCircle does. - + \see setPen */ void QCPScatterStyle::setBrush(const QBrush &brush) @@ -9842,9 +10090,9 @@ void QCPScatterStyle::setBrush(const QBrush &brush) /*! Sets the pixmap that will be drawn as scatter point to \a pixmap. - + Note that \ref setSize does not influence the appearance of the pixmap. - + The scatter shape is automatically set to \ref ssPixmap. */ void QCPScatterStyle::setPixmap(const QPixmap &pixmap) @@ -9855,7 +10103,7 @@ void QCPScatterStyle::setPixmap(const QPixmap &pixmap) /*! Sets the custom shape that will be drawn as scatter point to \a customPath. - + The scatter shape is automatically set to \ref ssCustom. */ void QCPScatterStyle::setCustomPath(const QPainterPath &customPath) @@ -9878,10 +10126,10 @@ void QCPScatterStyle::undefinePen() /*! Applies the pen and the brush of this scatter style to \a painter. If this scatter style has an undefined pen (\ref isPenDefined), sets the pen of \a painter to \a defaultPen instead. - + This function is used by plottables (or any class that wants to draw scatters) just before a number of scatters with this style shall be drawn with the \a painter. - + \see drawShape */ void QCPScatterStyle::applyTo(QCPPainter *painter, const QPen &defaultPen) const @@ -9892,10 +10140,10 @@ void QCPScatterStyle::applyTo(QCPPainter *painter, const QPen &defaultPen) const /*! Draws the scatter shape with \a painter at position \a pos. - + This function does not modify the pen or the brush on the painter, as \ref applyTo is meant to be called before scatter points are drawn with \ref drawShape. - + \see applyTo */ void QCPScatterStyle::drawShape(QCPPainter *painter, const QPointF &pos) const @@ -9949,10 +10197,11 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const } case ssDiamond: { - painter->drawLine(QLineF(x-w, y, x, y-w)); - painter->drawLine(QLineF( x, y-w, x+w, y)); - painter->drawLine(QLineF(x+w, y, x, y+w)); - painter->drawLine(QLineF( x, y+w, x-w, y)); + QPointF lineArray[4] = {QPointF(x-w, y), + QPointF( x, y-w), + QPointF(x+w, y), + QPointF( x, y+w)}; + painter->drawPolygon(lineArray, 4); break; } case ssStar: @@ -9965,52 +10214,54 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const } case ssTriangle: { - painter->drawLine(QLineF(x-w, y+0.755*w, x+w, y+0.755*w)); - painter->drawLine(QLineF(x+w, y+0.755*w, x, y-0.977*w)); - painter->drawLine(QLineF( x, y-0.977*w, x-w, y+0.755*w)); + QPointF lineArray[3] = {QPointF(x-w, y+0.755*w), + QPointF(x+w, y+0.755*w), + QPointF( x, y-0.977*w)}; + painter->drawPolygon(lineArray, 3); break; } case ssTriangleInverted: { - painter->drawLine(QLineF(x-w, y-0.755*w, x+w, y-0.755*w)); - painter->drawLine(QLineF(x+w, y-0.755*w, x, y+0.977*w)); - painter->drawLine(QLineF( x, y+0.977*w, x-w, y-0.755*w)); + QPointF lineArray[3] = {QPointF(x-w, y-0.755*w), + QPointF(x+w, y-0.755*w), + QPointF( x, y+0.977*w)}; + painter->drawPolygon(lineArray, 3); break; } case ssCrossSquare: { - painter->drawLine(QLineF(x-w, y-w, x+w*0.95, y+w*0.95)); - painter->drawLine(QLineF(x-w, y+w*0.95, x+w*0.95, y-w)); - painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + painter->drawLine(QLineF(x-w, y-w, x+w*0.95, y+w*0.95)); + painter->drawLine(QLineF(x-w, y+w*0.95, x+w*0.95, y-w)); break; } case ssPlusSquare: { - painter->drawLine(QLineF(x-w, y, x+w*0.95, y)); - painter->drawLine(QLineF( x, y+w, x, y-w)); - painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + painter->drawLine(QLineF(x-w, y, x+w*0.95, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); break; } case ssCrossCircle: { - painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.670, y+w*0.670)); - painter->drawLine(QLineF(x-w*0.707, y+w*0.670, x+w*0.670, y-w*0.707)); - painter->drawEllipse(QPointF(x, y), w, w); + painter->drawEllipse(QPointF(x, y), w, w); + painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.670, y+w*0.670)); + painter->drawLine(QLineF(x-w*0.707, y+w*0.670, x+w*0.670, y-w*0.707)); break; } case ssPlusCircle: { - painter->drawLine(QLineF(x-w, y, x+w, y)); - painter->drawLine(QLineF( x, y+w, x, y-w)); - painter->drawEllipse(QPointF(x, y), w, w); + painter->drawEllipse(QPointF(x, y), w, w); + painter->drawLine(QLineF(x-w, y, x+w, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); break; } case ssPeace: { - painter->drawLine(QLineF(x, y-w, x, y+w)); - painter->drawLine(QLineF(x, y, x-w*0.707, y+w*0.707)); - painter->drawLine(QLineF(x, y, x+w*0.707, y+w*0.707)); - painter->drawEllipse(QPointF(x, y), w, w); + painter->drawEllipse(QPointF(x, y), w, w); + painter->drawLine(QLineF(x, y-w, x, y+w)); + painter->drawLine(QLineF(x, y, x-w*0.707, y+w*0.707)); + painter->drawLine(QLineF(x, y, x+w*0.707, y+w*0.707)); break; } case ssPixmap: @@ -10041,8 +10292,8 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const //amalgamation: add datacontainer.cpp -/* including file 'src/plottable.cpp', size 38861 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottable.cpp', size 38845 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionDecorator @@ -10050,24 +10301,24 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const /*! \class QCPSelectionDecorator \brief Controls how a plottable's data selection is drawn - + Each \ref QCPAbstractPlottable instance has one \ref QCPSelectionDecorator (accessible via \ref QCPAbstractPlottable::selectionDecorator) and uses it when drawing selected segments of its data. - + The selection decorator controls both pen (\ref setPen) and brush (\ref setBrush), as well as the scatter style (\ref setScatterStyle) if the plottable draws scatters. Since a \ref QCPScatterStyle is itself composed of different properties such as color shape and size, the decorator allows specifying exactly which of those properties shall be used for the selected data point, via \ref setUsedScatterProperties. - + A \ref QCPSelectionDecorator subclass instance can be passed to a plottable via \ref QCPAbstractPlottable::setSelectionDecorator, allowing greater customizability of the appearance of selected segments. - + Use \ref copyFrom to easily transfer the settings of one decorator to another one. This is especially useful since plottables take ownership of the passed selection decorator, and thus the same decorator instance can not be passed to multiple plottables. - + Selection decorators can also themselves perform drawing operations by reimplementing \ref drawDecoration, which is called by the plottable's draw method. The base class \ref QCPSelectionDecorator does not make use of this however. For example, \ref @@ -10080,8 +10331,8 @@ void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const QCPSelectionDecorator::QCPSelectionDecorator() : mPen(QColor(80, 80, 255), 2.5), mBrush(Qt::NoBrush), - mScatterStyle(QCPScatterStyle::ssNone, QPen(Qt::blue, 2), Qt::NoBrush, 6.0), - mUsedScatterProperties(QCPScatterStyle::spPen), + mScatterStyle(), + mUsedScatterProperties(QCPScatterStyle::spNone), mPlottable(0) { } @@ -10109,7 +10360,7 @@ void QCPSelectionDecorator::setBrush(const QBrush &brush) /*! Sets the scatter style that will be used by the parent plottable to draw scatters in selected data segments. - + \a usedProperties specifies which parts of the passed \a scatterStyle will be used by the plottable. The used properties can also be changed via \ref setUsedScatterProperties. */ @@ -10123,6 +10374,8 @@ void QCPSelectionDecorator::setScatterStyle(const QCPScatterStyle &scatterStyle, Use this method to define which properties of the scatter style (set via \ref setScatterStyle) will be used for selected data segments. All properties of the scatter style that are not specified in \a properties will remain as specified in the plottable's original scatter style. + + \see QCPScatterStyle::ScatterProperty */ void QCPSelectionDecorator::setUsedScatterProperties(const QCPScatterStyle::ScatterProperties &properties) { @@ -10131,7 +10384,7 @@ void QCPSelectionDecorator::setUsedScatterProperties(const QCPScatterStyle::Scat /*! Sets the pen of \a painter to the pen of this selection decorator. - + \see applyBrush, getFinalScatterStyle */ void QCPSelectionDecorator::applyPen(QCPPainter *painter) const @@ -10141,7 +10394,7 @@ void QCPSelectionDecorator::applyPen(QCPPainter *painter) const /*! Sets the brush of \a painter to the brush of this selection decorator. - + \see applyPen, getFinalScatterStyle */ void QCPSelectionDecorator::applyBrush(QCPPainter *painter) const @@ -10154,20 +10407,20 @@ void QCPSelectionDecorator::applyBrush(QCPPainter *painter) const plottable's original (unselected) scatter style must be passed as \a unselectedStyle. Depending on the setting of \ref setUsedScatterProperties, the returned scatter style is a mixture of this selecion decorator's scatter style (\ref setScatterStyle), and \a unselectedStyle. - + \see applyPen, applyBrush, setScatterStyle */ QCPScatterStyle QCPSelectionDecorator::getFinalScatterStyle(const QCPScatterStyle &unselectedStyle) const { QCPScatterStyle result(unselectedStyle); result.setFromOther(mScatterStyle, mUsedScatterProperties); - + // if style shall inherit pen from plottable (has no own pen defined), give it the selected // plottable pen explicitly, so it doesn't use the unselected plottable pen when used in the // plottable: if (!result.isPenDefined()) result.setPen(mPen); - + return result; } @@ -10186,7 +10439,7 @@ void QCPSelectionDecorator::copyFrom(const QCPSelectionDecorator *other) This method is called by all plottables' draw methods to allow custom selection decorations to be drawn. Use the passed \a painter to perform the drawing operations. \a selection carries the data selection for which the decoration shall be drawn. - + The default base class implementation of \ref QCPSelectionDecorator has no special decoration, so this method does nothing. */ @@ -10197,11 +10450,11 @@ void QCPSelectionDecorator::drawDecoration(QCPPainter *painter, QCPDataSelection } /*! \internal - + This method is called as soon as a selection decorator is associated with a plottable, by a call to \ref QCPAbstractPlottable::setSelectionDecorator. This way the selection decorator can obtain a pointer to the plottable that uses it (e.g. to access data points via the \ref QCPAbstractPlottable::interface1D interface). - + If the selection decorator was already added to a different plottable before, this method aborts the registration and returns false. */ @@ -10232,7 +10485,7 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl one-dimensional data (i.e. data points have a single key dimension and one or multiple values at each key) are based off of the template subclass \ref QCPAbstractPlottable1D, see details there. - + All further specifics are in the subclasses, for example: \li A normal graph with possibly a line and/or scatter points \ref QCPGraph (typically created with \ref QCustomPlot::addGraph) @@ -10241,14 +10494,14 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl \li A statistical box plot: \ref QCPStatisticalBox \li A color encoded two-dimensional map: \ref QCPColorMap \li An OHLC/Candlestick chart: \ref QCPFinancial - + \section plottables-subclassing Creating own plottables - + Subclassing directly from QCPAbstractPlottable is only recommended if you wish to display two-dimensional data like \ref QCPColorMap, i.e. two logical key dimensions and one (or more) data dimensions. If you want to display data with only one logical key dimension, you should rather derive from \ref QCPAbstractPlottable1D. - + If subclassing QCPAbstractPlottable directly, these are the pure virtual functions you must implement: \li \ref selectTest @@ -10256,9 +10509,9 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl \li \ref drawLegendIcon \li \ref getKeyRange \li \ref getValueRange - + See the documentation of those functions for what they need to do. - + For drawing your plot, you can use the \ref coordsToPixels functions to translate a point in plot coordinates to pixel coordinates. This function is quite convenient, because it takes the orientation of the key and value axes into account for you (x and y are swapped when the key axis @@ -10266,7 +10519,7 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl to translate many points in a loop like QCPGraph), you can directly use \ref QCPAxis::coordToPixel. However, you must then take care about the orientation of the axis yourself. - + Here are some important members you inherit from QCPAbstractPlottable: @@ -10307,35 +10560,35 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl /* start of documentation of inline functions */ /*! \fn QCPSelectionDecorator *QCPAbstractPlottable::selectionDecorator() const - + Provides access to the selection decorator of this plottable. The selection decorator controls how selected data ranges are drawn (e.g. their pen color and fill), see \ref QCPSelectionDecorator for details. - + If you wish to use an own \ref QCPSelectionDecorator subclass, pass an instance of it to \ref setSelectionDecorator. */ /*! \fn bool QCPAbstractPlottable::selected() const - + Returns true if there are any data points of the plottable currently selected. Use \ref selection to retrieve the current \ref QCPDataSelection. */ /*! \fn QCPDataSelection QCPAbstractPlottable::selection() const - + Returns a \ref QCPDataSelection encompassing all the data points that are currently selected on this plottable. - + \see selected, setSelection, setSelectable */ /*! \fn virtual QCPPlottableInterface1D *QCPAbstractPlottable::interface1D() - + If this plottable is a one-dimensional plottable, i.e. it implements the \ref QCPPlottableInterface1D, returns the \a this pointer with that type. Otherwise (e.g. in the case of a \ref QCPColorMap) returns zero. - + You can use this method to gain read access to data coordinates while holding a pointer to the abstract base class only. */ @@ -10345,16 +10598,16 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl /*! \fn void QCPAbstractPlottable::drawLegendIcon(QCPPainter *painter, const QRect &rect) const = 0 \internal - + called by QCPLegend::draw (via QCPPlottableLegendItem::draw) to create a graphical representation of this plottable inside \a rect, next to the plottable name. - + The passed \a painter has its cliprect set to \a rect, so painting outside of \a rect won't appear outside the legend icon border. */ /*! \fn QCPRange QCPAbstractPlottable::getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain) const = 0 - + Returns the coordinate range that all data in this plottable span in the key axis dimension. For logarithmic plots, one can set \a inSignDomain to either \ref QCP::sdNegative or \ref QCP::sdPositive in order to restrict the returned range to that sign domain. E.g. when only @@ -10367,12 +10620,12 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl this function may have size zero (e.g. when there is only one data point). In this case \a foundRange would return true, but the returned range is not a valid range in terms of \ref QCPRange::validRange. - + \see rescaleAxes, getValueRange */ /*! \fn QCPRange QCPAbstractPlottable::getValueRange(bool &foundRange, QCP::SignDomain inSignDomain, const QCPRange &inKeyRange) const = 0 - + Returns the coordinate range that the data points in the specified key range (\a inKeyRange) span in the value axis dimension. For logarithmic plots, one can set \a inSignDomain to either \ref QCP::sdNegative or \ref QCP::sdPositive in order to restrict the returned range to that sign @@ -10381,7 +10634,7 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl inSignDomain to \ref QCP::sdBoth (default). \a foundRange is an output parameter that indicates whether a range could be found or not. If this is false, you shouldn't use the returned range (e.g. no points in data). - + If \a inKeyRange has both lower and upper bound set to zero (is equal to QCPRange()), all data points are considered, without any restriction on the keys. @@ -10389,7 +10642,7 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl this function may have size zero (e.g. when there is only one data point). In this case \a foundRange would return true, but the returned range is not a valid range in terms of \ref QCPRange::validRange. - + \see rescaleAxes, getKeyRange */ @@ -10397,27 +10650,27 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl /* start of documentation of signals */ /*! \fn void QCPAbstractPlottable::selectionChanged(bool selected) - + This signal is emitted when the selection state of this plottable has changed, either by user interaction or by a direct call to \ref setSelection. The parameter \a selected indicates whether there are any points selected or not. - + \see selectionChanged(const QCPDataSelection &selection) */ /*! \fn void QCPAbstractPlottable::selectionChanged(const QCPDataSelection &selection) - + This signal is emitted when the selection state of this plottable has changed, either by user interaction or by a direct call to \ref setSelection. The parameter \a selection holds the currently selected data ranges. - + \see selectionChanged(bool selected) */ /*! \fn void QCPAbstractPlottable::selectableChanged(QCP::SelectionType selectable); - + This signal is emitted when the selectability of this plottable has changed. - + \see setSelectable */ @@ -10428,10 +10681,10 @@ bool QCPSelectionDecorator::registerWithPlottable(QCPAbstractPlottable *plottabl its value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and have perpendicular orientations. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + Since QCPAbstractPlottable is an abstract class that defines the basic interface to plottables, it can't be directly instantiated. - + You probably want one of the subclasses like \ref QCPGraph or \ref QCPCurve instead. */ QCPAbstractPlottable::QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis) : @@ -10450,7 +10703,7 @@ QCPAbstractPlottable::QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis) qDebug() << Q_FUNC_INFO << "Parent plot of keyAxis is not the same as that of valueAxis."; if (keyAxis->orientation() == valueAxis->orientation()) qDebug() << Q_FUNC_INFO << "keyAxis and valueAxis must be orthogonal to each other."; - + mParentPlot->registerPlottable(this); setSelectionDecorator(new QCPSelectionDecorator); } @@ -10475,7 +10728,7 @@ void QCPAbstractPlottable::setName(const QString &name) /*! Sets whether fills of this plottable are drawn antialiased or not. - + Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. */ @@ -10486,7 +10739,7 @@ void QCPAbstractPlottable::setAntialiasedFill(bool enabled) /*! Sets whether the scatter symbols of this plottable are drawn antialiased or not. - + Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. */ @@ -10498,7 +10751,7 @@ void QCPAbstractPlottable::setAntialiasedScatters(bool enabled) /*! The pen is used to draw basic lines that make up the plottable representation in the plot. - + For example, the \ref QCPGraph subclass draws its graph lines with this pen. \see setBrush @@ -10511,7 +10764,7 @@ void QCPAbstractPlottable::setPen(const QPen &pen) /*! The brush is used to draw basic fills of the plottable representation in the plot. The Fill can be a color, gradient or texture, see the usage of QBrush. - + For example, the \ref QCPGraph subclass draws the fill under the graph with this brush, when it's not set to Qt::NoBrush. @@ -10527,7 +10780,7 @@ void QCPAbstractPlottable::setBrush(const QBrush &brush) to the plottable's value axis. This function performs no checks to make sure this is the case. The typical mathematical choice is to use the x-axis (QCustomPlot::xAxis) as key axis and the y-axis (QCustomPlot::yAxis) as value axis. - + Normally, the key and value axes are set in the constructor of the plottable (or \ref QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface). @@ -10546,7 +10799,7 @@ void QCPAbstractPlottable::setKeyAxis(QCPAxis *axis) Normally, the key and value axes are set in the constructor of the plottable (or \ref QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface). - + \see setKeyAxis */ void QCPAbstractPlottable::setValueAxis(QCPAxis *axis) @@ -10559,18 +10812,18 @@ void QCPAbstractPlottable::setValueAxis(QCPAxis *axis) Sets which data ranges of this plottable are selected. Selected data ranges are drawn differently (e.g. color) in the plot. This can be controlled via the selection decorator (see \ref selectionDecorator). - + The entire selection mechanism for plottables is handled automatically when \ref QCustomPlot::setInteractions contains iSelectPlottables. You only need to call this function when you wish to change the selection state programmatically. - + Using \ref setSelectable you can further specify for each plottable whether and to which granularity it is selectable. If \a selection is not compatible with the current \ref QCP::SelectionType set via \ref setSelectable, the resulting selection will be adjusted accordingly (see \ref QCPDataSelection::enforceType). - + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. - + \see setSelectable, selectTest */ void QCPAbstractPlottable::setSelection(QCPDataSelection selection) @@ -10588,9 +10841,9 @@ void QCPAbstractPlottable::setSelection(QCPDataSelection selection) Use this method to set an own QCPSelectionDecorator (subclass) instance. This allows you to customize the visual representation of selected data ranges further than by using the default QCPSelectionDecorator. - + The plottable takes ownership of the \a decorator. - + The currently set decorator can be accessed via \ref selectionDecorator. */ void QCPAbstractPlottable::setSelectionDecorator(QCPSelectionDecorator *decorator) @@ -10617,7 +10870,7 @@ void QCPAbstractPlottable::setSelectionDecorator(QCPSelectionDecorator *decorato QCustomPlot::setInteractions contains \ref QCP::iSelectPlottables), by dragging a selection rect (When \ref QCustomPlot::setSelectionRectMode is \ref QCP::srmSelect), or programmatically by calling \ref setSelection. - + \see setSelection, QCP::SelectionType */ void QCPAbstractPlottable::setSelectable(QCP::SelectionType selectable) @@ -10651,7 +10904,7 @@ void QCPAbstractPlottable::coordsToPixels(double key, double value, double &x, d QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + if (keyAxis->orientation() == Qt::Horizontal) { x = keyAxis->coordToPixel(key); @@ -10672,7 +10925,7 @@ const QPointF QCPAbstractPlottable::coordsToPixels(double key, double value) con QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } - + if (keyAxis->orientation() == Qt::Horizontal) return QPointF(keyAxis->coordToPixel(key), valueAxis->coordToPixel(value)); else @@ -10693,7 +10946,7 @@ void QCPAbstractPlottable::pixelsToCoords(double x, double y, double &key, doubl QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + if (keyAxis->orientation() == Qt::Horizontal) { key = keyAxis->pixelToCoord(x); @@ -10720,11 +10973,11 @@ void QCPAbstractPlottable::pixelsToCoords(const QPointF &pixelPos, double &key, sure not to rescale to an illegal range i.e. a range containing different signs and/or zero. Instead it will stay in the current sign domain and ignore all parts of the plottable that lie outside of that domain. - + \a onlyEnlarge makes sure the ranges are only expanded, never reduced. So it's possible to show multiple plottables in their entirety by multiple calls to rescaleAxes where the first call has \a onlyEnlarge set to false (the default), and all subsequent set to true. - + \see rescaleKeyAxis, rescaleValueAxis, QCustomPlot::rescaleAxes, QCPAxis::rescale */ void QCPAbstractPlottable::rescaleAxes(bool onlyEnlarge) const @@ -10735,18 +10988,18 @@ void QCPAbstractPlottable::rescaleAxes(bool onlyEnlarge) const /*! Rescales the key axis of the plottable so the whole plottable is visible. - + See \ref rescaleAxes for detailed behaviour. */ void QCPAbstractPlottable::rescaleKeyAxis(bool onlyEnlarge) const { QCPAxis *keyAxis = mKeyAxis.data(); if (!keyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } - + QCP::SignDomain signDomain = QCP::sdBoth; if (keyAxis->scaleType() == QCPAxis::stLogarithmic) signDomain = (keyAxis->range().upper < 0 ? QCP::sdNegative : QCP::sdPositive); - + bool foundRange; QCPRange newRange = getKeyRange(foundRange, signDomain); if (foundRange) @@ -10785,11 +11038,11 @@ void QCPAbstractPlottable::rescaleValueAxis(bool onlyEnlarge, bool inKeyRange) c QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + QCP::SignDomain signDomain = QCP::sdBoth; if (valueAxis->scaleType() == QCPAxis::stLogarithmic) signDomain = (valueAxis->range().upper < 0 ? QCP::sdNegative : QCP::sdPositive); - + bool foundRange; QCPRange newRange = getValueRange(foundRange, signDomain, inKeyRange ? keyAxis->range() : QCPRange()); if (foundRange) @@ -10839,7 +11092,7 @@ bool QCPAbstractPlottable::addToLegend(QCPLegend *legend) qDebug() << Q_FUNC_INFO << "passed legend isn't in the same QCustomPlot as this plottable"; return false; } - + if (!legend->hasItemWithPlottable(this)) { legend->addItem(new QCPPlottableLegendItem(legend, this)); @@ -10879,7 +11132,7 @@ bool QCPAbstractPlottable::removeFromLegend(QCPLegend *legend) const qDebug() << Q_FUNC_INFO << "passed legend is null"; return false; } - + if (QCPPlottableLegendItem *lip = legend->itemWithPlottable(this)) return legend->removeItem(lip); else @@ -10921,13 +11174,13 @@ QCP::Interaction QCPAbstractPlottable::selectionCategory() const before drawing plottable lines. This is the antialiasing state the painter passed to the \ref draw method is in by default. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \seebaseclassmethod - + \see setAntialiased, applyFillAntialiasingHint, applyScattersAntialiasingHint */ void QCPAbstractPlottable::applyDefaultAntialiasingHint(QCPPainter *painter) const @@ -10939,11 +11192,11 @@ void QCPAbstractPlottable::applyDefaultAntialiasingHint(QCPPainter *painter) con A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter before drawing plottable fills. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \see setAntialiased, applyDefaultAntialiasingHint, applyScattersAntialiasingHint */ void QCPAbstractPlottable::applyFillAntialiasingHint(QCPPainter *painter) const @@ -10955,11 +11208,11 @@ void QCPAbstractPlottable::applyFillAntialiasingHint(QCPPainter *painter) const A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter before drawing plottable scatter points. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \see setAntialiased, applyFillAntialiasingHint, applyDefaultAntialiasingHint */ void QCPAbstractPlottable::applyScattersAntialiasingHint(QCPPainter *painter) const @@ -10971,7 +11224,7 @@ void QCPAbstractPlottable::applyScattersAntialiasingHint(QCPPainter *painter) co void QCPAbstractPlottable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) { Q_UNUSED(event) - + if (mSelectable != QCP::stNone) { QCPDataSelection newSelection = details.value(); @@ -11013,7 +11266,7 @@ void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) /* including file 'src/item.cpp', size 49269 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemAnchor @@ -11021,7 +11274,7 @@ void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) /*! \class QCPItemAnchor \brief An anchor of an item to which positions can be attached to. - + An item (QCPAbstractItem) may have one or more anchors. Unlike QCPItemPosition, an anchor doesn't control anything on its item, but provides a way to tie other items via their positions to the anchor. @@ -11032,10 +11285,10 @@ void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) calling QCPItemPosition::setParentAnchor on \a start, passing the wanted anchor of the QCPItemRect. This way the start of the line will now always follow the respective anchor location on the rect item. - + Note that QCPItemPosition derives from QCPItemAnchor, so every position can also serve as an anchor to other positions. - + To learn how to provide anchors in your own item subclasses, see the subclassing section of the QCPAbstractItem documentation. */ @@ -11043,10 +11296,10 @@ void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) /* start documentation of inline functions */ /*! \fn virtual QCPItemPosition *QCPItemAnchor::toQCPItemPosition() - + Returns 0 if this instance is merely a QCPItemAnchor, and a valid pointer of type QCPItemPosition* if it actually is a QCPItemPosition (which is a subclass of QCPItemAnchor). - + This safe downcast functionality could also be achieved with a dynamic_cast. However, QCustomPlot avoids dynamic_cast to work with projects that don't have RTTI support enabled (e.g. -fno-rtti flag with gcc compiler). @@ -11084,7 +11337,7 @@ QCPItemAnchor::~QCPItemAnchor() /*! Returns the final absolute pixel position of the QCPItemAnchor on the QCustomPlot surface. - + The pixel information is internally retrieved via QCPAbstractItem::anchorPixelPosition of the parent item, QCPItemAnchor is just an intermediary. */ @@ -11112,7 +11365,7 @@ QPointF QCPItemAnchor::pixelPosition() const Adds \a pos to the childX list of this anchor, which keeps track of which children use this anchor as parent anchor for the respective coordinate. This is necessary to notify the children prior to destruction of the anchor. - + Note that this function does not change the parent setting in \a pos. */ void QCPItemAnchor::addChildX(QCPItemPosition *pos) @@ -11126,7 +11379,7 @@ void QCPItemAnchor::addChildX(QCPItemPosition *pos) /*! \internal Removes \a pos from the childX list of this anchor. - + Note that this function does not change the parent setting in \a pos. */ void QCPItemAnchor::removeChildX(QCPItemPosition *pos) @@ -11140,7 +11393,7 @@ void QCPItemAnchor::removeChildX(QCPItemPosition *pos) Adds \a pos to the childY list of this anchor, which keeps track of which children use this anchor as parent anchor for the respective coordinate. This is necessary to notify the children prior to destruction of the anchor. - + Note that this function does not change the parent setting in \a pos. */ void QCPItemAnchor::addChildY(QCPItemPosition *pos) @@ -11154,7 +11407,7 @@ void QCPItemAnchor::addChildY(QCPItemPosition *pos) /*! \internal Removes \a pos from the childY list of this anchor. - + Note that this function does not change the parent setting in \a pos. */ void QCPItemAnchor::removeChildY(QCPItemPosition *pos) @@ -11170,7 +11423,7 @@ void QCPItemAnchor::removeChildY(QCPItemPosition *pos) /*! \class QCPItemPosition \brief Manages the position of an item. - + Every item has at least one public QCPItemPosition member pointer which provides ways to position the item on the QCustomPlot surface. Some items have multiple positions, for example QCPItemRect has two: \a topLeft and \a bottomRight. @@ -11205,23 +11458,23 @@ void QCPItemAnchor::removeChildY(QCPItemPosition *pos) /* start documentation of inline functions */ /*! \fn QCPItemPosition::PositionType *QCPItemPosition::type() const - + Returns the current position type. - + If different types were set for X and Y (\ref setTypeX, \ref setTypeY), this method returns the type of the X coordinate. In that case rather use \a typeX() and \a typeY(). - + \see setType */ /*! \fn QCPItemAnchor *QCPItemPosition::parentAnchor() const - + Returns the current parent anchor. - + If different parent anchors were set for X and Y (\ref setParentAnchorX, \ref setParentAnchorY), this method returns the parent anchor of the Y coordinate. In that case rather use \a parentAnchorX() and \a parentAnchorY(). - + \see setParentAnchor */ @@ -11274,25 +11527,25 @@ QCPAxisRect *QCPItemPosition::axisRect() const /*! Sets the type of the position. The type defines how the coordinates passed to \ref setCoords should be handled and how the QCPItemPosition should behave in the plot. - + The possible values for \a type can be separated in two main categories: \li The position is regarded as a point in plot coordinates. This corresponds to \ref ptPlotCoords and requires two axes that define the plot coordinate system. They can be specified with \ref setAxes. By default, the QCustomPlot's x- and yAxis are used. - + \li The position is fixed on the QCustomPlot surface, i.e. independent of axis ranges. This corresponds to all other types, i.e. \ref ptAbsolute, \ref ptViewportRatio and \ref ptAxisRectRatio. They differ only in the way the absolute position is described, see the documentation of \ref PositionType for details. For \ref ptAxisRectRatio, note that you can specify the axis rect with \ref setAxisRect. By default this is set to the main axis rect. - + Note that the position type \ref ptPlotCoords is only available (and sensible) when the position has no parent anchor (\ref setParentAnchor). - + If the type is changed, the apparent pixel position on the plot is preserved. This means the coordinates as retrieved with coords() and set with \ref setCoords may change in the process. - + This method sets the type for both X and Y directions. It is also possible to set different types for X and Y, see \ref setTypeX, \ref setTypeY. */ @@ -11304,9 +11557,9 @@ void QCPItemPosition::setType(QCPItemPosition::PositionType type) /*! This method sets the position type of the X coordinate to \a type. - + For a detailed description of what a position type is, see the documentation of \ref setType. - + \see setType, setTypeY */ void QCPItemPosition::setTypeX(QCPItemPosition::PositionType type) @@ -11320,13 +11573,13 @@ void QCPItemPosition::setTypeX(QCPItemPosition::PositionType type) retainPixelPosition = false; if ((mPositionTypeX == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect)) retainPixelPosition = false; - + QPointF pixel; if (retainPixelPosition) pixel = pixelPosition(); - + mPositionTypeX = type; - + if (retainPixelPosition) setPixelPosition(pixel); } @@ -11334,9 +11587,9 @@ void QCPItemPosition::setTypeX(QCPItemPosition::PositionType type) /*! This method sets the position type of the Y coordinate to \a type. - + For a detailed description of what a position type is, see the documentation of \ref setType. - + \see setType, setTypeX */ void QCPItemPosition::setTypeY(QCPItemPosition::PositionType type) @@ -11350,13 +11603,13 @@ void QCPItemPosition::setTypeY(QCPItemPosition::PositionType type) retainPixelPosition = false; if ((mPositionTypeY == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect)) retainPixelPosition = false; - + QPointF pixel; if (retainPixelPosition) pixel = pixelPosition(); - + mPositionTypeY = type; - + if (retainPixelPosition) setPixelPosition(pixel); } @@ -11367,16 +11620,16 @@ void QCPItemPosition::setTypeY(QCPItemPosition::PositionType type) follow any position changes of the anchor. The local coordinate system of positions with a parent anchor always is absolute pixels, with (0, 0) being exactly on top of the parent anchor. (Hence the type shouldn't be set to \ref ptPlotCoords for positions with parent anchors.) - + if \a keepPixelPosition is true, the current pixel position of the QCPItemPosition is preserved during reparenting. If it's set to false, the coordinates are set to (0, 0), i.e. the position will be exactly on top of the parent anchor. - + To remove this QCPItemPosition from any parent anchor, set \a parentAnchor to 0. - + If the QCPItemPosition previously had no parent and the type is \ref ptPlotCoords, the type is set to \ref ptAbsolute, to keep the position in a valid state. - + This method sets the parent anchor for both X and Y directions. It is also possible to set different parents for X and Y, see \ref setParentAnchorX, \ref setParentAnchorY. */ @@ -11389,9 +11642,9 @@ bool QCPItemPosition::setParentAnchor(QCPItemAnchor *parentAnchor, bool keepPixe /*! This method sets the parent anchor of the X coordinate to \a parentAnchor. - + For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor. - + \see setParentAnchor, setParentAnchorY */ bool QCPItemPosition::setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPixelPosition) @@ -11428,11 +11681,11 @@ bool QCPItemPosition::setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPix break; } } - + // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute: if (!mParentAnchorX && mPositionTypeX == ptPlotCoords) setTypeX(ptAbsolute); - + // save pixel position: QPointF pixelP; if (keepPixelPosition) @@ -11454,9 +11707,9 @@ bool QCPItemPosition::setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPix /*! This method sets the parent anchor of the Y coordinate to \a parentAnchor. - + For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor. - + \see setParentAnchor, setParentAnchorX */ bool QCPItemPosition::setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPixelPosition) @@ -11493,11 +11746,11 @@ bool QCPItemPosition::setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPix break; } } - + // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute: if (!mParentAnchorY && mPositionTypeY == ptPlotCoords) setTypeY(ptAbsolute); - + // save pixel position: QPointF pixelP; if (keepPixelPosition) @@ -11520,14 +11773,14 @@ bool QCPItemPosition::setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPix /*! Sets the coordinates of this QCPItemPosition. What the coordinates mean, is defined by the type (\ref setType, \ref setTypeX, \ref setTypeY). - + For example, if the type is \ref ptAbsolute, \a key and \a value mean the x and y pixel position on the QCustomPlot surface. In that case the origin (0, 0) is in the top left corner of the QCustomPlot viewport. If the type is \ref ptPlotCoords, \a key and \a value mean a point in the plot coordinate system defined by the axes set by \ref setAxes. By default those are the QCustomPlot's xAxis and yAxis. See the documentation of \ref setType for other available coordinate types and their meaning. - + If different types were configured for X and Y (\ref setTypeX, \ref setTypeY), \a key and \a value must also be provided in the different coordinate systems. Here, the X type refers to \a key, and the Y type refers to \a value. @@ -11559,7 +11812,7 @@ void QCPItemPosition::setCoords(const QPointF &pos) QPointF QCPItemPosition::pixelPosition() const { QPointF result; - + // determine X: switch (mPositionTypeX) { @@ -11603,7 +11856,7 @@ QPointF QCPItemPosition::pixelPosition() const break; } } - + // determine Y: switch (mPositionTypeY) { @@ -11647,7 +11900,7 @@ QPointF QCPItemPosition::pixelPosition() const break; } } - + return result; } @@ -11686,7 +11939,7 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) { double x = pixelPosition.x(); double y = pixelPosition.y(); - + switch (mPositionTypeX) { case ptAbsolute: @@ -11728,7 +11981,7 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) break; } } - + switch (mPositionTypeY) { case ptAbsolute: @@ -11770,7 +12023,7 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) break; } } - + setCoords(x, y); } @@ -11781,18 +12034,18 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) /*! \class QCPAbstractItem \brief The abstract base class for all items in a plot. - + In QCustomPlot, items are supplemental graphical elements that are neither plottables (QCPAbstractPlottable) nor axes (QCPAxis). While plottables are always tied to two axes and thus plot coordinates, items can also be placed in absolute coordinates independent of any axes. Each specific item has at least one QCPItemPosition member which controls the positioning. Some items are defined by more than one coordinate and thus have two or more QCPItemPosition members (For example, QCPItemRect has \a topLeft and \a bottomRight). - + This abstract base class defines a very basic interface like visibility and clipping. Since this class is abstract, it can't be instantiated. Use one of the subclasses or create a subclass yourself to create new items. - + The built-in items are:
@@ -11805,7 +12058,7 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition)
QCPItemLineA line defined by a start and an end point. May have different ending styles on each side (e.g. arrows).
QCPItemBracketA bracket which may be used to reference/highlight certain parts in the plot.
QCPItemTracerAn item that can be attached to a QCPGraph and sticks to its data points, given a key coordinate.
- + \section items-clipping Clipping Items are by default clipped to the main axis rect (they are only visible inside the axis rect). @@ -11817,9 +12070,9 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) in principle is independent of the coordinate axes the item might be tied to via its position members (\ref QCPItemPosition::setAxes). However, it is common that the axis rect for clipping also contains the axes used for the item positions. - + \section items-using Using items - + First you instantiate the item you want to use and add it to the plot: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-1 by default, the positions of the item are bound to the x- and y-Axis of the plot. So we can just @@ -11832,35 +12085,35 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-4 and make the line visible on the entire QCustomPlot, by disabling clipping to the axis rect: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-5 - + For more advanced plots, it is even possible to set different types and parent anchors per X/Y coordinate of an item position, using for example \ref QCPItemPosition::setTypeX or \ref QCPItemPosition::setParentAnchorX. For details, see the documentation of \ref QCPItemPosition. - + \section items-subclassing Creating own items - + To create an own item, you implement a subclass of QCPAbstractItem. These are the pure virtual functions, you must implement: \li \ref selectTest \li \ref draw - + See the documentation of those functions for what they need to do. - + \subsection items-positioning Allowing the item to be positioned - + As mentioned, item positions are represented by QCPItemPosition members. Let's assume the new item shall have only one point as its position (as opposed to two like a rect or multiple like a polygon). You then add a public member of type QCPItemPosition like so: - + \code QCPItemPosition * const myPosition;\endcode - + the const makes sure the pointer itself can't be modified from the user of your new item (the QCPItemPosition instance it points to, can be modified, of course). The initialization of this pointer is made easy with the \ref createPosition function. Just assign the return value of this function to each QCPItemPosition in the constructor of your item. \ref createPosition takes a string which is the name of the position, typically this is identical to the variable name. For example, the constructor of QCPItemExample could look like this: - + \code QCPItemExample::QCPItemExample(QCustomPlot *parentPlot) : QCPAbstractItem(parentPlot), @@ -11869,9 +12122,9 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) // other constructor code } \endcode - + \subsection items-drawing The draw function - + To give your item a visual representation, reimplement the \ref draw function and use the passed QCPPainter to draw the item. You can retrieve the item position in pixel coordinates from the position member(s) via \ref QCPItemPosition::pixelPosition. @@ -11879,19 +12132,19 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) To optimize performance you should calculate a bounding rect first (don't forget to take the pen width into account), check whether it intersects the \ref clipRect, and only draw the item at all if this is the case. - + \subsection items-selection The selectTest function - + Your implementation of the \ref selectTest function may use the helpers \ref QCPVector2D::distanceSquaredToLine and \ref rectDistance. With these, the implementation of the selection test becomes significantly simpler for most items. See the documentation of \ref selectTest for what the function parameters mean and what the function should return. - + \subsection anchors Providing anchors - + Providing anchors (QCPItemAnchor) starts off like adding a position. First you create a public member, e.g. - + \code QCPItemAnchor * const bottom;\endcode and create it in the constructor with the \ref createAnchor function, assigning it a name and an @@ -11899,7 +12152,7 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) Since anchors can be placed anywhere, relative to the item's position(s), your item needs to provide the position of every anchor with the reimplementation of the \ref anchorPixelPosition(int anchorId) function. - + In essence the QCPItemAnchor is merely an intermediary that itself asks your item for the pixel position when anything attached to the anchor needs to know the coordinates. */ @@ -11907,17 +12160,17 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) /* start of documentation of inline functions */ /*! \fn QList QCPAbstractItem::positions() const - + Returns all positions of the item in a list. - + \see anchors, position */ /*! \fn QList QCPAbstractItem::anchors() const - + Returns all anchors of the item in a list. Note that since a position (QCPItemPosition) is always also an anchor, the list will also contain the positions of this item. - + \see positions, anchor */ @@ -11926,9 +12179,9 @@ void QCPItemPosition::setPixelPosition(const QPointF &pixelPosition) /*! \fn void QCPAbstractItem::draw(QCPPainter *painter) = 0 \internal - + Draws this item with the provided \a painter. - + The cliprect of the provided painter is set to the rect returned by \ref clipRect before this function is called. The clipRect depends on the clipping settings defined by \ref setClipToAxisRect and \ref setClipAxisRect. @@ -11954,7 +12207,7 @@ QCPAbstractItem::QCPAbstractItem(QCustomPlot *parentPlot) : mSelected(false) { parentPlot->registerItem(this); - + QList rects = parentPlot->axisRects(); if (rects.size() > 0) { @@ -11978,7 +12231,7 @@ QCPAxisRect *QCPAbstractItem::clipAxisRect() const /*! Sets whether the item shall be clipped to an axis rect or whether it shall be visible on the entire QCustomPlot. The axis rect can be set with \ref setClipAxisRect. - + \see setClipAxisRect */ void QCPAbstractItem::setClipToAxisRect(bool clip) @@ -11991,7 +12244,7 @@ void QCPAbstractItem::setClipToAxisRect(bool clip) /*! Sets the clip axis rect. It defines the rect that will be used to clip the item when \ref setClipToAxisRect is set to true. - + \see setClipToAxisRect */ void QCPAbstractItem::setClipAxisRect(QCPAxisRect *rect) @@ -12004,10 +12257,10 @@ void QCPAbstractItem::setClipAxisRect(QCPAxisRect *rect) /*! Sets whether the user can (de-)select this item by clicking on the QCustomPlot surface. (When \ref QCustomPlot::setInteractions contains QCustomPlot::iSelectItems.) - + However, even when \a selectable was set to false, it is possible to set the selection manually, by calling \ref setSelected. - + \see QCustomPlot::setInteractions, setSelected */ void QCPAbstractItem::setSelectable(bool selectable) @@ -12026,11 +12279,11 @@ void QCPAbstractItem::setSelectable(bool selectable) The entire selection mechanism for items is handled automatically when \ref QCustomPlot::setInteractions contains QCustomPlot::iSelectItems. You only need to call this function when you wish to change the selection state manually. - + This function can change the selection state even when \ref setSelectable was set to false. - + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. - + \see setSelectable, selectTest */ void QCPAbstractItem::setSelected(bool selected) @@ -12045,11 +12298,11 @@ void QCPAbstractItem::setSelected(bool selected) /*! Returns the QCPItemPosition with the specified \a name. If this item doesn't have a position by that name, returns 0. - + This function provides an alternative way to access item positions. Normally, you access positions direcly by their member pointers (which typically have the same variable name as \a name). - + \see positions, anchor */ QCPItemPosition *QCPAbstractItem::position(const QString &name) const @@ -12066,11 +12319,11 @@ QCPItemPosition *QCPAbstractItem::position(const QString &name) const /*! Returns the QCPItemAnchor with the specified \a name. If this item doesn't have an anchor by that name, returns 0. - + This function provides an alternative way to access item anchors. Normally, you access anchors direcly by their member pointers (which typically have the same variable name as \a name). - + \see anchors, position */ QCPItemAnchor *QCPAbstractItem::anchor(const QString &name) const @@ -12086,10 +12339,10 @@ QCPItemAnchor *QCPAbstractItem::anchor(const QString &name) const /*! Returns whether this item has an anchor with the specified \a name. - + Note that you can check for positions with this function, too. This is because every position is also an anchor (QCPItemPosition inherits from QCPItemAnchor). - + \see anchor, position */ bool QCPAbstractItem::hasAnchor(const QString &name) const @@ -12103,12 +12356,12 @@ bool QCPAbstractItem::hasAnchor(const QString &name) const } /*! \internal - + Returns the rect the visual representation of this item is clipped to. This depends on the current setting of \ref setClipToAxisRect as well as the axis rect set with \ref setClipAxisRect. - + If the item is not clipped to an axis rect, QCustomPlot's viewport rect is returned. - + \see draw */ QRect QCPAbstractItem::clipRect() const @@ -12125,11 +12378,11 @@ QRect QCPAbstractItem::clipRect() const before drawing item lines. This is the antialiasing state the painter passed to the \ref draw method is in by default. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \see setAntialiased */ void QCPAbstractItem::applyDefaultAntialiasingHint(QCPPainter *painter) const @@ -12142,10 +12395,10 @@ void QCPAbstractItem::applyDefaultAntialiasingHint(QCPPainter *painter) const A convenience function which returns the selectTest value for a specified \a rect and a specified click position \a pos. \a filledRect defines whether a click inside the rect should also be considered a hit or whether only the rect border is sensitive to hits. - + This function may be used to help with the implementation of the \ref selectTest function for specific items. - + For example, if your item consists of four rects, call this function four times, once for each rect, in your \ref selectTest reimplementation. Finally, return the minimum (non -1) of all four returned values. @@ -12166,7 +12419,7 @@ double QCPAbstractItem::rectDistance(const QRectF &rect, const QPointF &pos, boo minDistSqr = distSqr; } result = qSqrt(minDistSqr); - + // filled rect, allow click inside to count as hit: if (filledRect && result > mParentPlot->selectionTolerance()*0.99) { @@ -12180,10 +12433,10 @@ double QCPAbstractItem::rectDistance(const QRectF &rect, const QPointF &pos, boo Returns the pixel position of the anchor with Id \a anchorId. This function must be reimplemented in item subclasses if they want to provide anchors (QCPItemAnchor). - + For example, if the item has two anchors with id 0 and 1, this function takes one of these anchor ids and returns the respective pixel points of the specified anchor. - + \see createAnchor */ QPointF QCPAbstractItem::anchorPixelPosition(int anchorId) const @@ -12197,13 +12450,13 @@ QPointF QCPAbstractItem::anchorPixelPosition(int anchorId) const Creates a QCPItemPosition, registers it with this item and returns a pointer to it. The specified \a name must be a unique string that is usually identical to the variable name of the position member (This is needed to provide the name-based \ref position access to positions). - + Don't delete positions created by this function manually, as the item will take care of it. - + Use this function in the constructor (initialization list) of the specific item subclass to create each position member. Don't create QCPItemPositions with \b new yourself, because they won't be registered with the item properly. - + \see createAnchor */ QCPItemPosition *QCPAbstractItem::createPosition(const QString &name) @@ -12226,18 +12479,18 @@ QCPItemPosition *QCPAbstractItem::createPosition(const QString &name) Creates a QCPItemAnchor, registers it with this item and returns a pointer to it. The specified \a name must be a unique string that is usually identical to the variable name of the anchor member (This is needed to provide the name based \ref anchor access to anchors). - + The \a anchorId must be a number identifying the created anchor. It is recommended to create an enum (e.g. "AnchorIndex") for this on each item that uses anchors. This id is used by the anchor to identify itself when it calls QCPAbstractItem::anchorPixelPosition. That function then returns the correct pixel coordinates for the passed anchor id. - + Don't delete anchors created by this function manually, as the item will take care of it. - + Use this function in the constructor (initialization list) of the specific item subclass to create each anchor member. Don't create QCPItemAnchors with \b new yourself, because then they won't be registered with the item properly. - + \see createPosition */ QCPItemAnchor *QCPAbstractItem::createAnchor(const QString &name, int anchorId) @@ -12283,18 +12536,18 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /* end of 'src/item.cpp' */ -/* including file 'src/core.cpp', size 124243 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/core.cpp', size 125037 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCustomPlot //////////////////////////////////////////////////////////////////////////////////////////////////// /*! \class QCustomPlot - + \brief The central class of the library. This is the QWidget which displays the plot and interacts with the user. - + For tutorials on how to use QCustomPlot, see the website\n http://www.qcustomplot.com/ */ @@ -12302,15 +12555,15 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /* start of documentation of inline functions */ /*! \fn QCPSelectionRect *QCustomPlot::selectionRect() const - + Allows access to the currently used QCPSelectionRect instance (or subclass thereof), that is used to handle and draw selection rect interactions (see \ref setSelectionRectMode). - + \see setSelectionRect */ /*! \fn QCPLayoutGrid *QCustomPlot::plotLayout() const - + Returns the top level layout of this QCustomPlot instance. It is a \ref QCPLayoutGrid, initially containing just one cell with the main QCPAxisRect inside. */ @@ -12326,7 +12579,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \fn void QCustomPlot::mousePress(QMouseEvent *event) This signal is emitted when the QCustomPlot receives a mouse press event. - + It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref QCPAxisRect::setRangeDragAxes. @@ -12335,11 +12588,11 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \fn void QCustomPlot::mouseMove(QMouseEvent *event) This signal is emitted when the QCustomPlot receives a mouse move event. - + It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref QCPAxisRect::setRangeDragAxes. - + \warning It is discouraged to change the drag-axes with \ref QCPAxisRect::setRangeDragAxes here, because the dragging starting point was saved the moment the mouse was pressed. Thus it only has a meaning for the range drag axes that were set at that moment. If you want to change the drag @@ -12349,7 +12602,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \fn void QCustomPlot::mouseRelease(QMouseEvent *event) This signal is emitted when the QCustomPlot receives a mouse release event. - + It is emitted before QCustomPlot handles any other mechanisms like object selection. So a slot connected to this signal can still influence the behaviour e.g. with \ref setInteractions or \ref QCPAbstractPlottable::setSelectable. @@ -12358,7 +12611,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \fn void QCustomPlot::mouseWheel(QMouseEvent *event) This signal is emitted when the QCustomPlot receives a mouse wheel event. - + It is emitted before QCustomPlot handles any other mechanisms like range zooming. So a slot connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeZoomAxes or \ref QCPAxisRect::setRangeZoomFactor. @@ -12387,104 +12640,104 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const */ /*! \fn void QCustomPlot::itemClick(QCPAbstractItem *item, QMouseEvent *event) - + This signal is emitted when an item is clicked. \a event is the mouse event that caused the click and \a item is the item that received the click. - + \see itemDoubleClick */ /*! \fn void QCustomPlot::itemDoubleClick(QCPAbstractItem *item, QMouseEvent *event) - + This signal is emitted when an item is double clicked. - + \a event is the mouse event that caused the click and \a item is the item that received the click. - + \see itemClick */ /*! \fn void QCustomPlot::axisClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event) - + This signal is emitted when an axis is clicked. - + \a event is the mouse event that caused the click, \a axis is the axis that received the click and \a part indicates the part of the axis that was clicked. - + \see axisDoubleClick */ /*! \fn void QCustomPlot::axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event) This signal is emitted when an axis is double clicked. - + \a event is the mouse event that caused the click, \a axis is the axis that received the click and \a part indicates the part of the axis that was clicked. - + \see axisClick */ /*! \fn void QCustomPlot::legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event) This signal is emitted when a legend (item) is clicked. - + \a event is the mouse event that caused the click, \a legend is the legend that received the click and \a item is the legend item that received the click. If only the legend and no item is clicked, \a item is 0. This happens for a click inside the legend padding or the space between two items. - + \see legendDoubleClick */ /*! \fn void QCustomPlot::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event) This signal is emitted when a legend (item) is double clicked. - + \a event is the mouse event that caused the click, \a legend is the legend that received the click and \a item is the legend item that received the click. If only the legend and no item is clicked, \a item is 0. This happens for a click inside the legend padding or the space between two items. - + \see legendClick */ /*! \fn void QCustomPlot::selectionChangedByUser() - + This signal is emitted after the user has changed the selection in the QCustomPlot, e.g. by clicking. It is not emitted when the selection state of an object has changed programmatically by a direct call to setSelected()/setSelection() on an object or by calling \ref deselectAll. - + In addition to this signal, selectable objects also provide individual signals, for example \ref QCPAxis::selectionChanged or \ref QCPAbstractPlottable::selectionChanged. Note that those signals are emitted even if the selection state is changed programmatically. - + See the documentation of \ref setInteractions for details about the selection mechanism. - + \see selectedPlottables, selectedGraphs, selectedItems, selectedAxes, selectedLegends */ /*! \fn void QCustomPlot::beforeReplot() - + This signal is emitted immediately before a replot takes place (caused by a call to the slot \ref replot). - + It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them replot synchronously, it won't cause an infinite recursion. - + \see replot, afterReplot */ /*! \fn void QCustomPlot::afterReplot() - + This signal is emitted immediately after a replot has taken place (caused by a call to the slot \ref replot). - + It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them replot synchronously, it won't cause an infinite recursion. - + \see replot, beforeReplot */ @@ -12494,7 +12747,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \var QCPAxis *QCustomPlot::xAxis A pointer to the primary x Axis (bottom) of the main axis rect of the plot. - + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref yAxis2) and the \ref legend. They make it very easy working with plots that only have a single axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the @@ -12502,7 +12755,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the default legend is removed due to manipulation of the layout system (e.g. by removing the main axis rect), the corresponding pointers become 0. - + If an axis convenience pointer is currently zero and a new axis rect or a corresponding axis is added in the place of the main axis rect, QCustomPlot resets the convenience pointers to the according new axes. Similarly the \ref legend convenience pointer will be reset if a legend is @@ -12512,7 +12765,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const /*! \var QCPAxis *QCustomPlot::yAxis A pointer to the primary y Axis (left) of the main axis rect of the plot. - + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref yAxis2) and the \ref legend. They make it very easy working with plots that only have a single axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the @@ -12520,7 +12773,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the default legend is removed due to manipulation of the layout system (e.g. by removing the main axis rect), the corresponding pointers become 0. - + If an axis convenience pointer is currently zero and a new axis rect or a corresponding axis is added in the place of the main axis rect, QCustomPlot resets the convenience pointers to the according new axes. Similarly the \ref legend convenience pointer will be reset if a legend is @@ -12532,7 +12785,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const A pointer to the secondary x Axis (top) of the main axis rect of the plot. Secondary axes are invisible by default. Use QCPAxis::setVisible to change this (or use \ref QCPAxisRect::setupFullAxesBox). - + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref yAxis2) and the \ref legend. They make it very easy working with plots that only have a single axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the @@ -12540,7 +12793,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the default legend is removed due to manipulation of the layout system (e.g. by removing the main axis rect), the corresponding pointers become 0. - + If an axis convenience pointer is currently zero and a new axis rect or a corresponding axis is added in the place of the main axis rect, QCustomPlot resets the convenience pointers to the according new axes. Similarly the \ref legend convenience pointer will be reset if a legend is @@ -12552,7 +12805,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const A pointer to the secondary y Axis (right) of the main axis rect of the plot. Secondary axes are invisible by default. Use QCPAxis::setVisible to change this (or use \ref QCPAxisRect::setupFullAxesBox). - + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref yAxis2) and the \ref legend. They make it very easy working with plots that only have a single axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the @@ -12560,7 +12813,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the default legend is removed due to manipulation of the layout system (e.g. by removing the main axis rect), the corresponding pointers become 0. - + If an axis convenience pointer is currently zero and a new axis rect or a corresponding axis is added in the place of the main axis rect, QCustomPlot resets the convenience pointers to the according new axes. Similarly the \ref legend convenience pointer will be reset if a legend is @@ -12571,7 +12824,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const A pointer to the default legend of the main axis rect. The legend is invisible by default. Use QCPLegend::setVisible to change this. - + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref yAxis2) and the \ref legend. They make it very easy working with plots that only have a single axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the @@ -12580,7 +12833,7 @@ QCP::Interaction QCPAbstractItem::selectionCategory() const QCPAxisRect::insetLayout "inset layout", and must then also be accessed via the inset layout. If the default legend is removed due to manipulation of the layout system (e.g. by removing the main axis rect), the corresponding pointer becomes 0. - + If an axis convenience pointer is currently zero and a new axis rect or a corresponding axis is added in the place of the main axis rect, QCustomPlot resets the convenience pointers to the according new axes. Similarly the \ref legend convenience pointer will be reset if a legend is @@ -12618,6 +12871,7 @@ QCustomPlot::QCustomPlot(QWidget *parent) : mOpenGl(false), mMouseHasMoved(false), mMouseEventLayerable(0), + mMouseSignalLayerable(0), mReplotting(false), mReplotQueued(false), mOpenGlMultisamples(16), @@ -12638,7 +12892,7 @@ QCustomPlot::QCustomPlot(QWidget *parent) : setBufferDevicePixelRatio(QWidget::devicePixelRatio()); # endif #endif - + mOpenGlAntialiasedElementsBackup = mAntialiasedElements; mOpenGlCacheLabelsBackup = mPlottingHints.testFlag(QCP::phCacheLabels); // create initial layers: @@ -12651,7 +12905,7 @@ QCustomPlot::QCustomPlot(QWidget *parent) : updateLayerIndices(); setCurrentLayer(QLatin1String("main")); layer(QLatin1String("overlay"))->setMode(QCPLayer::lmBuffered); - + // create initial layout, axis rect and legend: mPlotLayout = new QCPLayoutGrid; mPlotLayout->initializeParentPlot(this); @@ -12667,7 +12921,7 @@ QCustomPlot::QCustomPlot(QWidget *parent) : legend->setVisible(false); defaultAxisRect->insetLayout()->addElement(legend, Qt::AlignRight|Qt::AlignTop); defaultAxisRect->insetLayout()->setMargins(QMargins(12, 12, 12, 12)); - + defaultAxisRect->setLayer(QLatin1String("background")); xAxis->setLayer(QLatin1String("axes")); yAxis->setLayer(QLatin1String("axes")); @@ -12678,13 +12932,13 @@ QCustomPlot::QCustomPlot(QWidget *parent) : xAxis2->grid()->setLayer(QLatin1String("grid")); yAxis2->grid()->setLayer(QLatin1String("grid")); legend->setLayer(QLatin1String("legend")); - + // create selection rect instance: mSelectionRect = new QCPSelectionRect(this); mSelectionRect->setLayer(QLatin1String("overlay")); - + setViewport(rect()); // needs to be called after mPlotLayout has been created - + replot(rpQueuedReplot); } @@ -12698,7 +12952,7 @@ QCustomPlot::~QCustomPlot() delete mPlotLayout; mPlotLayout = 0; } - + mCurrentLayer = 0; qDeleteAll(mLayers); // don't use removeLayer, because it would prevent the last layer to be removed mLayers.clear(); @@ -12706,25 +12960,25 @@ QCustomPlot::~QCustomPlot() /*! Sets which elements are forcibly drawn antialiased as an \a or combination of QCP::AntialiasedElement. - + This overrides the antialiasing settings for whole element groups, normally controlled with the \a setAntialiasing function on the individual elements. If an element is neither specified in \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on each individual element instance is used. - + For example, if \a antialiasedElements contains \ref QCP::aePlottables, all plottables will be drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set to. - + if an element in \a antialiasedElements is already set in \ref setNotAntialiasedElements, it is removed from there. - + \see setNotAntialiasedElements */ void QCustomPlot::setAntialiasedElements(const QCP::AntialiasedElements &antialiasedElements) { mAntialiasedElements = antialiasedElements; - + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: if ((mNotAntialiasedElements & mAntialiasedElements) != 0) mNotAntialiasedElements |= ~mAntialiasedElements; @@ -12732,9 +12986,9 @@ void QCustomPlot::setAntialiasedElements(const QCP::AntialiasedElements &antiali /*! Sets whether the specified \a antialiasedElement is forcibly drawn antialiased. - + See \ref setAntialiasedElements for details. - + \see setNotAntialiasedElement */ void QCustomPlot::setAntialiasedElement(QCP::AntialiasedElement antialiasedElement, bool enabled) @@ -12743,7 +12997,7 @@ void QCustomPlot::setAntialiasedElement(QCP::AntialiasedElement antialiasedEleme mAntialiasedElements &= ~antialiasedElement; else if (enabled && !mAntialiasedElements.testFlag(antialiasedElement)) mAntialiasedElements |= antialiasedElement; - + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: if ((mNotAntialiasedElements & mAntialiasedElements) != 0) mNotAntialiasedElements |= ~mAntialiasedElements; @@ -12752,25 +13006,25 @@ void QCustomPlot::setAntialiasedElement(QCP::AntialiasedElement antialiasedEleme /*! Sets which elements are forcibly drawn not antialiased as an \a or combination of QCP::AntialiasedElement. - + This overrides the antialiasing settings for whole element groups, normally controlled with the \a setAntialiasing function on the individual elements. If an element is neither specified in \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on each individual element instance is used. - + For example, if \a notAntialiasedElements contains \ref QCP::aePlottables, no plottables will be drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set to. - + if an element in \a notAntialiasedElements is already set in \ref setAntialiasedElements, it is removed from there. - + \see setAntialiasedElements */ void QCustomPlot::setNotAntialiasedElements(const QCP::AntialiasedElements ¬AntialiasedElements) { mNotAntialiasedElements = notAntialiasedElements; - + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: if ((mNotAntialiasedElements & mAntialiasedElements) != 0) mAntialiasedElements |= ~mNotAntialiasedElements; @@ -12778,9 +13032,9 @@ void QCustomPlot::setNotAntialiasedElements(const QCP::AntialiasedElements ¬A /*! Sets whether the specified \a notAntialiasedElement is forcibly drawn not antialiased. - + See \ref setNotAntialiasedElements for details. - + \see setAntialiasedElement */ void QCustomPlot::setNotAntialiasedElement(QCP::AntialiasedElement notAntialiasedElement, bool enabled) @@ -12789,7 +13043,7 @@ void QCustomPlot::setNotAntialiasedElement(QCP::AntialiasedElement notAntialiase mNotAntialiasedElements &= ~notAntialiasedElement; else if (enabled && !mNotAntialiasedElements.testFlag(notAntialiasedElement)) mNotAntialiasedElements |= notAntialiasedElement; - + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: if ((mNotAntialiasedElements & mAntialiasedElements) != 0) mAntialiasedElements |= ~mNotAntialiasedElements; @@ -12798,7 +13052,7 @@ void QCustomPlot::setNotAntialiasedElement(QCP::AntialiasedElement notAntialiase /*! If set to true, adding a plottable (e.g. a graph) to the QCustomPlot automatically also adds the plottable to the legend (QCustomPlot::legend). - + \see addGraph, QCPLegend::addItem */ void QCustomPlot::setAutoAddPlottableToLegend(bool on) @@ -12809,13 +13063,13 @@ void QCustomPlot::setAutoAddPlottableToLegend(bool on) /*! Sets the possible interactions of this QCustomPlot as an or-combination of \ref QCP::Interaction enums. There are the following types of interactions: - + Axis range manipulation is controlled via \ref QCP::iRangeDrag and \ref QCP::iRangeZoom. When the respective interaction is enabled, the user may drag axes ranges and zoom with the mouse wheel. For details how to control which axes the user may drag/zoom and in what orientations, see \ref QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeDragAxes, \ref QCPAxisRect::setRangeZoomAxes. - + Plottable data selection is controlled by \ref QCP::iSelectPlottables. If \ref QCP::iSelectPlottables is set, the user may select plottables (graphs, curves, bars,...) and their data by clicking on them or in their vicinity (\ref setSelectionTolerance). Whether the @@ -12824,40 +13078,40 @@ void QCustomPlot::setAutoAddPlottableToLegend(bool on) special page about the \ref dataselection "data selection mechanism". To retrieve a list of all currently selected plottables, call \ref selectedPlottables. If you're only interested in QCPGraphs, you may use the convenience function \ref selectedGraphs. - + Item selection is controlled by \ref QCP::iSelectItems. If \ref QCP::iSelectItems is set, the user may select items (QCPItemLine, QCPItemText,...) by clicking on them or in their vicinity. To find out whether a specific item is selected, call QCPAbstractItem::selected(). To retrieve a list of all currently selected items, call \ref selectedItems. - + Axis selection is controlled with \ref QCP::iSelectAxes. If \ref QCP::iSelectAxes is set, the user may select parts of the axes by clicking on them. What parts exactly (e.g. Axis base line, tick labels, axis label) are selectable can be controlled via \ref QCPAxis::setSelectableParts for each axis. To retrieve a list of all axes that currently contain selected parts, call \ref selectedAxes. Which parts of an axis are selected, can be retrieved with QCPAxis::selectedParts(). - + Legend selection is controlled with \ref QCP::iSelectLegend. If this is set, the user may select the legend itself or individual items by clicking on them. What parts exactly are selectable can be controlled via \ref QCPLegend::setSelectableParts. To find out whether the legend or any of its child items are selected, check the value of QCPLegend::selectedParts. To find out which child items are selected, call \ref QCPLegend::selectedItems. - + All other selectable elements The selection of all other selectable objects (e.g. QCPTextElement, or your own layerable subclasses) is controlled with \ref QCP::iSelectOther. If set, the user may select those objects by clicking on them. To find out which are currently selected, you need to check their selected state explicitly. - + If the selection state has changed by user interaction, the \ref selectionChangedByUser signal is emitted. Each selectable object additionally emits an individual selectionChanged signal whenever their selection state has changed, i.e. not only by user interaction. - + To allow multiple objects to be selected by holding the selection modifier (\ref setMultiSelectModifier), set the flag \ref QCP::iMultiSelect. - + \note In addition to the selection mechanism presented here, QCustomPlot always emits corresponding signals, when an object is clicked or double clicked. see \ref plottableClick and \ref plottableDoubleClick for example. - + \see setInteraction, setSelectionTolerance */ void QCustomPlot::setInteractions(const QCP::Interactions &interactions) @@ -12867,9 +13121,9 @@ void QCustomPlot::setInteractions(const QCP::Interactions &interactions) /*! Sets the single \a interaction of this QCustomPlot to \a enabled. - + For details about the interaction system, see \ref setInteractions. - + \see setInteractions */ void QCustomPlot::setInteraction(const QCP::Interaction &interaction, bool enabled) @@ -12883,14 +13137,14 @@ void QCustomPlot::setInteraction(const QCP::Interaction &interaction, bool enabl /*! Sets the tolerance that is used to decide whether a click selects an object (e.g. a plottable) or not. - + If the user clicks in the vicinity of the line of e.g. a QCPGraph, it's only regarded as a potential selection when the minimum distance between the click position and the graph line is smaller than \a pixels. Objects that are defined by an area (e.g. QCPBars) only react to clicks directly inside the area and ignore this selection tolerance. In other words, it only has meaning for parts of objects that are too thin to exactly hit with a click and thus need such a tolerance. - + \see setInteractions, QCPLayerable::selectTest */ void QCustomPlot::setSelectionTolerance(int pixels) @@ -12904,7 +13158,7 @@ void QCustomPlot::setSelectionTolerance(int pixels) performance during dragging. Thus it creates a more responsive user experience. As soon as the user stops dragging, the last replot is done with normal antialiasing, to restore high image quality. - + \see setAntialiasedElements, setNotAntialiasedElements */ void QCustomPlot::setNoAntialiasingOnDrag(bool enabled) @@ -12914,7 +13168,7 @@ void QCustomPlot::setNoAntialiasingOnDrag(bool enabled) /*! Sets the plotting hints for this QCustomPlot instance as an \a or combination of QCP::PlottingHint. - + \see setPlottingHint */ void QCustomPlot::setPlottingHints(const QCP::PlottingHints &hints) @@ -12924,7 +13178,7 @@ void QCustomPlot::setPlottingHints(const QCP::PlottingHints &hints) /*! Sets the specified plotting \a hint to \a enabled. - + \see setPlottingHints */ void QCustomPlot::setPlottingHint(QCP::PlottingHint hint, bool enabled) @@ -12934,19 +13188,19 @@ void QCustomPlot::setPlottingHint(QCP::PlottingHint hint, bool enabled) newHints &= ~hint; else newHints |= hint; - + if (newHints != mPlottingHints) setPlottingHints(newHints); } /*! Sets the keyboard modifier that will be recognized as multi-select-modifier. - + If \ref QCP::iMultiSelect is specified in \ref setInteractions, the user may select multiple objects (or data points) by clicking on them one after the other while holding down \a modifier. - + By default the multi-select-modifier is set to Qt::ControlModifier. - + \see setInteractions */ void QCustomPlot::setMultiSelectModifier(Qt::KeyboardModifier modifier) @@ -12961,17 +13215,17 @@ void QCustomPlot::setMultiSelectModifier(Qt::KeyboardModifier modifier) example, QCPAxisRect may process a mouse drag by dragging axis ranges, see \ref QCPAxisRect::setRangeDrag. If \a mode is not \ref QCP::srmNone, the current selection rect (\ref selectionRect) becomes activated and allows e.g. rect zooming and data point selection. - + If you wish to provide your user both with axis range dragging and data selection/range zooming, use this method to switch between the modes just before the interaction is processed, e.g. in reaction to the \ref mousePress or \ref mouseMove signals. For example you could check whether the user is holding a certain keyboard modifier, and then decide which \a mode shall be set. - + If a selection rect interaction is currently active, and \a mode is set to \ref QCP::srmNone, the interaction is canceled (\ref QCPSelectionRect::cancel). Switching between any of the other modes will keep the selection rect active. Upon completion of the interaction, the behaviour is as defined by the currently set \a mode, not the mode that was set when the interaction started. - + \see setInteractions, setSelectionRect, QCPSelectionRect */ void QCustomPlot::setSelectionRectMode(QCP::SelectionRectMode mode) @@ -12980,20 +13234,20 @@ void QCustomPlot::setSelectionRectMode(QCP::SelectionRectMode mode) { if (mode == QCP::srmNone) mSelectionRect->cancel(); // when switching to none, we immediately want to abort a potentially active selection rect - + // disconnect old connections: if (mSelectionRectMode == QCP::srmSelect) disconnect(mSelectionRect, SIGNAL(accepted(QRect,QMouseEvent*)), this, SLOT(processRectSelection(QRect,QMouseEvent*))); else if (mSelectionRectMode == QCP::srmZoom) disconnect(mSelectionRect, SIGNAL(accepted(QRect,QMouseEvent*)), this, SLOT(processRectZoom(QRect,QMouseEvent*))); - + // establish new ones: if (mode == QCP::srmSelect) connect(mSelectionRect, SIGNAL(accepted(QRect,QMouseEvent*)), this, SLOT(processRectSelection(QRect,QMouseEvent*))); else if (mode == QCP::srmZoom) connect(mSelectionRect, SIGNAL(accepted(QRect,QMouseEvent*)), this, SLOT(processRectZoom(QRect,QMouseEvent*))); } - + mSelectionRectMode = mode; } @@ -13001,19 +13255,19 @@ void QCustomPlot::setSelectionRectMode(QCP::SelectionRectMode mode) Sets the \ref QCPSelectionRect instance that QCustomPlot will use if \a mode is not \ref QCP::srmNone and the user performs a click-and-drag interaction. QCustomPlot takes ownership of the passed \a selectionRect. It can be accessed later via \ref selectionRect. - + This method is useful if you wish to replace the default QCPSelectionRect instance with an instance of a QCPSelectionRect subclass, to introduce custom behaviour of the selection rect. - + \see setSelectionRectMode */ void QCustomPlot::setSelectionRect(QCPSelectionRect *selectionRect) { if (mSelectionRect) delete mSelectionRect; - + mSelectionRect = selectionRect; - + if (mSelectionRect) { // establish connections with new selection rect: @@ -13025,6 +13279,10 @@ void QCustomPlot::setSelectionRect(QCPSelectionRect *selectionRect) } /*! + \warning This is still an experimental feature and its performance depends on the system that it + runs on. Having multiple QCustomPlot widgets in one application with enabled OpenGL rendering + might cause context conflicts on some systems. + This method allows to enable OpenGL plot rendering, for increased plotting performance of graphically demanding plots (thick lines, translucent fills, etc.). @@ -13152,7 +13410,7 @@ void QCustomPlot::setBufferDevicePixelRatio(double ratio) enabled with \ref setBackgroundScaled and the scaling mode (whether and how the aspect ratio is preserved) can be set with \ref setBackgroundScaledMode. To set all these options in one call, consider using the overloaded version of this function. - + If a background brush was set with \ref setBackground(const QBrush &brush), the viewport will first be filled with that brush, before drawing the background pixmap. This can be useful for background pixmaps with translucent areas. @@ -13172,7 +13430,7 @@ void QCustomPlot::setBackground(const QPixmap &pm) was set with \ref setBackground(const QPixmap &pm), this brush will be used to fill the viewport before the background pixmap is drawn. This can be useful for background pixmaps with translucent areas. - + Set \a brush to Qt::NoBrush or Qt::Transparent to leave background transparent. This can be useful for exporting to image formats which support transparency, e.g. \ref savePng. @@ -13184,7 +13442,7 @@ void QCustomPlot::setBackground(const QBrush &brush) } /*! \overload - + Allows setting the background pixmap of the viewport, whether it shall be scaled and how it shall be scaled in one call. @@ -13202,10 +13460,10 @@ void QCustomPlot::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioM Sets whether the viewport background pixmap shall be scaled to fit the viewport. If \a scaled is set to true, control whether and how the aspect ratio of the original pixmap is preserved with \ref setBackgroundScaledMode. - + Note that the scaled version of the original pixmap is buffered, so there is no performance penalty on replots. (Except when the viewport dimensions are changed continuously.) - + \see setBackground, setBackgroundScaledMode */ void QCustomPlot::setBackgroundScaled(bool scaled) @@ -13216,7 +13474,7 @@ void QCustomPlot::setBackgroundScaled(bool scaled) /*! If scaling of the viewport background pixmap is enabled (\ref setBackgroundScaled), use this function to define whether and how the aspect ratio of the original pixmap is preserved. - + \see setBackground, setBackgroundScaled */ void QCustomPlot::setBackgroundScaledMode(Qt::AspectRatioMode mode) @@ -13226,10 +13484,10 @@ void QCustomPlot::setBackgroundScaledMode(Qt::AspectRatioMode mode) /*! Returns the plottable with \a index. If the index is invalid, returns 0. - + There is an overloaded version of this function with no parameter which returns the last added plottable, see QCustomPlot::plottable() - + \see plottableCount */ QCPAbstractPlottable *QCustomPlot::plottable(int index) @@ -13245,10 +13503,10 @@ QCPAbstractPlottable *QCustomPlot::plottable(int index) } /*! \overload - + Returns the last plottable that was added to the plot. If there are no plottables in the plot, returns 0. - + \see plottableCount */ QCPAbstractPlottable *QCustomPlot::plottable() @@ -13263,9 +13521,9 @@ QCPAbstractPlottable *QCustomPlot::plottable() /*! Removes the specified plottable from the plot and deletes it. If necessary, the corresponding legend item is also removed from the default legend (QCustomPlot::legend). - + Returns true on success. - + \see clearPlottables */ bool QCustomPlot::removePlottable(QCPAbstractPlottable *plottable) @@ -13275,7 +13533,7 @@ bool QCustomPlot::removePlottable(QCPAbstractPlottable *plottable) qDebug() << Q_FUNC_INFO << "plottable not in list:" << reinterpret_cast(plottable); return false; } - + // remove plottable from legend: plottable->removeFromLegend(); // special handling for QCPGraphs to maintain the simple graph interface: @@ -13288,7 +13546,7 @@ bool QCustomPlot::removePlottable(QCPAbstractPlottable *plottable) } /*! \overload - + Removes and deletes the plottable by its \a index. */ bool QCustomPlot::removePlottable(int index) @@ -13305,9 +13563,9 @@ bool QCustomPlot::removePlottable(int index) /*! Removes all plottables from the plot and deletes them. Corresponding legend items are also removed from the default legend (QCustomPlot::legend). - + Returns the number of plottables removed. - + \see removePlottable */ int QCustomPlot::clearPlottables() @@ -13320,7 +13578,7 @@ int QCustomPlot::clearPlottables() /*! Returns the number of currently existing plottables in the plot - + \see plottable */ int QCustomPlot::plottableCount() const @@ -13330,9 +13588,9 @@ int QCustomPlot::plottableCount() const /*! Returns a list of the selected plottables. If no plottables are currently selected, the list is empty. - + There is a convenience function if you're only interested in selected graphs, see \ref selectedGraphs. - + \see setInteractions, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelection */ QList QCustomPlot::selectedPlottables() const @@ -13350,19 +13608,19 @@ QList QCustomPlot::selectedPlottables() const Returns the plottable at the pixel position \a pos. Plottables that only consist of single lines (like graphs) have a tolerance band around them, see \ref setSelectionTolerance. If multiple plottables come into consideration, the one closest to \a pos is returned. - + If \a onlySelectable is true, only plottables that are selectable (QCPAbstractPlottable::setSelectable) are considered. - + If there is no plottable at \a pos, the return value is 0. - + \see itemAt, layoutElementAt */ QCPAbstractPlottable *QCustomPlot::plottableAt(const QPointF &pos, bool onlySelectable) const { QCPAbstractPlottable *resultPlottable = 0; double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value - + foreach (QCPAbstractPlottable *plottable, mPlottables) { if (onlySelectable && !plottable->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPabstractPlottable::selectable @@ -13377,7 +13635,7 @@ QCPAbstractPlottable *QCustomPlot::plottableAt(const QPointF &pos, bool onlySele } } } - + return resultPlottable; } @@ -13391,10 +13649,10 @@ bool QCustomPlot::hasPlottable(QCPAbstractPlottable *plottable) const /*! Returns the graph with \a index. If the index is invalid, returns 0. - + There is an overloaded version of this function with no parameter which returns the last created graph, see QCustomPlot::graph() - + \see graphCount, addGraph */ QCPGraph *QCustomPlot::graph(int index) const @@ -13410,10 +13668,10 @@ QCPGraph *QCustomPlot::graph(int index) const } /*! \overload - + Returns the last graph, that was created with \ref addGraph. If there are no graphs in the plot, returns 0. - + \see graphCount, addGraph */ QCPGraph *QCustomPlot::graph() const @@ -13429,12 +13687,12 @@ QCPGraph *QCustomPlot::graph() const Creates a new graph inside the plot. If \a keyAxis and \a valueAxis are left unspecified (0), the bottom (xAxis) is used as key and the left (yAxis) is used as value axis. If specified, \a keyAxis and \a valueAxis must reside in this QCustomPlot. - + \a keyAxis will be used as key axis (typically "x") and \a valueAxis as value axis (typically "y") for the graph. - + Returns a pointer to the newly created graph, or 0 if adding the graph failed. - + \see graph, graphCount, removeGraph, clearGraphs */ QCPGraph *QCustomPlot::addGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) @@ -13451,7 +13709,7 @@ QCPGraph *QCustomPlot::addGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) qDebug() << Q_FUNC_INFO << "passed keyAxis or valueAxis doesn't have this QCustomPlot as parent"; return 0; } - + QCPGraph *newGraph = new QCPGraph(keyAxis, valueAxis); newGraph->setName(QLatin1String("Graph ")+QString::number(mGraphs.size())); return newGraph; @@ -13462,9 +13720,9 @@ QCPGraph *QCustomPlot::addGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) legend item is also removed from the default legend (QCustomPlot::legend). If any other graphs in the plot have a channel fill set towards the removed graph, the channel fill property of those graphs is reset to zero (no channel fill). - + Returns true on success. - + \see clearGraphs */ bool QCustomPlot::removeGraph(QCPGraph *graph) @@ -13473,7 +13731,7 @@ bool QCustomPlot::removeGraph(QCPGraph *graph) } /*! \overload - + Removes and deletes the graph by its \a index. */ bool QCustomPlot::removeGraph(int index) @@ -13489,7 +13747,7 @@ bool QCustomPlot::removeGraph(int index) from the default legend (QCustomPlot::legend). Returns the number of graphs removed. - + \see removeGraph */ int QCustomPlot::clearGraphs() @@ -13502,7 +13760,7 @@ int QCustomPlot::clearGraphs() /*! Returns the number of currently existing graphs in the plot - + \see graph, addGraph */ int QCustomPlot::graphCount() const @@ -13512,10 +13770,10 @@ int QCustomPlot::graphCount() const /*! Returns a list of the selected graphs. If no graphs are currently selected, the list is empty. - + If you are not only interested in selected graphs but other plottables like QCPCurve, QCPBars, etc., use \ref selectedPlottables. - + \see setInteractions, selectedPlottables, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelection */ QList QCustomPlot::selectedGraphs() const @@ -13531,10 +13789,10 @@ QList QCustomPlot::selectedGraphs() const /*! Returns the item with \a index. If the index is invalid, returns 0. - + There is an overloaded version of this function with no parameter which returns the last added item, see QCustomPlot::item() - + \see itemCount */ QCPAbstractItem *QCustomPlot::item(int index) const @@ -13550,10 +13808,10 @@ QCPAbstractItem *QCustomPlot::item(int index) const } /*! \overload - + Returns the last item that was added to this plot. If there are no items in the plot, returns 0. - + \see itemCount */ QCPAbstractItem *QCustomPlot::item() const @@ -13567,9 +13825,9 @@ QCPAbstractItem *QCustomPlot::item() const /*! Removes the specified item from the plot and deletes it. - + Returns true on success. - + \see clearItems */ bool QCustomPlot::removeItem(QCPAbstractItem *item) @@ -13587,7 +13845,7 @@ bool QCustomPlot::removeItem(QCPAbstractItem *item) } /*! \overload - + Removes and deletes the item by its \a index. */ bool QCustomPlot::removeItem(int index) @@ -13603,9 +13861,9 @@ bool QCustomPlot::removeItem(int index) /*! Removes all items from the plot and deletes them. - + Returns the number of items removed. - + \see removeItem */ int QCustomPlot::clearItems() @@ -13618,7 +13876,7 @@ int QCustomPlot::clearItems() /*! Returns the number of currently existing items in the plot - + \see item */ int QCustomPlot::itemCount() const @@ -13628,7 +13886,7 @@ int QCustomPlot::itemCount() const /*! Returns a list of the selected items. If no items are currently selected, the list is empty. - + \see setInteractions, QCPAbstractItem::setSelectable, QCPAbstractItem::setSelected */ QList QCustomPlot::selectedItems() const @@ -13647,19 +13905,19 @@ QList QCustomPlot::selectedItems() const QCPItemLine or \ref QCPItemCurve) have a tolerance band around them, see \ref setSelectionTolerance. If multiple items come into consideration, the one closest to \a pos is returned. - + If \a onlySelectable is true, only items that are selectable (QCPAbstractItem::setSelectable) are considered. - + If there is no item at \a pos, the return value is 0. - + \see plottableAt, layoutElementAt */ QCPAbstractItem *QCustomPlot::itemAt(const QPointF &pos, bool onlySelectable) const { QCPAbstractItem *resultItem = 0; double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value - + foreach (QCPAbstractItem *item, mItems) { if (onlySelectable && !item->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPAbstractItem::selectable @@ -13674,13 +13932,13 @@ QCPAbstractItem *QCustomPlot::itemAt(const QPointF &pos, bool onlySelectable) co } } } - + return resultItem; } /*! Returns whether this QCustomPlot contains the \a item. - + \see item */ bool QCustomPlot::hasItem(QCPAbstractItem *item) const @@ -13691,9 +13949,9 @@ bool QCustomPlot::hasItem(QCPAbstractItem *item) const /*! Returns the layer with the specified \a name. If there is no layer with the specified name, 0 is returned. - + Layer names are case-sensitive. - + \see addLayer, moveLayer, removeLayer */ QCPLayer *QCustomPlot::layer(const QString &name) const @@ -13707,9 +13965,9 @@ QCPLayer *QCustomPlot::layer(const QString &name) const } /*! \overload - + Returns the layer by \a index. If the index is invalid, 0 is returned. - + \see addLayer, moveLayer, removeLayer */ QCPLayer *QCustomPlot::layer(int index) const @@ -13735,11 +13993,11 @@ QCPLayer *QCustomPlot::currentLayer() const /*! Sets the layer with the specified \a name to be the current layer. All layerables (\ref QCPLayerable), e.g. plottables and items, are created on the current layer. - + Returns true on success, i.e. if there is a layer with the specified \a name in the QCustomPlot. - + Layer names are case-sensitive. - + \see addLayer, moveLayer, removeLayer, QCPLayerable::setLayer */ bool QCustomPlot::setCurrentLayer(const QString &name) @@ -13755,11 +14013,11 @@ bool QCustomPlot::setCurrentLayer(const QString &name) } /*! \overload - + Sets the provided \a layer to be the current layer. - + Returns true on success, i.e. when \a layer is a valid layer in the QCustomPlot. - + \see addLayer, moveLayer, removeLayer */ bool QCustomPlot::setCurrentLayer(QCPLayer *layer) @@ -13769,14 +14027,14 @@ bool QCustomPlot::setCurrentLayer(QCPLayer *layer) qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast(layer); return false; } - + mCurrentLayer = layer; return true; } /*! Returns the number of currently existing layers in the plot - + \see layer, addLayer */ int QCustomPlot::layerCount() const @@ -13787,14 +14045,14 @@ int QCustomPlot::layerCount() const /*! Adds a new layer to this QCustomPlot instance. The new layer will have the name \a name, which must be unique. Depending on \a insertMode, it is positioned either below or above \a otherLayer. - + Returns true on success, i.e. if there is no other layer named \a name and \a otherLayer is a valid layer inside this QCustomPlot. - + If \a otherLayer is 0, the highest layer in the QCustomPlot will be used. - + For an explanation of what layers are in QCustomPlot, see the documentation of \ref QCPLayer. - + \see layer, moveLayer, removeLayer */ bool QCustomPlot::addLayer(const QString &name, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode) @@ -13811,7 +14069,7 @@ bool QCustomPlot::addLayer(const QString &name, QCPLayer *otherLayer, QCustomPlo qDebug() << Q_FUNC_INFO << "A layer exists already with the name" << name; return false; } - + QCPLayer *newLayer = new QCPLayer(this, name); mLayers.insert(otherLayer->index() + (insertMode==limAbove ? 1:0), newLayer); updateLayerIndices(); @@ -13821,16 +14079,16 @@ bool QCustomPlot::addLayer(const QString &name, QCPLayer *otherLayer, QCustomPlo /*! Removes the specified \a layer and returns true on success. - + All layerables (e.g. plottables and items) on the removed layer will be moved to the layer below \a layer. If \a layer is the bottom layer, the layerables are moved to the layer above. In both cases, the total rendering order of all layerables in the QCustomPlot is preserved. - + If \a layer is the current layer (\ref setCurrentLayer), the layer below (or above, if bottom layer) becomes the new current layer. - + It is not possible to remove the last layer of the plot. - + \see layer, addLayer, moveLayer */ bool QCustomPlot::removeLayer(QCPLayer *layer) @@ -13845,7 +14103,7 @@ bool QCustomPlot::removeLayer(QCPLayer *layer) qDebug() << Q_FUNC_INFO << "can't remove last layer"; return false; } - + // append all children of this layer to layer below (if this is lowest layer, prepend to layer above) int removedIndex = layer->index(); bool isFirstLayer = removedIndex==0; @@ -13876,10 +14134,10 @@ bool QCustomPlot::removeLayer(QCPLayer *layer) /*! Moves the specified \a layer either above or below \a otherLayer. Whether it's placed above or below is controlled with \a insertMode. - + Returns true on success, i.e. when both \a layer and \a otherLayer are valid layers in the QCustomPlot. - + \see layer, addLayer, moveLayer */ bool QCustomPlot::moveLayer(QCPLayer *layer, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode) @@ -13894,29 +14152,29 @@ bool QCustomPlot::moveLayer(QCPLayer *layer, QCPLayer *otherLayer, QCustomPlot:: qDebug() << Q_FUNC_INFO << "otherLayer not a layer of this QCustomPlot:" << reinterpret_cast(otherLayer); return false; } - + if (layer->index() > otherLayer->index()) mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 1:0)); else if (layer->index() < otherLayer->index()) mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 0:-1)); - + // invalidate the paint buffers that are responsible for the layers: if (!layer->mPaintBuffer.isNull()) layer->mPaintBuffer.data()->setInvalidated(); if (!otherLayer->mPaintBuffer.isNull()) otherLayer->mPaintBuffer.data()->setInvalidated(); - + updateLayerIndices(); return true; } /*! Returns the number of axis rects in the plot. - + All axis rects can be accessed via QCustomPlot::axisRect(). - + Initially, only one axis rect exists in the plot. - + \see axisRect, axisRects */ int QCustomPlot::axisRectCount() const @@ -13926,11 +14184,11 @@ int QCustomPlot::axisRectCount() const /*! Returns the axis rect with \a index. - + Initially, only one axis rect (with index 0) exists in the plot. If multiple axis rects were added, all of them may be accessed with this function in a linear fashion (even when they are nested in a layout hierarchy or inside other axis rects via QCPAxisRect::insetLayout). - + \see axisRectCount, axisRects */ QCPAxisRect *QCustomPlot::axisRect(int index) const @@ -13948,7 +14206,7 @@ QCPAxisRect *QCustomPlot::axisRect(int index) const /*! Returns all axis rects in the plot. - + \see axisRectCount, axisRect */ QList QCustomPlot::axisRects() const @@ -13957,7 +14215,7 @@ QList QCustomPlot::axisRects() const QStack elementStack; if (mPlotLayout) elementStack.push(mPlotLayout); - + while (!elementStack.isEmpty()) { foreach (QCPLayoutElement *element, elementStack.pop()->elements(false)) @@ -13970,17 +14228,17 @@ QList QCustomPlot::axisRects() const } } } - + return result; } /*! Returns the layout element at pixel position \a pos. If there is no element at that position, returns 0. - + Only visible elements are used. If \ref QCPLayoutElement::setVisible on the element itself or on any of its parent elements is set to false, it will not be considered. - + \see itemAt, plottableAt */ QCPLayoutElement *QCustomPlot::layoutElementAt(const QPointF &pos) const @@ -14039,7 +14297,7 @@ QCPAxisRect *QCustomPlot::axisRectAt(const QPointF &pos) const /*! Returns the axes that currently have selected parts, i.e. whose selection state is not \ref QCPAxis::spNone. - + \see selectedPlottables, selectedLegends, setInteractions, QCPAxis::setSelectedParts, QCPAxis::setSelectableParts */ @@ -14048,31 +14306,31 @@ QList QCustomPlot::selectedAxes() const QList result, allAxes; foreach (QCPAxisRect *rect, axisRects()) allAxes << rect->axes(); - + foreach (QCPAxis *axis, allAxes) { if (axis->selectedParts() != QCPAxis::spNone) result.append(axis); } - + return result; } /*! Returns the legends that currently have selected parts, i.e. whose selection state is not \ref QCPLegend::spNone. - + \see selectedPlottables, selectedAxes, setInteractions, QCPLegend::setSelectedParts, QCPLegend::setSelectableParts, QCPLegend::selectedItems */ QList QCustomPlot::selectedLegends() const { QList result; - + QStack elementStack; if (mPlotLayout) elementStack.push(mPlotLayout); - + while (!elementStack.isEmpty()) { foreach (QCPLayoutElement *subElement, elementStack.pop()->elements(false)) @@ -14088,17 +14346,17 @@ QList QCustomPlot::selectedLegends() const } } } - + return result; } /*! Deselects all layerables (plottables, items, axes, legends,...) of the QCustomPlot. - + Since calling this function is not a user interaction, this does not emit the \ref selectionChangedByUser signal. The individual selectionChanged signals are emitted though, if the objects were previously selected. - + \see setInteractions, selectedPlottables, selectedItems, selectedAxes, selectedLegends */ void QCustomPlot::deselectAll() @@ -14146,13 +14404,13 @@ void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority) } return; } - + if (mReplotting) // incase signals loop back to replot slot return; mReplotting = true; mReplotQueued = false; emit beforeReplot(); - + updateLayout(); // draw all layered objects (grid, axes, plottables, items, legend,...) into their buffers: setupPaintBuffers(); @@ -14160,22 +14418,22 @@ void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority) layer->drawToPaintBuffer(); for (int i=0; isetInvalidated(false); - + if ((refreshPriority == rpRefreshHint && mPlottingHints.testFlag(QCP::phImmediateRefresh)) || refreshPriority==rpImmediateRefresh) repaint(); else update(); - + emit afterReplot(); mReplotting = false; } /*! Rescales the axes such that all plottables (like graphs) in the plot are fully visible. - + if \a onlyVisiblePlottables is set to true, only the plottables that have their visibility set to true (QCPLayerable::setVisible), will be used to rescale the axes. - + \see QCPAbstractPlottable::rescaleAxes, QCPAxis::rescale */ void QCustomPlot::rescaleAxes(bool onlyVisiblePlottables) @@ -14183,7 +14441,7 @@ void QCustomPlot::rescaleAxes(bool onlyVisiblePlottables) QList allAxes; foreach (QCPAxisRect *rect, axisRects()) allAxes << rect->axes(); - + foreach (QCPAxis *axis, allAxes) axis->rescale(onlyVisiblePlottables); } @@ -14247,7 +14505,7 @@ bool QCustomPlot::savePdf(const QString &fileName, int width, int height, QCP::E newWidth = width; newHeight = height; } - + QPrinter printer(QPrinter::ScreenResolution); printer.setOutputFileName(fileName); printer.setOutputFormat(QPrinter::PdfFormat); @@ -14430,7 +14688,7 @@ bool QCustomPlot::saveBmp(const QString &fileName, int width, int height, double } /*! \internal - + Returns a minimum size hint that corresponds to the minimum size of the top level layout (\ref plotLayout). To prevent QCustomPlot from being collapsed to size/width zero, set a minimum size (setMinimumSize) either on the whole QCustomPlot or on any layout elements inside the plot. @@ -14439,21 +14697,21 @@ bool QCustomPlot::saveBmp(const QString &fileName, int width, int height, double */ QSize QCustomPlot::minimumSizeHint() const { - return mPlotLayout->minimumSizeHint(); + return mPlotLayout->minimumOuterSizeHint(); } /*! \internal - + Returns a size hint that is the same as \ref minimumSizeHint. - + */ QSize QCustomPlot::sizeHint() const { - return mPlotLayout->minimumSizeHint(); + return mPlotLayout->minimumOuterSizeHint(); } /*! \internal - + Event handler for when the QCustomPlot widget needs repainting. This does not cause a \ref replot, but draws the internal buffer on the widget surface. */ @@ -14473,7 +14731,7 @@ void QCustomPlot::paintEvent(QPaintEvent *event) } /*! \internal - + Event handler for a resize of the QCustomPlot widget. The viewport (which becomes the outer rect of mPlotLayout) is resized appropriately. Finally a \ref replot is performed. */ @@ -14486,12 +14744,12 @@ void QCustomPlot::resizeEvent(QResizeEvent *event) } /*! \internal - + Event handler for when a double click occurs. Emits the \ref mouseDoubleClick signal, then determines the layerable under the cursor and forwards the event to it. Finally, emits the specialized signals when certain objecs are clicked (e.g. \ref plottableDoubleClick, \ref axisDoubleClick, etc.). - + \see mousePressEvent, mouseReleaseEvent */ void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event) @@ -14499,7 +14757,7 @@ void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event) emit mouseDoubleClick(event); mMouseHasMoved = false; mMousePressPos = event->pos(); - + // determine layerable under the cursor (this event is called instead of the second press event in a double-click): QList details; QList candidates = layerableListAt(mMousePressPos, false, &details); @@ -14514,7 +14772,7 @@ void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event) break; } } - + // emit specialized object double click signals: if (!candidates.isEmpty()) { @@ -14533,17 +14791,17 @@ void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event) else if (QCPAbstractLegendItem *li = qobject_cast(candidates.first())) emit legendDoubleClick(li->parentLegend(), li, event); } - + event->accept(); // in case QCPLayerable reimplementation manipulates event accepted state. In QWidget event system, QCustomPlot wants to accept the event. } /*! \internal - + Event handler for when a mouse button is pressed. Emits the mousePress signal. If the current \ref setSelectionRectMode is not \ref QCP::srmNone, passes the event to the selection rect. Otherwise determines the layerable under the cursor and forwards the event to it. - + \see mouseMoveEvent, mouseReleaseEvent */ void QCustomPlot::mousePressEvent(QMouseEvent *event) @@ -14552,19 +14810,25 @@ void QCustomPlot::mousePressEvent(QMouseEvent *event) // save some state to tell in releaseEvent whether it was a click: mMouseHasMoved = false; mMousePressPos = event->pos(); - + if (mSelectionRect && mSelectionRectMode != QCP::srmNone) { if (mSelectionRectMode != QCP::srmZoom || qobject_cast(axisRectAt(mMousePressPos))) // in zoom mode only activate selection rect if on an axis rect mSelectionRect->startSelection(event); } else { - // no selection rect interaction, so forward event to layerable under the cursor: + // no selection rect interaction, prepare for click signal emission and forward event to layerable under the cursor: QList details; QList candidates = layerableListAt(mMousePressPos, false, &details); + if (!candidates.isEmpty()) + { + mMouseSignalLayerable = candidates.first(); // candidate for signal emission is always topmost hit layerable (signal emitted in release event) + mMouseSignalLayerableDetails = details.first(); + } + // forward event to topmost candidate which accepts the event: for (int i=0; iaccept(); // default impl of QCPLayerable's mouse events ignore the event, in that case propagate to next candidate in list + event->accept(); // default impl of QCPLayerable's mouse events call ignore() on the event, in that case propagate to next candidate in list candidates.at(i)->mousePressEvent(event, details.at(i)); if (event->isAccepted()) { @@ -14574,34 +14838,34 @@ void QCustomPlot::mousePressEvent(QMouseEvent *event) } } } - + event->accept(); // in case QCPLayerable reimplementation manipulates event accepted state. In QWidget event system, QCustomPlot wants to accept the event. } /*! \internal - + Event handler for when the cursor is moved. Emits the \ref mouseMove signal. If the selection rect (\ref setSelectionRect) is currently active, the event is forwarded to it in order to update the rect geometry. - + Otherwise, if a layout element has mouse capture focus (a mousePressEvent happened on top of the layout element before), the mouseMoveEvent is forwarded to that element. - + \see mousePressEvent, mouseReleaseEvent */ void QCustomPlot::mouseMoveEvent(QMouseEvent *event) { emit mouseMove(event); - + if (!mMouseHasMoved && (mMousePressPos-event->pos()).manhattanLength() > 3) mMouseHasMoved = true; // moved too far from mouse press position, don't handle as click on mouse release - + if (mSelectionRect && mSelectionRect->isActive()) mSelectionRect->moveSelection(event); else if (mMouseEventLayerable) // call event of affected layerable: mMouseEventLayerable->mouseMoveEvent(event, mMousePressPos); - + event->accept(); // in case QCPLayerable reimplementation manipulates event accepted state. In QWidget event system, QCustomPlot wants to accept the event. } @@ -14622,31 +14886,32 @@ void QCustomPlot::mouseMoveEvent(QMouseEvent *event) void QCustomPlot::mouseReleaseEvent(QMouseEvent *event) { emit mouseRelease(event); - + if (!mMouseHasMoved) // mouse hasn't moved (much) between press and release, so handle as click { if (mSelectionRect && mSelectionRect->isActive()) // a simple click shouldn't successfully finish a selection rect, so cancel it here mSelectionRect->cancel(); if (event->button() == Qt::LeftButton) processPointSelection(event); - + // emit specialized click signals of QCustomPlot instance: - if (QCPAbstractPlottable *ap = qobject_cast(mMouseEventLayerable)) + if (QCPAbstractPlottable *ap = qobject_cast(mMouseSignalLayerable)) { int dataIndex = 0; - if (!mMouseEventLayerableDetails.value().isEmpty()) - dataIndex = mMouseEventLayerableDetails.value().dataRange().begin(); + if (!mMouseSignalLayerableDetails.value().isEmpty()) + dataIndex = mMouseSignalLayerableDetails.value().dataRange().begin(); emit plottableClick(ap, dataIndex, event); - } else if (QCPAxis *ax = qobject_cast(mMouseEventLayerable)) - emit axisClick(ax, mMouseEventLayerableDetails.value(), event); - else if (QCPAbstractItem *ai = qobject_cast(mMouseEventLayerable)) + } else if (QCPAxis *ax = qobject_cast(mMouseSignalLayerable)) + emit axisClick(ax, mMouseSignalLayerableDetails.value(), event); + else if (QCPAbstractItem *ai = qobject_cast(mMouseSignalLayerable)) emit itemClick(ai, event); - else if (QCPLegend *lg = qobject_cast(mMouseEventLayerable)) + else if (QCPLegend *lg = qobject_cast(mMouseSignalLayerable)) emit legendClick(lg, 0, event); - else if (QCPAbstractLegendItem *li = qobject_cast(mMouseEventLayerable)) + else if (QCPAbstractLegendItem *li = qobject_cast(mMouseSignalLayerable)) emit legendClick(li->parentLegend(), li, event); + mMouseSignalLayerable = 0; } - + if (mSelectionRect && mSelectionRect->isActive()) // Note: if a click was detected above, the selection rect is canceled there { // finish selection rect, the appropriate action will be taken via signal-slot connection: @@ -14660,10 +14925,10 @@ void QCustomPlot::mouseReleaseEvent(QMouseEvent *event) mMouseEventLayerable = 0; } } - + if (noAntialiasingOnDrag()) replot(rpQueuedReplot); - + event->accept(); // in case QCPLayerable reimplementation manipulates event accepted state. In QWidget event system, QCustomPlot wants to accept the event. } @@ -14688,7 +14953,7 @@ void QCustomPlot::wheelEvent(QWheelEvent *event) } /*! \internal - + This function draws the entire plot, including background pixmap, with the specified \a painter. It does not make use of the paint buffers like \ref replot, so this is the function typically used by saving/exporting methods such as \ref savePdf or \ref toPainter. @@ -14700,14 +14965,14 @@ void QCustomPlot::wheelEvent(QWheelEvent *event) void QCustomPlot::draw(QCPPainter *painter) { updateLayout(); - + // draw viewport background pixmap: drawBackground(painter); // draw all layered objects (grid, axes, plottables, items, legend,...): foreach (QCPLayer *layer, mLayers) layer->draw(painter); - + /* Debug code to draw all layout element rects foreach (QCPLayoutElement* el, findChildren()) { @@ -14737,9 +15002,9 @@ void QCustomPlot::updateLayout() } /*! \internal - + Draws the viewport background pixmap of the plot. - + If a pixmap was provided via \ref setBackground, this function buffers the scaled version depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside the viewport with the provided \a painter. The scaled version is buffered in @@ -14747,10 +15012,10 @@ void QCustomPlot::updateLayout() the axis rect has changed in a way that requires a rescale of the background pixmap (this is dependent on the \ref setBackgroundScaledMode), or when a differend axis background pixmap was set. - + Note that this function does not draw a fill with the background brush (\ref setBackground(const QBrush &brush)) beneath the pixmap. - + \see setBackground, setBackgroundScaled, setBackgroundScaledMode */ void QCustomPlot::drawBackground(QCPPainter *painter) @@ -14799,7 +15064,7 @@ void QCustomPlot::setupPaintBuffers() int bufferIndex = 0; if (mPaintBuffers.isEmpty()) mPaintBuffers.append(QSharedPointer(createPaintBuffer())); - + for (int layerIndex = 0; layerIndex < mLayers.size(); ++layerIndex) { QCPLayer *layer = mLayers.at(layerIndex); @@ -14958,7 +15223,7 @@ void QCustomPlot::freeOpenGl() } /*! \internal - + This method is used by \ref QCPAxisRect::removeAxis to report removed axes to the QCustomPlot so it may clear its QCustomPlot::xAxis, yAxis, xAxis2 and yAxis2 members accordingly. */ @@ -14972,12 +15237,12 @@ void QCustomPlot::axisRemoved(QCPAxis *axis) yAxis = 0; if (yAxis2 == axis) yAxis2 = 0; - + // Note: No need to take care of range drag axes and range zoom axes, because they are stored in smart pointers } /*! \internal - + This method is used by the QCPLegend destructor to report legend removal to the QCustomPlot so it may clear its QCustomPlot::legend member accordingly. */ @@ -14988,7 +15253,7 @@ void QCustomPlot::legendRemoved(QCPLegend *legend) } /*! \internal - + This slot is connected to the selection rect's \ref QCPSelectionRect::accepted signal when \ref setSelectionRectMode is set to \ref QCP::srmSelect. @@ -14996,18 +15261,18 @@ void QCustomPlot::legendRemoved(QCPLegend *legend) point of the selection. Then it goes through the plottables (\ref QCPAbstractPlottable1D to be precise) associated with that axis rect and finds the data points that are in \a rect. It does this by querying their \ref QCPAbstractPlottable1D::selectTestRect method. - + Then, the actual selection is done by calling the plottables' \ref QCPAbstractPlottable::selectEvent, placing the found selected data points in the \a details parameter as QVariant(\ref QCPDataSelection). All plottables that weren't touched by \a rect receive a \ref QCPAbstractPlottable::deselectEvent. - + \see processRectZoom */ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) { bool selectionStateChanged = false; - + if (mInteractions.testFlag(QCP::iSelectPlottables)) { QMap > potentialSelections; // map key is number of selected data points, so we have selections sorted by size @@ -15024,7 +15289,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) potentialSelections.insertMulti(dataSel.dataPointCount(), QPair(plottable, dataSel)); } } - + if (!mInteractions.testFlag(QCP::iMultiSelect)) { // only leave plottable with most selected points in map, since we will only select a single plottable: @@ -15035,7 +15300,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) it = potentialSelections.erase(it); } } - + bool additive = event->modifiers().testFlag(mMultiSelectModifier); // deselect all other layerables if not additive selection: if (!additive) @@ -15054,7 +15319,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) } } } - + // go through selections in reverse (largest selection first) and emit select events: QMap >::const_iterator it = potentialSelections.constEnd(); while (it != potentialSelections.constBegin()) @@ -15069,7 +15334,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) } } } - + if (selectionStateChanged) { emit selectionChangedByUser(); @@ -15079,14 +15344,14 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) } /*! \internal - + This slot is connected to the selection rect's \ref QCPSelectionRect::accepted signal when \ref setSelectionRectMode is set to \ref QCP::srmZoom. It determines which axis rect was the origin of the selection rect judging by the starting point of the selection, and then zooms the axes defined via \ref QCPAxisRect::setRangeZoomAxes to the provided \a rect (see \ref QCPAxisRect::zoom). - + \see processRectSelection */ void QCustomPlot::processRectZoom(QRect rect, QMouseEvent *event) @@ -15155,14 +15420,14 @@ void QCustomPlot::processPointSelection(QMouseEvent *event) } /*! \internal - + Registers the specified plottable with this QCustomPlot and, if \ref setAutoAddPlottableToLegend is enabled, adds it to the legend (QCustomPlot::legend). QCustomPlot takes ownership of the plottable. - + Returns true on success, i.e. when \a plottable isn't already in this plot and the parent plot of \a plottable is this QCustomPlot. - + This method is called automatically in the QCPAbstractPlottable base class constructor. */ bool QCustomPlot::registerPlottable(QCPAbstractPlottable *plottable) @@ -15177,7 +15442,7 @@ bool QCustomPlot::registerPlottable(QCPAbstractPlottable *plottable) qDebug() << Q_FUNC_INFO << "plottable not created with this QCustomPlot as parent:" << reinterpret_cast(plottable); return false; } - + mPlottables.append(plottable); // possibly add plottable to legend: if (mAutoAddPlottableToLegend) @@ -15188,11 +15453,11 @@ bool QCustomPlot::registerPlottable(QCPAbstractPlottable *plottable) } /*! \internal - + In order to maintain the simplified graph interface of QCustomPlot, this method is called by the QCPGraph constructor to register itself with this QCustomPlot's internal graph list. Returns true on success, i.e. if \a graph is valid and wasn't already registered with this QCustomPlot. - + This graph specific registration happens in addition to the call to \ref registerPlottable by the QCPAbstractPlottable base class. */ @@ -15208,7 +15473,7 @@ bool QCustomPlot::registerGraph(QCPGraph *graph) qDebug() << Q_FUNC_INFO << "graph already registered with this QCustomPlot"; return false; } - + mGraphs.append(graph); return true; } @@ -15217,10 +15482,10 @@ bool QCustomPlot::registerGraph(QCPGraph *graph) /*! \internal Registers the specified item with this QCustomPlot. QCustomPlot takes ownership of the item. - + Returns true on success, i.e. when \a item wasn't already in the plot and the parent plot of \a item is this QCustomPlot. - + This method is called automatically in the QCPAbstractItem base class constructor. */ bool QCustomPlot::registerItem(QCPAbstractItem *item) @@ -15235,7 +15500,7 @@ bool QCustomPlot::registerItem(QCPAbstractItem *item) qDebug() << Q_FUNC_INFO << "item not created with this QCustomPlot as parent:" << reinterpret_cast(item); return false; } - + mItems.append(item); if (!item->layer()) // usually the layer is already set in the constructor of the item (via QCPLayerable constructor) item->setLayer(currentLayer()); @@ -15243,7 +15508,7 @@ bool QCustomPlot::registerItem(QCPAbstractItem *item) } /*! \internal - + Assigns all layers their index (QCPLayer::mIndex) in the mLayers list. This method is thus called after every operation that changes the layer indices, like layer removal, layer creation, layer moving. @@ -15266,7 +15531,7 @@ void QCustomPlot::updateLayerIndices() const information about which part of the layerable was hit, in multi-part layerables (e.g. QCPAxis::SelectablePart). If the layerable is a plottable, \a selectionDetails contains a \ref QCPDataSelection instance with the single data point which is closest to \a pos. - + \see layerableListAt, layoutElementAt, axisRectAt */ QCPLayerable *QCustomPlot::layerableAt(const QPointF &pos, bool onlySelectable, QVariant *selectionDetails) const @@ -15296,7 +15561,7 @@ QCPLayerable *QCustomPlot::layerableAt(const QPointF &pos, bool onlySelectable, information about which part of the layerable was hit, in multi-part layerables (e.g. QCPAxis::SelectablePart). If the layerable is a plottable, \a selectionDetails contains a \ref QCPDataSelection instance with the single data point which is closest to \a pos. - + \see layerableAt, layoutElementAt, axisRectAt */ QList QCustomPlot::layerableListAt(const QPointF &pos, bool onlySelectable, QList *selectionDetails) const @@ -15343,7 +15608,7 @@ QList QCustomPlot::layerableListAt(const QPointF &pos, bool onlyS bool QCustomPlot::saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality, int resolution, QCP::ResolutionUnit resolutionUnit) { QImage buffer = toPixmap(width, height, scale).toImage(); - + int dotsPerMeter = 0; switch (resolutionUnit) { @@ -15361,10 +15626,10 @@ bool QCustomPlot::saveRastered(const QString &fileName, int width, int height, d /*! Renders the plot to a pixmap and returns it. - + The plot is sized to \a width and \a height in pixels and scaled with \a scale. (width 100 and scale 2.0 lead to a full resolution pixmap with width 200.) - + \see toPainter, saveRastered, saveBmp, savePng, saveJpg, savePdf */ QPixmap QCustomPlot::toPixmap(int width, int height, double scale) @@ -15413,14 +15678,14 @@ QPixmap QCustomPlot::toPixmap(int width, int height, double scale) /*! Renders the plot using the passed \a painter. - + The plot is sized to \a width and \a height in pixels. If the \a painter's scale is not 1.0, the resulting plot will appear scaled accordingly. - + \note If you are restricted to using a QPainter (instead of QCPPainter), create a temporary QPicture and open a QCPPainter on it. Then call \ref toPainter with this QCPPainter. After ending the paint operation on the picture, draw it with the QPainter. This will reproduce the painter actions the QCPPainter took, with a QPainter. - + \see toPixmap */ void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) @@ -15454,7 +15719,7 @@ void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) //amalgamation: add plottable1d.cpp /* including file 'src/colorgradient.cpp', size 24646 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -15463,7 +15728,7 @@ void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) /*! \class QCPColorGradient \brief Defines a color gradient for use with e.g. \ref QCPColorMap - + This class describes a color gradient which can be used to encode data with color. For example, QCPColorMap and QCPColorScale have \ref QCPColorMap::setGradient "setGradient" methods which take an instance of this class. Colors are set with \ref setColorStopAt(double position, const QColor &color) @@ -15472,18 +15737,18 @@ void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) Alternatively, load one of the preset color gradients shown in the image below, with \ref loadPreset, or by directly specifying the preset in the constructor. - + Apart from red, green and blue components, the gradient also interpolates the alpha values of the configured color stops. This allows to display some portions of the data range as transparent in the plot. - + \image html QCPColorGradient.png - + The \ref QCPColorGradient(GradientPreset preset) constructor allows directly converting a \ref GradientPreset to a QCPColorGradient. This means that you can directly pass \ref GradientPreset to all the \a setGradient methods, e.g.: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorgradient-setgradient - + The total number of levels used in the gradient can be set with \ref setLevelCount. Whether the color gradient shall be applied periodically (wrapping around) to data values that lie outside the data range specified on the plottable instance can be controlled with \ref setPeriodic. @@ -15553,11 +15818,11 @@ void QCPColorGradient::setLevelCount(int n) Sets at which positions from 0 to 1 which color shall occur. The positions are the keys, the colors are the values of the passed QMap \a colorStops. In between these color stops, the color is interpolated according to \ref setColorInterpolation. - + A more convenient way to create a custom gradient may be to clear all color stops with \ref clearColorStops (or creating a new, empty QCPColorGradient) and then adding them one by one with \ref setColorStopAt. - + \see clearColorStops */ void QCPColorGradient::setColorStops(const QMap &colorStops) @@ -15569,7 +15834,7 @@ void QCPColorGradient::setColorStops(const QMap &colorStops) /*! Sets the \a color the gradient will have at the specified \a position (from 0 to 1). In between these color stops, the color is interpolated according to \ref setColorInterpolation. - + \see setColorStops, clearColorStops */ void QCPColorGradient::setColorStopAt(double position, const QColor &color) @@ -15581,7 +15846,7 @@ void QCPColorGradient::setColorStopAt(double position, const QColor &color) /*! Sets whether the colors in between the configured color stops (see \ref setColorStopAt) shall be interpolated linearly in RGB or in HSV color space. - + For example, a sweep in RGB space from red to green will have a muddy brown intermediate color, whereas in HSV space the intermediate color is yellow. */ @@ -15598,13 +15863,13 @@ void QCPColorGradient::setColorInterpolation(QCPColorGradient::ColorInterpolatio Sets whether data points that are outside the configured data range (e.g. \ref QCPColorMap::setDataRange) are colored by periodically repeating the color gradient or whether they all have the same color, corresponding to the respective gradient boundary color. - + \image html QCPColorGradient-periodic.png - + As shown in the image above, gradients that have the same start and end color are especially suitable for a periodic gradient mapping, since they produce smooth color transitions throughout the color map. A preset that has this property is \ref gpHues. - + In practice, using periodic color gradients makes sense when the data corresponds to a periodic dimension, such as an angle or a phase. If this is not the case, the color encoding might become ambiguous, because multiple different data values are shown as the same color. @@ -15615,7 +15880,7 @@ void QCPColorGradient::setPeriodic(bool enabled) } /*! \overload - + This method is used to quickly convert a \a data array to colors. The colors will be output in the array \a scanLine. Both \a data and \a scanLine must have the length \a n when passed to this function. The data range that shall be used for mapping the data value to the gradient is passed @@ -15626,7 +15891,7 @@ void QCPColorGradient::setPeriodic(bool enabled) set \a dataIndexFactor to columnCount to convert a column instead of a row of the data array, in \a scanLine. \a scanLine will remain a regular (1D) array. This works because \a data is addressed data[i*dataIndexFactor]. - + Use the overloaded method to additionally provide alpha map data. The QRgb values that are placed in \a scanLine have their r, g and b components premultiplied @@ -15647,7 +15912,7 @@ void QCPColorGradient::colorize(const double *data, const QCPRange &range, QRgb } if (mColorBufferInvalidated) updateColorBuffer(); - + if (!logarithmic) { const double posToIndexFactor = (mLevelCount-1)/range.size(); @@ -15726,7 +15991,7 @@ void QCPColorGradient::colorize(const double *data, const unsigned char *alpha, } if (mColorBufferInvalidated) updateColorBuffer(); - + if (!logarithmic) { const double posToIndexFactor = (mLevelCount-1)/range.size(); @@ -15849,7 +16114,7 @@ QRgb QCPColorGradient::color(double position, const QCPRange &range, bool logari /*! Clears the current color stops and loads the specified \a preset. A preset consists of predefined color stops and the corresponding color interpolation method. - + The available presets are: \image html QCPColorGradient.png */ @@ -15959,7 +16224,7 @@ void QCPColorGradient::loadPreset(GradientPreset preset) /*! Clears all color stops. - + \see setColorStops, setColorStopAt */ void QCPColorGradient::clearColorStops() @@ -15971,7 +16236,7 @@ void QCPColorGradient::clearColorStops() /*! Returns an inverted gradient. The inverted gradient has all properties as this \ref QCPColorGradient, but the order of the color stops is inverted. - + \see setColorStops, setColorStopAt */ QCPColorGradient QCPColorGradient::inverted() const @@ -15984,7 +16249,7 @@ QCPColorGradient QCPColorGradient::inverted() const } /*! \internal - + Returns true if the color gradient uses transparency, i.e. if any of the configured color stops has an alpha value below 255. */ @@ -15999,7 +16264,7 @@ bool QCPColorGradient::stopsUseAlpha() const } /*! \internal - + Updates the internal color buffer which will be used by \ref colorize and \ref color, to quickly convert positions to colors. This is where the interpolation between color stops is calculated. */ @@ -16094,7 +16359,7 @@ void QCPColorGradient::updateColorBuffer() /* including file 'src/selectiondecorator-bracket.cpp', size 12313 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPSelectionDecoratorBracket @@ -16102,15 +16367,15 @@ void QCPColorGradient::updateColorBuffer() /*! \class QCPSelectionDecoratorBracket \brief A selection decorator which draws brackets around each selected data segment - + Additionally to the regular highlighting of selected segments via color, fill and scatter style, this \ref QCPSelectionDecorator subclass draws markers at the begin and end of each selected data segment of the plottable. - + The shape of the markers can be controlled with \ref setBracketStyle, \ref setBracketWidth and \ref setBracketHeight. The color/fill can be controlled with \ref setBracketPen and \ref setBracketBrush. - + To introduce custom bracket styles, it is only necessary to sublcass \ref QCPSelectionDecoratorBracket and reimplement \ref drawBracket. The rest will be managed by the base class. @@ -16128,7 +16393,7 @@ QCPSelectionDecoratorBracket::QCPSelectionDecoratorBracket() : mTangentToData(false), mTangentAverage(2) { - + } QCPSelectionDecoratorBracket::~QCPSelectionDecoratorBracket() @@ -16175,7 +16440,7 @@ void QCPSelectionDecoratorBracket::setBracketHeight(int height) /*! Sets the shape that the bracket/marker will have. - + \see setBracketWidth, setBracketHeight */ void QCPSelectionDecoratorBracket::setBracketStyle(QCPSelectionDecoratorBracket::BracketStyle style) @@ -16186,7 +16451,7 @@ void QCPSelectionDecoratorBracket::setBracketStyle(QCPSelectionDecoratorBracket: /*! Sets whether the brackets will be rotated such that they align with the slope of the data at the position that they appear in. - + For noisy data, it might be more visually appealing to average the slope over multiple data points. This can be configured via \ref setTangentAverage. */ @@ -16198,7 +16463,7 @@ void QCPSelectionDecoratorBracket::setTangentToData(bool enabled) /*! Controls over how many data points the slope shall be averaged, when brackets shall be aligned with the data (if \ref setTangentToData is true). - + From the position of the bracket, \a pointCount points towards the selected data range will be taken into account. The smallest value of \a pointCount is 1, which is effectively equivalent to disabling \ref setTangentToData. @@ -16214,11 +16479,11 @@ void QCPSelectionDecoratorBracket::setTangentAverage(int pointCount) Draws the bracket shape with \a painter. The parameter \a direction is either -1 or 1 and indicates whether the bracket shall point to the left or the right (i.e. is a closing or opening bracket, respectively). - + The passed \a painter already contains all transformations that are necessary to position and rotate the bracket appropriately. Painting operations can be performed as if drawing upright brackets on flat data with horizontal key axis, with (0, 0) being the center of the bracket. - + If you wish to sublcass \ref QCPSelectionDecoratorBracket in order to provide custom bracket shapes (see \ref QCPSelectionDecoratorBracket::bsUserStyle), this is the method you should reimplement. @@ -16261,15 +16526,15 @@ void QCPSelectionDecoratorBracket::drawBracket(QCPPainter *painter, int directio /*! Draws the bracket decoration on the data points at the begin and end of each selected data segment given in \a seletion. - + It uses the method \ref drawBracket to actually draw the shapes. - + \seebaseclassmethod */ void QCPSelectionDecoratorBracket::drawDecoration(QCPPainter *painter, QCPDataSelection selection) { if (!mPlottable || selection.isEmpty()) return; - + if (QCPPlottableInterface1D *interface1d = mPlottable->interface1D()) { foreach (const QCPDataRange &dataRange, selection.dataRanges()) @@ -16306,16 +16571,16 @@ void QCPSelectionDecoratorBracket::drawDecoration(QCPPainter *painter, QCPDataSe } /*! \internal - + If \ref setTangentToData is enabled, brackets need to be rotated according to the data slope. This method returns the angle in radians by which a bracket at the given \a dataIndex must be rotated. - + The parameter \a direction must be set to either -1 or 1, representing whether it is an opening or closing bracket. Since for slope calculation multiple data points are required, this defines the direction in which the algorithm walks, starting at \a dataIndex, to average those data points. (see \ref setTangentToData and \ref setTangentAverage) - + \a interface1d is the interface to the plottable's data which is used to query data coordinates. */ double QCPSelectionDecoratorBracket::getTangentAngle(const QCPPlottableInterface1D *interface1d, int dataIndex, int direction) const @@ -16323,7 +16588,7 @@ double QCPSelectionDecoratorBracket::getTangentAngle(const QCPPlottableInterface if (!interface1d || dataIndex < 0 || dataIndex >= interface1d->dataCount()) return 0; direction = direction < 0 ? -1 : 1; // enforce direction is either -1 or 1 - + // how many steps we can actually go from index in the given direction without exceeding data bounds: int averageCount; if (direction < 0) @@ -16342,7 +16607,7 @@ double QCPSelectionDecoratorBracket::getTangentAngle(const QCPPlottableInterface currentIndex += direction; } pointsAverage /= (double)averageCount; - + // calculate slope of linear regression through points: double numSum = 0; double denomSum = 0; @@ -16361,7 +16626,7 @@ double QCPSelectionDecoratorBracket::getTangentAngle(const QCPPlottableInterface } /*! \internal - + Returns the pixel coordinates of the data point at \a dataIndex, using \a interface1d to access the data points. */ @@ -16370,7 +16635,7 @@ QPointF QCPSelectionDecoratorBracket::getPixelCoordinates(const QCPPlottableInte QCPAxis *keyAxis = mPlottable->keyAxis(); QCPAxis *valueAxis = mPlottable->valueAxis(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(0, 0); } - + if (keyAxis->orientation() == Qt::Horizontal) return QPointF(keyAxis->coordToPixel(interface1d->dataMainKey(dataIndex)), valueAxis->coordToPixel(interface1d->dataMainValue(dataIndex))); else @@ -16379,8 +16644,8 @@ QPointF QCPSelectionDecoratorBracket::getPixelCoordinates(const QCPPlottableInte /* end of 'src/selectiondecorator-bracket.cpp' */ -/* including file 'src/layoutelements/layoutelement-axisrect.cpp', size 47509 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-axisrect.cpp', size 47584 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -16389,36 +16654,36 @@ QPointF QCPSelectionDecoratorBracket::getPixelCoordinates(const QCPPlottableInte /*! \class QCPAxisRect \brief Holds multiple axes and arranges them in a rectangular shape. - + This class represents an axis rect, a rectangular area that is bounded on all sides with an arbitrary number of axes. - + Initially QCustomPlot has one axis rect, accessible via QCustomPlot::axisRect(). However, the layout system allows to have multiple axis rects, e.g. arranged in a grid layout (QCustomPlot::plotLayout). - + By default, QCPAxisRect comes with four axes, at bottom, top, left and right. They can be accessed via \ref axis by providing the respective axis type (\ref QCPAxis::AxisType) and index. If you need all axes in the axis rect, use \ref axes. The top and right axes are set to be invisible initially (QCPAxis::setVisible). To add more axes to a side, use \ref addAxis or \ref addAxes. To remove an axis, use \ref removeAxis. - + The axis rect layerable itself only draws a background pixmap or color, if specified (\ref setBackground). It is placed on the "background" layer initially (see \ref QCPLayer for an explanation of the QCustomPlot layer system). The axes that are held by the axis rect can be placed on other layers, independently of the axis rect. - + Every axis rect has a child layout of type \ref QCPLayoutInset. It is accessible via \ref insetLayout and can be used to have other layout elements (or even other layouts with multiple elements) hovering inside the axis rect. - + If an axis rect is clicked and dragged, it processes this by moving certain axis ranges. The behaviour can be controlled with \ref setRangeDrag and \ref setRangeDragAxes. If the mouse wheel is scrolled while the cursor is on the axis rect, certain axes are scaled. This is controllable via \ref setRangeZoom, \ref setRangeZoomAxes and \ref setRangeZoomFactor. These interactions are only enabled if \ref QCustomPlot::setInteractions contains \ref QCP::iRangeDrag and \ref QCP::iRangeZoom. - + \image html AxisRectSpacingOverview.png
Overview of the spacings and paddings that define the geometry of an axis. The dashed line on the far left indicates the viewport/widget border.
@@ -16427,81 +16692,81 @@ QPointF QCPSelectionDecoratorBracket::getPixelCoordinates(const QCPPlottableInte /* start documentation of inline functions */ /*! \fn QCPLayoutInset *QCPAxisRect::insetLayout() const - + Returns the inset layout of this axis rect. It can be used to place other layout elements (or even layouts with multiple other elements) inside/on top of an axis rect. - + \see QCPLayoutInset */ /*! \fn int QCPAxisRect::left() const - + Returns the pixel position of the left border of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn int QCPAxisRect::right() const - + Returns the pixel position of the right border of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn int QCPAxisRect::top() const - + Returns the pixel position of the top border of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn int QCPAxisRect::bottom() const - + Returns the pixel position of the bottom border of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn int QCPAxisRect::width() const - + Returns the pixel width of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn int QCPAxisRect::height() const - + Returns the pixel height of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QSize QCPAxisRect::size() const - + Returns the pixel size of this axis rect. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QPoint QCPAxisRect::topLeft() const - + Returns the top left corner of this axis rect in pixels. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QPoint QCPAxisRect::topRight() const - + Returns the top right corner of this axis rect in pixels. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QPoint QCPAxisRect::bottomLeft() const - + Returns the bottom left corner of this axis rect in pixels. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QPoint QCPAxisRect::bottomRight() const - + Returns the bottom right corner of this axis rect in pixels. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ /*! \fn QPoint QCPAxisRect::center() const - + Returns the center of this axis rect in pixels. Margins are not taken into account here, so the returned value is with respect to the inner \ref rect. */ @@ -16527,14 +16792,14 @@ QCPAxisRect::QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes) : mInsetLayout->initializeParentPlot(mParentPlot); mInsetLayout->setParentLayerable(this); mInsetLayout->setParent(this); - + setMinimumSize(50, 50); setMinimumMargins(QMargins(15, 15, 15, 15)); mAxes.insert(QCPAxis::atLeft, QList()); mAxes.insert(QCPAxis::atRight, QList()); mAxes.insert(QCPAxis::atTop, QList()); mAxes.insert(QCPAxis::atBottom, QList()); - + if (setupDefaultAxes) { QCPAxis *xAxis = addAxis(QCPAxis::atBottom); @@ -16560,7 +16825,7 @@ QCPAxisRect::~QCPAxisRect() { delete mInsetLayout; mInsetLayout = 0; - + QList axesList = axes(); for (int i=0; ior-combination, to get the axes of multiple sides. - + \see axis */ QList QCPAxisRect::axes(QCPAxis::AxisTypes types) const @@ -16617,7 +16882,7 @@ QList QCPAxisRect::axes(QCPAxis::AxisTypes types) const } /*! \overload - + Returns all axes of this axis rect. */ QList QCPAxisRect::axes() const @@ -16637,7 +16902,7 @@ QList QCPAxisRect::axes() const new QCPAxis instance is created internally. QCustomPlot owns the returned axis, so if you want to remove an axis, use \ref removeAxis instead of deleting it manually. - You may inject QCPAxis instances (or sublasses of QCPAxis) by setting \a axis to an axis that was + You may inject QCPAxis instances (or subclasses of QCPAxis) by setting \a axis to an axis that was previously created outside QCustomPlot. It is important to note that QCustomPlot takes ownership of the axis, so you may not delete it afterwards. Further, the \a axis must have been created with this axis rect as parent and with the same axis type as specified in \a type. If this is not @@ -16683,7 +16948,7 @@ QCPAxis *QCPAxisRect::addAxis(QCPAxis::AxisType type, QCPAxis *axis) newAxis->setUpperEnding(QCPLineEnding(QCPLineEnding::esHalfBar, 6, 10, invert)); } mAxes[type].append(newAxis); - + // reset convenience axis pointers on parent QCustomPlot if they are unset: if (mParentPlot && mParentPlot->axisRectCount() > 0 && mParentPlot->axisRect(0) == this) { @@ -16695,16 +16960,16 @@ QCPAxis *QCPAxisRect::addAxis(QCPAxis::AxisType type, QCPAxis *axis) case QCPAxis::atRight: { if (!mParentPlot->yAxis2) mParentPlot->yAxis2 = newAxis; break; } } } - + return newAxis; } /*! Adds a new axis with \ref addAxis to each axis rect side specified in \a types. This may be an or-combination of QCPAxis::AxisType, so axes can be added to multiple sides at once. - + Returns a list of the added axes. - + \see addAxis, setupFullAxesBox */ QList QCPAxisRect::addAxes(QCPAxis::AxisTypes types) @@ -16723,9 +16988,9 @@ QList QCPAxisRect::addAxes(QCPAxis::AxisTypes types) /*! Removes the specified \a axis from the axis rect and deletes it. - + Returns true on success, i.e. if \a axis was a valid axis in this axis rect. - + \see addAxis */ bool QCPAxisRect::removeAxis(QCPAxis *axis) @@ -16737,6 +17002,8 @@ bool QCPAxisRect::removeAxis(QCPAxis *axis) it.next(); if (it.value().contains(axis)) { + if (it.value().first() == axis && it.value().size() > 1) // if removing first axis, transfer axis offset to the new first axis (which at this point is the second axis, if it exists) + it.value()[1]->setOffset(axis->offset()); mAxes[it.key()].removeOne(axis); if (qobject_cast(parentPlot())) // make sure this isn't called from QObject dtor when QCustomPlot is already destructed (happens when the axis rect is not in any layout and thus QObject-child of QCustomPlot) parentPlot()->axisRemoved(axis); @@ -16753,7 +17020,7 @@ bool QCPAxisRect::removeAxis(QCPAxis *axis) All axes of this axis rect will have their range zoomed accordingly. If you only wish to zoom specific axes, use the overloaded version of this method. - + \see QCustomPlot::setSelectionRectMode */ void QCPAxisRect::zoom(const QRectF &pixelRect) @@ -16762,11 +17029,11 @@ void QCPAxisRect::zoom(const QRectF &pixelRect) } /*! \overload - + Zooms in (or out) to the passed rectangular region \a pixelRect, given in pixel coordinates. - + Only the axes passed in \a affectedAxes will have their ranges zoomed accordingly. - + \see QCustomPlot::setSelectionRectMode */ void QCPAxisRect::zoom(const QRectF &pixelRect, const QList &affectedAxes) @@ -16813,29 +17080,29 @@ void QCPAxisRect::setupFullAxesBox(bool connectRanges) xAxis = addAxis(QCPAxis::atBottom); else xAxis = axis(QCPAxis::atBottom); - + if (axisCount(QCPAxis::atLeft) == 0) yAxis = addAxis(QCPAxis::atLeft); else yAxis = axis(QCPAxis::atLeft); - + if (axisCount(QCPAxis::atTop) == 0) xAxis2 = addAxis(QCPAxis::atTop); else xAxis2 = axis(QCPAxis::atTop); - + if (axisCount(QCPAxis::atRight) == 0) yAxis2 = addAxis(QCPAxis::atRight); else yAxis2 = axis(QCPAxis::atRight); - + xAxis->setVisible(true); yAxis->setVisible(true); xAxis2->setVisible(true); yAxis2->setVisible(true); xAxis2->setTickLabels(false); yAxis2->setTickLabels(false); - + xAxis2->setRange(xAxis->range()); xAxis2->setRangeReversed(xAxis->rangeReversed()); xAxis2->setScaleType(xAxis->scaleType()); @@ -16844,7 +17111,7 @@ void QCPAxisRect::setupFullAxesBox(bool connectRanges) xAxis2->setNumberPrecision(xAxis->numberPrecision()); xAxis2->ticker()->setTickCount(xAxis->ticker()->tickCount()); xAxis2->ticker()->setTickOrigin(xAxis->ticker()->tickOrigin()); - + yAxis2->setRange(yAxis->range()); yAxis2->setRangeReversed(yAxis->rangeReversed()); yAxis2->setScaleType(yAxis->scaleType()); @@ -16853,7 +17120,7 @@ void QCPAxisRect::setupFullAxesBox(bool connectRanges) yAxis2->setNumberPrecision(yAxis->numberPrecision()); yAxis2->ticker()->setTickCount(yAxis->ticker()->tickCount()); yAxis2->ticker()->setTickOrigin(yAxis->ticker()->tickOrigin()); - + if (connectRanges) { connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange))); @@ -16863,10 +17130,10 @@ void QCPAxisRect::setupFullAxesBox(bool connectRanges) /*! Returns a list of all the plottables that are associated with this axis rect. - + A plottable is considered associated with an axis rect if its key or value axis (or both) is in this axis rect. - + \see graphs, items */ QList QCPAxisRect::plottables() const @@ -16883,10 +17150,10 @@ QList QCPAxisRect::plottables() const /*! Returns a list of all the graphs that are associated with this axis rect. - + A graph is considered associated with an axis rect if its key or value axis (or both) is in this axis rect. - + \see plottables, items */ QList QCPAxisRect::graphs() const @@ -16903,12 +17170,12 @@ QList QCPAxisRect::graphs() const /*! Returns a list of all the items that are associated with this axis rect. - + An item is considered associated with an axis rect if any of its positions has key or value axis set to an axis that is in this axis rect, or if any of its positions has \ref QCPItemPosition::setAxisRect set to the axis rect, or if the clip axis rect (\ref QCPAbstractItem::setClipAxisRect) is set to this axis rect. - + \see plottables, graphs */ QList QCPAxisRect::items() const @@ -16941,17 +17208,17 @@ QList QCPAxisRect::items() const /*! This method is called automatically upon replot and doesn't need to be called by users of QCPAxisRect. - + Calls the base class implementation to update the margins (see \ref QCPLayoutElement::update), and finally passes the \ref rect to the inset layout (\ref insetLayout) and calls its QCPInsetLayout::update function. - + \seebaseclassmethod */ void QCPAxisRect::update(UpdatePhase phase) { QCPLayoutElement::update(phase); - + switch (phase) { case upPreparation: @@ -16968,7 +17235,7 @@ void QCPAxisRect::update(UpdatePhase phase) } default: break; } - + // pass update call on to inset layout (doesn't happen automatically, because QCPAxisRect doesn't derive from QCPLayout): mInsetLayout->update(phase); } @@ -17010,7 +17277,7 @@ void QCPAxisRect::draw(QCPPainter *painter) Below the pixmap, the axis rect may be optionally filled with a brush, if specified with \ref setBackground(const QBrush &brush). - + \see setBackgroundScaled, setBackgroundScaledMode, setBackground(const QBrush &brush) */ void QCPAxisRect::setBackground(const QPixmap &pm) @@ -17020,7 +17287,7 @@ void QCPAxisRect::setBackground(const QPixmap &pm) } /*! \overload - + Sets \a brush as the background brush. The axis rect background will be filled with this brush. Since axis rects place themselves on the "background" layer by default, the axis rect backgrounds are usually drawn below everything else. @@ -17029,7 +17296,7 @@ void QCPAxisRect::setBackground(const QPixmap &pm) setBackground(const QPixmap &pm). To disable drawing of a background brush, set \a brush to Qt::NoBrush. - + \see setBackground(const QPixmap &pm) */ void QCPAxisRect::setBackground(const QBrush &brush) @@ -17038,7 +17305,7 @@ void QCPAxisRect::setBackground(const QBrush &brush) } /*! \overload - + Allows setting the background pixmap of the axis rect, whether it shall be scaled and how it shall be scaled in one call. @@ -17056,10 +17323,10 @@ void QCPAxisRect::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioM Sets whether the axis background pixmap shall be scaled to fit the axis rect or not. If \a scaled is set to true, you may control whether and how the aspect ratio of the original pixmap is preserved with \ref setBackgroundScaledMode. - + Note that the scaled version of the original pixmap is buffered, so there is no performance penalty on replots. (Except when the axis rect dimensions are changed continuously.) - + \see setBackground, setBackgroundScaledMode */ void QCPAxisRect::setBackgroundScaled(bool scaled) @@ -17159,7 +17426,7 @@ QList QCPAxisRect::rangeZoomAxes(Qt::Orientation orientation) /*! Returns the range zoom factor of the \a orientation provided. - + \see setRangeZoomFactor */ double QCPAxisRect::rangeZoomFactor(Qt::Orientation orientation) @@ -17173,14 +17440,14 @@ double QCPAxisRect::rangeZoomFactor(Qt::Orientation orientation) \ref setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical). By default, the horizontal axis is the bottom axis (xAxis) and the vertical axis is the left axis (yAxis). - + To disable range dragging entirely, pass 0 as \a orientations or remove \ref QCP::iRangeDrag from \ref QCustomPlot::setInteractions. To enable range dragging for both directions, pass Qt::Horizontal | Qt::Vertical as \a orientations. - + In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions contains \ref QCP::iRangeDrag to enable the range dragging interaction. - + \see setRangeZoom, setRangeDragAxes, QCustomPlot::setNoAntialiasingOnDrag */ void QCPAxisRect::setRangeDrag(Qt::Orientations orientations) @@ -17197,10 +17464,10 @@ void QCPAxisRect::setRangeDrag(Qt::Orientations orientations) To disable range zooming entirely, pass 0 as \a orientations or remove \ref QCP::iRangeZoom from \ref QCustomPlot::setInteractions. To enable range zooming for both directions, pass Qt::Horizontal | Qt::Vertical as \a orientations. - + In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions contains \ref QCP::iRangeZoom to enable the range zooming interaction. - + \see setRangeZoomFactor, setRangeZoomAxes, setRangeDrag */ void QCPAxisRect::setRangeZoom(Qt::Orientations orientations) @@ -17209,7 +17476,7 @@ void QCPAxisRect::setRangeZoom(Qt::Orientations orientations) } /*! \overload - + Sets the axes whose range will be dragged when \ref setRangeDrag enables mouse range dragging on the QCustomPlot widget. Pass 0 if no axis shall be dragged in the respective orientation. @@ -17367,7 +17634,7 @@ void QCPAxisRect::setRangeZoomFactor(double horizontalFactor, double verticalFac } /*! \overload - + Sets both the horizontal and vertical zoom \a factor. */ void QCPAxisRect::setRangeZoomFactor(double factor) @@ -17377,13 +17644,13 @@ void QCPAxisRect::setRangeZoomFactor(double factor) } /*! \internal - + Draws the background of this axis rect. It may consist of a background fill (a QBrush) and a pixmap. - + If a brush was given via \ref setBackground(const QBrush &brush), this function first draws an according filling inside the axis rect with the provided \a painter. - + Then, if a pixmap was provided via \ref setBackground, this function buffers the scaled version depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside the axis rect with the provided \a painter. The scaled version is buffered in @@ -17391,7 +17658,7 @@ void QCPAxisRect::setRangeZoomFactor(double factor) the axis rect has changed in a way that requires a rescale of the background pixmap (this is dependent on the \ref setBackgroundScaledMode), or when a differend axis background pixmap was set. - + \see setBackground, setBackgroundScaled, setBackgroundScaledMode */ void QCPAxisRect::drawBackground(QCPPainter *painter) @@ -17399,7 +17666,7 @@ void QCPAxisRect::drawBackground(QCPPainter *painter) // draw background fill: if (mBackgroundBrush != Qt::NoBrush) painter->fillRect(mRect, mBackgroundBrush); - + // draw background pixmap (on top of fill, if brush specified): if (!mBackgroundPixmap.isNull()) { @@ -17419,13 +17686,13 @@ void QCPAxisRect::drawBackground(QCPPainter *painter) } /*! \internal - + This function makes sure multiple axes on the side specified with \a type don't collide, but are distributed according to their respective space requirement (QCPAxis::calculateMargin). - + It does this by setting an appropriate offset (\ref QCPAxis::setOffset) on all axes except the one with index zero. - + This function is called by \ref calculateAutoMargin. */ void QCPAxisRect::updateAxesOffset(QCPAxis::AxisType type) @@ -17433,7 +17700,7 @@ void QCPAxisRect::updateAxesOffset(QCPAxis::AxisType type) const QList axesList = mAxes.value(type); if (axesList.isEmpty()) return; - + bool isFirstVisible = !axesList.first()->visible(); // if the first axis is visible, the second axis (which is where the loop starts) isn't the first visible axis, so initialize with false for (int i=1; i axesList = mAxes.value(QCPAxis::marginSideToAxisType(side)); if (axesList.size() > 0) @@ -17465,12 +17732,12 @@ int QCPAxisRect::calculateAutoMargin(QCP::MarginSide side) } /*! \internal - + Reacts to a change in layout to potentially set the convenience axis pointers \ref QCustomPlot::xAxis, \ref QCustomPlot::yAxis, etc. of the parent QCustomPlot to the respective axes of this axis rect. This is only done if the respective convenience pointer is currently zero and if there is no QCPAxisRect at position (0, 0) of the plot layout. - + This automation makes it simpler to replace the main axis rect with a newly created one, without the need to manually reset the convenience pointers. */ @@ -17490,20 +17757,19 @@ void QCPAxisRect::layoutChanged() } /*! \internal - + Event handler for when a mouse button is pressed on the axis rect. If the left mouse button is pressed, the range dragging interaction is initialized (the actual range manipulation happens in the \ref mouseMoveEvent). The mDragging flag is set to true and some anchor points are set that are needed to determine the distance the mouse was dragged in the mouse move/release events later. - + \see mouseMoveEvent, mouseReleaseEvent */ void QCPAxisRect::mousePressEvent(QMouseEvent *event, const QVariant &details) { Q_UNUSED(details) - mDragStart = event->pos(); // need this even when not LeftButton is pressed, to determine in releaseEvent whether it was a full click (no position change between press and release) if (event->buttons() & Qt::LeftButton) { mDragging = true; @@ -17527,10 +17793,10 @@ void QCPAxisRect::mousePressEvent(QMouseEvent *event, const QVariant &details) } /*! \internal - + Event handler for when the mouse is moved on the axis rect. If range dragging was activated in a preceding \ref mousePressEvent, the range is moved accordingly. - + \see mousePressEvent, mouseReleaseEvent */ void QCPAxisRect::mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) @@ -17539,7 +17805,7 @@ void QCPAxisRect::mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) // Mouse range dragging interaction: if (mDragging && mParentPlot->interactions().testFlag(QCP::iRangeDrag)) { - + if (mRangeDrag.testFlag(Qt::Horizontal)) { for (int i=0; imScaleType == QCPAxis::stLinear) { - double diff = ax->pixelToCoord(mDragStart.x()) - ax->pixelToCoord(event->pos().x()); + double diff = ax->pixelToCoord(startPos.x()) - ax->pixelToCoord(event->pos().x()); ax->setRange(mDragStartHorzRange.at(i).lower+diff, mDragStartHorzRange.at(i).upper+diff); } else if (ax->mScaleType == QCPAxis::stLogarithmic) { - double diff = ax->pixelToCoord(mDragStart.x()) / ax->pixelToCoord(event->pos().x()); + double diff = ax->pixelToCoord(startPos.x()) / ax->pixelToCoord(event->pos().x()); ax->setRange(mDragStartHorzRange.at(i).lower*diff, mDragStartHorzRange.at(i).upper*diff); } } } - + if (mRangeDrag.testFlag(Qt::Vertical)) { for (int i=0; imScaleType == QCPAxis::stLinear) { - double diff = ax->pixelToCoord(mDragStart.y()) - ax->pixelToCoord(event->pos().y()); + double diff = ax->pixelToCoord(startPos.y()) - ax->pixelToCoord(event->pos().y()); ax->setRange(mDragStartVertRange.at(i).lower+diff, mDragStartVertRange.at(i).upper+diff); } else if (ax->mScaleType == QCPAxis::stLogarithmic) { - double diff = ax->pixelToCoord(mDragStart.y()) / ax->pixelToCoord(event->pos().y()); + double diff = ax->pixelToCoord(startPos.y()) / ax->pixelToCoord(event->pos().y()); ax->setRange(mDragStartVertRange.at(i).lower*diff, mDragStartVertRange.at(i).upper*diff); } } } - + if (mRangeDrag != 0) // if either vertical or horizontal drag was enabled, do a replot { if (mParentPlot->noAntialiasingOnDrag()) mParentPlot->setNotAntialiasedElements(QCP::aeAll); mParentPlot->replot(QCustomPlot::rpQueuedReplot); } - + } } @@ -17606,13 +17872,13 @@ void QCPAxisRect::mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) } /*! \internal - + Event handler for mouse wheel events. If rangeZoom is Qt::Horizontal, Qt::Vertical or both, the ranges of the axes defined as rangeZoomHorzAxis and rangeZoomVertAxis are scaled. The center of the scaling operation is the current cursor position inside the axis rect. The scaling factor is dependent on the mouse wheel delta (which direction the wheel was rotated) to provide a natural zooming feel. The Strength of the zoom can be controlled via \ref setRangeZoomFactor. - + Note, that event->delta() is usually +/-120 for single rotation steps. However, if the mouse wheel is turned rapidly, many steps may bunch up to one event, so the event->delta() may then be multiples of 120. This is taken into account here, by calculating \a wheelSteps and using it as @@ -17653,8 +17919,8 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) /* end of 'src/layoutelements/layoutelement-axisrect.cpp' */ -/* including file 'src/layoutelements/layoutelement-legend.cpp', size 30933 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-legend.cpp', size 31097 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPAbstractLegendItem @@ -17662,16 +17928,16 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) /*! \class QCPAbstractLegendItem \brief The abstract base class for all entries in a QCPLegend. - + It defines a very basic interface for entries in a QCPLegend. For representing plottables in the legend, the subclass \ref QCPPlottableLegendItem is more suitable. - + Only derive directly from this class when you need absolute freedom (e.g. a custom legend entry that's not even associated with a plottable). You must implement the following pure virtual functions: \li \ref draw (from QCPLayerable) - + You inherit the following members you may use: @@ -17687,7 +17953,7 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) /* start of documentation of signals */ /*! \fn void QCPAbstractLegendItem::selectionChanged(bool selected) - + This signal is emitted when the selection state of this legend item has changed, either by user interaction or by a direct call to \ref setSelected. */ @@ -17714,7 +17980,7 @@ QCPAbstractLegendItem::QCPAbstractLegendItem(QCPLegend *parent) : /*! Sets the default font of this specific legend item to \a font. - + \see setTextColor, QCPLegend::setFont */ void QCPAbstractLegendItem::setFont(const QFont &font) @@ -17724,7 +17990,7 @@ void QCPAbstractLegendItem::setFont(const QFont &font) /*! Sets the default text color of this specific legend item to \a color. - + \see setFont, QCPLegend::setTextColor */ void QCPAbstractLegendItem::setTextColor(const QColor &color) @@ -17735,7 +18001,7 @@ void QCPAbstractLegendItem::setTextColor(const QColor &color) /*! When this legend item is selected, \a font is used to draw generic text, instead of the normal font set with \ref setFont. - + \see setFont, QCPLegend::setSelectedFont */ void QCPAbstractLegendItem::setSelectedFont(const QFont &font) @@ -17746,7 +18012,7 @@ void QCPAbstractLegendItem::setSelectedFont(const QFont &font) /*! When this legend item is selected, \a color is used to draw generic text, instead of the normal color set with \ref setTextColor. - + \see setTextColor, QCPLegend::setSelectedTextColor */ void QCPAbstractLegendItem::setSelectedTextColor(const QColor &color) @@ -17756,7 +18022,7 @@ void QCPAbstractLegendItem::setSelectedTextColor(const QColor &color) /*! Sets whether this specific legend item is selectable. - + \see setSelectedParts, QCustomPlot::setInteractions */ void QCPAbstractLegendItem::setSelectable(bool selectable) @@ -17770,10 +18036,10 @@ void QCPAbstractLegendItem::setSelectable(bool selectable) /*! Sets whether this specific legend item is selected. - + It is possible to set the selection state of this item by calling this function directly, even if setSelectable is set to false. - + \see setSelectableParts, QCustomPlot::setInteractions */ void QCPAbstractLegendItem::setSelected(bool selected) @@ -17792,7 +18058,7 @@ double QCPAbstractLegendItem::selectTest(const QPointF &pos, bool onlySelectable if (!mParentPlot) return -1; if (onlySelectable && (!mSelectable || !mParentLegend->selectableParts().testFlag(QCPLegend::spItems))) return -1; - + if (mRect.contains(pos.toPoint())) return mParentPlot->selectionTolerance()*0.99; else @@ -17843,23 +18109,21 @@ void QCPAbstractLegendItem::deselectEvent(bool *selectionStateChanged) /*! \class QCPPlottableLegendItem \brief A legend item representing a plottable with an icon and the plottable name. - + This is the standard legend item for plottables. It displays an icon of the plottable next to the plottable name. The icon is drawn by the respective plottable itself (\ref QCPAbstractPlottable::drawLegendIcon), and tries to give an intuitive symbol for the plottable. For example, the QCPGraph draws a centered horizontal line and/or a single scatter point in the middle. - + Legend items of this type are always associated with one plottable (retrievable via the plottable() function and settable with the constructor). You may change the font of the plottable name with \ref setFont. Icon padding and border pen is taken from the parent QCPLegend, see \ref QCPLegend::setIconBorderPen and \ref QCPLegend::setIconTextPadding. The function \ref QCPAbstractPlottable::addToLegend/\ref QCPAbstractPlottable::removeFromLegend - creates/removes legend items of this type in the default implementation. However, these functions - may be reimplemented such that a different kind of legend item (e.g a direct subclass of - QCPAbstractLegendItem) is used for that plottable. - + creates/removes legend items of this type. + Since QCPLegend is based on QCPLayoutGrid, a legend item itself is just a subclass of QCPLayoutElement. While it could be added to a legend (or any other layout) via the normal layout interface, QCPLegend has specialized functions for handling legend items conveniently, see the @@ -17868,9 +18132,9 @@ void QCPAbstractLegendItem::deselectEvent(bool *selectionStateChanged) /*! Creates a new legend item associated with \a plottable. - + Once it's created, it can be added to the legend via \ref QCPLegend::addItem. - + A more convenient way of adding/removing a plottable to/from the legend is via the functions \ref QCPAbstractPlottable::addToLegend and \ref QCPAbstractPlottable::removeFromLegend. */ @@ -17882,7 +18146,7 @@ QCPPlottableLegendItem::QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlo } /*! \internal - + Returns the pen that shall be used to draw the icon border, taking into account the selection state of this item. */ @@ -17892,7 +18156,7 @@ QPen QCPPlottableLegendItem::getIconBorderPen() const } /*! \internal - + Returns the text color that shall be used to draw text, taking into account the selection state of this item. */ @@ -17902,7 +18166,7 @@ QColor QCPPlottableLegendItem::getTextColor() const } /*! \internal - + Returns the font that shall be used to draw text, taking into account the selection state of this item. */ @@ -17912,10 +18176,10 @@ QFont QCPPlottableLegendItem::getFont() const } /*! \internal - + Draws the item with \a painter. The size and position of the drawn legend item is defined by the - parent layout (typically a \ref QCPLegend) and the \ref minimumSizeHint and \ref maximumSizeHint - of this legend item. + parent layout (typically a \ref QCPLegend) and the \ref minimumOuterSizeHint and \ref + maximumOuterSizeHint of this legend item. */ void QCPPlottableLegendItem::draw(QCPPainter *painter) { @@ -17944,13 +18208,13 @@ void QCPPlottableLegendItem::draw(QCPPainter *painter) } /*! \internal - + Calculates and returns the size of this item. This includes the icon, the text and the padding in between. - + \seebaseclassmethod */ -QSize QCPPlottableLegendItem::minimumSizeHint() const +QSize QCPPlottableLegendItem::minimumOuterSizeHint() const { if (!mPlottable) return QSize(); QSize result(0, 0); @@ -17958,8 +18222,10 @@ QSize QCPPlottableLegendItem::minimumSizeHint() const QFontMetrics fontMetrics(getFont()); QSize iconSize = mParentLegend->iconSize(); textRect = fontMetrics.boundingRect(0, 0, 0, iconSize.height(), Qt::TextDontClip, mPlottable->name()); - result.setWidth(iconSize.width() + mParentLegend->iconTextPadding() + textRect.width() + mMargins.left() + mMargins.right()); - result.setHeight(qMax(textRect.height(), iconSize.height()) + mMargins.top() + mMargins.bottom()); + result.setWidth(iconSize.width() + mParentLegend->iconTextPadding() + textRect.width()); + result.setHeight(qMax(textRect.height(), iconSize.height())); + result.rwidth() += mMargins.left()+mMargins.right(); + result.rheight() += mMargins.top()+mMargins.bottom(); return result; } @@ -17973,10 +18239,14 @@ QSize QCPPlottableLegendItem::minimumSizeHint() const A legend is a small box somewhere in the plot which lists plottables with their name and icon. - Normally, the legend is populated by calling \ref QCPAbstractPlottable::addToLegend. The - respective legend item can be removed with \ref QCPAbstractPlottable::removeFromLegend. However, - QCPLegend also offers an interface to add and manipulate legend items directly: \ref item, \ref - itemWithPlottable, \ref itemCount, \ref addItem, \ref removeItem, etc. + A legend is populated with legend items by calling \ref QCPAbstractPlottable::addToLegend on the + plottable, for which a legend item shall be created. In the case of the main legend (\ref + QCustomPlot::legend), simply adding plottables to the plot while \ref + QCustomPlot::setAutoAddPlottableToLegend is set to true (the default) creates corresponding + legend items. The legend item associated with a certain plottable can be removed with \ref + QCPAbstractPlottable::removeFromLegend. However, QCPLegend also offers an interface to add and + manipulate legend items directly: \ref item, \ref itemWithPlottable, \ref itemCount, \ref + addItem, \ref removeItem, etc. Since \ref QCPLegend derives from \ref QCPLayoutGrid, it can be placed in any position a \ref QCPLayoutElement may be positioned. The legend items are themselves \ref QCPLayoutElement @@ -18003,7 +18273,7 @@ QSize QCPPlottableLegendItem::minimumSizeHint() const /*! \fn void QCPLegend::selectionChanged(QCPLegend::SelectableParts selection); This signal is emitted when the selection state of this legend has changed. - + \see setSelectedParts, setSelectableParts */ @@ -18011,7 +18281,7 @@ QSize QCPPlottableLegendItem::minimumSizeHint() const /*! Constructs a new QCPLegend instance with default values. - + Note that by default, QCustomPlot already contains a legend ready to be used as \ref QCustomPlot::legend */ @@ -18019,18 +18289,18 @@ QCPLegend::QCPLegend() { setFillOrder(QCPLayoutGrid::foRowsFirst); setWrap(0); - + setRowSpacing(3); setColumnSpacing(8); setMargins(QMargins(7, 5, 7, 4)); setAntialiased(false); setIconSize(32, 18); - + setIconTextPadding(7); - + setSelectableParts(spLegendBox | spItems); setSelectedParts(spNone); - + setBorderPen(QPen(Qt::black, 0)); setSelectedBorderPen(QPen(Qt::blue, 2)); setIconBorderPen(Qt::NoPen); @@ -18087,9 +18357,9 @@ void QCPLegend::setBrush(const QBrush &brush) Sets the default font of legend text. Legend items that draw text (e.g. the name of a graph) will use this font by default. However, a different font can be specified on a per-item-basis by accessing the specific legend item. - + This function will also set \a font on all already existing legend items. - + \see QCPAbstractLegendItem::setFont */ void QCPLegend::setFont(const QFont &font) @@ -18106,9 +18376,9 @@ void QCPLegend::setFont(const QFont &font) Sets the default color of legend text. Legend items that draw text (e.g. the name of a graph) will use this color by default. However, a different colors can be specified on a per-item-basis by accessing the specific legend item. - + This function will also set \a color on all already existing legend items. - + \see QCPAbstractLegendItem::setTextColor */ void QCPLegend::setTextColor(const QColor &color) @@ -18151,7 +18421,7 @@ void QCPLegend::setIconTextPadding(int padding) /*! Sets the pen used to draw a border around each legend icon. Legend items that draw an icon (e.g. a visual representation of the graph) will use this pen by default. - + If no border is wanted, set this to \a Qt::NoPen. */ void QCPLegend::setIconBorderPen(const QPen &pen) @@ -18162,11 +18432,11 @@ void QCPLegend::setIconBorderPen(const QPen &pen) /*! Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface. (When \ref QCustomPlot::setInteractions contains \ref QCP::iSelectLegend.) - + However, even when \a selectable is set to a value not allowing the selection of a specific part, it is still possible to set the selection of this part manually, by calling \ref setSelectedParts directly. - + \see SelectablePart, setSelectedParts */ void QCPLegend::setSelectableParts(const SelectableParts &selectable) @@ -18182,20 +18452,20 @@ void QCPLegend::setSelectableParts(const SelectableParts &selectable) Sets the selected state of the respective legend parts described by \ref SelectablePart. When a part is selected, it uses a different pen/font and brush. If some legend items are selected and \a selected doesn't contain \ref spItems, those items become deselected. - + The entire selection mechanism is handled automatically when \ref QCustomPlot::setInteractions contains iSelectLegend. You only need to call this function when you wish to change the selection state manually. - + This function can change the selection state of a part even when \ref setSelectableParts was set to a value that actually excludes the part. - + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. - + Note that it doesn't make sense to set the selected state \ref spItems here when it wasn't set before, because there's no way to specify which exact items to newly select. Do this by calling \ref QCPAbstractLegendItem::setSelected directly on the legend item you wish to select. - + \see SelectablePart, setSelectableParts, selectTest, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush, setSelectedFont */ @@ -18258,7 +18528,7 @@ void QCPLegend::setSelectedBrush(const QBrush &brush) /*! Sets the default font that is used by legend items when they are selected. - + This function will also set \a font on all already existing legend items. \see setFont, QCPAbstractLegendItem::setSelectedFont @@ -18275,7 +18545,7 @@ void QCPLegend::setSelectedFont(const QFont &font) /*! Sets the default text color that is used by legend items when they are selected. - + This function will also set \a color on all already existing legend items. \see setTextColor, QCPAbstractLegendItem::setSelectedTextColor @@ -18305,7 +18575,7 @@ QCPAbstractLegendItem *QCPLegend::item(int index) const /*! Returns the QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*). If such an item isn't in the legend, returns 0. - + \see hasItemWithPlottable */ QCPPlottableLegendItem *QCPLegend::itemWithPlottable(const QCPAbstractPlottable *plottable) const @@ -18336,7 +18606,7 @@ int QCPLegend::itemCount() const /*! Returns whether the legend contains \a item. - + \see hasItemWithPlottable */ bool QCPLegend::hasItem(QCPAbstractLegendItem *item) const @@ -18352,7 +18622,7 @@ bool QCPLegend::hasItem(QCPAbstractLegendItem *item) const /*! Returns whether the legend contains a QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*). If such an item isn't in the legend, returns false. - + \see itemWithPlottable */ bool QCPLegend::hasItemWithPlottable(const QCPAbstractPlottable *plottable) const @@ -18432,7 +18702,7 @@ void QCPLegend::clearItems() /*! Returns the legend items that are currently selected. If no items are selected, the list is empty. - + \see QCPAbstractLegendItem::setSelected, setSelectable */ QList QCPLegend::selectedItems() const @@ -18455,13 +18725,13 @@ QList QCPLegend::selectedItems() const before drawing main legend elements. This is the antialiasing state the painter passed to the \ref draw method is in by default. - + This function takes into account the local setting of the antialiasing flag as well as the overrides set with \ref QCustomPlot::setAntialiasedElements and \ref QCustomPlot::setNotAntialiasedElements. - + \seebaseclassmethod - + \see setAntialiased */ void QCPLegend::applyDefaultAntialiasingHint(QCPPainter *painter) const @@ -18470,7 +18740,7 @@ void QCPLegend::applyDefaultAntialiasingHint(QCPPainter *painter) const } /*! \internal - + Returns the pen used to paint the border of the legend, taking into account the selection state of the legend box. */ @@ -18480,7 +18750,7 @@ QPen QCPLegend::getBorderPen() const } /*! \internal - + Returns the brush used to paint the background of the legend, taking into account the selection state of the legend box. */ @@ -18490,7 +18760,7 @@ QBrush QCPLegend::getBrush() const } /*! \internal - + Draws the legend box with the provided \a painter. The individual legend items are layerables themselves, thus are drawn independently. */ @@ -18508,7 +18778,7 @@ double QCPLegend::selectTest(const QPointF &pos, bool onlySelectable, QVariant * if (!mParentPlot) return -1; if (onlySelectable && !mSelectableParts.testFlag(spLegendBox)) return -1; - + if (mOuterRect.contains(pos.toPoint())) { if (details) details->setValue(spLegendBox); @@ -18565,8 +18835,8 @@ void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot) /* end of 'src/layoutelements/layoutelement-legend.cpp' */ -/* including file 'src/layoutelements/layoutelement-textelement.cpp', size 12759 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-textelement.cpp', size 12761 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPTextElement @@ -18585,10 +18855,10 @@ void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot) /* start documentation of signals */ /*! \fn void QCPTextElement::selectionChanged(bool selected) - + This signal is emitted when the selection state has changed to \a selected, either by user interaction or by a direct call to \ref setSelected. - + \see setSelected, setSelectable */ @@ -18609,7 +18879,7 @@ void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot) /* end documentation of signals */ /*! \overload - + Creates a new QCPTextElement instance and sets default values. The initial text is empty (\ref setText). */ @@ -18633,7 +18903,7 @@ QCPTextElement::QCPTextElement(QCustomPlot *parentPlot) : } /*! \overload - + Creates a new QCPTextElement instance and sets default values. The initial text is set to \a text. @@ -18658,7 +18928,7 @@ QCPTextElement::QCPTextElement(QCustomPlot *parentPlot, const QString &text) : } /*! \overload - + Creates a new QCPTextElement instance and sets default values. The initial text is set to \a text with \a pointSize. @@ -18685,7 +18955,7 @@ QCPTextElement::QCPTextElement(QCustomPlot *parentPlot, const QString &text, dou } /*! \overload - + Creates a new QCPTextElement instance and sets default values. The initial text is set to \a text with \a pointSize and the specified \a fontFamily. @@ -18705,7 +18975,7 @@ QCPTextElement::QCPTextElement(QCustomPlot *parentPlot, const QString &text, con } /*! \overload - + Creates a new QCPTextElement instance and sets default values. The initial text is set to \a text with the specified \a font. @@ -18726,7 +18996,7 @@ QCPTextElement::QCPTextElement(QCustomPlot *parentPlot, const QString &text, con /*! Sets the text that will be displayed to \a text. Multiple lines can be created by insertion of "\n". - + \see setFont, setTextColor, setTextFlags */ void QCPTextElement::setText(const QString &text) @@ -18737,7 +19007,7 @@ void QCPTextElement::setText(const QString &text) /*! Sets options for text alignment and wrapping behaviour. \a flags is a bitwise OR-combination of \c Qt::AlignmentFlag and \c Qt::TextFlag enums. - + Possible enums are: - Qt::AlignLeft - Qt::AlignRight @@ -18761,7 +19031,7 @@ void QCPTextElement::setTextFlags(int flags) /*! Sets the \a font of the text. - + \see setTextColor, setSelectedFont */ void QCPTextElement::setFont(const QFont &font) @@ -18771,7 +19041,7 @@ void QCPTextElement::setFont(const QFont &font) /*! Sets the \a color of the text. - + \see setFont, setSelectedTextColor */ void QCPTextElement::setTextColor(const QColor &color) @@ -18781,7 +19051,7 @@ void QCPTextElement::setTextColor(const QColor &color) /*! Sets the \a font of the text that will be used if the text element is selected (\ref setSelected). - + \see setFont */ void QCPTextElement::setSelectedFont(const QFont &font) @@ -18791,7 +19061,7 @@ void QCPTextElement::setSelectedFont(const QFont &font) /*! Sets the \a color of the text that will be used if the text element is selected (\ref setSelected). - + \see setTextColor */ void QCPTextElement::setSelectedTextColor(const QColor &color) @@ -18817,7 +19087,7 @@ void QCPTextElement::setSelectable(bool selectable) /*! Sets the selection state of this text element to \a selected. If the selection has changed, \ref selectionChanged is emitted. - + Note that this function can change the selection state independently of the current \ref setSelectable state. */ @@ -18845,22 +19115,22 @@ void QCPTextElement::draw(QCPPainter *painter) } /* inherits documentation from base class */ -QSize QCPTextElement::minimumSizeHint() const +QSize QCPTextElement::minimumOuterSizeHint() const { QFontMetrics metrics(mFont); - QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size(); - result.rwidth() += mMargins.left() + mMargins.right(); - result.rheight() += mMargins.top() + mMargins.bottom(); + QSize result(metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size()); + result.rwidth() += mMargins.left()+mMargins.right(); + result.rheight() += mMargins.top()+mMargins.bottom(); return result; } /* inherits documentation from base class */ -QSize QCPTextElement::maximumSizeHint() const +QSize QCPTextElement::maximumOuterSizeHint() const { QFontMetrics metrics(mFont); - QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size(); - result.rheight() += mMargins.top() + mMargins.bottom(); + QSize result(metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size()); result.setWidth(QWIDGETSIZE_MAX); + result.rheight() += mMargins.top()+mMargins.bottom(); return result; } @@ -18905,7 +19175,7 @@ double QCPTextElement::selectTest(const QPointF &pos, bool onlySelectable, QVari Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + if (mTextBoundingRect.contains(pos.toPoint())) return mParentPlot->selectionTolerance()*0.99; else @@ -18948,7 +19218,7 @@ void QCPTextElement::mouseDoubleClickEvent(QMouseEvent *event, const QVariant &d } /*! \internal - + Returns the main font to be used. This is mSelectedFont if \ref setSelected is set to true, else mFont is returned. */ @@ -18958,7 +19228,7 @@ QFont QCPTextElement::mainFont() const } /*! \internal - + Returns the main color to be used. This is mSelectedTextColor if \ref setSelected is set to true, else mTextColor is returned. */ @@ -18969,8 +19239,8 @@ QColor QCPTextElement::mainTextColor() const /* end of 'src/layoutelements/layoutelement-textelement.cpp' */ -/* including file 'src/layoutelements/layoutelement-colorscale.cpp', size 25910 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-colorscale.cpp', size 25770 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -18979,35 +19249,35 @@ QColor QCPTextElement::mainTextColor() const /*! \class QCPColorScale \brief A color scale for use with color coding data such as QCPColorMap - + This layout element can be placed on the plot to correlate a color gradient with data values. It is usually used in combination with one or multiple \ref QCPColorMap "QCPColorMaps". \image html QCPColorScale.png - + The color scale can be either horizontal or vertical, as shown in the image above. The orientation and the side where the numbers appear is controlled with \ref setType. - + Use \ref QCPColorMap::setColorScale to connect a color map with a color scale. Once they are connected, they share their gradient, data range and data scale type (\ref setGradient, \ref setDataRange, \ref setDataScaleType). Multiple color maps may be associated with a single color scale, to make them all synchronize these properties. - + To have finer control over the number display and axis behaviour, you can directly access the \ref axis. See the documentation of QCPAxis for details about configuring axes. For example, if you want to change the number of automatically generated ticks, call \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-tickcount - + Placing a color scale next to the main axis rect works like with any other layout element: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-creation In this case we have placed it to the right of the default axis rect, so it wasn't necessary to call \ref setType, since \ref QCPAxis::atRight is already the default. The text next to the color scale can be set with \ref setLabel. - + For optimum appearance (like in the image above), it may be desirable to line up the axis rect and the borders of the color scale. Use a \ref QCPMarginGroup to achieve this: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-margingroup - + Color scales are initialized with a non-zero minimum top and bottom margin (\ref setMinimumMargins), because vertical color scales are most common and the minimum top/bottom margin makes sure it keeps some distance to the top/bottom widget border. So if you change to a @@ -19018,14 +19288,14 @@ QColor QCPTextElement::mainTextColor() const /* start documentation of inline functions */ /*! \fn QCPAxis *QCPColorScale::axis() const - + Returns the internal \ref QCPAxis instance of this color scale. You can access it to alter the appearance and behaviour of the axis. \ref QCPColorScale duplicates some properties in its interface for convenience. Those are \ref setDataRange (\ref QCPAxis::setRange), \ref setDataScaleType (\ref QCPAxis::setScaleType), and the method \ref setLabel (\ref QCPAxis::setLabel). As they each are connected, it does not matter whether you use the method on the QCPColorScale or on its QCPAxis. - + If the type of the color scale is changed with \ref setType, the axis returned by this method will change, too, to either the left, right, bottom or top axis, depending on which type was set. */ @@ -19034,23 +19304,23 @@ QColor QCPTextElement::mainTextColor() const /* start documentation of signals */ /*! \fn void QCPColorScale::dataRangeChanged(const QCPRange &newRange); - + This signal is emitted when the data range changes. - + \see setDataRange */ /*! \fn void QCPColorScale::dataScaleTypeChanged(QCPAxis::ScaleType scaleType); - + This signal is emitted when the data scale type changes. - + \see setDataScaleType */ /*! \fn void QCPColorScale::gradientChanged(const QCPColorGradient &newGradient); - + This signal is emitted when the gradient changes. - + \see setGradient */ @@ -19084,7 +19354,7 @@ QString QCPColorScale::label() const qDebug() << Q_FUNC_INFO << "internal color axis undefined"; return QString(); } - + return mColorAxis.data()->label(); } @@ -19096,7 +19366,7 @@ bool QCPColorScale::rangeDrag() const qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; return false; } - + return mAxisRect.data()->rangeDrag().testFlag(QCPAxis::orientation(mType)) && mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType)) && mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType); @@ -19110,7 +19380,7 @@ bool QCPColorScale::rangeZoom() const qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; return false; } - + return mAxisRect.data()->rangeZoom().testFlag(QCPAxis::orientation(mType)) && mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType)) && mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType); @@ -19118,7 +19388,7 @@ bool QCPColorScale::rangeZoom() const /*! Sets at which side of the color scale the axis is placed, and thus also its orientation. - + Note that after setting \a type to a different value, the axis returned by \ref axis() will be a different one. The new axis will adopt the following properties from the previous axis: The range, scale type, label and ticker (the latter will be shared and not copied). @@ -19170,11 +19440,11 @@ void QCPColorScale::setType(QCPAxis::AxisType type) /*! Sets the range spanned by the color gradient and that is shown by the axis in the color scale. - + It is equivalent to calling QCPColorMap::setDataRange on any of the connected color maps. It is also equivalent to directly accessing the \ref axis and setting its range with \ref QCPAxis::setRange. - + \see setDataScaleType, setGradient, rescaleDataRange */ void QCPColorScale::setDataRange(const QCPRange &dataRange) @@ -19191,11 +19461,11 @@ void QCPColorScale::setDataRange(const QCPRange &dataRange) /*! Sets the scale type of the color scale, i.e. whether values are linearly associated with colors or logarithmically. - + It is equivalent to calling QCPColorMap::setDataScaleType on any of the connected color maps. It is also equivalent to directly accessing the \ref axis and setting its scale type with \ref QCPAxis::setScaleType. - + \see setDataRange, setGradient */ void QCPColorScale::setDataScaleType(QCPAxis::ScaleType scaleType) @@ -19213,9 +19483,9 @@ void QCPColorScale::setDataScaleType(QCPAxis::ScaleType scaleType) /*! Sets the color gradient that will be used to represent data values. - + It is equivalent to calling QCPColorMap::setGradient on any of the connected color maps. - + \see setDataRange, setDataScaleType */ void QCPColorScale::setGradient(const QCPColorGradient &gradient) @@ -19240,7 +19510,7 @@ void QCPColorScale::setLabel(const QString &str) qDebug() << Q_FUNC_INFO << "internal color axis undefined"; return; } - + mColorAxis.data()->setLabel(str); } @@ -19255,7 +19525,7 @@ void QCPColorScale::setBarWidth(int width) /*! Sets whether the user can drag the data range (\ref setDataRange). - + Note that \ref QCP::iRangeDrag must be in the QCustomPlot's interactions (\ref QCustomPlot::setInteractions) to allow range dragging. */ @@ -19266,7 +19536,7 @@ void QCPColorScale::setRangeDrag(bool enabled) qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; return; } - + if (enabled) mAxisRect.data()->setRangeDrag(QCPAxis::orientation(mType)); else @@ -19275,7 +19545,7 @@ void QCPColorScale::setRangeDrag(bool enabled) /*! Sets whether the user can zoom the data range (\ref setDataRange) by scrolling the mouse wheel. - + Note that \ref QCP::iRangeZoom must be in the QCustomPlot's interactions (\ref QCustomPlot::setInteractions) to allow range dragging. */ @@ -19286,7 +19556,7 @@ void QCPColorScale::setRangeZoom(bool enabled) qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; return; } - + if (enabled) mAxisRect.data()->setRangeZoom(QCPAxis::orientation(mType)); else @@ -19311,7 +19581,7 @@ QList QCPColorScale::colorMaps() const /*! Changes the data range such that all color maps associated with this color scale are fully mapped to the gradient in the data dimension. - + \see setDataRange */ void QCPColorScale::rescaleDataRange(bool onlyVisibleMaps) @@ -19382,21 +19652,21 @@ void QCPColorScale::update(UpdatePhase phase) qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; return; } - + mAxisRect.data()->update(phase); - + switch (phase) { case upMargins: { if (mType == QCPAxis::atBottom || mType == QCPAxis::atTop) { - setMaximumSize(QWIDGETSIZE_MAX, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom()); - setMinimumSize(0, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom()); + setMaximumSize(QWIDGETSIZE_MAX, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()); + setMinimumSize(0, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()); } else { - setMaximumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), QWIDGETSIZE_MAX); - setMinimumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), 0); + setMaximumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right(), QWIDGETSIZE_MAX); + setMinimumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right(), 0); } break; } @@ -19467,9 +19737,9 @@ void QCPColorScale::wheelEvent(QWheelEvent *event) \internal \brief An axis rect subclass for use in a QCPColorScale - + This is a private class and not part of the public QCustomPlot interface. - + It provides the axis rect functionality for the QCPColorScale class. */ @@ -19502,7 +19772,7 @@ QCPColorScaleAxisRectPrivate::QCPColorScaleAxisRectPrivate(QCPColorScale *parent connect(axis(QCPAxis::atRight), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atLeft), SLOT(setScaleType(QCPAxis::ScaleType))); connect(axis(QCPAxis::atBottom), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atTop), SLOT(setScaleType(QCPAxis::ScaleType))); connect(axis(QCPAxis::atTop), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atBottom), SLOT(setScaleType(QCPAxis::ScaleType))); - + // make layer transfers of color scale transfer to axis rect and axes // the axes must be set after axis rect, such that they appear above color gradient drawn by axis rect: connect(parentColorScale, SIGNAL(layerChanged(QCPLayer*)), this, SLOT(setLayer(QCPLayer*))); @@ -19511,17 +19781,17 @@ QCPColorScaleAxisRectPrivate::QCPColorScaleAxisRectPrivate(QCPColorScale *parent } /*! \internal - + Updates the color gradient image if necessary, by calling \ref updateGradientImage, then draws it. Then the axes are drawn by calling the \ref QCPAxisRect::draw base class implementation. - + \seebaseclassmethod */ void QCPColorScaleAxisRectPrivate::draw(QCPPainter *painter) { if (mGradientImageInvalidated) updateGradientImage(); - + bool mirrorHorz = false; bool mirrorVert = false; if (mParentColorScale->mColorAxis) @@ -19529,7 +19799,7 @@ void QCPColorScaleAxisRectPrivate::draw(QCPPainter *painter) mirrorHorz = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atBottom || mParentColorScale->type() == QCPAxis::atTop); mirrorVert = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atLeft || mParentColorScale->type() == QCPAxis::atRight); } - + painter->drawImage(rect().adjusted(0, -1, 0, -1), mGradientImage.mirrored(mirrorHorz, mirrorVert)); QCPAxisRect::draw(painter); } @@ -19543,7 +19813,7 @@ void QCPColorScaleAxisRectPrivate::updateGradientImage() { if (rect().isEmpty()) return; - + const QImage::Format format = QImage::Format_ARGB32_Premultiplied; int n = mParentColorScale->mGradient.levelCount(); int w, h; @@ -19591,7 +19861,7 @@ void QCPColorScaleAxisRectPrivate::axisSelectionChanged(QCPAxis::SelectableParts if (QCPAxis *senderAxis = qobject_cast(sender())) if (senderAxis->axisType() == type) continue; - + if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis)) { if (selectedParts.testFlag(QCPAxis::spAxis)) @@ -19616,7 +19886,7 @@ void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectablePart if (QCPAxis *senderAxis = qobject_cast(sender())) if (senderAxis->axisType() == type) continue; - + if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis)) { if (selectableParts.testFlag(QCPAxis::spAxis)) @@ -19629,8 +19899,8 @@ void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectablePart /* end of 'src/layoutelements/layoutelement-colorscale.cpp' */ -/* including file 'src/plottables/plottable-graph.cpp', size 72363 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-graph.cpp', size 73960 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPGraphData @@ -19638,65 +19908,65 @@ void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectablePart /*! \class QCPGraphData \brief Holds the data of one single data point for QCPGraph. - + The stored data is: \li \a key: coordinate on the key axis of this data point (this is the \a mainKey and the \a sortKey) \li \a value: coordinate on the value axis of this data point (this is the \a mainValue) - + The container for storing multiple data points is \ref QCPGraphDataContainer. It is a typedef for \ref QCPDataContainer with \ref QCPGraphData as the DataType template parameter. See the documentation there for an explanation regarding the data type's generic methods. - + \see QCPGraphDataContainer */ /* start documentation of inline functions */ /*! \fn double QCPGraphData::sortKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static QCPGraphData QCPGraphData::fromSortKey(double sortKey) - + Returns a data point with the specified \a sortKey. All other members are set to zero. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static static bool QCPGraphData::sortKeyIsMainKey() - + Since the member \a key is both the data point key coordinate and the data ordering parameter, this method returns true. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPGraphData::mainKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPGraphData::mainValue() const - + Returns the \a value member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn QCPRange QCPGraphData::valueRange() const - + Returns a QCPRange with both lower and upper boundary set to \a value of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ @@ -19730,33 +20000,33 @@ QCPGraphData::QCPGraphData(double key, double value) : \brief A plottable representing a graph in a plot. \image html QCPGraph.png - + Usually you create new graphs by calling QCustomPlot::addGraph. The resulting instance can be accessed via QCustomPlot::graph. To plot data, assign it with the \ref setData or \ref addData functions. Alternatively, you can also access and modify the data via the \ref data method, which returns a pointer to the internal \ref QCPGraphDataContainer. - + Graphs are used to display single-valued data. Single-valued means that there should only be one data point per unique key coordinate. In other words, the graph can't have \a loops. If you do want to plot non-single-valued curves, rather use the QCPCurve plottable. - + Gaps in the graph line can be created by adding data points with NaN as value (qQNaN() or std::numeric_limits::quiet_NaN()) in between the two data points that shall be separated. - + \section qcpgraph-appearance Changing the appearance - + The appearance of the graph is mainly determined by the line style, scatter style, brush and pen of the graph (\ref setLineStyle, \ref setScatterStyle, \ref setBrush, \ref setPen). - + \subsection filling Filling under or between graphs - + QCPGraph knows two types of fills: Normal graph fills towards the zero-value-line parallel to the key axis of the graph, and fills between two graphs, called channel fills. To enable a fill, just set a brush with \ref setBrush which is neither Qt::NoBrush nor fully transparent. - + By default, a normal fill towards the zero-value-line will be drawn. To set up a channel fill between this graph and another one, call \ref setChannelFillGraph with the other graph as parameter. @@ -19767,7 +20037,7 @@ QCPGraphData::QCPGraphData(double key, double value) : /* start of documentation of inline functions */ /*! \fn QSharedPointer QCPGraph::data() const - + Returns a shared pointer to the internal data storage of type \ref QCPGraphDataContainer. You may use it to directly manipulate the data, which may be more convenient and faster than using the regular \ref setData or \ref addData methods. @@ -19780,11 +20050,11 @@ QCPGraphData::QCPGraphData(double key, double value) : axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have the same orientation. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + The created QCPGraph is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPGraph, so do not delete it manually but use QCustomPlot::removePlottable() instead. - + To directly create a graph inside a plot, you can also use the simpler QCustomPlot::addGraph function. */ QCPGraph::QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) : @@ -19795,7 +20065,7 @@ QCPGraph::QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) : setPen(QPen(Qt::blue, 0)); setBrush(Qt::NoBrush); - + setLineStyle(lsLine); setScatterSkip(0); setChannelFillGraph(0); @@ -19807,18 +20077,18 @@ QCPGraph::~QCPGraph() } /*! \overload - + Replaces the current data container with the provided \a data container. - + Since a QSharedPointer is used, multiple QCPGraphs may share the same data container safely. Modifying the data in the container will then affect all graphs that share the container. Sharing can be achieved by simply exchanging the data containers wrapped in shared pointers: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpgraph-datasharing-1 - + If you do not wish to share containers, but create a copy from an existing container, rather use the \ref QCPDataContainer::set method on the graph's data container directly: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpgraph-datasharing-2 - + \see addData */ void QCPGraph::setData(QSharedPointer data) @@ -19827,14 +20097,14 @@ void QCPGraph::setData(QSharedPointer data) } /*! \overload - + Replaces the current data with the provided points in \a keys and \a values. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + \see addData */ void QCPGraph::setData(const QVector &keys, const QVector &values, bool alreadySorted) @@ -19846,7 +20116,7 @@ void QCPGraph::setData(const QVector &keys, const QVector &value /*! Sets how the single data points are connected in the plot. For scatter-only plots, set \a ls to \ref lsNone and \ref setScatterStyle to the desired scatter style. - + \see setScatterStyle */ void QCPGraph::setLineStyle(LineStyle ls) @@ -19857,7 +20127,7 @@ void QCPGraph::setLineStyle(LineStyle ls) /*! Sets the visual appearance of single data points in the plot. If set to \ref QCPScatterStyle::ssNone, no scatter points are drawn (e.g. for line-only-plots with appropriate line style). - + \see QCPScatterStyle, setLineStyle */ void QCPGraph::setScatterStyle(const QCPScatterStyle &style) @@ -19884,7 +20154,7 @@ void QCPGraph::setScatterSkip(int skip) /*! Sets the target graph for filling the area between this graph and \a targetGraph with the current brush (\ref setBrush). - + When \a targetGraph is set to 0, a normal graph fill to the zero-value-line will be shown. To disable any filling, set the brush to Qt::NoBrush. @@ -19906,7 +20176,7 @@ void QCPGraph::setChannelFillGraph(QCPGraph *targetGraph) mChannelFillGraph = 0; return; } - + mChannelFillGraph = targetGraph; } @@ -19914,19 +20184,19 @@ void QCPGraph::setChannelFillGraph(QCPGraph *targetGraph) Sets whether adaptive sampling shall be used when plotting this graph. QCustomPlot's adaptive sampling technique can drastically improve the replot performance for graphs with a larger number of points (e.g. above 10,000), without notably changing the appearance of the graph. - + By default, adaptive sampling is enabled. Even if enabled, QCustomPlot decides whether adaptive sampling shall actually be used on a per-graph basis. So leaving adaptive sampling enabled has no disadvantage in almost all cases. - + \image html adaptive-sampling-line.png "A line plot of 500,000 points without and with adaptive sampling" - + As can be seen, line plots experience no visual degradation from adaptive sampling. Outliers are reproduced reliably, as well as the overall shape of the data set. The replot time reduces dramatically though. This allows QCustomPlot to display large amounts of data in realtime. - + \image html adaptive-sampling-scatter.png "A scatter plot of 100,000 points without and with adaptive sampling" - + Care must be taken when using high-density scatter plots in combination with adaptive sampling. The adaptive sampling algorithm treats scatter plots more carefully than line plots which still gives a significant reduction of replot times, but not quite as much as for line plots. This is @@ -19935,7 +20205,7 @@ void QCPGraph::setChannelFillGraph(QCPGraph *targetGraph) identical, as banding occurs for the outer data points. This is in fact intentional, such that the boundaries of the data cloud stay visible to the viewer. How strong the banding appears, depends on the point density, i.e. the number of points in the plot. - + For some situations with scatter plots it might thus be desirable to manually turn adaptive sampling off. For example, when saving the plot to disk. This can be achieved by setting \a enabled to false before issuing a command like \ref QCustomPlot::savePng, and setting \a enabled @@ -19947,14 +20217,14 @@ void QCPGraph::setAdaptiveSampling(bool enabled) } /*! \overload - + Adds the provided points in \a keys and \a values to the current data. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -19978,9 +20248,9 @@ void QCPGraph::addData(const QVector &keys, const QVector &value } /*! \overload - + Adds the provided data point as \a key and \a value to the current data. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -19996,7 +20266,7 @@ double QCPGraph::selectTest(const QPointF &pos, bool onlySelectable, QVariant *d return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { QCPGraphDataContainer::const_iterator closestDataPoint = mDataContainer->constEnd(); @@ -20029,9 +20299,9 @@ void QCPGraph::draw(QCPPainter *painter) if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } if (mKeyAxis.data()->range().size() <= 0 || mDataContainer->isEmpty()) return; if (mLineStyle == lsNone && mScatterStyle.isNone()) return; - + QVector lines, scatters; // line and (if necessary) scatter pixel coordinates will be stored here while iterating over segments - + // loop over and draw segments of unselected/selected data: QList selectedSegments, unselectedSegments, allSegments; getDataSegments(selectedSegments, unselectedSegments); @@ -20042,7 +20312,7 @@ void QCPGraph::draw(QCPPainter *painter) // get line pixel points appropriate to line style: QCPDataRange lineDataRange = isSelectedSegment ? allSegments.at(i) : allSegments.at(i).adjusted(-1, 1); // unselected segments extend lines to bordering selected data point (safe to exceed total data bounds in first/last segment, getLines takes care) getLines(&lines, lineDataRange); - + // check data validity if flag set: #ifdef QCUSTOMPLOT_CHECK_DATA QCPGraphDataContainer::const_iterator it; @@ -20052,7 +20322,7 @@ void QCPGraph::draw(QCPPainter *painter) qDebug() << Q_FUNC_INFO << "Data point at" << it->key << "invalid." << "Plottable name:" << name(); } #endif - + // draw fill of graph: if (isSelectedSegment && mSelectionDecorator) mSelectionDecorator->applyBrush(painter); @@ -20060,7 +20330,7 @@ void QCPGraph::draw(QCPPainter *painter) painter->setBrush(mBrush); painter->setPen(Qt::NoPen); drawFill(painter, &lines); - + // draw line: if (mLineStyle != lsNone) { @@ -20074,7 +20344,7 @@ void QCPGraph::draw(QCPPainter *painter) else drawLinePlot(painter, lines); // also step plots can be drawn as a line plot } - + // draw scatters: QCPScatterStyle finalScatterStyle = mScatterStyle; if (isSelectedSegment && mSelectionDecorator) @@ -20085,7 +20355,7 @@ void QCPGraph::draw(QCPPainter *painter) drawScatterPlot(painter, scatters, finalScatterStyle); } } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -20156,10 +20426,13 @@ void QCPGraph::getLines(QVector *lines, const QCPDataRange &dataRange) lines->clear(); return; } - + QVector lineData; if (mLineStyle != lsNone) getOptimizedLineData(&lineData, begin, end); + + if (mKeyAxis->rangeReversed() != (mKeyAxis->orientation() == Qt::Vertical)) // make sure key pixels are sorted ascending in lineData (significantly simplifies following processing) + std::reverse(lineData.begin(), lineData.end()); switch (mLineStyle) { @@ -20190,7 +20463,7 @@ void QCPGraph::getScatters(QVector *scatters, const QCPDataRange &dataR QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; scatters->clear(); return; } - + QCPGraphDataContainer::const_iterator begin, end; getVisibleDataBounds(begin, end, dataRange); if (begin == end) @@ -20198,9 +20471,13 @@ void QCPGraph::getScatters(QVector *scatters, const QCPDataRange &dataR scatters->clear(); return; } - + QVector data; getOptimizedScatterData(&data, begin, end); + + if (mKeyAxis->rangeReversed() != (mKeyAxis->orientation() == Qt::Vertical)) // make sure key pixels are sorted ascending in data (significantly simplifies following processing) + std::reverse(data.begin(), data.end()); + scatters->resize(data.size()); if (keyAxis->orientation() == Qt::Vertical) { @@ -20229,7 +20506,7 @@ void QCPGraph::getScatters(QVector *scatters, const QCPDataRange &dataR Takes raw data points in plot coordinates as \a data, and returns a vector containing pixel coordinate points which are suitable for drawing the line style \ref lsLine. - + The source of \a data is usually \ref getOptimizedLineData, and this method is called in \a getLines if the line style is set accordingly. @@ -20242,9 +20519,8 @@ QVector QCPGraph::dataToLines(const QVector &data) const QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return result; } - result.reserve(data.size()+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill result.resize(data.size()); - + // transform data points to pixels: if (keyAxis->orientation() == Qt::Vertical) { @@ -20268,7 +20544,7 @@ QVector QCPGraph::dataToLines(const QVector &data) const Takes raw data points in plot coordinates as \a data, and returns a vector containing pixel coordinate points which are suitable for drawing the line style \ref lsStepLeft. - + The source of \a data is usually \ref getOptimizedLineData, and this method is called in \a getLines if the line style is set accordingly. @@ -20280,10 +20556,9 @@ QVector QCPGraph::dataToStepLeftLines(const QVector &data QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return result; } - - result.reserve(data.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + result.resize(data.size()*2); - + // calculate steps from data and transform to pixel coordinates: if (keyAxis->orientation() == Qt::Vertical) { @@ -20317,7 +20592,7 @@ QVector QCPGraph::dataToStepLeftLines(const QVector &data Takes raw data points in plot coordinates as \a data, and returns a vector containing pixel coordinate points which are suitable for drawing the line style \ref lsStepRight. - + The source of \a data is usually \ref getOptimizedLineData, and this method is called in \a getLines if the line style is set accordingly. @@ -20329,10 +20604,9 @@ QVector QCPGraph::dataToStepRightLines(const QVector &dat QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return result; } - - result.reserve(data.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + result.resize(data.size()*2); - + // calculate steps from data and transform to pixel coordinates: if (keyAxis->orientation() == Qt::Vertical) { @@ -20366,7 +20640,7 @@ QVector QCPGraph::dataToStepRightLines(const QVector &dat Takes raw data points in plot coordinates as \a data, and returns a vector containing pixel coordinate points which are suitable for drawing the line style \ref lsStepCenter. - + The source of \a data is usually \ref getOptimizedLineData, and this method is called in \a getLines if the line style is set accordingly. @@ -20378,10 +20652,9 @@ QVector QCPGraph::dataToStepCenterLines(const QVector &da QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return result; } - - result.reserve(data.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + result.resize(data.size()*2); - + // calculate steps from data and transform to pixel coordinates: if (keyAxis->orientation() == Qt::Vertical) { @@ -20427,7 +20700,7 @@ QVector QCPGraph::dataToStepCenterLines(const QVector &da Takes raw data points in plot coordinates as \a data, and returns a vector containing pixel coordinate points which are suitable for drawing the line style \ref lsImpulse. - + The source of \a data is usually \ref getOptimizedLineData, and this method is called in \a getLines if the line style is set accordingly. @@ -20439,9 +20712,9 @@ QVector QCPGraph::dataToImpulseLines(const QVector &data) QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return result; } - - result.resize(data.size()*2); // no need to reserve 2 extra points because impulse plot has no fill - + + result.resize(data.size()*2); + // transform data points to pixels: if (keyAxis->orientation() == Qt::Vertical) { @@ -20468,18 +20741,19 @@ QVector QCPGraph::dataToImpulseLines(const QVector &data) } /*! \internal - + Draws the fill of the graph using the specified \a painter, with the currently set brush. - - \a lines contains the points of the graph line, in pixel coordinates. - - If the fill is a normal fill towards the zero-value-line, only the points in \a lines are - required and two extra points at the zero-value-line, which are added by \ref addFillBasePoints - and removed by \ref removeFillBasePoints after the fill drawing is done. - - On the other hand if the fill is a channel fill between this QCPGraph and another QCPGraph (\a - mChannelFillGraph), the more complex polygon is calculated with the \ref getChannelFillPolygon - function, and then drawn. + + Depending on whether a normal fill or a channel fill (\ref setChannelFillGraph) is needed, \ref + getFillPolygon or \ref getChannelFillPolygon are used to find the according fill polygons. + + In order to handle NaN Data points correctly (the fill needs to be split into disjoint areas), + this method first determines a list of non-NaN segments with \ref getNonNanSegments, on which to + operate. In the channel fill case, \ref getOverlappingSegments is used to consolidate the non-NaN + segments of the two involved graphs, before passing the overlapping pairs to \ref + getChannelFillPolygon. + + Pass the points of this graph's line as \a lines, in pixel coordinates. \see drawLinePlot, drawImpulsePlot, drawScatterPlot */ @@ -20487,18 +20761,26 @@ void QCPGraph::drawFill(QCPPainter *painter, QVector *lines) const { if (mLineStyle == lsImpulse) return; // fill doesn't make sense for impulse plot if (painter->brush().style() == Qt::NoBrush || painter->brush().color().alpha() == 0) return; - + applyFillAntialiasingHint(painter); + QVector segments = getNonNanSegments(lines, keyAxis()->orientation()); if (!mChannelFillGraph) { // draw base fill under graph, fill goes all the way to the zero-value-line: - addFillBasePoints(lines); - painter->drawPolygon(QPolygonF(*lines)); - removeFillBasePoints(lines); + for (int i=0; idrawPolygon(getFillPolygon(lines, segments.at(i))); } else { - // draw channel fill between this graph and mChannelFillGraph: - painter->drawPolygon(getChannelFillPolygon(lines)); + // draw fill between this graph and mChannelFillGraph: + QVector otherLines; + mChannelFillGraph->getLines(&otherLines, QCPDataRange(0, mChannelFillGraph->dataCount())); + if (!otherLines.isEmpty()) + { + QVector otherSegments = getNonNanSegments(&otherLines, mChannelFillGraph->keyAxis()->orientation()); + QVector > segmentPairs = getOverlappingSegments(segments, lines, otherSegments, &otherLines); + for (int i=0; idrawPolygon(getChannelFillPolygon(lines, segmentPairs.at(i).first, &otherLines, segmentPairs.at(i).second)); + } } } @@ -20518,9 +20800,9 @@ void QCPGraph::drawScatterPlot(QCPPainter *painter, const QVector &scat } /*! \internal - + Draws lines between the points in \a lines, given in pixel coordinates. - + \see drawScatterPlot, drawImpulsePlot, QCPAbstractPlottable1D::drawPolyline */ void QCPGraph::drawLinePlot(QCPPainter *painter, const QVector &lines) const @@ -20573,7 +20855,7 @@ void QCPGraph::getOptimizedLineData(QVector *lineData, const QCPGr QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } if (begin == end) return; - + int dataCount = end-begin; int maxCount = std::numeric_limits::max(); if (mAdaptiveSampling) @@ -20582,7 +20864,7 @@ void QCPGraph::getOptimizedLineData(QVector *lineData, const QCPGr if (2*keyPixelSpan+2 < (double)std::numeric_limits::max()) maxCount = 2*keyPixelSpan+2; } - + if (mAdaptiveSampling && dataCount >= maxCount) // use adaptive sampling only if there are at least two points per pixel on average { QCPGraphDataContainer::const_iterator it = begin; @@ -20638,16 +20920,11 @@ void QCPGraph::getOptimizedLineData(QVector *lineData, const QCPGr lineData->append(QCPGraphData(currentIntervalStartKey+keyEpsilon*0.75, maxValue)); } else lineData->append(QCPGraphData(currentIntervalFirstPoint->key, currentIntervalFirstPoint->value)); - + } else // don't use adaptive sampling algorithm, transfer points one-to-one from the data container into the output { - QCPGraphDataContainer::const_iterator it = begin; - lineData->reserve(dataCount+2); // +2 for possible fill end points - while (it != end) - { - lineData->append(*it); - ++it; - } + lineData->resize(dataCount); + std::copy(begin, end, lineData->begin()); } } @@ -20669,7 +20946,7 @@ void QCPGraph::getOptimizedScatterData(QVector *scatterData, QCPGr QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + const int scatterModulo = mScatterSkip+1; const bool doScatterSkip = mScatterSkip > 0; int beginIndex = begin-mDataContainer->constBegin(); @@ -20687,7 +20964,7 @@ void QCPGraph::getOptimizedScatterData(QVector *scatterData, QCPGr int keyPixelSpan = qAbs(keyAxis->coordToPixel(begin->key)-keyAxis->coordToPixel((end-1)->key)); maxCount = 2*keyPixelSpan+2; } - + if (mAdaptiveSampling && dataCount >= maxCount) // use adaptive sampling only if there are at least two points per pixel on average { double valueMaxRange = valueAxis->range().upper; @@ -20808,7 +21085,7 @@ void QCPGraph::getOptimizedScatterData(QVector *scatterData, QCPGr } } else if (currentIntervalStart->value > valueMinRange && currentIntervalStart->value < valueMaxRange) scatterData->append(*currentIntervalStart); - + } else // don't use adaptive sampling algorithm, transfer points one-to-one from the data container into the output { QCPGraphDataContainer::const_iterator it = begin; @@ -20863,157 +21140,188 @@ void QCPGraph::getVisibleDataBounds(QCPGraphDataContainer::const_iterator &begin } } -/*! \internal - - The line vector generated by e.g. \ref getLines describes only the line that connects the data - points. If the graph needs to be filled, two additional points need to be added at the - value-zero-line in the lower and upper key positions of the graph. This function calculates these - points and adds them to the end of \a lineData. Since the fill is typically drawn before the line - stroke, these added points need to be removed again after the fill is done, with the - removeFillBasePoints function. - - The expanding of \a lines by two points will not cause unnecessary memory reallocations, because - the data vector generation functions (e.g. \ref getLines) reserve two extra points when they - allocate memory for \a lines. - - \see removeFillBasePoints, lowerFillBasePoint, upperFillBasePoint +/*! \internal + + This method goes through the passed points in \a lineData and returns a list of the segments + which don't contain NaN data points. + + \a keyOrientation defines whether the \a x or \a y member of the passed QPointF is used to check + for NaN. If \a keyOrientation is \c Qt::Horizontal, the \a y member is checked, if it is \c + Qt::Vertical, the \a x member is checked. + + \see getOverlappingSegments, drawFill */ -void QCPGraph::addFillBasePoints(QVector *lines) const +QVector QCPGraph::getNonNanSegments(const QVector *lineData, Qt::Orientation keyOrientation) const { - if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } - if (!lines) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; } - if (lines->isEmpty()) return; - - // append points that close the polygon fill at the key axis: - if (mKeyAxis.data()->orientation() == Qt::Vertical) + QVector result; + const int n = lineData->size(); + + QCPDataRange currentSegment(-1, -1); + int i = 0; + + if (keyOrientation == Qt::Horizontal) { - *lines << upperFillBasePoint(lines->last().y()); - *lines << lowerFillBasePoint(lines->first().y()); + while (i < n) + { + while (i < n && qIsNaN(lineData->at(i).y())) // seek next non-NaN data point + ++i; + if (i == n) + break; + currentSegment.setBegin(i++); + while (i < n && !qIsNaN(lineData->at(i).y())) // seek next NaN data point or end of data + ++i; + currentSegment.setEnd(i++); + result.append(currentSegment); + } + } else // keyOrientation == Qt::Vertical + { + while (i < n) + { + while (i < n && qIsNaN(lineData->at(i).x())) // seek next non-NaN data point + ++i; + if (i == n) + break; + currentSegment.setBegin(i++); + while (i < n && !qIsNaN(lineData->at(i).x())) // seek next NaN data point or end of data + ++i; + currentSegment.setEnd(i++); + result.append(currentSegment); + } + } + return result; +} + +/*! \internal + + This method takes two segment lists (e.g. created by \ref getNonNanSegments) \a thisSegments and + \a otherSegments, and their associated point data \a thisData and \a otherData. + + It returns all pairs of segments (the first from \a thisSegments, the second from \a + otherSegments), which overlap in plot coordinates. + + This method is useful in the case of a channel fill between two graphs, when only those non-NaN + segments which actually overlap in their key coordinate shall be considered for drawing a channel + fill polygon. + + It is assumed that the passed segments in \a thisSegments are ordered ascending by index, and + that the segments don't overlap themselves. The same is assumed for the segments in \a + otherSegments. This is fulfilled when the segments are obtained via \ref getNonNanSegments. + + \see getNonNanSegments, segmentsIntersect, drawFill, getChannelFillPolygon +*/ +QVector > QCPGraph::getOverlappingSegments(QVector thisSegments, const QVector *thisData, QVector otherSegments, const QVector *otherData) const +{ + QVector > result; + if (thisData->isEmpty() || otherData->isEmpty() || thisSegments.isEmpty() || otherSegments.isEmpty()) + return result; + + int thisIndex = 0; + int otherIndex = 0; + const bool verticalKey = mKeyAxis->orientation() == Qt::Vertical; + while (thisIndex < thisSegments.size() && otherIndex < otherSegments.size()) + { + if (thisSegments.at(thisIndex).size() < 2) // segments with fewer than two points won't have a fill anyhow + { + ++thisIndex; + continue; + } + if (otherSegments.at(otherIndex).size() < 2) // segments with fewer than two points won't have a fill anyhow + { + ++otherIndex; + continue; + } + double thisLower, thisUpper, otherLower, otherUpper; + if (!verticalKey) + { + thisLower = thisData->at(thisSegments.at(thisIndex).begin()).x(); + thisUpper = thisData->at(thisSegments.at(thisIndex).end()-1).x(); + otherLower = otherData->at(otherSegments.at(otherIndex).begin()).x(); + otherUpper = otherData->at(otherSegments.at(otherIndex).end()-1).x(); + } else + { + thisLower = thisData->at(thisSegments.at(thisIndex).begin()).y(); + thisUpper = thisData->at(thisSegments.at(thisIndex).end()-1).y(); + otherLower = otherData->at(otherSegments.at(otherIndex).begin()).y(); + otherUpper = otherData->at(otherSegments.at(otherIndex).end()-1).y(); + } + + int bPrecedence; + if (segmentsIntersect(thisLower, thisUpper, otherLower, otherUpper, bPrecedence)) + result.append(QPair(thisSegments.at(thisIndex), otherSegments.at(otherIndex))); + + if (bPrecedence <= 0) // otherSegment doesn't reach as far as thisSegment, so continue with next otherSegment, keeping current thisSegment + ++otherIndex; + else // otherSegment reaches further than thisSegment, so continue with next thisSegment, keeping current otherSegment + ++thisIndex; + } + + return result; +} + +/*! \internal + + Returns whether the segments defined by the coordinates (aLower, aUpper) and (bLower, bUpper) + have overlap. + + The output parameter \a bPrecedence indicates whether the \a b segment reaches farther than the + \a a segment or not. If \a bPrecedence returns 1, segment \a b reaches the farthest to higher + coordinates (i.e. bUpper > aUpper). If it returns -1, segment \a a reaches the farthest. Only if + both segment's upper bounds are identical, 0 is returned as \a bPrecedence. + + It is assumed that the lower bounds always have smaller or equal values than the upper bounds. + + \see getOverlappingSegments +*/ +bool QCPGraph::segmentsIntersect(double aLower, double aUpper, double bLower, double bUpper, int &bPrecedence) const +{ + bPrecedence = 0; + if (aLower > bUpper) + { + bPrecedence = -1; + return false; + } else if (bLower > aUpper) + { + bPrecedence = 1; + return false; } else { - *lines << upperFillBasePoint(lines->last().x()); - *lines << lowerFillBasePoint(lines->first().x()); + if (aUpper > bUpper) + bPrecedence = -1; + else if (aUpper < bUpper) + bPrecedence = 1; + + return true; } } /*! \internal + + Returns the point which closes the fill polygon on the zero-value-line parallel to the key axis. + The logarithmic axis scale case is a bit special, since the zero-value-line in pixel coordinates + is in positive or negative infinity. So this case is handled separately by just closing the fill + polygon on the axis which lies in the direction towards the zero value. - removes the two points from \a lines that were added by \ref addFillBasePoints. - - \see addFillBasePoints, lowerFillBasePoint, upperFillBasePoint + \a matchingDataPoint will provide the key (in pixels) of the returned point. Depending on whether + the key axis of this graph is horizontal or vertical, \a matchingDataPoint will provide the x or + y value of the returned point, respectively. */ -void QCPGraph::removeFillBasePoints(QVector *lines) const -{ - if (!lines) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; } - if (lines->isEmpty()) return; - - lines->remove(lines->size()-2, 2); -} - -/*! \internal - - called by \ref addFillBasePoints to conveniently assign the point which closes the fill polygon - on the lower side of the zero-value-line parallel to the key axis. The logarithmic axis scale - case is a bit special, since the zero-value-line in pixel coordinates is in positive or negative - infinity. So this case is handled separately by just closing the fill polygon on the axis which - lies in the direction towards the zero value. - - \a lowerKey will be the the key (in pixels) of the returned point. Depending on whether the key - axis is horizontal or vertical, \a lowerKey will end up as the x or y value of the returned - point, respectively. - - \see upperFillBasePoint, addFillBasePoints -*/ -QPointF QCPGraph::lowerFillBasePoint(double lowerKey) const +QPointF QCPGraph::getFillBasePoint(QPointF matchingDataPoint) const { QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } - - QPointF point; + + QPointF result; if (valueAxis->scaleType() == QCPAxis::stLinear) { - if (keyAxis->axisType() == QCPAxis::atLeft) + if (keyAxis->orientation() == Qt::Horizontal) { - point.setX(valueAxis->coordToPixel(0)); - point.setY(lowerKey); - } else if (keyAxis->axisType() == QCPAxis::atRight) + result.setX(matchingDataPoint.x()); + result.setY(valueAxis->coordToPixel(0)); + } else // keyAxis->orientation() == Qt::Vertical { - point.setX(valueAxis->coordToPixel(0)); - point.setY(lowerKey); - } else if (keyAxis->axisType() == QCPAxis::atTop) - { - point.setX(lowerKey); - point.setY(valueAxis->coordToPixel(0)); - } else if (keyAxis->axisType() == QCPAxis::atBottom) - { - point.setX(lowerKey); - point.setY(valueAxis->coordToPixel(0)); - } - } else // valueAxis->mScaleType == QCPAxis::stLogarithmic - { - // In logarithmic scaling we can't just draw to value zero so we just fill all the way - // to the axis which is in the direction towards zero - if (keyAxis->orientation() == Qt::Vertical) - { - if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || - (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis - point.setX(keyAxis->axisRect()->right()); - else - point.setX(keyAxis->axisRect()->left()); - point.setY(lowerKey); - } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom) - { - point.setX(lowerKey); - if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || - (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis - point.setY(keyAxis->axisRect()->top()); - else - point.setY(keyAxis->axisRect()->bottom()); - } - } - return point; -} - -/*! \internal - - called by \ref addFillBasePoints to conveniently assign the point which closes the fill - polygon on the upper side of the zero-value-line parallel to the key axis. The logarithmic axis - scale case is a bit special, since the zero-value-line in pixel coordinates is in positive or - negative infinity. So this case is handled separately by just closing the fill polygon on the - axis which lies in the direction towards the zero value. - - \a upperKey will be the the key (in pixels) of the returned point. Depending on whether the key - axis is horizontal or vertical, \a upperKey will end up as the x or y value of the returned - point, respectively. - - \see lowerFillBasePoint, addFillBasePoints -*/ -QPointF QCPGraph::upperFillBasePoint(double upperKey) const -{ - QCPAxis *keyAxis = mKeyAxis.data(); - QCPAxis *valueAxis = mValueAxis.data(); - if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } - - QPointF point; - if (valueAxis->scaleType() == QCPAxis::stLinear) - { - if (keyAxis->axisType() == QCPAxis::atLeft) - { - point.setX(valueAxis->coordToPixel(0)); - point.setY(upperKey); - } else if (keyAxis->axisType() == QCPAxis::atRight) - { - point.setX(valueAxis->coordToPixel(0)); - point.setY(upperKey); - } else if (keyAxis->axisType() == QCPAxis::atTop) - { - point.setX(upperKey); - point.setY(valueAxis->coordToPixel(0)); - } else if (keyAxis->axisType() == QCPAxis::atBottom) - { - point.setX(upperKey); - point.setY(valueAxis->coordToPixel(0)); + result.setX(valueAxis->coordToPixel(0)); + result.setY(matchingDataPoint.y()); } } else // valueAxis->mScaleType == QCPAxis::stLogarithmic { @@ -21023,106 +21331,122 @@ QPointF QCPGraph::upperFillBasePoint(double upperKey) const { if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis - point.setX(keyAxis->axisRect()->right()); + result.setX(keyAxis->axisRect()->right()); else - point.setX(keyAxis->axisRect()->left()); - point.setY(upperKey); + result.setX(keyAxis->axisRect()->left()); + result.setY(matchingDataPoint.y()); } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom) { - point.setX(upperKey); + result.setX(matchingDataPoint.x()); if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis - point.setY(keyAxis->axisRect()->top()); + result.setY(keyAxis->axisRect()->top()); else - point.setY(keyAxis->axisRect()->bottom()); + result.setY(keyAxis->axisRect()->bottom()); } } - return point; + return result; } /*! \internal + + Returns the polygon needed for drawing normal fills between this graph and the key axis. + + Pass the graph's data points (in pixel coordinates) as \a lineData, and specify the \a segment + which shall be used for the fill. The collection of \a lineData points described by \a segment + must not contain NaN data points (see \ref getNonNanSegments). + + The returned fill polygon will be closed at the key axis (the zero-value line) for linear value + axes. For logarithmic value axes the polygon will reach just beyond the corresponding axis rect + side (see \ref getFillBasePoint). - Generates the polygon needed for drawing channel fills between this graph and the graph specified - in \a mChannelFillGraph (see \ref setChannelFillGraph). The data points representing the line of - this graph in pixel coordinates must be passed in \a lines, the corresponding points of the other - graph are generated by calling its \ref getLines method. - - This method may return an empty polygon if the key ranges of the two graphs have no overlap of if - they don't have the same orientation (e.g. one key axis vertical, the other horizontal). For - increased performance (due to implicit sharing), it is recommended to keep the returned QPolygonF - const. + For increased performance (due to implicit sharing), keep the returned QPolygonF const. + + \see drawFill, getNonNanSegments */ -const QPolygonF QCPGraph::getChannelFillPolygon(const QVector *lines) const +const QPolygonF QCPGraph::getFillPolygon(const QVector *lineData, QCPDataRange segment) const +{ + if (segment.size() < 2) + return QPolygonF(); + QPolygonF result(segment.size()+2); + + result[0] = getFillBasePoint(lineData->at(segment.begin())); + std::copy(lineData->constBegin()+segment.begin(), lineData->constBegin()+segment.end(), result.begin()+1); + result[result.size()-1] = getFillBasePoint(lineData->at(segment.end()-1)); + + return result; +} + +/*! \internal + + Returns the polygon needed for drawing (partial) channel fills between this graph and the graph + specified by \ref setChannelFillGraph. + + The data points of this graph are passed as pixel coordinates via \a thisData, the data of the + other graph as \a otherData. The returned polygon will be calculated for the specified data + segments \a thisSegment and \a otherSegment, pertaining to the respective \a thisData and \a + otherData, respectively. + + The passed \a thisSegment and \a otherSegment should correspond to the segment pairs returned by + \ref getOverlappingSegments, to make sure only segments that actually have key coordinate overlap + need to be processed here. + + For increased performance due to implicit sharing, keep the returned QPolygonF const. + + \see drawFill, getOverlappingSegments, getNonNanSegments +*/ +const QPolygonF QCPGraph::getChannelFillPolygon(const QVector *thisData, QCPDataRange thisSegment, const QVector *otherData, QCPDataRange otherSegment) const { if (!mChannelFillGraph) return QPolygonF(); - + QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPolygonF(); } if (!mChannelFillGraph.data()->mKeyAxis) { qDebug() << Q_FUNC_INFO << "channel fill target key axis invalid"; return QPolygonF(); } - + if (mChannelFillGraph.data()->mKeyAxis.data()->orientation() != keyAxis->orientation()) return QPolygonF(); // don't have same axis orientation, can't fill that (Note: if keyAxis fits, valueAxis will fit too, because it's always orthogonal to keyAxis) - - if (lines->isEmpty()) return QPolygonF(); - QVector otherData; - mChannelFillGraph.data()->getLines(&otherData, QCPDataRange(0, mChannelFillGraph.data()->dataCount())); - if (otherData.isEmpty()) return QPolygonF(); - QVector thisData; - thisData.reserve(lines->size()+otherData.size()); // because we will join both vectors at end of this function - for (int i=0; isize(); ++i) // don't use the vector<<(vector), it squeezes internally, which ruins the performance tuning with reserve() - thisData << lines->at(i); - + + if (thisData->isEmpty()) return QPolygonF(); + QVector thisSegmentData(thisSegment.size()); + QVector otherSegmentData(otherSegment.size()); + std::copy(thisData->constBegin()+thisSegment.begin(), thisData->constBegin()+thisSegment.end(), thisSegmentData.begin()); + std::copy(otherData->constBegin()+otherSegment.begin(), otherData->constBegin()+otherSegment.end(), otherSegmentData.begin()); // pointers to be able to swap them, depending which data range needs cropping: - QVector *staticData = &thisData; - QVector *croppedData = &otherData; - + QVector *staticData = &thisSegmentData; + QVector *croppedData = &otherSegmentData; + // crop both vectors to ranges in which the keys overlap (which coord is key, depends on axisType): if (keyAxis->orientation() == Qt::Horizontal) { // x is key - // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys: - if (staticData->first().x() > staticData->last().x()) - { - int size = staticData->size(); - for (int i=0; ifirst().x() > croppedData->last().x()) - { - int size = croppedData->size(); - for (int i=0; ifirst().x() < croppedData->first().x()) // other one must be cropped qSwap(staticData, croppedData); - int lowBound = findIndexBelowX(croppedData, staticData->first().x()); + const int lowBound = findIndexBelowX(croppedData, staticData->first().x()); if (lowBound == -1) return QPolygonF(); // key ranges have no overlap croppedData->remove(0, lowBound); - // set lowest point of cropped data to fit exactly key position of first static data - // point via linear interpolation: + // set lowest point of cropped data to fit exactly key position of first static data point via linear interpolation: if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation double slope; - if (croppedData->at(1).x()-croppedData->at(0).x() != 0) + if (!qFuzzyCompare(croppedData->at(1).x(), croppedData->at(0).x())) slope = (croppedData->at(1).y()-croppedData->at(0).y())/(croppedData->at(1).x()-croppedData->at(0).x()); else slope = 0; (*croppedData)[0].setY(croppedData->at(0).y()+slope*(staticData->first().x()-croppedData->at(0).x())); (*croppedData)[0].setX(staticData->first().x()); - + // crop upper bound: if (staticData->last().x() > croppedData->last().x()) // other one must be cropped qSwap(staticData, croppedData); int highBound = findIndexAboveX(croppedData, staticData->last().x()); if (highBound == -1) return QPolygonF(); // key ranges have no overlap croppedData->remove(highBound+1, croppedData->size()-(highBound+1)); - // set highest point of cropped data to fit exactly key position of last static data - // point via linear interpolation: + // set highest point of cropped data to fit exactly key position of last static data point via linear interpolation: if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation - int li = croppedData->size()-1; // last index - if (croppedData->at(li).x()-croppedData->at(li-1).x() != 0) + const int li = croppedData->size()-1; // last index + if (!qFuzzyCompare(croppedData->at(li).x(), croppedData->at(li-1).x())) slope = (croppedData->at(li).y()-croppedData->at(li-1).y())/(croppedData->at(li).x()-croppedData->at(li-1).x()); else slope = 0; @@ -21131,66 +21455,50 @@ const QPolygonF QCPGraph::getChannelFillPolygon(const QVector *lines) c } else // mKeyAxis->orientation() == Qt::Vertical { // y is key - // similar to "x is key" but switched x,y. Further, lower/upper meaning is inverted compared to x, - // because in pixel coordinates, y increases from top to bottom, not bottom to top like data coordinate. - // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys: - if (staticData->first().y() < staticData->last().y()) - { - int size = staticData->size(); - for (int i=0; ifirst().y() < croppedData->last().y()) - { - int size = croppedData->size(); - for (int i=0; ifirst().y() > croppedData->first().y()) // other one must be cropped + if (staticData->first().y() < croppedData->first().y()) // other one must be cropped qSwap(staticData, croppedData); - int lowBound = findIndexAboveY(croppedData, staticData->first().y()); + int lowBound = findIndexBelowY(croppedData, staticData->first().y()); if (lowBound == -1) return QPolygonF(); // key ranges have no overlap croppedData->remove(0, lowBound); - // set lowest point of cropped data to fit exactly key position of first static data - // point via linear interpolation: + // set lowest point of cropped data to fit exactly key position of first static data point via linear interpolation: if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation double slope; - if (croppedData->at(1).y()-croppedData->at(0).y() != 0) // avoid division by zero in step plots + if (!qFuzzyCompare(croppedData->at(1).y(), croppedData->at(0).y())) // avoid division by zero in step plots slope = (croppedData->at(1).x()-croppedData->at(0).x())/(croppedData->at(1).y()-croppedData->at(0).y()); else slope = 0; (*croppedData)[0].setX(croppedData->at(0).x()+slope*(staticData->first().y()-croppedData->at(0).y())); (*croppedData)[0].setY(staticData->first().y()); - + // crop upper bound: - if (staticData->last().y() < croppedData->last().y()) // other one must be cropped + if (staticData->last().y() > croppedData->last().y()) // other one must be cropped qSwap(staticData, croppedData); - int highBound = findIndexBelowY(croppedData, staticData->last().y()); + int highBound = findIndexAboveY(croppedData, staticData->last().y()); if (highBound == -1) return QPolygonF(); // key ranges have no overlap croppedData->remove(highBound+1, croppedData->size()-(highBound+1)); - // set highest point of cropped data to fit exactly key position of last static data - // point via linear interpolation: + // set highest point of cropped data to fit exactly key position of last static data point via linear interpolation: if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation int li = croppedData->size()-1; // last index - if (croppedData->at(li).y()-croppedData->at(li-1).y() != 0) // avoid division by zero in step plots + if (!qFuzzyCompare(croppedData->at(li).y(), croppedData->at(li-1).y())) // avoid division by zero in step plots slope = (croppedData->at(li).x()-croppedData->at(li-1).x())/(croppedData->at(li).y()-croppedData->at(li-1).y()); else slope = 0; (*croppedData)[li].setX(croppedData->at(li-1).x()+slope*(staticData->last().y()-croppedData->at(li-1).y())); (*croppedData)[li].setY(staticData->last().y()); } - + // return joined: - for (int i=otherData.size()-1; i>=0; --i) // insert reversed, otherwise the polygon will be twisted - thisData << otherData.at(i); - return QPolygonF(thisData); + for (int i=otherSegmentData.size()-1; i>=0; --i) // insert reversed, otherwise the polygon will be twisted + thisSegmentData << otherSegmentData.at(i); + return QPolygonF(thisSegmentData); } /*! \internal - + Finds the smallest index of \a data, whose points x value is just above \a x. Assumes x values in - \a data points are ordered ascending, as is the case when plotting with horizontal key axis. + \a data points are ordered ascending, as is ensured by \ref getLines/\ref getScatters if the key + axis is horizontal. Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. */ @@ -21210,10 +21518,11 @@ int QCPGraph::findIndexAboveX(const QVector *data, double x) const } /*! \internal - + Finds the highest index of \a data, whose points x value is just below \a x. Assumes x values in - \a data points are ordered ascending, as is the case when plotting with horizontal key axis. - + \a data points are ordered ascending, as is ensured by \ref getLines/\ref getScatters if the key + axis is horizontal. + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. */ int QCPGraph::findIndexBelowX(const QVector *data, double x) const @@ -21232,35 +21541,36 @@ int QCPGraph::findIndexBelowX(const QVector *data, double x) const } /*! \internal - + Finds the smallest index of \a data, whose points y value is just above \a y. Assumes y values in - \a data points are ordered descending, as is the case when plotting with vertical key axis. - + \a data points are ordered ascending, as is ensured by \ref getLines/\ref getScatters if the key + axis is vertical. + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. */ int QCPGraph::findIndexAboveY(const QVector *data, double y) const { - for (int i=0; isize(); ++i) + for (int i=data->size()-1; i>=0; --i) { if (data->at(i).y() < y) { - if (i>0) - return i-1; + if (isize()-1) + return i+1; else - return 0; + return data->size()-1; } } return -1; } /*! \internal - + Calculates the minimum distance in pixels the graph's representation has from the given \a pixelPoint. This is used to determine whether the graph was clicked or not, e.g. in \ref selectTest. The closest data point to \a pixelPoint is returned in \a closestData. Note that if the graph has a line representation, the returned distance may be smaller than the distance to the \a closestData point, since the distance to the graph line is also taken into account. - + If either the graph has no data or if the line style is \ref lsNone and the scatter style's shape is \ref QCPScatterStyle::ssNone (i.e. there is no visual representation of the graph), returns -1.0. */ @@ -21271,7 +21581,7 @@ double QCPGraph::pointDistance(const QPointF &pixelPoint, QCPGraphDataContainer: return -1.0; if (mLineStyle == lsNone && mScatterStyle.isNone()) return -1.0; - + // calculate minimum distances to graph data points and find closestData iterator: double minDistSqr = std::numeric_limits::max(); // determine which key range comes into question, taking selection tolerance around pos into account: @@ -21292,7 +21602,7 @@ double QCPGraph::pointDistance(const QPointF &pixelPoint, QCPGraphDataContainer: closestData = it; } } - + // calculate distance to graph line if there is one (if so, will probably be smaller than distance to closest data point): if (mLineStyle != lsNone) { @@ -21308,28 +21618,28 @@ double QCPGraph::pointDistance(const QPointF &pixelPoint, QCPGraphDataContainer: minDistSqr = currentDistSqr; } } - + return qSqrt(minDistSqr); } /*! \internal - + Finds the highest index of \a data, whose points y value is just below \a y. Assumes y values in - \a data points are ordered descending, as is the case when plotting with vertical key axis (since - keys are ordered ascending). + \a data points are ordered ascending, as is ensured by \ref getLines/\ref getScatters if the key + axis is vertical. Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. */ int QCPGraph::findIndexBelowY(const QVector *data, double y) const { - for (int i=data->size()-1; i>=0; --i) + for (int i=0; isize(); ++i) { if (data->at(i).y() > y) { - if (isize()-1) - return i+1; + if (i>0) + return i-1; else - return data->size()-1; + return 0; } } return -1; @@ -21337,8 +21647,8 @@ int QCPGraph::findIndexBelowY(const QVector *data, double y) const /* end of 'src/plottables/plottable-graph.cpp' */ -/* including file 'src/plottables/plottable-curve.cpp', size 60009 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-curve.cpp', size 63527 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPCurveData @@ -21346,67 +21656,67 @@ int QCPGraph::findIndexBelowY(const QVector *data, double y) const /*! \class QCPCurveData \brief Holds the data of one single data point for QCPCurve. - + The stored data is: \li \a t: the free ordering parameter of this curve point, like in the mathematical vector (x(t), y(t)). (This is the \a sortKey) \li \a key: coordinate on the key axis of this curve point (this is the \a mainKey) \li \a value: coordinate on the value axis of this curve point (this is the \a mainValue) - + The container for storing multiple data points is \ref QCPCurveDataContainer. It is a typedef for \ref QCPDataContainer with \ref QCPCurveData as the DataType template parameter. See the documentation there for an explanation regarding the data type's generic methods. - + \see QCPCurveDataContainer */ /* start documentation of inline functions */ /*! \fn double QCPCurveData::sortKey() const - + Returns the \a t member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static QCPCurveData QCPCurveData::fromSortKey(double sortKey) - + Returns a data point with the specified \a sortKey (assigned to the data point's \a t member). All other members are set to zero. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static static bool QCPCurveData::sortKeyIsMainKey() - + Since the member \a key is the data point key coordinate and the member \a t is the data ordering parameter, this method returns false. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPCurveData::mainKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPCurveData::mainValue() const - + Returns the \a value member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn QCPRange QCPCurveData::valueRange() const - + Returns a QCPRange with both lower and upper boundary set to \a value of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ @@ -21440,9 +21750,9 @@ QCPCurveData::QCPCurveData(double t, double key, double value) : /*! \class QCPCurve \brief A plottable representing a parametric curve in a plot. - + \image html QCPCurve.png - + Unlike QCPGraph, plottables of this type may have multiple points with the same key coordinate, so their visual representation can have \a loops. This is realized by introducing a third coordinate \a t, which defines the order of the points described by the other two coordinates \a @@ -21451,21 +21761,21 @@ QCPCurveData::QCPCurveData(double t, double key, double value) : To plot data, assign it with the \ref setData or \ref addData functions. Alternatively, you can also access and modify the curve's data via the \ref data method, which returns a pointer to the internal \ref QCPCurveDataContainer. - + Gaps in the curve can be created by adding data points with NaN as key and value (qQNaN() or std::numeric_limits::quiet_NaN()) in between the two data points that shall be separated. - + \section qcpcurve-appearance Changing the appearance - + The appearance of the curve is determined by the pen and the brush (\ref setPen, \ref setBrush). - + \section qcpcurve-usage Usage - + Like all data representing objects in QCustomPlot, the QCPCurve is a plottable (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::removePlottable, etc.) - + Usually, you first create an instance: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-creation-1 which registers it with the QCustomPlot instance of the passed axes. Note that this QCustomPlot instance takes @@ -21477,7 +21787,7 @@ QCPCurveData::QCPCurveData(double t, double key, double value) : /* start of documentation of inline functions */ /*! \fn QSharedPointer QCPCurve::data() const - + Returns a shared pointer to the internal data storage of type \ref QCPCurveDataContainer. You may use it to directly manipulate the data, which may be more convenient and faster than using the regular \ref setData or \ref addData methods. @@ -21490,7 +21800,7 @@ QCPCurveData::QCPCurveData(double t, double key, double value) : axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have the same orientation. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + The created QCPCurve is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPCurve, so do not delete it manually but use QCustomPlot::removePlottable() instead. @@ -21501,9 +21811,10 @@ QCPCurve::QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis) : // modify inherited properties from abstract plottable: setPen(QPen(Qt::blue, 0)); setBrush(Qt::NoBrush); - + setScatterStyle(QCPScatterStyle()); setLineStyle(lsLine); + setScatterSkip(0); } QCPCurve::~QCPCurve() @@ -21511,18 +21822,18 @@ QCPCurve::~QCPCurve() } /*! \overload - + Replaces the current data container with the provided \a data container. - + Since a QSharedPointer is used, multiple QCPCurves may share the same data container safely. Modifying the data in the container will then affect all curves that share the container. Sharing can be achieved by simply exchanging the data containers wrapped in shared pointers: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-datasharing-1 - + If you do not wish to share containers, but create a copy from an existing container, rather use the \ref QCPDataContainer::set method on the curve's data container directly: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-datasharing-2 - + \see addData */ void QCPCurve::setData(QSharedPointer data) @@ -21531,14 +21842,14 @@ void QCPCurve::setData(QSharedPointer data) } /*! \overload - + Replaces the current data with the provided points in \a t, \a keys and \a values. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a t in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + \see addData */ void QCPCurve::setData(const QVector &t, const QVector &keys, const QVector &values, bool alreadySorted) @@ -21549,14 +21860,14 @@ void QCPCurve::setData(const QVector &t, const QVector &keys, co /*! \overload - + Replaces the current data with the provided points in \a keys and \a values. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + The t parameter of each data point will be set to the integer index of the respective key/value pair. - + \see addData */ void QCPCurve::setData(const QVector &keys, const QVector &values) @@ -21569,7 +21880,7 @@ void QCPCurve::setData(const QVector &keys, const QVector &value Sets the visual appearance of single data points in the plot. If set to \ref QCPScatterStyle::ssNone, no scatter points are drawn (e.g. for line-only plots with appropriate line style). - + \see QCPScatterStyle, setLineStyle */ void QCPCurve::setScatterStyle(const QCPScatterStyle &style) @@ -21597,7 +21908,7 @@ void QCPCurve::setScatterSkip(int skip) Sets how the single data points are connected in the plot or how they are represented visually apart from the scatter symbol. For scatter-only plots, set \a style to \ref lsNone and \ref setScatterStyle to the desired scatter style. - + \see setScatterStyle */ void QCPCurve::setLineStyle(QCPCurve::LineStyle style) @@ -21606,14 +21917,14 @@ void QCPCurve::setLineStyle(QCPCurve::LineStyle style) } /*! \overload - + Adds the provided points in \a t, \a keys and \a values to the current data. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -21638,14 +21949,14 @@ void QCPCurve::addData(const QVector &t, const QVector &keys, co } /*! \overload - + Adds the provided points in \a keys and \a values to the current data. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + The t parameter of each data point will be set to the integer index of the respective key/value pair. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -21676,7 +21987,7 @@ void QCPCurve::addData(const QVector &keys, const QVector &value /*! \overload Adds the provided data point as \a t, \a key and \a value to the current data. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -21686,12 +21997,12 @@ void QCPCurve::addData(double t, double key, double value) } /*! \overload - + Adds the provided data point as \a key and \a value to the current data. - + The t parameter is generated automatically by increments of 1 for each point, starting at the highest t of previously existing data or 0, if the curve data is empty. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -21710,7 +22021,7 @@ double QCPCurve::selectTest(const QPointF &pos, bool onlySelectable, QVariant *d return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { QCPCurveDataContainer::const_iterator closestDataPoint = mDataContainer->constEnd(); @@ -21741,10 +22052,10 @@ QCPRange QCPCurve::getValueRange(bool &foundRange, QCP::SignDomain inSignDomain, void QCPCurve::draw(QCPPainter *painter) { if (mDataContainer->isEmpty()) return; - + // allocate line vector: QVector lines, scatters; - + // loop over and draw segments of unselected/selected data: QList selectedSegments, unselectedSegments, allSegments; getDataSegments(selectedSegments, unselectedSegments); @@ -21752,15 +22063,15 @@ void QCPCurve::draw(QCPPainter *painter) for (int i=0; i= unselectedSegments.size(); - + // fill with curve data: QPen finalCurvePen = mPen; // determine the final pen already here, because the line optimization depends on its stroke width if (isSelectedSegment && mSelectionDecorator) finalCurvePen = mSelectionDecorator->pen(); - + QCPDataRange lineDataRange = isSelectedSegment ? allSegments.at(i) : allSegments.at(i).adjusted(-1, 1); // unselected segments extend lines to bordering selected data point (safe to exceed total data bounds in first/last segment, getCurveLines takes care) getCurveLines(&lines, lineDataRange, finalCurvePen.widthF()); - + // check data validity if flag set: #ifdef QCUSTOMPLOT_CHECK_DATA for (QCPCurveDataContainer::const_iterator it = mDataContainer->constBegin(); it != mDataContainer->constEnd(); ++it) @@ -21770,7 +22081,7 @@ void QCPCurve::draw(QCPPainter *painter) qDebug() << Q_FUNC_INFO << "Data point at" << it->key << "invalid." << "Plottable name:" << name(); } #endif - + // draw curve fill: applyFillAntialiasingHint(painter); if (isSelectedSegment && mSelectionDecorator) @@ -21780,7 +22091,7 @@ void QCPCurve::draw(QCPPainter *painter) painter->setPen(Qt::NoPen); if (painter->brush().style() != Qt::NoBrush && painter->brush().color().alpha() != 0) painter->drawPolygon(QPolygonF(lines)); - + // draw curve line: if (mLineStyle != lsNone) { @@ -21788,7 +22099,7 @@ void QCPCurve::draw(QCPPainter *painter) painter->setBrush(Qt::NoBrush); drawCurveLine(painter, lines); } - + // draw scatters: QCPScatterStyle finalScatterStyle = mScatterStyle; if (isSelectedSegment && mSelectionDecorator) @@ -21799,7 +22110,7 @@ void QCPCurve::draw(QCPPainter *painter) drawScatterPlot(painter, scatters, finalScatterStyle); } } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -21907,7 +22218,7 @@ void QCPCurve::getCurveLines(QVector *lines, const QCPDataRange &dataRa QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + // add margins to rect to compensate for stroke width const double strokeMargin = qMax(qreal(1.0), qreal(penWidth*0.75)); // stroke radius + 50% safety const double keyMin = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyAxis->range().lower)-strokeMargin*keyAxis->pixelOrientation()); @@ -22010,7 +22321,7 @@ void QCPCurve::getScatters(QVector *scatters, const QCPDataRange &dataR QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + QCPCurveDataContainer::const_iterator begin = mDataContainer->constBegin(); QCPCurveDataContainer::const_iterator end = mDataContainer->constEnd(); mDataContainer->limitIteratorsToDataRange(begin, end, dataRange); @@ -22019,7 +22330,7 @@ void QCPCurve::getScatters(QVector *scatters, const QCPDataRange &dataR const int scatterModulo = mScatterSkip+1; const bool doScatterSkip = mScatterSkip > 0; int endIndex = end-mDataContainer->constBegin(); - + QCPRange keyRange = keyAxis->range(); QCPRange valueRange = valueAxis->range(); // extend range to include width of scatter symbols: @@ -22027,7 +22338,7 @@ void QCPCurve::getScatters(QVector *scatters, const QCPDataRange &dataR keyRange.upper = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyRange.upper)+scatterWidth*keyAxis->pixelOrientation()); valueRange.lower = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueRange.lower)-scatterWidth*valueAxis->pixelOrientation()); valueRange.upper = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueRange.upper)+scatterWidth*valueAxis->pixelOrientation()); - + QCPCurveDataContainer::const_iterator it = begin; int itIndex = begin-mDataContainer->constBegin(); while (doScatterSkip && it != end && itIndex % scatterModulo != 0) // advance begin iterator to first non-skipped scatter @@ -22041,7 +22352,7 @@ void QCPCurve::getScatters(QVector *scatters, const QCPDataRange &dataR { if (!qIsNaN(it->value) && keyRange.contains(it->key) && valueRange.contains(it->value)) scatters->append(QPointF(valueAxis->coordToPixel(it->value), keyAxis->coordToPixel(it->key))); - + // advance iterator to next (non-skipped) data point: if (!doScatterSkip) ++it; @@ -22063,7 +22374,7 @@ void QCPCurve::getScatters(QVector *scatters, const QCPDataRange &dataR { if (!qIsNaN(it->value) && keyRange.contains(it->key) && valueRange.contains(it->value)) scatters->append(QPointF(keyAxis->coordToPixel(it->key), valueAxis->coordToPixel(it->value))); - + // advance iterator to next (non-skipped) data point: if (!doScatterSkip) ++it; @@ -22131,15 +22442,15 @@ int QCPCurve::getRegion(double key, double value, double keyMin, double valueMax } /*! \internal - + This function is part of the curve optimization algorithm of \ref getCurveLines. - + This method is used in case the current segment passes from inside the visible rect (region 5, see \ref getRegion) to any of the outer regions (\a otherRegion). The current segment is given by the line connecting (\a key, \a value) with (\a otherKey, \a otherValue). - + It returns the intersection point of the segment with the border of region 5. - + For this function it doesn't matter whether (\a key, \a value) is the point inside region 5 or whether it's (\a otherKey, \a otherValue), i.e. whether the segment is coming from region 5 or leaving it. It is important though that \a otherRegion correctly identifies the other region not @@ -22147,42 +22458,55 @@ int QCPCurve::getRegion(double key, double value, double keyMin, double valueMax */ QPointF QCPCurve::getOptimizedPoint(int otherRegion, double otherKey, double otherValue, double key, double value, double keyMin, double valueMax, double keyMax, double valueMin) const { - double intersectKey = keyMin; // initial value is just fail-safe - double intersectValue = valueMax; // initial value is just fail-safe + // The intersection point interpolation here is done in pixel coordinates, so we don't need to + // differentiate between different axis scale types. Note that the nomenclature + // top/left/bottom/right/min/max is with respect to the rect in plot coordinates, wich may be + // different in pixel coordinates (horz/vert key axes, reversed ranges) + + const double keyMinPx = mKeyAxis->coordToPixel(keyMin); + const double keyMaxPx = mKeyAxis->coordToPixel(keyMax); + const double valueMinPx = mValueAxis->coordToPixel(valueMin); + const double valueMaxPx = mValueAxis->coordToPixel(valueMax); + const double otherValuePx = mValueAxis->coordToPixel(otherValue); + const double valuePx = mValueAxis->coordToPixel(value); + const double otherKeyPx = mKeyAxis->coordToPixel(otherKey); + const double keyPx = mKeyAxis->coordToPixel(key); + double intersectKeyPx = keyMinPx; // initial key just a fail-safe + double intersectValuePx = valueMinPx; // initial value just a fail-safe switch (otherRegion) { case 1: // top and left edge { - intersectValue = valueMax; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); - if (intersectKey < keyMin || intersectKey > keyMax) // doesn't intersect, so must intersect other: + intersectValuePx = valueMaxPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); + if (intersectKeyPx < qMin(keyMinPx, keyMaxPx) || intersectKeyPx > qMax(keyMinPx, keyMaxPx)) // check whether top edge is not intersected, then it must be left edge (qMin/qMax necessary since axes may be reversed) { - intersectKey = keyMin; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMinPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); } break; } case 2: // left edge { - intersectKey = keyMin; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMinPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); break; } case 3: // bottom and left edge { - intersectValue = valueMin; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); - if (intersectKey < keyMin || intersectKey > keyMax) // doesn't intersect, so must intersect other: + intersectValuePx = valueMinPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); + if (intersectKeyPx < qMin(keyMinPx, keyMaxPx) || intersectKeyPx > qMax(keyMinPx, keyMaxPx)) // check whether bottom edge is not intersected, then it must be left edge (qMin/qMax necessary since axes may be reversed) { - intersectKey = keyMin; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMinPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); } break; } case 4: // top edge { - intersectValue = valueMax; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + intersectValuePx = valueMaxPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); break; } case 5: @@ -22191,53 +22515,56 @@ QPointF QCPCurve::getOptimizedPoint(int otherRegion, double otherKey, double oth } case 6: // bottom edge { - intersectValue = valueMin; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + intersectValuePx = valueMinPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); break; } case 7: // top and right edge { - intersectValue = valueMax; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); - if (intersectKey < keyMin || intersectKey > keyMax) // doesn't intersect, so must intersect other: + intersectValuePx = valueMaxPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); + if (intersectKeyPx < qMin(keyMinPx, keyMaxPx) || intersectKeyPx > qMax(keyMinPx, keyMaxPx)) // check whether top edge is not intersected, then it must be right edge (qMin/qMax necessary since axes may be reversed) { - intersectKey = keyMax; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMaxPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); } break; } case 8: // right edge { - intersectKey = keyMax; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMaxPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); break; } case 9: // bottom and right edge { - intersectValue = valueMin; - intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); - if (intersectKey < keyMin || intersectKey > keyMax) // doesn't intersect, so must intersect other: + intersectValuePx = valueMinPx; + intersectKeyPx = otherKeyPx + (keyPx-otherKeyPx)/(valuePx-otherValuePx)*(intersectValuePx-otherValuePx); + if (intersectKeyPx < qMin(keyMinPx, keyMaxPx) || intersectKeyPx > qMax(keyMinPx, keyMaxPx)) // check whether bottom edge is not intersected, then it must be right edge (qMin/qMax necessary since axes may be reversed) { - intersectKey = keyMax; - intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + intersectKeyPx = keyMaxPx; + intersectValuePx = otherValuePx + (valuePx-otherValuePx)/(keyPx-otherKeyPx)*(intersectKeyPx-otherKeyPx); } break; } } - return coordsToPixels(intersectKey, intersectValue); + if (mKeyAxis->orientation() == Qt::Horizontal) + return QPointF(intersectKeyPx, intersectValuePx); + else + return QPointF(intersectValuePx, intersectKeyPx); } /*! \internal - + This function is part of the curve optimization algorithm of \ref getCurveLines. - + In situations where a single segment skips over multiple regions it might become necessary to add extra points at the corners of region 5 (see \ref getRegion) such that the optimized segment doesn't unintentionally cut through the visible area of the axis rect and create plot artifacts. This method provides these points that must be added, assuming the original segment doesn't start, end, or traverse region 5. (Corner points where region 5 is traversed are calculated by \ref getTraverseCornerPoints.) - + For example, consider a segment which directly goes from region 4 to 2 but originally is far out to the top left such that it doesn't cross region 5. Naively optimizing these points by projecting them on the top and left borders of region 5 will create a segment that surely crosses @@ -22398,13 +22725,13 @@ QVector QCPCurve::getOptimizedCornerPoints(int prevRegion, int currentR } /*! \internal - + This function is part of the curve optimization algorithm of \ref getCurveLines. - + This method returns whether a segment going from \a prevRegion to \a currentRegion (see \ref getRegion) may traverse the visible region 5. This function assumes that neither \a prevRegion nor \a currentRegion is 5 itself. - + If this method returns false, the segment for sure doesn't pass region 5. If it returns true, the segment may or may not pass region 5 and a more fine-grained calculation must be used (\ref getTraverse). @@ -22500,54 +22827,67 @@ bool QCPCurve::mayTraverse(int prevRegion, int currentRegion) const /*! \internal - + This function is part of the curve optimization algorithm of \ref getCurveLines. - + This method assumes that the \ref mayTraverse test has returned true, so there is a chance the segment defined by (\a prevKey, \a prevValue) and (\a key, \a value) goes through the visible region 5. - + The return value of this method indicates whether the segment actually traverses region 5 or not. - + If the segment traverses 5, the output parameters \a crossA and \a crossB indicate the entry and exit points of region 5. They will become the optimized points for that segment. */ bool QCPCurve::getTraverse(double prevKey, double prevValue, double key, double value, double keyMin, double valueMax, double keyMax, double valueMin, QPointF &crossA, QPointF &crossB) const { - QList intersections; // x of QPointF corresponds to key and y to value + // The intersection point interpolation here is done in pixel coordinates, so we don't need to + // differentiate between different axis scale types. Note that the nomenclature + // top/left/bottom/right/min/max is with respect to the rect in plot coordinates, wich may be + // different in pixel coordinates (horz/vert key axes, reversed ranges) + + QList intersections; + const double valueMinPx = mValueAxis->coordToPixel(valueMin); + const double valueMaxPx = mValueAxis->coordToPixel(valueMax); + const double keyMinPx = mKeyAxis->coordToPixel(keyMin); + const double keyMaxPx = mKeyAxis->coordToPixel(keyMax); + const double keyPx = mKeyAxis->coordToPixel(key); + const double valuePx = mValueAxis->coordToPixel(value); + const double prevKeyPx = mKeyAxis->coordToPixel(prevKey); + const double prevValuePx = mValueAxis->coordToPixel(prevValue); if (qFuzzyIsNull(key-prevKey)) // line is parallel to value axis { - // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here - intersections.append(QPointF(key, valueMin)); // direction will be taken care of at end of method - intersections.append(QPointF(key, valueMax)); + // due to region filter in mayTraverse(), if line is parallel to value or key axis, region 5 is traversed here + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyPx, valueMinPx) : QPointF(valueMinPx, keyPx)); // direction will be taken care of at end of method + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyPx, valueMaxPx) : QPointF(valueMaxPx, keyPx)); } else if (qFuzzyIsNull(value-prevValue)) // line is parallel to key axis { - // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here - intersections.append(QPointF(keyMin, value)); // direction will be taken care of at end of method - intersections.append(QPointF(keyMax, value)); + // due to region filter in mayTraverse(), if line is parallel to value or key axis, region 5 is traversed here + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyMinPx, valuePx) : QPointF(valuePx, keyMinPx)); // direction will be taken care of at end of method + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyMaxPx, valuePx) : QPointF(valuePx, keyMaxPx)); } else // line is skewed { double gamma; - double keyPerValue = (key-prevKey)/(value-prevValue); + double keyPerValuePx = (keyPx-prevKeyPx)/(valuePx-prevValuePx); // check top of rect: - gamma = prevKey + (valueMax-prevValue)*keyPerValue; - if (gamma >= keyMin && gamma <= keyMax) - intersections.append(QPointF(gamma, valueMax)); + gamma = prevKeyPx + (valueMaxPx-prevValuePx)*keyPerValuePx; + if (gamma >= qMin(keyMinPx, keyMaxPx) && gamma <= qMax(keyMinPx, keyMaxPx)) // qMin/qMax necessary since axes may be reversed + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(gamma, valueMaxPx) : QPointF(valueMaxPx, gamma)); // check bottom of rect: - gamma = prevKey + (valueMin-prevValue)*keyPerValue; - if (gamma >= keyMin && gamma <= keyMax) - intersections.append(QPointF(gamma, valueMin)); - double valuePerKey = 1.0/keyPerValue; + gamma = prevKeyPx + (valueMinPx-prevValuePx)*keyPerValuePx; + if (gamma >= qMin(keyMinPx, keyMaxPx) && gamma <= qMax(keyMinPx, keyMaxPx)) // qMin/qMax necessary since axes may be reversed + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(gamma, valueMinPx) : QPointF(valueMinPx, gamma)); + const double valuePerKeyPx = 1.0/keyPerValuePx; // check left of rect: - gamma = prevValue + (keyMin-prevKey)*valuePerKey; - if (gamma >= valueMin && gamma <= valueMax) - intersections.append(QPointF(keyMin, gamma)); + gamma = prevValuePx + (keyMinPx-prevKeyPx)*valuePerKeyPx; + if (gamma >= qMin(valueMinPx, valueMaxPx) && gamma <= qMax(valueMinPx, valueMaxPx)) // qMin/qMax necessary since axes may be reversed + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyMinPx, gamma) : QPointF(gamma, keyMinPx)); // check right of rect: - gamma = prevValue + (keyMax-prevKey)*valuePerKey; - if (gamma >= valueMin && gamma <= valueMax) - intersections.append(QPointF(keyMax, gamma)); + gamma = prevValuePx + (keyMaxPx-prevKeyPx)*valuePerKeyPx; + if (gamma >= qMin(valueMinPx, valueMaxPx) && gamma <= qMax(valueMinPx, valueMaxPx)) // qMin/qMax necessary since axes may be reversed + intersections.append(mKeyAxis->orientation() == Qt::Horizontal ? QPointF(keyMaxPx, gamma) : QPointF(gamma, keyMaxPx)); } - + // handle cases where found points isn't exactly 2: if (intersections.size() > 2) { @@ -22574,36 +22914,40 @@ bool QCPCurve::getTraverse(double prevKey, double prevValue, double key, double // one or even zero points found (shouldn't happen unless line perfectly tangent to corner), no need to draw segment return false; } - + // possibly re-sort points so optimized point segment has same direction as original segment: - if ((key-prevKey)*(intersections.at(1).x()-intersections.at(0).x()) + (value-prevValue)*(intersections.at(1).y()-intersections.at(0).y()) < 0) // scalar product of both segments < 0 -> opposite direction + double xDelta = keyPx-prevKeyPx; + double yDelta = valuePx-prevValuePx; + if (mKeyAxis->orientation() != Qt::Horizontal) + qSwap(xDelta, yDelta); + if (xDelta*(intersections.at(1).x()-intersections.at(0).x()) + yDelta*(intersections.at(1).y()-intersections.at(0).y()) < 0) // scalar product of both segments < 0 -> opposite direction intersections.move(0, 1); - crossA = coordsToPixels(intersections.at(0).x(), intersections.at(0).y()); - crossB = coordsToPixels(intersections.at(1).x(), intersections.at(1).y()); + crossA = intersections.at(0); + crossB = intersections.at(1); return true; } /*! \internal - + This function is part of the curve optimization algorithm of \ref getCurveLines. - + This method assumes that the \ref getTraverse test has returned true, so the segment definitely traverses the visible region 5 when going from \a prevRegion to \a currentRegion. - + In certain situations it is not sufficient to merely generate the entry and exit points of the segment into/out of region 5, as \ref getTraverse provides. It may happen that a single segment, in addition to traversing region 5, skips another region outside of region 5, which makes it necessary to add an optimized corner point there (very similar to the job \ref getOptimizedCornerPoints does for segments that are completely in outside regions and don't traverse 5). - + As an example, consider a segment going from region 1 to region 6, traversing the lower left corner of region 5. In this configuration, the segment additionally crosses the border between region 1 and 2 before entering region 5. This makes it necessary to add an additional point in the top left corner, before adding the optimized traverse points. So in this case, the output parameter \a beforeTraverse will contain the top left corner point, and \a afterTraverse will be empty. - + In some cases, such as when going from region 1 to 9, it may even be necessary to add additional corner points before and after the traverse. Then both \a beforeTraverse and \a afterTraverse return the respective corner points. @@ -22693,13 +23037,13 @@ void QCPCurve::getTraverseCornerPoints(int prevRegion, int currentRegion, double } /*! \internal - + Calculates the (minimum) distance (in pixels) the curve's representation has from the given \a pixelPoint in pixels. This is used to determine whether the curve was clicked or not, e.g. in \ref selectTest. The closest data point to \a pixelPoint is returned in \a closestData. Note that if the curve has a line representation, the returned distance may be smaller than the distance to the \a closestData point, since the distance to the curve line is also taken into account. - + If either the curve has no data or if the line style is \ref lsNone and the scatter style's shape is \ref QCPScatterStyle::ssNone (i.e. there is no visual representation of the curve), returns -1.0. @@ -22711,14 +23055,14 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: return -1.0; if (mLineStyle == lsNone && mScatterStyle.isNone()) return -1.0; - + if (mDataContainer->size() == 1) { QPointF dataPoint = coordsToPixels(mDataContainer->constBegin()->key, mDataContainer->constBegin()->value); closestData = mDataContainer->constBegin(); return QCPVector2D(dataPoint-pixelPoint).length(); } - + // calculate minimum distances to curve data points and find closestData iterator: double minDistSqr = std::numeric_limits::max(); // iterate over found data points and then choose the one with the shortest distance to pos: @@ -22733,7 +23077,7 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: closestData = it; } } - + // calculate distance to line if there is one (if so, will probably be smaller than distance to closest data point): if (mLineStyle != lsNone) { @@ -22746,14 +23090,14 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: minDistSqr = currentDistSqr; } } - + return qSqrt(minDistSqr); } /* end of 'src/plottables/plottable-curve.cpp' */ /* including file 'src/plottables/plottable-bars.cpp', size 43512 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -22762,34 +23106,34 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: /*! \class QCPBarsGroup \brief Groups multiple QCPBars together so they appear side by side - + \image html QCPBarsGroup.png - + When showing multiple QCPBars in one plot which have bars at identical keys, it may be desirable to have them appearing next to each other at each key. This is what adding the respective QCPBars plottables to a QCPBarsGroup achieves. (An alternative approach is to stack them on top of each other, see \ref QCPBars::moveAbove.) - + \section qcpbarsgroup-usage Usage - + To add a QCPBars plottable to the group, create a new group and then add the respective bars intances: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbarsgroup-creation Alternatively to appending to the group like shown above, you can also set the group on the QCPBars plottable via \ref QCPBars::setBarsGroup. - + The spacing between the bars can be configured via \ref setSpacingType and \ref setSpacing. The bars in this group appear in the plot in the order they were appended. To insert a bars plottable at a certain index position, or to reposition a bars plottable which is already in the group, use \ref insert. - + To remove specific bars from the group, use either \ref remove or call \ref QCPBars::setBarsGroup "QCPBars::setBarsGroup(0)" on the respective bars plottable. - + To clear the entire group, call \ref clear, or simply delete the group. - + \section qcpbarsgroup-example Example - + The image above is generated with the following code: \snippet documentation/doc-image-generator/mainwindow.cpp qcpbarsgroup-example */ @@ -22797,29 +23141,29 @@ double QCPCurve::pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer: /* start of documentation of inline functions */ /*! \fn QList QCPBarsGroup::bars() const - + Returns all bars currently in this group. - + \see bars(int index) */ /*! \fn int QCPBarsGroup::size() const - + Returns the number of QCPBars plottables that are part of this group. - + */ /*! \fn bool QCPBarsGroup::isEmpty() const - + Returns whether this bars group is empty. - + \see size */ /*! \fn bool QCPBarsGroup::contains(QCPBars *bars) - + Returns whether the specified \a bars plottable is part of this group. - + */ /* end of documentation of inline functions */ @@ -22842,7 +23186,7 @@ QCPBarsGroup::~QCPBarsGroup() /*! Sets how the spacing between adjacent bars is interpreted. See \ref SpacingType. - + The actual spacing can then be specified with \ref setSpacing. \see setSpacing @@ -22905,7 +23249,7 @@ void QCPBarsGroup::append(QCPBars *bars) qDebug() << Q_FUNC_INFO << "bars is 0"; return; } - + if (!mBars.contains(bars)) bars->setBarsGroup(this); else @@ -22915,7 +23259,7 @@ void QCPBarsGroup::append(QCPBars *bars) /*! Inserts the specified \a bars plottable into this group at the specified index position \a i. This gives you full control over the ordering of the bars. - + \a bars may already be part of this group. In that case, \a bars is just moved to the new index position. @@ -22928,7 +23272,7 @@ void QCPBarsGroup::insert(int i, QCPBars *bars) qDebug() << Q_FUNC_INFO << "bars is 0"; return; } - + // first append to bars list normally: if (!mBars.contains(bars)) bars->setBarsGroup(this); @@ -22938,7 +23282,7 @@ void QCPBarsGroup::insert(int i, QCPBars *bars) /*! Removes the specified \a bars plottable from this group. - + \see contains, clear */ void QCPBarsGroup::remove(QCPBars *bars) @@ -22948,7 +23292,7 @@ void QCPBarsGroup::remove(QCPBars *bars) qDebug() << Q_FUNC_INFO << "bars is 0"; return; } - + if (mBars.contains(bars)) bars->setBarsGroup(0); else @@ -22956,10 +23300,10 @@ void QCPBarsGroup::remove(QCPBars *bars) } /*! \internal - + Adds the specified \a bars to the internal mBars list of bars. This method does not change the barsGroup property on \a bars. - + \see unregisterBars */ void QCPBarsGroup::registerBars(QCPBars *bars) @@ -22969,10 +23313,10 @@ void QCPBarsGroup::registerBars(QCPBars *bars) } /*! \internal - + Removes the specified \a bars from the internal mBars list of bars. This method does not change the barsGroup property on \a bars. - + \see registerBars */ void QCPBarsGroup::unregisterBars(QCPBars *bars) @@ -22981,7 +23325,7 @@ void QCPBarsGroup::unregisterBars(QCPBars *bars) } /*! \internal - + Returns the pixel offset in the key dimension the specified \a bars plottable should have at the given key coordinate \a keyCoord. The offset is relative to the pixel position of the key coordinate \a keyCoord. @@ -23001,7 +23345,7 @@ double QCPBarsGroup::keyPixelOffset(const QCPBars *bars, double keyCoord) const QCPBars *thisBase = bars; while (thisBase->barBelow()) thisBase = thisBase->barBelow(); - + // determine key pixel offset of this base bars considering all other base bars in this barsgroup: double result = 0; int index = baseBars.indexOf(thisBase); @@ -23043,10 +23387,10 @@ double QCPBarsGroup::keyPixelOffset(const QCPBars *bars, double keyCoord) } /*! \internal - + Returns the spacing in pixels which is between this \a bars and the following one, both at the key coordinate \a keyCoord. - + \note Typically the returned value doesn't depend on \a bars or \a keyCoord. \a bars is only needed to get access to the key axis transformation and axis rect for the modes \ref stAxisRectRatio and \ref stPlotCoords. The \a keyCoord is only relevant for spacings given in @@ -23083,65 +23427,65 @@ double QCPBarsGroup::getPixelSpacing(const QCPBars *bars, double keyCoord) /*! \class QCPBarsData \brief Holds the data of one single data point (one bar) for QCPBars. - + The stored data is: \li \a key: coordinate on the key axis of this bar (this is the \a mainKey and the \a sortKey) \li \a value: height coordinate on the value axis of this bar (this is the \a mainValue) - + The container for storing multiple data points is \ref QCPBarsDataContainer. It is a typedef for \ref QCPDataContainer with \ref QCPBarsData as the DataType template parameter. See the documentation there for an explanation regarding the data type's generic methods. - + \see QCPBarsDataContainer */ /* start documentation of inline functions */ /*! \fn double QCPBarsData::sortKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static QCPBarsData QCPBarsData::fromSortKey(double sortKey) - + Returns a data point with the specified \a sortKey. All other members are set to zero. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static static bool QCPBarsData::sortKeyIsMainKey() - + Since the member \a key is both the data point key coordinate and the data ordering parameter, this method returns true. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPBarsData::mainKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPBarsData::mainValue() const - + Returns the \a value member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn QCPRange QCPBarsData::valueRange() const - + Returns a QCPRange with both lower and upper boundary set to \a value of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ @@ -23175,29 +23519,29 @@ QCPBarsData::QCPBarsData(double key, double value) : \brief A plottable representing a bar chart in a plot. \image html QCPBars.png - + To plot data, assign it with the \ref setData or \ref addData functions. - + \section qcpbars-appearance Changing the appearance - + The appearance of the bars is determined by the pen and the brush (\ref setPen, \ref setBrush). The width of the individual bars can be controlled with \ref setWidthType and \ref setWidth. - + Bar charts are stackable. This means, two QCPBars plottables can be placed on top of each other (see \ref QCPBars::moveAbove). So when two bars are at the same key position, they will appear stacked. - + If you would like to group multiple QCPBars plottables together so they appear side by side as shown below, use QCPBarsGroup. - + \image html QCPBarsGroup.png - + \section qcpbars-usage Usage - + Like all data representing objects in QCustomPlot, the QCPBars is a plottable (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::removePlottable, etc.) - + Usually, you first create an instance: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-1 which registers it with the QCustomPlot instance of the passed axes. Note that this QCustomPlot instance takes @@ -23209,7 +23553,7 @@ QCPBarsData::QCPBarsData(double key, double value) : /* start of documentation of inline functions */ /*! \fn QSharedPointer QCPBars::data() const - + Returns a shared pointer to the internal data storage of type \ref QCPBarsDataContainer. You may use it to directly manipulate the data, which may be more convenient and faster than using the regular \ref setData or \ref addData methods. @@ -23218,14 +23562,14 @@ QCPBarsData::QCPBarsData(double key, double value) : /*! \fn QCPBars *QCPBars::barBelow() const Returns the bars plottable that is directly below this bars plottable. If there is no such plottable, returns 0. - + \see barAbove, moveBelow, moveAbove */ /*! \fn QCPBars *QCPBars::barAbove() const Returns the bars plottable that is directly above this bars plottable. If there is no such plottable, returns 0. - + \see barBelow, moveBelow, moveAbove */ @@ -23236,7 +23580,7 @@ QCPBarsData::QCPBarsData(double key, double value) : axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have the same orientation. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + The created QCPBars is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPBars, so do not delete it manually but use QCustomPlot::removePlottable() instead. @@ -23265,18 +23609,18 @@ QCPBars::~QCPBars() } /*! \overload - + Replaces the current data container with the provided \a data container. - + Since a QSharedPointer is used, multiple QCPBars may share the same data container safely. Modifying the data in the container will then affect all bars that share the container. Sharing can be achieved by simply exchanging the data containers wrapped in shared pointers: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-datasharing-1 - + If you do not wish to share containers, but create a copy from an existing container, rather use the \ref QCPDataContainer::set method on the bar's data container directly: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-datasharing-2 - + \see addData */ void QCPBars::setData(QSharedPointer data) @@ -23285,14 +23629,14 @@ void QCPBars::setData(QSharedPointer data) } /*! \overload - + Replaces the current data with the provided points in \a keys and \a values. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + \see addData */ void QCPBars::setData(const QVector &keys, const QVector &values, bool alreadySorted) @@ -23315,9 +23659,9 @@ void QCPBars::setWidth(double width) /*! Sets how the width of the bars is defined. See the documentation of \ref WidthType for an explanation of the possible values for \a widthType. - + The default value is \ref wtPlotCoords. - + \see setWidth */ void QCPBars::setWidthType(QCPBars::WidthType widthType) @@ -23328,7 +23672,7 @@ void QCPBars::setWidthType(QCPBars::WidthType widthType) /*! Sets to which QCPBarsGroup this QCPBars instance belongs to. Alternatively, you can also use \ref QCPBarsGroup::append. - + To remove this QCPBars from any group, set \a barsGroup to 0. */ void QCPBars::setBarsGroup(QCPBarsGroup *barsGroup) @@ -23349,9 +23693,9 @@ void QCPBars::setBarsGroup(QCPBarsGroup *barsGroup) the base value is given by their individual value data. For example, if the base value is set to 1, a bar with data value 2 will have its lowest point at value coordinate 1 and highest point at 3. - + For stacked bars, only the base value of the bottom-most QCPBars has meaning. - + The default base value is 0. */ void QCPBars::setBaseValue(double baseValue) @@ -23370,14 +23714,14 @@ void QCPBars::setStackingGap(double pixels) } /*! \overload - + Adds the provided points in \a keys and \a values to the current data. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -23402,7 +23746,7 @@ void QCPBars::addData(const QVector &keys, const QVector &values /*! \overload Adds the provided data point as \a key and \a value to the current data. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. */ @@ -23415,14 +23759,14 @@ void QCPBars::addData(double key, double value) Moves this bars plottable below \a bars. In other words, the bars of this plottable will appear below the bars of \a bars. The move target \a bars must use the same key and value axis as this plottable. - + Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already has a bars object below itself, this bars object is inserted between the two. If this bars object is already between two other bars, the two other bars will be stacked on top of each other after the operation. - + To remove this bars plottable from any stacking, set \a bars to 0. - + \see moveBelow, barAbove, barBelow */ void QCPBars::moveBelow(QCPBars *bars) @@ -23448,14 +23792,14 @@ void QCPBars::moveBelow(QCPBars *bars) Moves this bars plottable above \a bars. In other words, the bars of this plottable will appear above the bars of \a bars. The move target \a bars must use the same key and value axis as this plottable. - + Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already has a bars object above itself, this bars object is inserted between the two. If this bars object is already between two other bars, the two other bars will be stacked on top of each other after the operation. - + To remove this bars plottable from any stacking, set \a bars to 0. - + \see moveBelow, barBelow, barAbove */ void QCPBars::moveAbove(QCPBars *bars) @@ -23487,10 +23831,10 @@ QCPDataSelection QCPBars::selectTestRect(const QRectF &rect, bool onlySelectable return result; if (!mKeyAxis || !mValueAxis) return result; - + QCPBarsDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd); - + for (QCPBarsDataContainer::const_iterator it=visibleBegin; it!=visibleEnd; ++it) { if (rect.intersects(getBarRect(it->key, it->value))) @@ -23508,7 +23852,7 @@ double QCPBars::selectTest(const QPointF &pos, bool onlySelectable, QVariant *de return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { // get visible data range: @@ -23544,7 +23888,7 @@ QCPRange QCPBars::getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain) co */ QCPRange range; range = mDataContainer->keyRange(foundRange, inSignDomain); - + // determine exact range of bars by including bar width and barsgroup offset: if (foundRange && mKeyAxis) { @@ -23604,7 +23948,7 @@ QCPRange QCPBars::getValueRange(bool &foundRange, QCP::SignDomain inSignDomain, } } } - + foundRange = true; // return true because bar charts always have the 0-line visible return range; } @@ -23617,7 +23961,7 @@ QPointF QCPBars::dataPixelPosition(int index) const QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } - + const QCPDataContainer::const_iterator it = mDataContainer->constBegin()+index; const double valuePixel = valueAxis->coordToPixel(getStackedBaseValue(it->key, it->value >= 0) + it->value); const double keyPixel = keyAxis->coordToPixel(it->key) + (mBarsGroup ? mBarsGroup->keyPixelOffset(this, it->key) : 0); @@ -23637,10 +23981,10 @@ void QCPBars::draw(QCPPainter *painter) { if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } if (mDataContainer->isEmpty()) return; - + QCPBarsDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd); - + // loop over and draw segments of unselected/selected data: QList selectedSegments, unselectedSegments, allSegments; getDataSegments(selectedSegments, unselectedSegments); @@ -23653,7 +23997,7 @@ void QCPBars::draw(QCPPainter *painter) mDataContainer->limitIteratorsToDataRange(begin, end, allSegments.at(i)); if (begin == end) continue; - + for (QCPBarsDataContainer::const_iterator it=begin; it!=end; ++it) { // check data validity if flag set: @@ -23675,7 +24019,7 @@ void QCPBars::draw(QCPPainter *painter) painter->drawPolygon(getBarRect(it->key, it->value)); } } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -23694,17 +24038,17 @@ void QCPBars::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const } /*! \internal - + called by \ref draw to determine which data (key) range is visible at the current key axis range setting, so only that needs to be processed. It also takes into account the bar width. - + \a begin returns an iterator to the lowest data point that needs to be taken into account when plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a lower may still be just outside the visible range. - + \a end returns an iterator one higher than the highest visible data point. Same as before, \a end may also lie just outside of the visible range. - + if the plottable contains no data, both \a begin and \a end point to constEnd. */ void QCPBars::getVisibleDataBounds(QCPBarsDataContainer::const_iterator &begin, QCPBarsDataContainer::const_iterator &end) const @@ -23722,7 +24066,7 @@ void QCPBars::getVisibleDataBounds(QCPBarsDataContainer::const_iterator &begin, end = mDataContainer->constEnd(); return; } - + // get visible data range as QMap iterators begin = mDataContainer->findBegin(mKeyAxis.data()->range().lower); end = mDataContainer->findEnd(mKeyAxis.data()->range().upper); @@ -23762,7 +24106,7 @@ void QCPBars::getVisibleDataBounds(QCPBarsDataContainer::const_iterator &begin, } /*! \internal - + Returns the rect in pixel coordinates of a single bar with the specified \a key and \a value. The rect is shifted according to the bar stacking (see \ref moveAbove) and base value (see \ref setBaseValue), and to have non-overlapping border lines with the bars stacked below. @@ -23772,7 +24116,7 @@ QRectF QCPBars::getBarRect(double key, double value) const QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QRectF(); } - + double lowerPixelWidth, upperPixelWidth; getPixelWidth(key, lowerPixelWidth, upperPixelWidth); double base = getStackedBaseValue(key, value >= 0); @@ -23796,10 +24140,10 @@ QRectF QCPBars::getBarRect(double key, double value) const } /*! \internal - + This function is used to determine the width of the bar at coordinate \a key, according to the specified width (\ref setWidth) and width type (\ref setWidthType). - + The output parameters \a lower and \a upper return the number of pixels the bar extends to lower and higher keys, relative to the \a key coordinate (so with a non-reversed horizontal axis, \a lower is negative and \a upper positive). @@ -23846,10 +24190,10 @@ void QCPBars::getPixelWidth(double key, double &lower, double &upper) const } /*! \internal - + This function is called to find at which value to start drawing the base of a bar at \a key, when it is stacked on top of another QCPBars (e.g. with \ref moveAbove). - + positive and negative bars are separated per stack (positive are stacked above baseValue upwards, negative are stacked below baseValue downwards). This can be indicated with \a positive. So if the bar for which we need the base value is negative, set \a positive to false. @@ -23885,14 +24229,14 @@ double QCPBars::getStackedBaseValue(double key, bool positive) const Connects \a below and \a above to each other via their mBarAbove/mBarBelow properties. The bar(s) currently above lower and below upper will become disconnected to lower/upper. - + If lower is zero, upper will be disconnected at the bottom. If upper is zero, lower will be disconnected at the top. */ void QCPBars::connectBars(QCPBars *lower, QCPBars *upper) { if (!lower && !upper) return; - + if (!lower) // disconnect upper at bottom { // disconnect old bar below upper: @@ -23921,7 +24265,7 @@ void QCPBars::connectBars(QCPBars *lower, QCPBars *upper) /* including file 'src/plottables/plottable-statisticalbox.cpp', size 28622 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPStatisticalBoxData @@ -23929,87 +24273,87 @@ void QCPBars::connectBars(QCPBars *lower, QCPBars *upper) /*! \class QCPStatisticalBoxData \brief Holds the data of one single data point for QCPStatisticalBox. - + The stored data is: - + \li \a key: coordinate on the key axis of this data point (this is the \a mainKey and the \a sortKey) - + \li \a minimum: the position of the lower whisker, typically the minimum measurement of the sample that's not considered an outlier. - + \li \a lowerQuartile: the lower end of the box. The lower and the upper quartiles are the two statistical quartiles around the median of the sample, they should contain 50% of the sample data. - + \li \a median: the value of the median mark inside the quartile box. The median separates the sample data in half (50% of the sample data is below/above the median). (This is the \a mainValue) - + \li \a upperQuartile: the upper end of the box. The lower and the upper quartiles are the two statistical quartiles around the median of the sample, they should contain 50% of the sample data. - + \li \a maximum: the position of the upper whisker, typically the maximum measurement of the sample that's not considered an outlier. - + \li \a outliers: a QVector of outlier values that will be drawn as scatter points at the \a key coordinate of this data point (see \ref QCPStatisticalBox::setOutlierStyle) - + The container for storing multiple data points is \ref QCPStatisticalBoxDataContainer. It is a typedef for \ref QCPDataContainer with \ref QCPStatisticalBoxData as the DataType template parameter. See the documentation there for an explanation regarding the data type's generic methods. - + \see QCPStatisticalBoxDataContainer */ /* start documentation of inline functions */ /*! \fn double QCPStatisticalBoxData::sortKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static QCPStatisticalBoxData QCPStatisticalBoxData::fromSortKey(double sortKey) - + Returns a data point with the specified \a sortKey. All other members are set to zero. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static static bool QCPStatisticalBoxData::sortKeyIsMainKey() - + Since the member \a key is both the data point key coordinate and the data ordering parameter, this method returns true. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPStatisticalBoxData::mainKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPStatisticalBoxData::mainValue() const - + Returns the \a median member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn QCPRange QCPStatisticalBoxData::valueRange() const - + Returns a QCPRange spanning from the \a minimum to the \a maximum member of this statistical box data point, possibly further expanded by outliers. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ @@ -24053,19 +24397,19 @@ QCPStatisticalBoxData::QCPStatisticalBoxData(double key, double minimum, double \brief A plottable representing a single statistical box in a plot. \image html QCPStatisticalBox.png - + To plot data, assign it with the \ref setData or \ref addData functions. Alternatively, you can also access and modify the data via the \ref data method, which returns a pointer to the internal \ref QCPStatisticalBoxDataContainer. - + Additionally each data point can itself have a list of outliers, drawn as scatter points at the key coordinate of the respective statistical box data point. They can either be set by using the respective \ref addData(double,double,double,double,double,double,const QVector&) "addData" method or accessing the individual data points through \ref data, and setting the QVector outliers of the data points directly. - + \section qcpstatisticalbox-appearance Changing the appearance - + The appearance of each data point box, ranging from the lower to the upper quartile, is controlled via \ref setPen and \ref setBrush. You may change the width of the boxes with \ref setWidth in plot coordinates. @@ -24077,18 +24421,18 @@ QCPStatisticalBoxData::QCPStatisticalBoxData(double key, double minimum, double the top (for maximum) and bottom (for minimum). If the whisker pen is changed, make sure to set the \c capStyle to \c Qt::FlatCap. Otherwise the backbone line might exceed the whisker bars by a few pixels due to the pen cap being not perfectly flat. - + The median indicator line inside the box has its own pen, \ref setMedianPen. - + The outlier data points are drawn as normal scatter points. Their look can be controlled with \ref setOutlierStyle - + \section qcpstatisticalbox-usage Usage - + Like all data representing objects in QCustomPlot, the QCPStatisticalBox is a plottable (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::removePlottable, etc.) - + Usually, you first create an instance: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-creation-1 which registers it with the QCustomPlot instance of the passed axes. Note that this QCustomPlot instance takes @@ -24100,7 +24444,7 @@ QCPStatisticalBoxData::QCPStatisticalBoxData(double key, double minimum, double /* start documentation of inline functions */ /*! \fn QSharedPointer QCPStatisticalBox::data() const - + Returns a shared pointer to the internal data storage of type \ref QCPStatisticalBoxDataContainer. You may use it to directly manipulate the data, which may be more convenient and faster than using the regular \ref setData or \ref addData methods. @@ -24113,7 +24457,7 @@ QCPStatisticalBoxData::QCPStatisticalBoxData(double key, double minimum, double value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have the same orientation. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + The created QCPStatisticalBox is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPStatisticalBox, so do not delete it manually but use QCustomPlot::removePlottable() instead. @@ -24133,19 +24477,19 @@ QCPStatisticalBox::QCPStatisticalBox(QCPAxis *keyAxis, QCPAxis *valueAxis) : } /*! \overload - + Replaces the current data container with the provided \a data container. - + Since a QSharedPointer is used, multiple QCPStatisticalBoxes may share the same data container safely. Modifying the data in the container will then affect all statistical boxes that share the container. Sharing can be achieved by simply exchanging the data containers wrapped in shared pointers: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-datasharing-1 - + If you do not wish to share containers, but create a copy from an existing container, rather use the \ref QCPDataContainer::set method on the statistical box data container directly: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-datasharing-2 - + \see addData */ void QCPStatisticalBox::setData(QSharedPointer data) @@ -24153,14 +24497,14 @@ void QCPStatisticalBox::setData(QSharedPointer d mDataContainer = data; } /*! \overload - + Replaces the current data with the provided points in \a keys, \a minimum, \a lowerQuartile, \a median, \a upperQuartile and \a maximum. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + \see addData */ void QCPStatisticalBox::setData(const QVector &keys, const QVector &minimum, const QVector &lowerQuartile, const QVector &median, const QVector &upperQuartile, const QVector &maximum, bool alreadySorted) @@ -24171,7 +24515,7 @@ void QCPStatisticalBox::setData(const QVector &keys, const QVector &keys, const QVectoraxisRect()->rect().contains(pos.toPoint())) { // get visible data range: @@ -24403,10 +24747,10 @@ void QCPStatisticalBox::draw(QCPPainter *painter) QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + QCPStatisticalBoxDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd); - + // loop over and draw segments of unselected/selected data: QList selectedSegments, unselectedSegments, allSegments; getDataSegments(selectedSegments, unselectedSegments); @@ -24419,7 +24763,7 @@ void QCPStatisticalBox::draw(QCPPainter *painter) mDataContainer->limitIteratorsToDataRange(begin, end, allSegments.at(i)); if (begin == end) continue; - + for (QCPStatisticalBoxDataContainer::const_iterator it=begin; it!=end; ++it) { // check data validity if flag set: @@ -24432,7 +24776,7 @@ void QCPStatisticalBox::draw(QCPPainter *painter) if (QCP::isInvalidData(it->outliers.at(i))) qDebug() << Q_FUNC_INFO << "Data point outlier at" << it->key << "of drawn range invalid." << "Plottable name:" << name(); # endif - + if (isSelectedSegment && mSelectionDecorator) { mSelectionDecorator->applyPen(painter); @@ -24448,7 +24792,7 @@ void QCPStatisticalBox::draw(QCPPainter *painter) drawStatisticalBox(painter, it, finalOutlierStyle); } } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -24500,17 +24844,17 @@ void QCPStatisticalBox::drawStatisticalBox(QCPPainter *painter, QCPStatisticalBo } /*! \internal - + called by \ref draw to determine which data (key) range is visible at the current key axis range setting, so only that needs to be processed. It also takes into account the bar width. - + \a begin returns an iterator to the lowest data point that needs to be taken into account when plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a lower may still be just outside the visible range. - + \a end returns an iterator one higher than the highest visible data point. Same as before, \a end may also lie just outside of the visible range. - + if the plottable contains no data, both \a begin and \a end point to constEnd. */ void QCPStatisticalBox::getVisibleDataBounds(QCPStatisticalBoxDataContainer::const_iterator &begin, QCPStatisticalBoxDataContainer::const_iterator &end) const @@ -24574,8 +24918,8 @@ QVector QCPStatisticalBox::getWhiskerBarLines(QCPStatisticalBoxDataConta /* end of 'src/plottables/plottable-statisticalbox.cpp' */ -/* including file 'src/plottables/plottable-colormap.cpp', size 47531 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-colormap.cpp', size 47881 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPColorMapData @@ -24583,25 +24927,25 @@ QVector QCPStatisticalBox::getWhiskerBarLines(QCPStatisticalBoxDataConta /*! \class QCPColorMapData \brief Holds the two-dimensional data of a QCPColorMap plottable. - + This class is a data storage for \ref QCPColorMap. It holds a two-dimensional array, which \ref QCPColorMap then displays as a 2D image in the plot, where the array values are represented by a color, depending on the value. - + The size of the array can be controlled via \ref setSize (or \ref setKeySize, \ref setValueSize). Which plot coordinates these cells correspond to can be configured with \ref setRange (or \ref setKeyRange, \ref setValueRange). - + The data cells can be accessed in two ways: They can be directly addressed by an integer index with \ref setCell. This is the fastest method. Alternatively, they can be addressed by their plot coordinate with \ref setData. plot coordinate to cell index transformations and vice versa are provided by the functions \ref coordToCell and \ref cellToCoord. - + A \ref QCPColorMapData also holds an on-demand two-dimensional array of alpha values which (if allocated) has the same size as the data map. It can be accessed via \ref setAlpha, \ref fillAlpha and \ref clearAlpha. The memory for the alpha map is only allocated if needed, i.e. on the first call of \ref setAlpha. \ref clearAlpha restores full opacity and frees the alpha map. - + This class also buffers the minimum and maximum values that are in the data set, to provide QCPColorMap::rescaleDataRange with the necessary information quickly. Setting a cell to a value that is greater than the current maximum increases this maximum to the new value. However, @@ -24617,7 +24961,7 @@ QVector QCPStatisticalBox::getWhiskerBarLines(QCPStatisticalBoxDataConta /* start of documentation of inline functions */ /*! \fn bool QCPColorMapData::isEmpty() const - + Returns whether this instance carries no data. This is equivalent to having a size where at least one of the dimensions is 0 (see \ref setSize). */ @@ -24628,7 +24972,7 @@ QVector QCPStatisticalBox::getWhiskerBarLines(QCPStatisticalBoxDataConta Constructs a new QCPColorMapData instance. The instance has \a keySize cells in the key direction and \a valueSize cells in the value direction. These cells will be displayed by the \ref QCPColorMap at the coordinates \a keyRange and \a valueRange. - + \see setSize, setKeySize, setValueSize, setRange, setKeyRange, setValueRange */ QCPColorMapData::QCPColorMapData(int keySize, int valueSize, const QCPRange &keyRange, const QCPRange &valueRange) : @@ -24737,7 +25081,7 @@ unsigned char QCPColorMapData::alpha(int keyIndex, int valueIndex) The current data is discarded and the map cells are set to 0, unless the map had already the requested size. - + Setting at least one of \a keySize or \a valueSize to zero frees the internal data array and \ref isEmpty returns true. @@ -24767,10 +25111,10 @@ void QCPColorMapData::setSize(int keySize, int valueSize) qDebug() << Q_FUNC_INFO << "out of memory for data dimensions "<< mKeySize << "*" << mValueSize; } else mData = 0; - + if (mAlpha) // if we had an alpha map, recreate it with new size createAlpha(); - + mDataModified = true; } } @@ -24780,7 +25124,7 @@ void QCPColorMapData::setSize(int keySize, int valueSize) The current data is discarded and the map cells are set to 0, unless the map had already the requested size. - + Setting \a keySize to zero frees the internal data array and \ref isEmpty returns true. \see setKeyRange, setSize, setValueSize @@ -24795,7 +25139,7 @@ void QCPColorMapData::setKeySize(int keySize) The current data is discarded and the map cells are set to 0, unless the map had already the requested size. - + Setting \a valueSize to zero frees the internal data array and \ref isEmpty returns true. \see setValueRange, setSize, setKeySize @@ -24808,11 +25152,11 @@ void QCPColorMapData::setValueSize(int valueSize) /*! Sets the coordinate ranges the data shall be distributed over. This defines the rectangular area covered by the color map in plot coordinates. - + The outer cells will be centered on the range boundaries given to this function. For example, if the key size (\ref setKeySize) is 3 and \a keyRange is set to QCPRange(2, 3) there will be cells centered on the key coordinates 2, 2.5 and 3. - + \see setSize */ void QCPColorMapData::setRange(const QCPRange &keyRange, const QCPRange &valueRange) @@ -24824,11 +25168,11 @@ void QCPColorMapData::setRange(const QCPRange &keyRange, const QCPRange &valueRa /*! Sets the coordinate range the data shall be distributed over in the key dimension. Together with the value range, This defines the rectangular area covered by the color map in plot coordinates. - + The outer cells will be centered on the range boundaries given to this function. For example, if the key size (\ref setKeySize) is 3 and \a keyRange is set to QCPRange(2, 3) there will be cells centered on the key coordinates 2, 2.5 and 3. - + \see setRange, setValueRange, setSize */ void QCPColorMapData::setKeyRange(const QCPRange &keyRange) @@ -24839,11 +25183,11 @@ void QCPColorMapData::setKeyRange(const QCPRange &keyRange) /*! Sets the coordinate range the data shall be distributed over in the value dimension. Together with the key range, This defines the rectangular area covered by the color map in plot coordinates. - + The outer cells will be centered on the range boundaries given to this function. For example, if the value size (\ref setValueSize) is 3 and \a valueRange is set to QCPRange(2, 3) there will be cells centered on the value coordinates 2, 2.5 and 3. - + \see setRange, setKeyRange, setSize */ void QCPColorMapData::setValueRange(const QCPRange &valueRange) @@ -24854,13 +25198,13 @@ void QCPColorMapData::setValueRange(const QCPRange &valueRange) /*! Sets the data of the cell, which lies at the plot coordinates given by \a key and \a value, to \a z. - + \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes, you shouldn't use the \ref QCPColorMapData::setData method as it uses a linear transformation to determine the cell index. Rather directly access the cell index with \ref QCPColorMapData::setCell. - + \see setCell, setRange */ void QCPColorMapData::setData(double key, double value, double z) @@ -24882,11 +25226,11 @@ void QCPColorMapData::setData(double key, double value, double z) Sets the data of the cell with indices \a keyIndex and \a valueIndex to \a z. The indices enumerate the cells starting from zero, up to the map's size-1 in the respective dimension (see \ref setSize). - + In the standard plot configuration (horizontal key axis and vertical value axis, both not range-reversed), the cell with indices (0, 0) is in the bottom left corner and the cell with indices (keySize-1, valueSize-1) is in the top right corner of the color map. - + \see setData, setSize */ void QCPColorMapData::setCell(int keyIndex, int valueIndex, double z) @@ -24933,13 +25277,13 @@ void QCPColorMapData::setAlpha(int keyIndex, int valueIndex, unsigned char alpha /*! Goes through the data and updates the buffered minimum and maximum data values. - + Calling this method is only advised if you are about to call \ref QCPColorMap::rescaleDataRange and can not guarantee that the cells holding the maximum or minimum data haven't been overwritten with a smaller or larger value respectively, since the buffered maximum/minimum values have been updated the last time. Why this is the case is explained in the class description (\ref QCPColorMapData). - + Note that the method \ref QCPColorMap::rescaleDataRange provides a parameter \a recalculateDataBounds for convenience. Setting this to true will call this method for you, before doing the rescale. @@ -24965,7 +25309,7 @@ void QCPColorMapData::recalculateDataBounds() /*! Frees the internal data memory. - + This is equivalent to calling \ref setSize "setSize(0, 0)". */ void QCPColorMapData::clear() @@ -25022,17 +25366,17 @@ void QCPColorMapData::fillAlpha(unsigned char alpha) Transforms plot coordinates given by \a key and \a value to cell indices of this QCPColorMapData instance. The resulting cell indices are returned via the output parameters \a keyIndex and \a valueIndex. - + The retrieved key/value cell indices can then be used for example with \ref setCell. - + If you are only interested in a key or value index, you may pass 0 as \a valueIndex or \a keyIndex. - + \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes, you shouldn't use the \ref QCPColorMapData::coordToCell method as it uses a linear transformation to determine the cell index. - + \see cellToCoord, QCPAxis::coordToPixel */ void QCPColorMapData::coordToCell(double key, double value, int *keyIndex, int *valueIndex) const @@ -25047,15 +25391,15 @@ void QCPColorMapData::coordToCell(double key, double value, int *keyIndex, int * Transforms cell indices given by \a keyIndex and \a valueIndex to cell indices of this QCPColorMapData instance. The resulting coordinates are returned via the output parameters \a key and \a value. - + If you are only interested in a key or value coordinate, you may pass 0 as \a key or \a value. - + \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes, you shouldn't use the \ref QCPColorMapData::cellToCoord method as it uses a linear transformation to determine the cell index. - + \see coordToCell, QCPAxis::pixelToCoord */ void QCPColorMapData::cellToCoord(int keyIndex, int valueIndex, double *key, double *value) const @@ -25084,7 +25428,7 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) clearAlpha(); if (isEmpty()) return false; - + #ifdef __EXCEPTIONS try { // 2D arrays get memory intensive fast. So if the allocation fails, at least output debug message #endif @@ -25113,10 +25457,10 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) \brief A plottable representing a two-dimensional color map in a plot. \image html QCPColorMap.png - + The data is stored in the class \ref QCPColorMapData, which can be accessed via the data() method. - + A color map has three dimensions to represent a data point: The \a key dimension, the \a value dimension and the \a data dimension. As with other plottables such as graphs, \a key and \a value correspond to two orthogonal axes on the QCustomPlot surface that you specify in the QCPColorMap @@ -25131,52 +25475,52 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) their plot coordinates with \ref QCPColorMapData::setData. If possible, you should prefer setCell, since it doesn't need to do any coordinate transformation and thus performs a bit better. - + The cell with index (0, 0) is at the bottom left, if the color map uses normal (i.e. not reversed) key and value axes. - + To show the user which colors correspond to which \a data values, a \ref QCPColorScale is typically placed to the right of the axis rect. See the documentation there for details on how to add and use a color scale. - + \section qcpcolormap-appearance Changing the appearance - + The central part of the appearance is the color gradient, which can be specified via \ref setGradient. See the documentation of \ref QCPColorGradient for details on configuring a color gradient. - + The \a data range that is mapped to the colors of the gradient can be specified with \ref setDataRange. To make the data range encompass the whole data set minimum to maximum, call \ref rescaleDataRange. - + \section qcpcolormap-transparency Transparency - + Transparency in color maps can be achieved by two mechanisms. On one hand, you can specify alpha values for color stops of the \ref QCPColorGradient, via the regular QColor interface. This will cause the color map data which gets mapped to colors around those color stops to appear with the accordingly interpolated transparency. - + On the other hand you can also directly apply an alpha value to each cell independent of its data, by using the alpha map feature of \ref QCPColorMapData. The relevant methods are \ref QCPColorMapData::setAlpha, QCPColorMapData::fillAlpha and \ref QCPColorMapData::clearAlpha(). - + The two transparencies will be joined together in the plot and otherwise not interfere with each other. They are mixed in a multiplicative matter, so an alpha of e.g. 50% (128/255) in both modes simultaneously, will result in a total transparency of 25% (64/255). - + \section qcpcolormap-usage Usage - + Like all data representing objects in QCustomPlot, the QCPColorMap is a plottable (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::removePlottable, etc.) - + Usually, you first create an instance: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolormap-creation-1 which registers it with the QCustomPlot instance of the passed axes. Note that this QCustomPlot instance takes ownership of the plottable, so do not delete it manually but use QCustomPlot::removePlottable() instead. The newly created plottable can be modified, e.g.: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolormap-creation-2 - + \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes, you shouldn't use the \ref QCPColorMapData::setData method as it uses a linear transformation to @@ -25187,10 +25531,10 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) /* start documentation of inline functions */ /*! \fn QCPColorMapData *QCPColorMap::data() const - + Returns a pointer to the internal data storage of type \ref QCPColorMapData. Access this to modify data points (cells) and the color map key/value range. - + \see setData */ @@ -25199,23 +25543,23 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) /* start documentation of signals */ /*! \fn void QCPColorMap::dataRangeChanged(const QCPRange &newRange); - + This signal is emitted when the data range changes. - + \see setDataRange */ /*! \fn void QCPColorMap::dataScaleTypeChanged(QCPAxis::ScaleType scaleType); - + This signal is emitted when the data scale type changes. - + \see setDataScaleType */ /*! \fn void QCPColorMap::gradientChanged(const QCPColorGradient &newGradient); - + This signal is emitted when the gradient changes. - + \see setGradient */ @@ -25223,7 +25567,7 @@ bool QCPColorMapData::createAlpha(bool initializeOpaque) /*! Constructs a color map with the specified \a keyAxis and \a valueAxis. - + The created QCPColorMap is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPColorMap, so do not delete it manually but use QCustomPlot::removePlottable() instead. @@ -25232,6 +25576,7 @@ QCPColorMap::QCPColorMap(QCPAxis *keyAxis, QCPAxis *valueAxis) : QCPAbstractPlottable(keyAxis, valueAxis), mDataScaleType(QCPAxis::stLinear), mMapData(new QCPColorMapData(10, 10, QCPRange(0, 5), QCPRange(0, 5))), + mGradient(QCPColorGradient::gpCold), mInterpolate(true), mTightBoundary(false), mMapImageInvalidated(true) @@ -25245,7 +25590,7 @@ QCPColorMap::~QCPColorMap() /*! Replaces the current \ref data with the provided \a data. - + If \a copy is set to true, the \a data object will only be copied. if false, the color map takes ownership of the passed data and replaces the internal data pointer with it. This is significantly faster than copying for large datasets. @@ -25271,9 +25616,9 @@ void QCPColorMap::setData(QCPColorMapData *data, bool copy) /*! Sets the data range of this color map to \a dataRange. The data range defines which data values are mapped to the color gradient. - + To make the data range span the full range of the data set, use \ref rescaleDataRange. - + \see QCPColorScale::setDataRange */ void QCPColorMap::setDataRange(const QCPRange &dataRange) @@ -25292,7 +25637,7 @@ void QCPColorMap::setDataRange(const QCPRange &dataRange) /*! Sets whether the data is correlated with the color gradient linearly or logarithmically. - + \see QCPColorScale::setDataScaleType */ void QCPColorMap::setDataScaleType(QCPAxis::ScaleType scaleType) @@ -25310,12 +25655,12 @@ void QCPColorMap::setDataScaleType(QCPAxis::ScaleType scaleType) /*! Sets the color gradient that is used to represent the data. For more details on how to create an own gradient or use one of the preset gradients, see \ref QCPColorGradient. - + The colors defined by the gradient will be used to represent data values in the currently set data range, see \ref setDataRange. Data points that are outside this data range will either be colored uniformly with the respective gradient boundary color, or the gradient will repeat, depending on \ref QCPColorGradient::setPeriodic. - + \see QCPColorScale::setGradient */ void QCPColorMap::setGradient(const QCPColorGradient &gradient) @@ -25331,7 +25676,7 @@ void QCPColorMap::setGradient(const QCPColorGradient &gradient) /*! Sets whether the color map image shall use bicubic interpolation when displaying the color map shrinked or expanded, and not at a 1:1 pixel-to-data scale. - + \image html QCPColorMap-interpolate.png "A 10*10 color map, with interpolation and without interpolation enabled" */ void QCPColorMap::setInterpolate(bool enabled) @@ -25343,12 +25688,12 @@ void QCPColorMap::setInterpolate(bool enabled) /*! Sets whether the outer most data rows and columns are clipped to the specified key and value range (see \ref QCPColorMapData::setKeyRange, \ref QCPColorMapData::setValueRange). - + if \a enabled is set to false, the data points at the border of the color map are drawn with the same width and height as all other data points. Since the data points are represented by rectangles of one color centered on the data coordinate, this means that the shown color map extends by half a data point over the specified key/value range in each direction. - + \image html QCPColorMap-tightboundary.png "A color map, with tight boundary enabled and disabled" */ void QCPColorMap::setTightBoundary(bool enabled) @@ -25358,16 +25703,16 @@ void QCPColorMap::setTightBoundary(bool enabled) /*! Associates the color scale \a colorScale with this color map. - + This means that both the color scale and the color map synchronize their gradient, data range and data scale type (\ref setGradient, \ref setDataRange, \ref setDataScaleType). Multiple color maps can be associated with one single color scale. This causes the color maps to also synchronize those properties, via the mutual color scale. - + This function causes the color map to adopt the current color gradient, data range and data scale type of \a colorScale. After this call, you may change these properties at either the color map or the color scale, and the setting will be applied to both. - + Pass 0 as \a colorScale to disconnect the color scale from this color map again. */ void QCPColorMap::setColorScale(QCPColorScale *colorScale) @@ -25400,7 +25745,7 @@ void QCPColorMap::setColorScale(QCPColorScale *colorScale) Sets the data range (\ref setDataRange) to span the minimum and maximum values that occur in the current data set. This corresponds to the \ref rescaleKeyAxis or \ref rescaleValueAxis methods, only for the third data dimension of the color map. - + The minimum and maximum values of the data set are buffered in the internal QCPColorMapData instance (\ref data). As data is updated via its \ref QCPColorMapData::setCell or \ref QCPColorMapData::setData, the buffered minimum and maximum values are updated, too. For @@ -25413,7 +25758,7 @@ void QCPColorMap::setColorScale(QCPColorScale *colorScale) QCPColorMapData::recalculateDataBounds can be used. For convenience, setting the parameter \a recalculateDataBounds calls this method before setting the data range to the buffered minimum and maximum. - + \see setDataRange */ void QCPColorMap::rescaleDataRange(bool recalculateDataBounds) @@ -25426,22 +25771,22 @@ void QCPColorMap::rescaleDataRange(bool recalculateDataBounds) /*! Takes the current appearance of the color map and updates the legend icon, which is used to represent this color map in the legend (see \ref QCPLegend). - + The \a transformMode specifies whether the rescaling is done by a faster, low quality image scaling algorithm (Qt::FastTransformation) or by a slower, higher quality algorithm (Qt::SmoothTransformation). - + The current color map appearance is scaled down to \a thumbSize. Ideally, this should be equal to the size of the legend icon (see \ref QCPLegend::setIconSize). If it isn't exactly the configured legend icon size, the thumb will be rescaled during drawing of the legend item. - + \see setDataRange */ void QCPColorMap::updateLegendIcon(Qt::TransformationMode transformMode, const QSize &thumbSize) { if (mMapImage.isNull() && !data()->isEmpty()) updateMapImage(); // try to update map image if it's null (happens if no draw has happened yet) - + if (!mMapImage.isNull()) // might still be null, e.g. if data is empty, so check here again { bool mirrorX = (keyAxis()->orientation() == Qt::Horizontal ? keyAxis() : valueAxis())->rangeReversed(); @@ -25458,7 +25803,7 @@ double QCPColorMap::selectTest(const QPointF &pos, bool onlySelectable, QVariant return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { double posKey, posValue; @@ -25506,7 +25851,7 @@ QCPRange QCPColorMap::getValueRange(bool &foundRange, QCP::SignDomain inSignDoma return QCPRange(); } } - + foundRange = true; QCPRange result = mMapData->valueRange(); result.normalize(); @@ -25527,14 +25872,14 @@ QCPRange QCPColorMap::getValueRange(bool &foundRange, QCP::SignDomain inSignDoma } /*! \internal - + Updates the internal map image buffer by going through the internal \ref QCPColorMapData and turning the data values into color pixels with \ref QCPColorGradient::colorize. - + This method is called by \ref QCPColorMap::draw if either the data has been modified or the map image has been invalidated for a different reason (e.g. a change of the data range with \ref setDataRange). - + If the map cell count is low, the image created will be oversampled in order to avoid a QPainter::drawImage bug which makes inner pixel boundaries jitter when stretch-drawing images without smooth transform enabled. Accordingly, oversampling isn't performed if \ref @@ -25545,65 +25890,73 @@ void QCPColorMap::updateMapImage() QCPAxis *keyAxis = mKeyAxis.data(); if (!keyAxis) return; if (mMapData->isEmpty()) return; - + const QImage::Format format = QImage::Format_ARGB32_Premultiplied; const int keySize = mMapData->keySize(); const int valueSize = mMapData->valueSize(); int keyOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)keySize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on int valueOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)valueSize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on - + // resize mMapImage to correct dimensions including possible oversampling factors, according to key/value axes orientation: if (keyAxis->orientation() == Qt::Horizontal && (mMapImage.width() != keySize*keyOversamplingFactor || mMapImage.height() != valueSize*valueOversamplingFactor)) mMapImage = QImage(QSize(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor), format); else if (keyAxis->orientation() == Qt::Vertical && (mMapImage.width() != valueSize*valueOversamplingFactor || mMapImage.height() != keySize*keyOversamplingFactor)) mMapImage = QImage(QSize(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor), format); - - QImage *localMapImage = &mMapImage; // this is the image on which the colorization operates. Either the final mMapImage, or if we need oversampling, mUndersampledMapImage - if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1) + + if (mMapImage.isNull()) { - // resize undersampled map image to actual key/value cell sizes: - if (keyAxis->orientation() == Qt::Horizontal && (mUndersampledMapImage.width() != keySize || mUndersampledMapImage.height() != valueSize)) - mUndersampledMapImage = QImage(QSize(keySize, valueSize), format); - else if (keyAxis->orientation() == Qt::Vertical && (mUndersampledMapImage.width() != valueSize || mUndersampledMapImage.height() != keySize)) - mUndersampledMapImage = QImage(QSize(valueSize, keySize), format); - localMapImage = &mUndersampledMapImage; // make the colorization run on the undersampled image - } else if (!mUndersampledMapImage.isNull()) - mUndersampledMapImage = QImage(); // don't need oversampling mechanism anymore (map size has changed) but mUndersampledMapImage still has nonzero size, free it - - const double *rawData = mMapData->mData; - const unsigned char *rawAlpha = mMapData->mAlpha; - if (keyAxis->orientation() == Qt::Horizontal) + qDebug() << Q_FUNC_INFO << "Couldn't create map image (possibly too large for memory)"; + mMapImage = QImage(QSize(10, 10), format); + mMapImage.fill(Qt::black); + } else { - const int lineCount = valueSize; - const int rowCount = keySize; - for (int line=0; line 1 || valueOversamplingFactor > 1) { - QRgb* pixels = reinterpret_cast(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) - if (rawAlpha) - mGradient.colorize(rawData+line*rowCount, rawAlpha+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic); - else - mGradient.colorize(rawData+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic); - } - } else // keyAxis->orientation() == Qt::Vertical - { - const int lineCount = keySize; - const int rowCount = valueSize; - for (int line=0; line(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) - if (rawAlpha) - mGradient.colorize(rawData+line, rawAlpha+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic); - else - mGradient.colorize(rawData+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic); - } - } - - if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1) - { + // resize undersampled map image to actual key/value cell sizes: + if (keyAxis->orientation() == Qt::Horizontal && (mUndersampledMapImage.width() != keySize || mUndersampledMapImage.height() != valueSize)) + mUndersampledMapImage = QImage(QSize(keySize, valueSize), format); + else if (keyAxis->orientation() == Qt::Vertical && (mUndersampledMapImage.width() != valueSize || mUndersampledMapImage.height() != keySize)) + mUndersampledMapImage = QImage(QSize(valueSize, keySize), format); + localMapImage = &mUndersampledMapImage; // make the colorization run on the undersampled image + } else if (!mUndersampledMapImage.isNull()) + mUndersampledMapImage = QImage(); // don't need oversampling mechanism anymore (map size has changed) but mUndersampledMapImage still has nonzero size, free it + + const double *rawData = mMapData->mData; + const unsigned char *rawAlpha = mMapData->mAlpha; if (keyAxis->orientation() == Qt::Horizontal) - mMapImage = mUndersampledMapImage.scaled(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); - else - mMapImage = mUndersampledMapImage.scaled(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); + { + const int lineCount = valueSize; + const int rowCount = keySize; + for (int line=0; line(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) + if (rawAlpha) + mGradient.colorize(rawData+line*rowCount, rawAlpha+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic); + else + mGradient.colorize(rawData+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic); + } + } else // keyAxis->orientation() == Qt::Vertical + { + const int lineCount = keySize; + const int rowCount = valueSize; + for (int line=0; line(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) + if (rawAlpha) + mGradient.colorize(rawData+line, rawAlpha+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic); + else + mGradient.colorize(rawData+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic); + } + } + + if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1) + { + if (keyAxis->orientation() == Qt::Horizontal) + mMapImage = mUndersampledMapImage.scaled(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); + else + mMapImage = mUndersampledMapImage.scaled(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); + } } mMapData->mDataModified = false; mMapImageInvalidated = false; @@ -25615,10 +25968,10 @@ void QCPColorMap::draw(QCPPainter *painter) if (mMapData->isEmpty()) return; if (!mKeyAxis || !mValueAxis) return; applyDefaultAntialiasingHint(painter); - + if (mMapData->mDataModified || mMapImageInvalidated) updateMapImage(); - + // use buffer if painting vectorized (PDF): const bool useBuffer = painter->modes().testFlag(QCPPainter::pmVectorized); QCPPainter *localPainter = painter; // will be redirected to paint on mapBuffer if painting vectorized @@ -25634,7 +25987,7 @@ void QCPColorMap::draw(QCPPainter *painter) localPainter->scale(mapBufferPixelRatio, mapBufferPixelRatio); localPainter->translate(-mapBufferTarget.topLeft()); } - + QRectF imageRect = QRectF(coordsToPixels(mMapData->keyRange().lower, mMapData->valueRange().lower), coordsToPixels(mMapData->keyRange().upper, mMapData->valueRange().upper)).normalized(); // extend imageRect to contain outer halves/quarters of bordering/cornering pixels (cells are centered on map range boundary): @@ -25670,7 +26023,7 @@ void QCPColorMap::draw(QCPPainter *painter) if (mTightBoundary) localPainter->setClipRegion(clipBackup); localPainter->setRenderHint(QPainter::SmoothPixmapTransform, smoothBackup); - + if (useBuffer) // localPainter painted to mapBuffer, so now draw buffer with original painter { delete localPainter; @@ -25701,7 +26054,7 @@ void QCPColorMap::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const /* including file 'src/plottables/plottable-financial.cpp', size 42610 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPFinancialData @@ -25709,68 +26062,68 @@ void QCPColorMap::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const /*! \class QCPFinancialData \brief Holds the data of one single data point for QCPFinancial. - + The stored data is: \li \a key: coordinate on the key axis of this data point (this is the \a mainKey and the \a sortKey) \li \a open: The opening value at the data point (this is the \a mainValue) \li \a high: The high/maximum value at the data point \li \a low: The low/minimum value at the data point \li \a close: The closing value at the data point - + The container for storing multiple data points is \ref QCPFinancialDataContainer. It is a typedef for \ref QCPDataContainer with \ref QCPFinancialData as the DataType template parameter. See the documentation there for an explanation regarding the data type's generic methods. - + \see QCPFinancialDataContainer */ /* start documentation of inline functions */ /*! \fn double QCPFinancialData::sortKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static QCPFinancialData QCPFinancialData::fromSortKey(double sortKey) - + Returns a data point with the specified \a sortKey. All other members are set to zero. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn static static bool QCPFinancialData::sortKeyIsMainKey() - + Since the member \a key is both the data point key coordinate and the data ordering parameter, this method returns true. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPFinancialData::mainKey() const - + Returns the \a key member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn double QCPFinancialData::mainValue() const - + Returns the \a open member of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ /*! \fn QCPRange QCPFinancialData::valueRange() const - + Returns a QCPRange spanning from the \a low to the \a high value of this data point. - + For a general explanation of what this method is good for in the context of the data container, see the documentation of \ref QCPDataContainer. */ @@ -25858,7 +26211,7 @@ QCPFinancialData::QCPFinancialData(double key, double open, double high, double /* start of documentation of inline functions */ /*! \fn QCPFinancialDataContainer *QCPFinancial::data() const - + Returns a pointer to the internal data storage of type \ref QCPFinancialDataContainer. You may use it to directly manipulate the data, which may be more convenient and faster than using the regular \ref setData or \ref addData methods, in certain situations. @@ -25871,7 +26224,7 @@ QCPFinancialData::QCPFinancialData(double key, double open, double high, double axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have the same orientation. If either of these restrictions is violated, a corresponding message is printed to the debug output (qDebug), the construction is not aborted, though. - + The created QCPFinancial is automatically registered with the QCustomPlot instance inferred from \a keyAxis. This QCustomPlot instance takes ownership of the QCPFinancial, so do not delete it manually but use QCustomPlot::removePlottable() instead. @@ -25895,18 +26248,18 @@ QCPFinancial::~QCPFinancial() } /*! \overload - + Replaces the current data container with the provided \a data container. - + Since a QSharedPointer is used, multiple QCPFinancials may share the same data container safely. Modifying the data in the container will then affect all financials that share the container. Sharing can be achieved by simply exchanging the data containers wrapped in shared pointers: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpfinancial-datasharing-1 - + If you do not wish to share containers, but create a copy from an existing container, rather use the \ref QCPDataContainer::set method on the financial's data container directly: \snippet documentation/doc-code-snippets/mainwindow.cpp qcpfinancial-datasharing-2 - + \see addData, timeSeriesToOhlc */ void QCPFinancial::setData(QSharedPointer data) @@ -25915,14 +26268,14 @@ void QCPFinancial::setData(QSharedPointer data) } /*! \overload - + Replaces the current data with the provided points in \a keys, \a open, \a high, \a low and \a close. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + \see addData, timeSeriesToOhlc */ void QCPFinancial::setData(const QVector &keys, const QVector &open, const QVector &high, const QVector &low, const QVector &close, bool alreadySorted) @@ -25941,7 +26294,7 @@ void QCPFinancial::setChartStyle(QCPFinancial::ChartStyle style) /*! Sets the width of the individual bars/candlesticks to \a width in plot key coordinates. - + A typical choice is to set it to (or slightly less than) one bin interval width. */ void QCPFinancial::setWidth(double width) @@ -25965,10 +26318,10 @@ void QCPFinancial::setWidthType(QCPFinancial::WidthType widthType) /*! Sets whether this chart shall contrast positive from negative trends per data point by using two separate colors to draw the respective bars/candlesticks. - + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref setBrush). - + \see setPenPositive, setPenNegative, setBrushPositive, setBrushNegative */ void QCPFinancial::setTwoColored(bool twoColored) @@ -25979,10 +26332,10 @@ void QCPFinancial::setTwoColored(bool twoColored) /*! If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills of data points with a positive trend (i.e. bars/candlesticks with close >= open). - + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref setBrush). - + \see setBrushNegative, setPenPositive, setPenNegative */ void QCPFinancial::setBrushPositive(const QBrush &brush) @@ -25993,10 +26346,10 @@ void QCPFinancial::setBrushPositive(const QBrush &brush) /*! If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills of data points with a negative trend (i.e. bars/candlesticks with close < open). - + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref setBrush). - + \see setBrushPositive, setPenNegative, setPenPositive */ void QCPFinancial::setBrushNegative(const QBrush &brush) @@ -26007,10 +26360,10 @@ void QCPFinancial::setBrushNegative(const QBrush &brush) /*! If \ref setTwoColored is set to true, this function controls the pen that is used to draw outlines of data points with a positive trend (i.e. bars/candlesticks with close >= open). - + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref setBrush). - + \see setPenNegative, setBrushPositive, setBrushNegative */ void QCPFinancial::setPenPositive(const QPen &pen) @@ -26021,10 +26374,10 @@ void QCPFinancial::setPenPositive(const QPen &pen) /*! If \ref setTwoColored is set to true, this function controls the pen that is used to draw outlines of data points with a negative trend (i.e. bars/candlesticks with close < open). - + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref setBrush). - + \see setPenPositive, setBrushNegative, setBrushPositive */ void QCPFinancial::setPenNegative(const QPen &pen) @@ -26033,17 +26386,17 @@ void QCPFinancial::setPenNegative(const QPen &pen) } /*! \overload - + Adds the provided points in \a keys, \a open, \a high, \a low and \a close to the current data. The provided vectors should have equal length. Else, the number of added points will be the size of the smallest vector. - + If you can guarantee that the passed data points are sorted by \a keys in ascending order, you can set \a alreadySorted to true, to improve performance by saving a sorting run. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. - + \see timeSeriesToOhlc */ void QCPFinancial::addData(const QVector &keys, const QVector &open, const QVector &high, const QVector &low, const QVector &close, bool alreadySorted) @@ -26069,13 +26422,13 @@ void QCPFinancial::addData(const QVector &keys, const QVector &o } /*! \overload - + Adds the provided data point as \a key, \a open, \a high, \a low and \a close to the current data. - + Alternatively, you can also access and modify the data directly via the \ref data method, which returns a pointer to the internal data container. - + \see timeSeriesToOhlc */ void QCPFinancial::addData(double key, double open, double high, double low, double close) @@ -26093,10 +26446,10 @@ QCPDataSelection QCPFinancial::selectTestRect(const QRectF &rect, bool onlySelec return result; if (!mKeyAxis || !mValueAxis) return result; - + QCPFinancialDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd); - + for (QCPFinancialDataContainer::const_iterator it=visibleBegin; it!=visibleEnd; ++it) { if (rect.intersects(selectionHitBox(it))) @@ -26114,7 +26467,7 @@ double QCPFinancial::selectTest(const QPointF &pos, bool onlySelectable, QVarian return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { // get visible data range: @@ -26137,7 +26490,7 @@ double QCPFinancial::selectTest(const QPointF &pos, bool onlySelectable, QVarian } return result; } - + return -1; } @@ -26166,11 +26519,11 @@ QCPRange QCPFinancial::getValueRange(bool &foundRange, QCP::SignDomain inSignDom A convenience function that converts time series data (\a value against \a time) to OHLC binned data points. The return value can then be passed on to \ref QCPFinancialDataContainer::set(const QCPFinancialDataContainer&). - + The size of the bins can be controlled with \a timeBinSize in the same units as \a time is given. For example, if the unit of \a time is seconds and single OHLC/Candlesticks should span an hour each, set \a timeBinSize to 3600. - + \a timeBinOffset allows to control precisely at what \a time coordinate a bin should start. The value passed as \a timeBinOffset doesn't need to be in the range encompassed by the \a time keys. It merely defines the mathematical offset/phase of the bins that will be used to process the @@ -26182,7 +26535,7 @@ QCPFinancialDataContainer QCPFinancial::timeSeriesToOhlc(const QVector & int count = qMin(time.size(), value.size()); if (count == 0) return QCPFinancialDataContainer(); - + QCPFinancialData currentBinData(0, value.first(), value.first(), value.first(), value.first()); int currentBinIndex = qFloor((time.first()-timeBinOffset)/timeBinSize+0.5); for (int i=0; i & currentBinData.low = value.at(i); } } - + return data; } @@ -26221,7 +26574,7 @@ void QCPFinancial::draw(QCPPainter *painter) // get visible data range: QCPFinancialDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd); - + // loop over and draw segments of unselected/selected data: QList selectedSegments, unselectedSegments, allSegments; getDataSegments(selectedSegments, unselectedSegments); @@ -26234,7 +26587,7 @@ void QCPFinancial::draw(QCPPainter *painter) mDataContainer->limitIteratorsToDataRange(begin, end, allSegments.at(i)); if (begin == end) continue; - + // draw data segment according to configured style: switch (mChartStyle) { @@ -26244,7 +26597,7 @@ void QCPFinancial::draw(QCPPainter *painter) drawCandlestickPlot(painter, begin, end, isSelectedSegment); break; } } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -26310,7 +26663,7 @@ void QCPFinancial::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const } /*! \internal - + Draws the data from \a begin to \a end-1 as OHLC bars with the provided \a painter. This method is a helper function for \ref draw. It is used when the chart style is \ref csOhlc. @@ -26320,7 +26673,7 @@ void QCPFinancial::drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataConta QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + if (keyAxis->orientation() == Qt::Horizontal) { for (QCPFinancialDataContainer::const_iterator it = begin; it != end; ++it) @@ -26367,7 +26720,7 @@ void QCPFinancial::drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataConta } /*! \internal - + Draws the data from \a begin to \a end-1 as Candlesticks with the provided \a painter. This method is a helper function for \ref draw. It is used when the chart style is \ref csCandlestick. @@ -26377,7 +26730,7 @@ void QCPFinancial::drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDa QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } - + if (keyAxis->orientation() == Qt::Horizontal) { for (QCPFinancialDataContainer::const_iterator it = begin; it != end; ++it) @@ -26488,7 +26841,7 @@ double QCPFinancial::getPixelWidth(double key, double keyPixel) const This method is a helper function for \ref selectTest. It is used to test for selection when the chart style is \ref csOhlc. It only tests against the data points between \a begin and \a end. - + Like \ref selectTest, this method returns the shortest distance of \a pos to the graphical representation of the plottable, and \a closestDataPoint will point to the respective data point. */ @@ -26531,11 +26884,11 @@ double QCPFinancial::ohlcSelectTest(const QPointF &pos, const QCPFinancialDataCo } /*! \internal - + This method is a helper function for \ref selectTest. It is used to test for selection when the chart style is \ref csCandlestick. It only tests against the data points between \a begin and \a end. - + Like \ref selectTest, this method returns the shortest distance of \a pos to the graphical representation of the plottable, and \a closestDataPoint will point to the respective data point. */ @@ -26606,17 +26959,17 @@ double QCPFinancial::candlestickSelectTest(const QPointF &pos, const QCPFinancia } /*! \internal - + called by the drawing methods to determine which data (key) range is visible at the current key axis range setting, so only that needs to be processed. - + \a begin returns an iterator to the lowest data point that needs to be taken into account when plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a begin may still be just outside the visible range. - + \a end returns the iterator just above the highest data point that needs to be taken into account. Same as before, \a end may also lie just outside of the visible range - + if the plottable contains no data, both \a begin and \a end point to \c constEnd. */ void QCPFinancial::getVisibleDataBounds(QCPFinancialDataContainer::const_iterator &begin, QCPFinancialDataContainer::const_iterator &end) const @@ -26642,7 +26995,7 @@ QRectF QCPFinancial::selectionHitBox(QCPFinancialDataContainer::const_iterator i QCPAxis *keyAxis = mKeyAxis.data(); QCPAxis *valueAxis = mValueAxis.data(); if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QRectF(); } - + double keyPixel = keyAxis->coordToPixel(it->key); double highPixel = valueAxis->coordToPixel(it->high); double lowPixel = valueAxis->coordToPixel(it->low); @@ -26655,8 +27008,8 @@ QRectF QCPFinancial::selectionHitBox(QCPFinancialDataContainer::const_iterator i /* end of 'src/plottables/plottable-financial.cpp' */ -/* including file 'src/plottables/plottable-errorbar.cpp', size 37210 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-errorbar.cpp', size 37355 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPErrorBarsData @@ -26860,7 +27213,7 @@ void QCPErrorBars::setDataPlottable(QCPAbstractPlottable *plottable) qDebug() << Q_FUNC_INFO << "passed plottable doesn't implement 1d interface, can't associate with QCPErrorBars"; return; } - + mDataPlottable = plottable; } @@ -27043,10 +27396,10 @@ QCPDataSelection QCPErrorBars::selectTestRect(const QRectF &rect, bool onlySelec return result; if (!mKeyAxis || !mValueAxis) return result; - + QCPErrorBarsDataContainer::const_iterator visibleBegin, visibleEnd; getVisibleDataBounds(visibleBegin, visibleEnd, QCPDataRange(0, dataCount())); - + QVector backbones, whiskers; for (QCPErrorBarsDataContainer::const_iterator it=visibleBegin; it!=visibleEnd; ++it) { @@ -27102,12 +27455,12 @@ int QCPErrorBars::findEnd(double sortKey, bool expandedRange) const double QCPErrorBars::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const { if (!mDataPlottable) return -1; - + if ((onlySelectable && mSelectable == QCP::stNone) || mDataContainer->isEmpty()) return -1; if (!mKeyAxis || !mValueAxis) return -1; - + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) { QCPErrorBarsDataContainer::const_iterator closestDataPoint = mDataContainer->constEnd(); @@ -27128,11 +27481,11 @@ void QCPErrorBars::draw(QCPPainter *painter) if (!mDataPlottable) return; if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } if (mKeyAxis.data()->range().size() <= 0 || mDataContainer->isEmpty()) return; - + // if the sort key isn't the main key, we must check the visibility for each data point/error bar individually // (getVisibleDataBounds applies range restriction, but otherwise can only return full data range): bool checkPointVisibility = !mDataPlottable->interface1D()->sortKeyIsMainKey(); - + // check data validity if flag set: #ifdef QCUSTOMPLOT_CHECK_DATA QCPErrorBarsDataContainer::const_iterator it; @@ -27142,7 +27495,7 @@ void QCPErrorBars::draw(QCPPainter *painter) qDebug() << Q_FUNC_INFO << "Data point at index" << it-mDataContainer->constBegin() << "invalid." << "Plottable name:" << name(); } #endif - + applyDefaultAntialiasingHint(painter); painter->setBrush(Qt::NoBrush); // loop over and draw segments of unselected/selected data: @@ -27156,7 +27509,7 @@ void QCPErrorBars::draw(QCPPainter *painter) getVisibleDataBounds(begin, end, allSegments.at(i)); if (begin == end) continue; - + bool isSelectedSegment = i >= unselectedSegments.size(); if (isSelectedSegment && mSelectionDecorator) mSelectionDecorator->applyPen(painter); @@ -27178,7 +27531,7 @@ void QCPErrorBars::draw(QCPPainter *painter) painter->drawLines(backbones); painter->drawLines(whiskers); } - + // draw other selection decoration that isn't just line/scatter pens and brushes: if (mSelectionDecorator) mSelectionDecorator->drawDecoration(painter, selection()); @@ -27210,7 +27563,7 @@ QCPRange QCPErrorBars::getKeyRange(bool &foundRange, QCP::SignDomain inSignDomai foundRange = false; return QCPRange(); } - + QCPRange range; bool haveLower = false; bool haveUpper = false; @@ -27261,7 +27614,7 @@ QCPRange QCPErrorBars::getKeyRange(bool &foundRange, QCP::SignDomain inSignDomai } } } - + if (haveUpper && !haveLower) { range.lower = range.upper; @@ -27271,7 +27624,7 @@ QCPRange QCPErrorBars::getKeyRange(bool &foundRange, QCP::SignDomain inSignDomai range.upper = range.lower; haveUpper = true; } - + foundRange = haveLower && haveUpper; return range; } @@ -27284,7 +27637,7 @@ QCPRange QCPErrorBars::getValueRange(bool &foundRange, QCP::SignDomain inSignDom foundRange = false; return QCPRange(); } - + QCPRange range; const bool restrictKeyRange = inKeyRange != QCPRange(); bool haveLower = false; @@ -27348,7 +27701,7 @@ QCPRange QCPErrorBars::getValueRange(bool &foundRange, QCP::SignDomain inSignDom } } } - + if (haveUpper && !haveLower) { range.lower = range.upper; @@ -27358,7 +27711,7 @@ QCPRange QCPErrorBars::getValueRange(bool &foundRange, QCP::SignDomain inSignDom range.upper = range.lower; haveUpper = true; } - + foundRange = haveLower && haveUpper; return range; } @@ -27377,13 +27730,13 @@ QCPRange QCPErrorBars::getValueRange(bool &foundRange, QCP::SignDomain inSignDom void QCPErrorBars::getErrorBarLines(QCPErrorBarsDataContainer::const_iterator it, QVector &backbones, QVector &whiskers) const { if (!mDataPlottable) return; - + int index = it-mDataContainer->constBegin(); QPointF centerPixel = mDataPlottable->interface1D()->dataPixelPosition(index); if (qIsNaN(centerPixel.x()) || qIsNaN(centerPixel.y())) return; - QCPAxis *errorAxis = mErrorType == etValueError ? mValueAxis : mKeyAxis; - QCPAxis *orthoAxis = mErrorType == etValueError ? mKeyAxis : mValueAxis; + QCPAxis *errorAxis = mErrorType == etValueError ? mValueAxis.data() : mKeyAxis.data(); + QCPAxis *orthoAxis = mErrorType == etValueError ? mKeyAxis.data() : mValueAxis.data(); const double centerErrorAxisPixel = errorAxis->orientation() == Qt::Horizontal ? centerPixel.x() : centerPixel.y(); const double centerOrthoAxisPixel = orthoAxis->orientation() == Qt::Horizontal ? centerPixel.x() : centerPixel.y(); const double centerErrorAxisCoord = errorAxis->pixelToCoord(centerErrorAxisPixel); // depending on plottable, this might be different from just mDataPlottable->interface1D()->dataMainKey/Value @@ -27471,7 +27824,7 @@ void QCPErrorBars::getVisibleDataBounds(QCPErrorBarsDataContainer::const_iterato end = mDataContainer->constBegin()+dataRange.end(); return; } - + // get visible data range via interface from data plottable, and then restrict to available error data points: const int n = qMin(mDataContainer->size(), mDataPlottable->interface1D()->dataCount()); int beginIndex = mDataPlottable->interface1D()->findBegin(keyAxis->range().lower); @@ -27507,10 +27860,15 @@ double QCPErrorBars::pointDistance(const QPointF &pixelPoint, QCPErrorBarsDataCo closestData = mDataContainer->constEnd(); if (!mDataPlottable || mDataContainer->isEmpty()) return -1.0; - + if (!mKeyAxis || !mValueAxis) + { + qDebug() << Q_FUNC_INFO << "invalid key or value axis"; + return -1.0; + } + QCPErrorBarsDataContainer::const_iterator begin, end; getVisibleDataBounds(begin, end, QCPDataRange(0, dataCount())); - + // calculate minimum distances to error backbones (whiskers are ignored for speed) and find closestData iterator: double minDistSqr = std::numeric_limits::max(); QVector backbones, whiskers; @@ -27571,7 +27929,7 @@ bool QCPErrorBars::errorBarVisible(int index) const const double centerKeyPixel = mKeyAxis->orientation() == Qt::Horizontal ? centerPixel.x() : centerPixel.y(); if (qIsNaN(centerKeyPixel)) return false; - + double keyMin, keyMax; if (mErrorType == etKeyError) { @@ -27612,7 +27970,7 @@ bool QCPErrorBars::rectIntersectsLine(const QRectF &pixelRect, const QLineF &lin /* including file 'src/items/item-straightline.cpp', size 7592 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemStraightLine @@ -27628,7 +27986,7 @@ bool QCPErrorBars::rectIntersectsLine(const QRectF &pixelRect, const QLineF &lin /*! Creates a straight line item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -27639,7 +27997,7 @@ QCPItemStraightLine::QCPItemStraightLine(QCustomPlot *parentPlot) : { point1->setCoords(0, 0); point2->setCoords(1, 1); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue,2)); } @@ -27650,7 +28008,7 @@ QCPItemStraightLine::~QCPItemStraightLine() /*! Sets the pen that will be used to draw the line - + \see setSelectedPen */ void QCPItemStraightLine::setPen(const QPen &pen) @@ -27660,7 +28018,7 @@ void QCPItemStraightLine::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line when selected - + \see setPen, setSelected */ void QCPItemStraightLine::setSelectedPen(const QPen &pen) @@ -27674,7 +28032,7 @@ double QCPItemStraightLine::selectTest(const QPointF &pos, bool onlySelectable, Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + return QCPVector2D(pos).distanceToStraightLine(point1->pixelPosition(), point2->pixelPosition()-point1->pixelPosition()); } @@ -27698,7 +28056,7 @@ void QCPItemStraightLine::draw(QCPPainter *painter) Returns the section of the straight line defined by \a base and direction vector \a vec, that is visible in the specified \a rect. - + This is a helper function for \ref draw. */ QLineF QCPItemStraightLine::getRectClippedStraightLine(const QCPVector2D &base, const QCPVector2D &vec, const QRect &rect) const @@ -27751,7 +28109,7 @@ QLineF QCPItemStraightLine::getRectClippedStraightLine(const QCPVector2D &base, gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x(); if (gamma >= 0 && gamma <= rect.height()) pointVectors.append(QCPVector2D(bx, by+gamma)); - + // evaluate points: if (pointVectors.size() == 2) { @@ -27793,7 +28151,7 @@ QPen QCPItemStraightLine::mainPen() const /* including file 'src/items/item-line.cpp', size 8498 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemLine @@ -27805,13 +28163,13 @@ QPen QCPItemStraightLine::mainPen() const \image html QCPItemLine.png "Line example. Blue dotted circles are anchors, solid blue discs are positions." It has two positions, \a start and \a end, which define the end points of the line. - + With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an arrow. */ /*! Creates a line item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -27822,7 +28180,7 @@ QCPItemLine::QCPItemLine(QCustomPlot *parentPlot) : { start->setCoords(0, 0); end->setCoords(1, 1); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue,2)); } @@ -27833,7 +28191,7 @@ QCPItemLine::~QCPItemLine() /*! Sets the pen that will be used to draw the line - + \see setSelectedPen */ void QCPItemLine::setPen(const QPen &pen) @@ -27843,7 +28201,7 @@ void QCPItemLine::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line when selected - + \see setPen, setSelected */ void QCPItemLine::setSelectedPen(const QPen &pen) @@ -27853,10 +28211,10 @@ void QCPItemLine::setSelectedPen(const QPen &pen) /*! Sets the line ending style of the head. The head corresponds to the \a end position. - + Note that due to the overloaded QCPLineEnding constructor, you may directly specify a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode - + \see setTail */ void QCPItemLine::setHead(const QCPLineEnding &head) @@ -27866,10 +28224,10 @@ void QCPItemLine::setHead(const QCPLineEnding &head) /*! Sets the line ending style of the tail. The tail corresponds to the \a start position. - + Note that due to the overloaded QCPLineEnding constructor, you may directly specify a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode - + \see setHead */ void QCPItemLine::setTail(const QCPLineEnding &tail) @@ -27883,7 +28241,7 @@ double QCPItemLine::selectTest(const QPointF &pos, bool onlySelectable, QVariant Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + return qSqrt(QCPVector2D(pos).distanceSquaredToLine(start->pixelPosition(), end->pixelPosition())); } @@ -27915,7 +28273,7 @@ void QCPItemLine::draw(QCPPainter *painter) Returns the section of the line defined by \a start and \a end, that is visible in the specified \a rect. - + This is a helper function for \ref draw. */ QLineF QCPItemLine::getRectClippedLine(const QCPVector2D &start, const QCPVector2D &end, const QRect &rect) const @@ -27924,7 +28282,7 @@ QLineF QCPItemLine::getRectClippedLine(const QCPVector2D &start, const QCPVector bool containsEnd = rect.contains(end.x(), end.y()); if (containsStart && containsEnd) return QLineF(start.toPointF(), end.toPointF()); - + QCPVector2D base = start; QCPVector2D vec = end-start; double bx, by; @@ -27978,12 +28336,12 @@ QLineF QCPItemLine::getRectClippedLine(const QCPVector2D &start, const QCPVector pointVectors.append(QCPVector2D(bx, by+gamma)); } } - + if (containsStart) pointVectors.append(start); if (containsEnd) pointVectors.append(end); - + // evaluate points: if (pointVectors.size() == 2) { @@ -28024,7 +28382,7 @@ QPen QCPItemLine::mainPen() const /* including file 'src/items/item-curve.cpp', size 7159 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemCurve @@ -28038,10 +28396,10 @@ QPen QCPItemLine::mainPen() const It has four positions, \a start and \a end, which define the end points of the line, and two control points which define the direction the line exits from the start and the direction from which it approaches the end: \a startDir and \a endDir. - + With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an arrow. - + Often it is desirable for the control points to stay at fixed relative positions to the start/end point. This can be achieved by setting the parent anchor e.g. of \a startDir simply to \a start, and then specify the desired pixel offset with QCPItemPosition::setCoords on \a startDir. @@ -28049,7 +28407,7 @@ QPen QCPItemLine::mainPen() const /*! Creates a curve item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -28064,7 +28422,7 @@ QCPItemCurve::QCPItemCurve(QCustomPlot *parentPlot) : startDir->setCoords(0.5, 0); endDir->setCoords(0, 0.5); end->setCoords(1, 1); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue,2)); } @@ -28075,7 +28433,7 @@ QCPItemCurve::~QCPItemCurve() /*! Sets the pen that will be used to draw the line - + \see setSelectedPen */ void QCPItemCurve::setPen(const QPen &pen) @@ -28085,7 +28443,7 @@ void QCPItemCurve::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line when selected - + \see setPen, setSelected */ void QCPItemCurve::setSelectedPen(const QPen &pen) @@ -28095,10 +28453,10 @@ void QCPItemCurve::setSelectedPen(const QPen &pen) /*! Sets the line ending style of the head. The head corresponds to the \a end position. - + Note that due to the overloaded QCPLineEnding constructor, you may directly specify a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode - + \see setTail */ void QCPItemCurve::setHead(const QCPLineEnding &head) @@ -28108,10 +28466,10 @@ void QCPItemCurve::setHead(const QCPLineEnding &head) /*! Sets the line ending style of the tail. The tail corresponds to the \a start position. - + Note that due to the overloaded QCPLineEnding constructor, you may directly specify a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode - + \see setHead */ void QCPItemCurve::setTail(const QCPLineEnding &tail) @@ -28125,7 +28483,7 @@ double QCPItemCurve::selectTest(const QPointF &pos, bool onlySelectable, QVarian Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + QPointF startVec(start->pixelPosition()); QPointF startDirVec(startDir->pixelPosition()); QPointF endDirVec(endDir->pixelPosition()); @@ -28133,7 +28491,7 @@ double QCPItemCurve::selectTest(const QPointF &pos, bool onlySelectable, QVarian QPainterPath cubicPath(startVec); cubicPath.cubicTo(startDirVec, endDirVec, endVec); - + QPolygonF polygon = cubicPath.toSubpathPolygons().first(); QCPVector2D p(pos); double minDistSqr = std::numeric_limits::max(); @@ -28189,7 +28547,7 @@ QPen QCPItemCurve::mainPen() const /* including file 'src/items/item-rect.cpp', size 6479 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemRect @@ -28205,7 +28563,7 @@ QPen QCPItemCurve::mainPen() const /*! Creates a rectangle item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -28222,7 +28580,7 @@ QCPItemRect::QCPItemRect(QCustomPlot *parentPlot) : { topLeft->setCoords(0, 1); bottomRight->setCoords(1, 0); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue,2)); setBrush(Qt::NoBrush); @@ -28235,7 +28593,7 @@ QCPItemRect::~QCPItemRect() /*! Sets the pen that will be used to draw the line of the rectangle - + \see setSelectedPen, setBrush */ void QCPItemRect::setPen(const QPen &pen) @@ -28245,7 +28603,7 @@ void QCPItemRect::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line of the rectangle when selected - + \see setPen, setSelected */ void QCPItemRect::setSelectedPen(const QPen &pen) @@ -28256,7 +28614,7 @@ void QCPItemRect::setSelectedPen(const QPen &pen) /*! Sets the brush that will be used to fill the rectangle. To disable filling, set \a brush to Qt::NoBrush. - + \see setSelectedBrush, setPen */ void QCPItemRect::setBrush(const QBrush &brush) @@ -28267,7 +28625,7 @@ void QCPItemRect::setBrush(const QBrush &brush) /*! Sets the brush that will be used to fill the rectangle when selected. To disable filling, set \a brush to Qt::NoBrush. - + \see setBrush */ void QCPItemRect::setSelectedBrush(const QBrush &brush) @@ -28281,7 +28639,7 @@ double QCPItemRect::selectTest(const QPointF &pos, bool onlySelectable, QVariant Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + QRectF rect = QRectF(topLeft->pixelPosition(), bottomRight->pixelPosition()).normalized(); bool filledRect = mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0; return rectDistance(rect, pos, filledRect); @@ -28318,7 +28676,7 @@ QPointF QCPItemRect::anchorPixelPosition(int anchorId) const case aiBottomLeft: return rect.bottomLeft(); case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5; } - + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; return QPointF(); } @@ -28346,7 +28704,7 @@ QBrush QCPItemRect::mainBrush() const /* including file 'src/items/item-text.cpp', size 13338 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemText @@ -28359,16 +28717,16 @@ QBrush QCPItemRect::mainBrush() const Its position is defined by the member \a position and the setting of \ref setPositionAlignment. The latter controls which part of the text rect shall be aligned with \a position. - + The text alignment itself (i.e. left, center, right) can be controlled with \ref setTextAlignment. - + The text may be rotated around the \a position point with \ref setRotation. */ /*! Creates a text item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -28389,7 +28747,7 @@ QCPItemText::QCPItemText(QCustomPlot *parentPlot) : mRotation(0) { position->setCoords(0, 0); - + setPen(Qt::NoPen); setSelectedPen(Qt::NoPen); setBrush(Qt::NoBrush); @@ -28421,7 +28779,7 @@ void QCPItemText::setSelectedColor(const QColor &color) /*! Sets the pen that will be used do draw a rectangular border around the text. To disable the border, set \a pen to Qt::NoPen. - + \see setSelectedPen, setBrush, setPadding */ void QCPItemText::setPen(const QPen &pen) @@ -28432,7 +28790,7 @@ void QCPItemText::setPen(const QPen &pen) /*! Sets the pen that will be used do draw a rectangular border around the text, when the item is selected. To disable the border, set \a pen to Qt::NoPen. - + \see setPen */ void QCPItemText::setSelectedPen(const QPen &pen) @@ -28443,7 +28801,7 @@ void QCPItemText::setSelectedPen(const QPen &pen) /*! Sets the brush that will be used do fill the background of the text. To disable the background, set \a brush to Qt::NoBrush. - + \see setSelectedBrush, setPen, setPadding */ void QCPItemText::setBrush(const QBrush &brush) @@ -28454,7 +28812,7 @@ void QCPItemText::setBrush(const QBrush &brush) /*! Sets the brush that will be used do fill the background of the text, when the item is selected. To disable the background, set \a brush to Qt::NoBrush. - + \see setBrush */ void QCPItemText::setSelectedBrush(const QBrush &brush) @@ -28464,7 +28822,7 @@ void QCPItemText::setSelectedBrush(const QBrush &brush) /*! Sets the font of the text. - + \see setSelectedFont, setColor */ void QCPItemText::setFont(const QFont &font) @@ -28474,7 +28832,7 @@ void QCPItemText::setFont(const QFont &font) /*! Sets the font of the text that will be used when the item is selected. - + \see setFont */ void QCPItemText::setSelectedFont(const QFont &font) @@ -28485,7 +28843,7 @@ void QCPItemText::setSelectedFont(const QFont &font) /*! Sets the text that will be displayed. Multi-line texts are supported by inserting a line break character, e.g. '\n'. - + \see setFont, setColor, setTextAlignment */ void QCPItemText::setText(const QString &text) @@ -28495,13 +28853,13 @@ void QCPItemText::setText(const QString &text) /*! Sets which point of the text rect shall be aligned with \a position. - + Examples: \li If \a alignment is Qt::AlignHCenter | Qt::AlignTop, the text will be positioned such that the top of the text rect will be horizontally centered on \a position. \li If \a alignment is Qt::AlignLeft | Qt::AlignBottom, \a position will indicate the bottom left corner of the text rect. - + If you want to control the alignment of (multi-lined) text within the text rect, use \ref setTextAlignment. */ @@ -28542,7 +28900,7 @@ double QCPItemText::selectTest(const QPointF &pos, bool onlySelectable, QVariant Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + // The rect may be rotated, so we transform the actual clicked pos to the rotated // coordinate system, so we can use the normal rectDistance function for non-rotated rects: QPointF positionPixels(position->pixelPosition()); @@ -28607,7 +28965,7 @@ QPointF QCPItemText::anchorPixelPosition(int anchorId) const QPointF textPos = getTextDrawPoint(QPointF(0, 0), textBoxRect, mPositionAlignment); // 0, 0 because the transform does the translation textBoxRect.moveTopLeft(textPos.toPoint()); QPolygonF rectPoly = transform.map(QPolygonF(textBoxRect)); - + switch (anchorId) { case aiTopLeft: return rectPoly.at(0); @@ -28619,17 +28977,17 @@ QPointF QCPItemText::anchorPixelPosition(int anchorId) const case aiBottomLeft: return rectPoly.at(3); case aiLeft: return (rectPoly.at(3)+rectPoly.at(0))*0.5; } - + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; return QPointF(); } /*! \internal - + Returns the point that must be given to the QPainter::drawText function (which expects the top left point of the text rect), according to the position \a pos, the text bounding box \a rect and the requested \a positionAlignment. - + For example, if \a positionAlignment is Qt::AlignLeft | Qt::AlignBottom the returned point will be shifted upward by the height of \a rect, starting from \a pos. So if the text is finally drawn at that point, the lower left corner of the resulting text rect is at \a pos. @@ -28638,7 +28996,7 @@ QPointF QCPItemText::getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt { if (positionAlignment == 0 || positionAlignment == (Qt::AlignLeft|Qt::AlignTop)) return pos; - + QPointF result = pos; // start at top left if (positionAlignment.testFlag(Qt::AlignHCenter)) result.rx() -= rect.width()/2.0; @@ -28694,7 +29052,7 @@ QBrush QCPItemText::mainBrush() const /* including file 'src/items/item-ellipse.cpp', size 7863 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemEllipse @@ -28710,7 +29068,7 @@ QBrush QCPItemText::mainBrush() const /*! Creates an ellipse item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -28730,7 +29088,7 @@ QCPItemEllipse::QCPItemEllipse(QCustomPlot *parentPlot) : { topLeft->setCoords(0, 1); bottomRight->setCoords(1, 0); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue, 2)); setBrush(Qt::NoBrush); @@ -28743,7 +29101,7 @@ QCPItemEllipse::~QCPItemEllipse() /*! Sets the pen that will be used to draw the line of the ellipse - + \see setSelectedPen, setBrush */ void QCPItemEllipse::setPen(const QPen &pen) @@ -28753,7 +29111,7 @@ void QCPItemEllipse::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line of the ellipse when selected - + \see setPen, setSelected */ void QCPItemEllipse::setSelectedPen(const QPen &pen) @@ -28764,7 +29122,7 @@ void QCPItemEllipse::setSelectedPen(const QPen &pen) /*! Sets the brush that will be used to fill the ellipse. To disable filling, set \a brush to Qt::NoBrush. - + \see setSelectedBrush, setPen */ void QCPItemEllipse::setBrush(const QBrush &brush) @@ -28775,7 +29133,7 @@ void QCPItemEllipse::setBrush(const QBrush &brush) /*! Sets the brush that will be used to fill the ellipse when selected. To disable filling, set \a brush to Qt::NoBrush. - + \see setBrush */ void QCPItemEllipse::setSelectedBrush(const QBrush &brush) @@ -28789,7 +29147,7 @@ double QCPItemEllipse::selectTest(const QPointF &pos, bool onlySelectable, QVari Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + QPointF p1 = topLeft->pixelPosition(); QPointF p2 = bottomRight->pixelPosition(); QPointF center((p1+p2)/2.0); @@ -28797,7 +29155,7 @@ double QCPItemEllipse::selectTest(const QPointF &pos, bool onlySelectable, QVari double b = qAbs(p1.y()-p2.y())/2.0; double x = pos.x()-center.x(); double y = pos.y()-center.y(); - + // distance to border: double c = 1.0/qSqrt(x*x/(a*a)+y*y/(b*b)); double result = qAbs(c-1)*qSqrt(x*x+y*y); @@ -28854,7 +29212,7 @@ QPointF QCPItemEllipse::anchorPixelPosition(int anchorId) const case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5; case aiCenter: return (rect.topLeft()+rect.bottomRight())*0.5; } - + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; return QPointF(); } @@ -28882,7 +29240,7 @@ QBrush QCPItemEllipse::mainBrush() const /* including file 'src/items/item-pixmap.cpp', size 10615 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemPixmap @@ -28896,7 +29254,7 @@ QBrush QCPItemEllipse::mainBrush() const It has two positions, \a topLeft and \a bottomRight, which define the rectangle the pixmap will be drawn in. Depending on the scale setting (\ref setScaled), the pixmap will be either scaled to fit the rectangle or be drawn aligned to the topLeft position. - + If scaling is enabled and \a topLeft is further to the bottom/right than \a bottomRight (as shown on the right side of the example image), the pixmap will be flipped in the respective orientations. @@ -28904,7 +29262,7 @@ QBrush QCPItemEllipse::mainBrush() const /*! Creates a rectangle item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -28925,7 +29283,7 @@ QCPItemPixmap::QCPItemPixmap(QCustomPlot *parentPlot) : { topLeft->setCoords(0, 1); bottomRight->setCoords(1, 0); - + setPen(Qt::NoPen); setSelectedPen(QPen(Qt::blue)); } @@ -28959,7 +29317,7 @@ void QCPItemPixmap::setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode, /*! Sets the pen that will be used to draw a border around the pixmap. - + \see setSelectedPen, setBrush */ void QCPItemPixmap::setPen(const QPen &pen) @@ -28969,7 +29327,7 @@ void QCPItemPixmap::setPen(const QPen &pen) /*! Sets the pen that will be used to draw a border around the pixmap when selected - + \see setPen, setSelected */ void QCPItemPixmap::setSelectedPen(const QPen &pen) @@ -28983,7 +29341,7 @@ double QCPItemPixmap::selectTest(const QPointF &pos, bool onlySelectable, QVaria Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + return rectDistance(getFinalRect(), pos, true); } @@ -29021,7 +29379,7 @@ QPointF QCPItemPixmap::anchorPixelPosition(int anchorId) const rect.adjust(rect.width(), 0, -rect.width(), 0); if (flipVert) rect.adjust(0, rect.height(), 0, -rect.height()); - + switch (anchorId) { case aiTop: return (rect.topLeft()+rect.topRight())*0.5; @@ -29031,29 +29389,29 @@ QPointF QCPItemPixmap::anchorPixelPosition(int anchorId) const case aiBottomLeft: return rect.bottomLeft(); case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5;; } - + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; return QPointF(); } /*! \internal - + Creates the buffered scaled image (\a mScaledPixmap) to fit the specified \a finalRect. The parameters \a flipHorz and \a flipVert control whether the resulting image shall be flipped horizontally or vertically. (This is used when \a topLeft is further to the bottom/right than \a bottomRight.) - + This function only creates the scaled pixmap when the buffered pixmap has a different size than the expected result, so calling this function repeatedly, e.g. in the \ref draw function, does not cause expensive rescaling every time. - + If scaling is disabled, sets mScaledPixmap to a null QPixmap. */ void QCPItemPixmap::updateScaledPixmap(QRect finalRect, bool flipHorz, bool flipVert) { if (mPixmap.isNull()) return; - + if (mScaled) { #ifdef QCP_DEVICEPIXELRATIO_SUPPORTED @@ -29078,16 +29436,16 @@ void QCPItemPixmap::updateScaledPixmap(QRect finalRect, bool flipHorz, bool flip } /*! \internal - + Returns the final (tight) rect the pixmap is drawn in, depending on the current item positions and scaling settings. - + The output parameters \a flippedHorz and \a flippedVert return whether the pixmap should be drawn flipped horizontally or vertically in the returned rect. (The returned rect itself is always normalized, i.e. the top left corner of the rect is actually further to the top/left than the bottom right corner). This is the case when the item position \a topLeft is further to the bottom/right than \a bottomRight. - + If scaling is disabled, returns a rect with size of the original pixmap and the top left corner aligned with the item position \a topLeft. The position \a bottomRight is ignored. */ @@ -29152,7 +29510,7 @@ QPen QCPItemPixmap::mainPen() const /* including file 'src/items/item-tracer.cpp', size 14624 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemTracer @@ -29169,19 +29527,19 @@ QPen QCPItemPixmap::mainPen() const QCPGraph is connected, note that setting the coordinates of the tracer item directly via \a position will have no effect because they will be overriden in the next redraw (this is when the coordinate update happens). - + If the specified key in \ref setGraphKey is outside the key bounds of the graph, the tracer will stay at the corresponding end of the graph. - + With \ref setInterpolating you may specify whether the tracer may only stay exactly on data points or whether it interpolates data points linearly, if given a key that lies between two data points of the graph. - + The tracer has different visual styles, see \ref setStyle. It is also possible to make the tracer have no own visual appearance (set the style to \ref tsNone), and just connect other item positions to the tracer \a position (used as an anchor) via \ref QCPItemPosition::setParentAnchor. - + \note The tracer position is only automatically updated upon redraws. So when the data of the graph changes and immediately afterwards (without a redraw) the position coordinates of the tracer are retrieved, they will not reflect the updated data of the graph. In this case \ref @@ -29190,7 +29548,7 @@ QPen QCPItemPixmap::mainPen() const /*! Creates a tracer item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -29217,7 +29575,7 @@ QCPItemTracer::~QCPItemTracer() /*! Sets the pen that will be used to draw the line of the tracer - + \see setSelectedPen, setBrush */ void QCPItemTracer::setPen(const QPen &pen) @@ -29227,7 +29585,7 @@ void QCPItemTracer::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the line of the tracer when selected - + \see setPen, setSelected */ void QCPItemTracer::setSelectedPen(const QPen &pen) @@ -29237,7 +29595,7 @@ void QCPItemTracer::setSelectedPen(const QPen &pen) /*! Sets the brush that will be used to draw any fills of the tracer - + \see setSelectedBrush, setPen */ void QCPItemTracer::setBrush(const QBrush &brush) @@ -29247,7 +29605,7 @@ void QCPItemTracer::setBrush(const QBrush &brush) /*! Sets the brush that will be used to draw any fills of the tracer, when selected. - + \see setBrush, setSelected */ void QCPItemTracer::setSelectedBrush(const QBrush &brush) @@ -29266,7 +29624,7 @@ void QCPItemTracer::setSize(double size) /*! Sets the style/visual appearance of the tracer. - + If you only want to use the tracer \a position as an anchor for other items, set \a style to \ref tsNone. */ @@ -29278,11 +29636,11 @@ void QCPItemTracer::setStyle(QCPItemTracer::TracerStyle style) /*! Sets the QCPGraph this tracer sticks to. The tracer \a position will be set to type QCPItemPosition::ptPlotCoords and the axes will be set to the axes of \a graph. - + To free the tracer from any graph, set \a graph to 0. The tracer \a position can then be placed freely like any other item position. This is the state the tracer will assume when its graph gets deleted while still attached to it. - + \see setGraphKey */ void QCPItemTracer::setGraph(QCPGraph *graph) @@ -29306,10 +29664,10 @@ void QCPItemTracer::setGraph(QCPGraph *graph) /*! Sets the key of the graph's data point the tracer will be positioned at. This is the only free coordinate of a tracer when attached to a graph. - + Depending on \ref setInterpolating, the tracer will be either positioned on the data point closest to \a key, or will stay exactly at \a key and interpolate the value linearly. - + \see setGraph, setInterpolating */ void QCPItemTracer::setGraphKey(double key) @@ -29320,12 +29678,12 @@ void QCPItemTracer::setGraphKey(double key) /*! Sets whether the value of the graph's data points shall be interpolated, when positioning the tracer. - + If \a enabled is set to false and a key is given with \ref setGraphKey, the tracer is placed on the data point of the graph which is closest to the key, but which is not necessarily exactly there. If \a enabled is true, the tracer will be positioned exactly at the specified key, and the appropriate value will be interpolated from the graph's data points linearly. - + \see setGraph, setGraphKey */ void QCPItemTracer::setInterpolating(bool enabled) @@ -29440,13 +29798,13 @@ void QCPItemTracer::draw(QCPPainter *painter) /*! If the tracer is connected with a graph (\ref setGraph), this function updates the tracer's \a position to reside on the graph data, depending on the configured key (\ref setGraphKey). - + It is called automatically on every redraw and normally doesn't need to be called manually. One exception is when you want to read the tracer coordinates via \a position and are not sure that the graph's data (or the tracer key with \ref setGraphKey) hasn't changed since the last redraw. In that situation, call this function before accessing \a position, to make sure you don't get out-of-date coordinates. - + If there is no graph set on this tracer, this function does nothing. */ void QCPItemTracer::updatePosition() @@ -29522,7 +29880,7 @@ QBrush QCPItemTracer::mainBrush() const /* including file 'src/items/item-bracket.cpp', size 10687 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPItemBracket @@ -29536,21 +29894,21 @@ QBrush QCPItemTracer::mainBrush() const It has two positions, \a left and \a right, which define the span of the bracket. If \a left is actually farther to the left than \a right, the bracket is opened to the bottom, as shown in the example image. - + The bracket supports multiple styles via \ref setStyle. The length, i.e. how far the bracket stretches away from the embraced span, can be controlled with \ref setLength. - + \image html QCPItemBracket-length.png
Demonstrating the effect of different values for \ref setLength, for styles \ref bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.
- + It provides an anchor \a center, to allow connection of other items, e.g. an arrow (QCPItemLine or QCPItemCurve) or a text label (QCPItemText), to the bracket. */ /*! Creates a bracket item and sets default values. - + The created item is automatically registered with \a parentPlot. This QCustomPlot instance takes ownership of the item, so do not delete it manually but use QCustomPlot::removeItem() instead. */ @@ -29564,7 +29922,7 @@ QCPItemBracket::QCPItemBracket(QCustomPlot *parentPlot) : { left->setCoords(0, 0); right->setCoords(1, 1); - + setPen(QPen(Qt::black)); setSelectedPen(QPen(Qt::blue, 2)); } @@ -29575,11 +29933,11 @@ QCPItemBracket::~QCPItemBracket() /*! Sets the pen that will be used to draw the bracket. - + Note that when the style is \ref bsCalligraphic, only the color will be taken from the pen, the stroke and width are ignored. To change the apparent stroke width of a calligraphic bracket, use \ref setLength, which has a similar effect. - + \see setSelectedPen */ void QCPItemBracket::setPen(const QPen &pen) @@ -29589,7 +29947,7 @@ void QCPItemBracket::setPen(const QPen &pen) /*! Sets the pen that will be used to draw the bracket when selected - + \see setPen, setSelected */ void QCPItemBracket::setSelectedPen(const QPen &pen) @@ -29600,7 +29958,7 @@ void QCPItemBracket::setSelectedPen(const QPen &pen) /*! Sets the \a length in pixels how far the bracket extends in the direction towards the embraced span of the bracket (i.e. perpendicular to the left-right-direction) - + \image html QCPItemBracket-length.png
Demonstrating the effect of different values for \ref setLength, for styles \ref bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.
@@ -29612,7 +29970,7 @@ void QCPItemBracket::setLength(double length) /*! Sets the style of the bracket, i.e. the shape/visual appearance. - + \see setPen */ void QCPItemBracket::setStyle(QCPItemBracket::BracketStyle style) @@ -29626,17 +29984,17 @@ double QCPItemBracket::selectTest(const QPointF &pos, bool onlySelectable, QVari Q_UNUSED(details) if (onlySelectable && !mSelectable) return -1; - + QCPVector2D p(pos); QCPVector2D leftVec(left->pixelPosition()); QCPVector2D rightVec(right->pixelPosition()); if (leftVec.toPoint() == rightVec.toPoint()) return -1; - + QCPVector2D widthVec = (rightVec-leftVec)*0.5; QCPVector2D lengthVec = widthVec.perpendicular().normalized()*mLength; QCPVector2D centerVec = (rightVec+leftVec)*0.5-lengthVec; - + switch (mStyle) { case QCPItemBracket::bsSquare: @@ -29667,7 +30025,7 @@ void QCPItemBracket::draw(QCPPainter *painter) QCPVector2D rightVec(right->pixelPosition()); if (leftVec.toPoint() == rightVec.toPoint()) return; - + QCPVector2D widthVec = (rightVec-leftVec)*0.5; QCPVector2D lengthVec = widthVec.perpendicular().normalized()*mLength; QCPVector2D centerVec = (rightVec+leftVec)*0.5-lengthVec; @@ -29714,13 +30072,13 @@ void QCPItemBracket::draw(QCPPainter *painter) painter->setBrush(QBrush(mainPen().color())); QPainterPath path; path.moveTo((centerVec+widthVec+lengthVec).toPointF()); - + path.cubicTo((centerVec+widthVec-lengthVec*0.8).toPointF(), (centerVec+0.4*widthVec+0.8*lengthVec).toPointF(), centerVec.toPointF()); path.cubicTo((centerVec-0.4*widthVec+0.8*lengthVec).toPointF(), (centerVec-widthVec-lengthVec*0.8).toPointF(), (centerVec-widthVec+lengthVec).toPointF()); - + path.cubicTo((centerVec-widthVec-lengthVec*0.5).toPointF(), (centerVec-0.2*widthVec+1.2*lengthVec).toPointF(), (centerVec+lengthVec*0.2).toPointF()); path.cubicTo((centerVec+0.2*widthVec+1.2*lengthVec).toPointF(), (centerVec+widthVec-lengthVec*0.5).toPointF(), (centerVec+widthVec+lengthVec).toPointF()); - + painter->drawPath(path); break; } @@ -29735,11 +30093,11 @@ QPointF QCPItemBracket::anchorPixelPosition(int anchorId) const QCPVector2D rightVec(right->pixelPosition()); if (leftVec.toPoint() == rightVec.toPoint()) return leftVec.toPointF(); - + QCPVector2D widthVec = (rightVec-leftVec)*0.5; QCPVector2D lengthVec = widthVec.perpendicular().normalized()*mLength; QCPVector2D centerVec = (rightVec+leftVec)*0.5-lengthVec; - + switch (anchorId) { case aiCenter: diff --git a/qcustomplot.h b/qcustomplot.h index 4668df6..278fbf8 100644 --- a/qcustomplot.h +++ b/qcustomplot.h @@ -1,7 +1,7 @@ /*************************************************************************** ** ** ** QCustomPlot, an easy to use, modern plotting widget for Qt ** -** Copyright (C) 2011-2016 Emanuel Eichhammer ** +** Copyright (C) 2011-2017 Emanuel Eichhammer ** ** ** ** This program is free software: you can redistribute it and/or modify ** ** it under the terms of the GNU General Public License as published by ** @@ -19,8 +19,8 @@ **************************************************************************** ** Author: Emanuel Eichhammer ** ** Website/Contact: http://www.qcustomplot.com/ ** -** Date: 13.09.16 ** -** Version: 2.0.0-beta ** +** Date: 04.09.17 ** +** Version: 2.0.0 ** ****************************************************************************/ #ifndef QCUSTOMPLOT_H @@ -45,7 +45,6 @@ # if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) # define QCP_DEVICEPIXELRATIO_FLOAT # endif - #endif #include @@ -113,8 +112,8 @@ class QCPColorMap; class QCPColorScale; class QCPBars; -/* including file 'src/global.h', size 16131 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/global.h', size 16225 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ // decl definitions for shared library compilation/usage: #if defined(QCUSTOMPLOT_COMPILE_LIBRARY) @@ -133,7 +132,7 @@ class QCPBars; /*! The QCP Namespace contains general enums, QFlags and functions used throughout the QCustomPlot library. - + It provides QMetaObject-based reflection of its enums and flags via \a QCP::staticMetaObject. */ #ifndef Q_MOC_RUN @@ -180,7 +179,7 @@ enum ExportPen { epNoCosmetic ///< Cosmetic pens are converted to pens with /*! Represents negative and positive sign domain, e.g. for passing to \ref QCPAbstractPlottable::getKeyRange and \ref QCPAbstractPlottable::getValueRange. - + This is primarily needed when working with logarithmic axis scales, since only one of the sign domains can be visible at a time. */ @@ -191,7 +190,7 @@ enum SignDomain { sdNegative ///< The negative sign domain, i.e. numbers smalle /*! Defines the sides of a rectangular entity to which margins can be applied. - + \see QCPLayoutElement::setAutoMargins, QCPAxisRect::setAutoMargins */ enum MarginSide { msLeft = 0x01 ///< 0x01 left margin @@ -207,9 +206,9 @@ Q_DECLARE_FLAGS(MarginSides, MarginSide) Defines what objects of a plot can be forcibly drawn antialiased/not antialiased. If an object is neither forcibly drawn antialiased nor forcibly drawn not antialiased, it is up to the respective element how it is drawn. Typically it provides a \a setAntialiased function for this. - + \c AntialiasedElements is a flag of or-combined elements of this enum type. - + \see QCustomPlot::setAntialiasedElements, QCustomPlot::setNotAntialiasedElements */ enum AntialiasedElement { aeAxes = 0x0001 ///< 0x0001 Axis base line and tick marks @@ -230,7 +229,7 @@ Q_DECLARE_FLAGS(AntialiasedElements, AntialiasedElement) /*! Defines plotting hints that control various aspects of the quality and speed of plotting. - + \see QCustomPlot::setPlottingHints */ enum PlottingHint { phNone = 0x000 ///< 0x000 No hints are set @@ -244,9 +243,9 @@ Q_DECLARE_FLAGS(PlottingHints, PlottingHint) /*! Defines the mouse interactions possible with QCustomPlot. - + \c Interactions is a flag of or-combined elements of this enum type. - + \see QCustomPlot::setInteractions */ enum Interaction { iRangeDrag = 0x001 ///< 0x001 Axis ranges are draggable (see \ref QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeDragAxes) @@ -262,7 +261,7 @@ Q_DECLARE_FLAGS(Interactions, Interaction) /*! Defines the behaviour of the selection rect. - + \see QCustomPlot::setSelectionRectMode, QCustomPlot::selectionRect, QCPSelectionRect */ enum SelectionRectMode { srmNone ///< The selection rect is disabled, and all mouse events are forwarded to the underlying objects, e.g. for axis range dragging @@ -274,7 +273,7 @@ enum SelectionRectMode { srmNone ///< The selection rect is disabled, and all /*! Defines the different ways a plottable can be selected. These images show the effect of the different selection types, when the indicated selection rect was dragged: - +
@@ -286,7 +285,7 @@ enum SelectionRectMode { srmNone ///< The selection rect is disabled, and all
- + \see QCPAbstractPlottable::setSelectable, QCPDataSelection::enforceType */ enum SelectionType { stNone ///< The plottable is not selectable @@ -297,7 +296,7 @@ enum SelectionType { stNone ///< The plottable is not selectable }; /*! \internal - + Returns whether the specified \a value is considered an invalid data value for plottables (i.e. is \e nan or \e +/-inf). This function is used to check data validity upon replots, when the compiler flag \c QCUSTOMPLOT_CHECK_DATA is set. @@ -309,7 +308,7 @@ inline bool isInvalidData(double value) /*! \internal \overload - + Checks two arguments instead of one. */ inline bool isInvalidData(double value1, double value2) @@ -318,9 +317,9 @@ inline bool isInvalidData(double value1, double value2) } /*! \internal - + Sets the specified \a side of \a margins to \a value - + \see getMarginValue */ inline void setMarginValue(QMargins &margins, QCP::MarginSide side, int value) @@ -337,10 +336,10 @@ inline void setMarginValue(QMargins &margins, QCP::MarginSide side, int value) } /*! \internal - + Returns the value of the specified \a side of \a margins. If \a side is \ref QCP::msNone or \ref QCP::msAll, returns 0. - + \see setMarginValue */ inline int getMarginValue(const QMargins &margins, QCP::MarginSide side) @@ -378,7 +377,7 @@ Q_DECLARE_METATYPE(QCP::SelectionType) /* including file 'src/vector2d.h', size 4928 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPVector2D { @@ -387,23 +386,23 @@ public: QCPVector2D(double x, double y); QCPVector2D(const QPoint &point); QCPVector2D(const QPointF &point); - + // getters: double x() const { return mX; } double y() const { return mY; } double &rx() { return mX; } double &ry() { return mY; } - + // setters: void setX(double x) { mX = x; } void setY(double y) { mY = y; } - + // non-virtual methods: double length() const { return qSqrt(mX*mX+mY*mY); } double lengthSquared() const { return mX*mX+mY*mY; } QPoint toPoint() const { return QPoint(mX, mY); } QPointF toPointF() const { return QPointF(mX, mY); } - + bool isNull() const { return qIsNull(mX) && qIsNull(mY); } void normalize(); QCPVector2D normalized() const; @@ -412,16 +411,16 @@ public: double distanceSquaredToLine(const QCPVector2D &start, const QCPVector2D &end) const; double distanceSquaredToLine(const QLineF &line) const; double distanceToStraightLine(const QCPVector2D &base, const QCPVector2D &direction) const; - + QCPVector2D &operator*=(double factor); QCPVector2D &operator/=(double divisor); QCPVector2D &operator+=(const QCPVector2D &vector); QCPVector2D &operator-=(const QCPVector2D &vector); - + private: // property members: double mX, mY; - + friend inline const QCPVector2D operator*(double factor, const QCPVector2D &vec); friend inline const QCPVector2D operator*(const QCPVector2D &vec, double factor); friend inline const QCPVector2D operator/(const QCPVector2D &vec, double divisor); @@ -452,7 +451,7 @@ inline QDebug operator<< (QDebug d, const QCPVector2D &vec) /* including file 'src/painter.h', size 4035 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPPainter : public QPainter { @@ -470,10 +469,10 @@ public: Q_ENUMS(PainterMode) Q_FLAGS(PainterModes) Q_DECLARE_FLAGS(PainterModes, PainterMode) - + QCPPainter(); explicit QCPPainter(QPaintDevice *device); - + // getters: bool antialiasing() const { return testRenderHint(QPainter::Antialiasing); } PainterModes modes() const { return mModes; } @@ -492,15 +491,15 @@ public: void drawLine(const QPointF &p1, const QPointF &p2) {drawLine(QLineF(p1, p2));} void save(); void restore(); - + // non-virtual methods: void makeNonCosmetic(); - + protected: // property members: PainterModes mModes; bool mIsAntialiasing; - + // non-property members: QStack mAntialiasingStack; }; @@ -511,38 +510,38 @@ Q_DECLARE_METATYPE(QCPPainter::PainterMode) /* including file 'src/paintbuffer.h', size 4958 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAbstractPaintBuffer { public: explicit QCPAbstractPaintBuffer(const QSize &size, double devicePixelRatio); virtual ~QCPAbstractPaintBuffer(); - + // getters: QSize size() const { return mSize; } bool invalidated() const { return mInvalidated; } double devicePixelRatio() const { return mDevicePixelRatio; } - + // setters: void setSize(const QSize &size); void setInvalidated(bool invalidated=true); void setDevicePixelRatio(double ratio); - + // introduced virtual methods: virtual QCPPainter *startPainting() = 0; virtual void donePainting() {} virtual void draw(QCPPainter *painter) const = 0; virtual void clear(const QColor &color) = 0; - + protected: // property members: QSize mSize; double mDevicePixelRatio; - + // non-property members: bool mInvalidated; - + // introduced virtual methods: virtual void reallocateBuffer() = 0; }; @@ -553,16 +552,16 @@ class QCP_LIB_DECL QCPPaintBufferPixmap : public QCPAbstractPaintBuffer public: explicit QCPPaintBufferPixmap(const QSize &size, double devicePixelRatio); virtual ~QCPPaintBufferPixmap(); - + // reimplemented virtual methods: virtual QCPPainter *startPainting() Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) const Q_DECL_OVERRIDE; void clear(const QColor &color) Q_DECL_OVERRIDE; - + protected: // non-property members: QPixmap mBuffer; - + // reimplemented virtual methods: virtual void reallocateBuffer() Q_DECL_OVERRIDE; }; @@ -574,17 +573,17 @@ class QCP_LIB_DECL QCPPaintBufferGlPbuffer : public QCPAbstractPaintBuffer public: explicit QCPPaintBufferGlPbuffer(const QSize &size, double devicePixelRatio, int multisamples); virtual ~QCPPaintBufferGlPbuffer(); - + // reimplemented virtual methods: virtual QCPPainter *startPainting() Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) const Q_DECL_OVERRIDE; void clear(const QColor &color) Q_DECL_OVERRIDE; - + protected: // non-property members: QGLPixelBuffer *mGlPBuffer; int mMultisamples; - + // reimplemented virtual methods: virtual void reallocateBuffer() Q_DECL_OVERRIDE; }; @@ -597,19 +596,19 @@ class QCP_LIB_DECL QCPPaintBufferGlFbo : public QCPAbstractPaintBuffer public: explicit QCPPaintBufferGlFbo(const QSize &size, double devicePixelRatio, QWeakPointer glContext, QWeakPointer glPaintDevice); virtual ~QCPPaintBufferGlFbo(); - + // reimplemented virtual methods: virtual QCPPainter *startPainting() Q_DECL_OVERRIDE; virtual void donePainting() Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) const Q_DECL_OVERRIDE; void clear(const QColor &color) Q_DECL_OVERRIDE; - + protected: // non-property members: QWeakPointer mGlContext; QWeakPointer mGlPaintDevice; QOpenGLFramebufferObject *mGlFrameBuffer; - + // reimplemented virtual methods: virtual void reallocateBuffer() Q_DECL_OVERRIDE; }; @@ -619,7 +618,7 @@ protected: /* including file 'src/layer.h', size 6885 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPLayer : public QObject { @@ -633,7 +632,7 @@ class QCP_LIB_DECL QCPLayer : public QObject Q_PROPERTY(LayerMode mode READ mode WRITE setMode) /// \endcond public: - + /*! Defines the different rendering modes of a layer. Depending on the mode, certain layers can be replotted individually, without the need to replot (possibly complex) layerables on other @@ -645,10 +644,10 @@ public: ,lmBuffered ///< Layer has its own paint buffer and may be replotted individually (see \ref replot). }; Q_ENUMS(LayerMode) - + QCPLayer(QCustomPlot* parentPlot, const QString &layerName); virtual ~QCPLayer(); - + // getters: QCustomPlot *parentPlot() const { return mParentPlot; } QString name() const { return mName; } @@ -656,14 +655,14 @@ public: QList children() const { return mChildren; } bool visible() const { return mVisible; } LayerMode mode() const { return mMode; } - + // setters: void setVisible(bool visible); void setMode(LayerMode mode); - + // non-virtual methods: void replot(); - + protected: // property members: QCustomPlot *mParentPlot; @@ -672,19 +671,19 @@ protected: QList mChildren; bool mVisible; LayerMode mMode; - + // non-property members: QWeakPointer mPaintBuffer; - + // non-virtual methods: void draw(QCPPainter *painter); void drawToPaintBuffer(); void addChild(QCPLayerable *layerable, bool prepend); void removeChild(QCPLayerable *layerable); - + private: Q_DISABLE_COPY(QCPLayer) - + friend class QCustomPlot; friend class QCPLayerable; }; @@ -703,29 +702,29 @@ class QCP_LIB_DECL QCPLayerable : public QObject public: QCPLayerable(QCustomPlot *plot, QString targetLayer=QString(), QCPLayerable *parentLayerable=0); virtual ~QCPLayerable(); - + // getters: bool visible() const { return mVisible; } QCustomPlot *parentPlot() const { return mParentPlot; } QCPLayerable *parentLayerable() const { return mParentLayerable.data(); } QCPLayer *layer() const { return mLayer; } bool antialiased() const { return mAntialiased; } - + // setters: void setVisible(bool on); Q_SLOT bool setLayer(QCPLayer *layer); bool setLayer(const QString &layerName); void setAntialiased(bool enabled); - + // introduced virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; // non-property methods: bool realVisibility() const; - + signals: void layerChanged(QCPLayer *newLayer); - + protected: // property members: bool mVisible; @@ -733,7 +732,7 @@ protected: QPointer mParentLayerable; QCPLayer *mLayer; bool mAntialiased; - + // introduced virtual methods: virtual void parentPlotInitialized(QCustomPlot *parentPlot); virtual QCP::Interaction selectionCategory() const; @@ -749,16 +748,16 @@ protected: virtual void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos); virtual void mouseDoubleClickEvent(QMouseEvent *event, const QVariant &details); virtual void wheelEvent(QWheelEvent *event); - + // non-property methods: void initializeParentPlot(QCustomPlot *parentPlot); void setParentLayerable(QCPLayerable* parentLayerable); bool moveToLayer(QCPLayer *layer, bool prepend); void applyAntialiasingHint(QCPPainter *painter, bool localAntialiased, QCP::AntialiasedElement overrideElement) const; - + private: Q_DISABLE_COPY(QCPLayerable) - + friend class QCustomPlot; friend class QCPLayer; friend class QCPAxisRect; @@ -768,19 +767,19 @@ private: /* including file 'src/axis/range.h', size 5280 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPRange { public: double lower, upper; - + QCPRange(); QCPRange(double lower, double upper); - + bool operator==(const QCPRange& other) const { return lower == other.lower && upper == other.upper; } bool operator!=(const QCPRange& other) const { return !(*this == other); } - + QCPRange &operator+=(const double& value) { lower+=value; upper+=value; return *this; } QCPRange &operator-=(const double& value) { lower-=value; upper-=value; return *this; } QCPRange &operator*=(const double& value) { lower*=value; upper*=value; return *this; } @@ -791,7 +790,7 @@ public: friend inline const QCPRange operator*(const QCPRange& range, double value); friend inline const QCPRange operator*(double value, const QCPRange& range); friend inline const QCPRange operator/(const QCPRange& range, double value); - + double size() const { return upper-lower; } double center() const { return (upper+lower)*0.5; } void normalize() { if (lower > upper) qSwap(lower, upper); } @@ -803,12 +802,12 @@ public: QCPRange sanitizedForLogScale() const; QCPRange sanitizedForLinScale() const; bool contains(double value) const { return value >= lower && value <= upper; } - + static bool validRange(double lower, double upper); static bool validRange(const QCPRange &range); static const double minRange; static const double maxRange; - + }; Q_DECLARE_TYPEINFO(QCPRange, Q_MOVABLE_TYPE); @@ -886,27 +885,27 @@ inline const QCPRange operator/(const QCPRange& range, double value) /* including file 'src/selection.h', size 8579 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPDataRange { public: QCPDataRange(); QCPDataRange(int begin, int end); - + bool operator==(const QCPDataRange& other) const { return mBegin == other.mBegin && mEnd == other.mEnd; } bool operator!=(const QCPDataRange& other) const { return !(*this == other); } - + // getters: int begin() const { return mBegin; } int end() const { return mEnd; } int size() const { return mEnd-mBegin; } int length() const { return size(); } - + // setters: void setBegin(int begin) { mBegin = begin; } void setEnd(int end) { mEnd = end; } - + // non-property methods: bool isValid() const { return (mEnd >= mBegin) && (mBegin >= 0); } bool isEmpty() const { return length() == 0; } @@ -916,7 +915,7 @@ public: QCPDataRange adjusted(int changeBegin, int changeEnd) const { return QCPDataRange(mBegin+changeBegin, mEnd+changeEnd); } bool intersects(const QCPDataRange &other) const; bool contains(const QCPDataRange &other) const; - + private: // property members: int mBegin, mEnd; @@ -930,7 +929,7 @@ class QCP_LIB_DECL QCPDataSelection public: explicit QCPDataSelection(); explicit QCPDataSelection(const QCPDataRange &range); - + bool operator==(const QCPDataSelection& other) const; bool operator!=(const QCPDataSelection& other) const { return !(*this == other); } QCPDataSelection &operator+=(const QCPDataSelection& other); @@ -945,14 +944,14 @@ public: friend inline const QCPDataSelection operator-(const QCPDataRange& a, const QCPDataSelection& b); friend inline const QCPDataSelection operator-(const QCPDataSelection& a, const QCPDataRange& b); friend inline const QCPDataSelection operator-(const QCPDataRange& a, const QCPDataRange& b); - + // getters: int dataRangeCount() const { return mDataRanges.size(); } int dataPointCount() const; QCPDataRange dataRange(int index=0) const; QList dataRanges() const { return mDataRanges; } QCPDataRange span() const; - + // non-property methods: void addDataRange(const QCPDataRange &dataRange, bool simplify=true); void clear(); @@ -963,11 +962,11 @@ public: QCPDataSelection intersection(const QCPDataRange &other) const; QCPDataSelection intersection(const QCPDataSelection &other) const; QCPDataSelection inverse(const QCPDataRange &outerRange) const; - + private: // property members: QList mDataRanges; - + inline static bool lessThanDataRangeBegin(const QCPDataRange &a, const QCPDataRange &b) { return a.begin() < b.begin(); } }; Q_DECLARE_METATYPE(QCPDataSelection) @@ -1090,7 +1089,7 @@ inline QDebug operator<< (QDebug d, const QCPDataSelection &selection) /* including file 'src/selectionrect.h', size 3338 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPSelectionRect : public QCPLayerable { @@ -1098,27 +1097,27 @@ class QCP_LIB_DECL QCPSelectionRect : public QCPLayerable public: explicit QCPSelectionRect(QCustomPlot *parentPlot); virtual ~QCPSelectionRect(); - + // getters: QRect rect() const { return mRect; } QCPRange range(const QCPAxis *axis) const; QPen pen() const { return mPen; } QBrush brush() const { return mBrush; } bool isActive() const { return mActive; } - + // setters: void setPen(const QPen &pen); void setBrush(const QBrush &brush); - + // non-property methods: Q_SLOT void cancel(); - + signals: void started(QMouseEvent *event); void changed(const QRect &rect, QMouseEvent *event); void canceled(const QRect &rect, QInputEvent *event); void accepted(const QRect &rect, QMouseEvent *event); - + protected: // property members: QRect mRect; @@ -1126,25 +1125,25 @@ protected: QBrush mBrush; // non-property members: bool mActive; - + // introduced virtual methods: virtual void startSelection(QMouseEvent *event); virtual void moveSelection(QMouseEvent *event); virtual void endSelection(QMouseEvent *event); virtual void keyPressEvent(QKeyEvent *event); - + // reimplemented virtual methods virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - + friend class QCustomPlot; }; /* end of 'src/selectionrect.h' */ -/* including file 'src/layout.h', size 13128 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layout.h', size 14224 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPMarginGroup : public QObject { @@ -1152,27 +1151,27 @@ class QCP_LIB_DECL QCPMarginGroup : public QObject public: explicit QCPMarginGroup(QCustomPlot *parentPlot); virtual ~QCPMarginGroup(); - + // non-virtual methods: QList elements(QCP::MarginSide side) const { return mChildren.value(side); } bool isEmpty() const; void clear(); - + protected: // non-property members: QCustomPlot *mParentPlot; QHash > mChildren; - + // introduced virtual methods: virtual int commonMargin(QCP::MarginSide side) const; - + // non-virtual methods: void addChild(QCP::MarginSide side, QCPLayoutElement *element); void removeChild(QCP::MarginSide side, QCPLayoutElement *element); - + private: Q_DISABLE_COPY(QCPMarginGroup) - + friend class QCPLayoutElement; }; @@ -1188,6 +1187,7 @@ class QCP_LIB_DECL QCPLayoutElement : public QCPLayerable Q_PROPERTY(QMargins minimumMargins READ minimumMargins WRITE setMinimumMargins) Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize) Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize) + Q_PROPERTY(SizeConstraintRect sizeConstraintRect READ sizeConstraintRect WRITE setSizeConstraintRect) /// \endcond public: /*! @@ -1199,10 +1199,23 @@ public: ,upLayout ///< Final phase in which the layout system places the rects of the elements }; Q_ENUMS(UpdatePhase) + + /*! + Defines to which rect of a layout element the size constraints that can be set via \ref + setMinimumSize and \ref setMaximumSize apply. The outer rect (\ref outerRect) includes the + margins (e.g. in the case of a QCPAxisRect the axis labels), whereas the inner rect (\ref rect) + does not. + + \see setSizeConstraintRect + */ + enum SizeConstraintRect { scrInnerRect ///< Minimum/Maximum size constraints apply to inner rect + , scrOuterRect ///< Minimum/Maximum size constraints apply to outer rect, thus include layout element margins + }; + Q_ENUMS(SizeConstraintRect) explicit QCPLayoutElement(QCustomPlot *parentPlot=0); virtual ~QCPLayoutElement(); - + // getters: QCPLayout *layout() const { return mParentLayout; } QRect rect() const { return mRect; } @@ -1212,9 +1225,10 @@ public: QCP::MarginSides autoMargins() const { return mAutoMargins; } QSize minimumSize() const { return mMinimumSize; } QSize maximumSize() const { return mMaximumSize; } + SizeConstraintRect sizeConstraintRect() const { return mSizeConstraintRect; } QCPMarginGroup *marginGroup(QCP::MarginSide side) const { return mMarginGroups.value(side, (QCPMarginGroup*)0); } QHash marginGroups() const { return mMarginGroups; } - + // setters: void setOuterRect(const QRect &rect); void setMargins(const QMargins &margins); @@ -1224,30 +1238,32 @@ public: void setMinimumSize(int width, int height); void setMaximumSize(const QSize &size); void setMaximumSize(int width, int height); + void setSizeConstraintRect(SizeConstraintRect constraintRect); void setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group); - + // introduced virtual methods: virtual void update(UpdatePhase phase); - virtual QSize minimumSizeHint() const; - virtual QSize maximumSizeHint() const; + virtual QSize minimumOuterSizeHint() const; + virtual QSize maximumOuterSizeHint() const; virtual QList elements(bool recursive) const; - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + protected: // property members: QCPLayout *mParentLayout; QSize mMinimumSize, mMaximumSize; + SizeConstraintRect mSizeConstraintRect; QRect mRect, mOuterRect; QMargins mMargins, mMinimumMargins; QCP::MarginSides mAutoMargins; QHash mMarginGroups; - + // introduced virtual methods: virtual int calculateAutoMargin(QCP::MarginSide side); virtual void layoutChanged(); - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE { Q_UNUSED(painter) } virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE { Q_UNUSED(painter) } @@ -1255,7 +1271,7 @@ protected: private: Q_DISABLE_COPY(QCPLayoutElement) - + friend class QCustomPlot; friend class QCPLayout; friend class QCPMarginGroup; @@ -1268,33 +1284,35 @@ class QCP_LIB_DECL QCPLayout : public QCPLayoutElement Q_OBJECT public: explicit QCPLayout(); - + // reimplemented virtual methods: virtual void update(UpdatePhase phase) Q_DECL_OVERRIDE; virtual QList elements(bool recursive) const Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual int elementCount() const = 0; virtual QCPLayoutElement* elementAt(int index) const = 0; virtual QCPLayoutElement* takeAt(int index) = 0; virtual bool take(QCPLayoutElement* element) = 0; virtual void simplify(); - + // non-virtual methods: bool removeAt(int index); bool remove(QCPLayoutElement* element); void clear(); - + protected: // introduced virtual methods: virtual void updateLayout(); - + // non-virtual methods: void sizeConstraintsChanged() const; void adoptElement(QCPLayoutElement *el); void releaseElement(QCPLayoutElement *el); QVector getSectionSizes(QVector maxSizes, QVector minSizes, QVector stretchFactors, int totalSize) const; - + static QSize getFinalMinimumOuterSize(const QCPLayoutElement *el); + static QSize getFinalMaximumOuterSize(const QCPLayoutElement *el); + private: Q_DISABLE_COPY(QCPLayout) friend class QCPLayoutElement; @@ -1315,7 +1333,7 @@ class QCP_LIB_DECL QCPLayoutGrid : public QCPLayout Q_PROPERTY(int wrap READ wrap WRITE setWrap) /// \endcond public: - + /*! Defines in which direction the grid is filled when using \ref addElement(QCPLayoutElement*). The column/row at which wrapping into the next row/column occurs can be specified with \ref @@ -1327,10 +1345,10 @@ public: ,foColumnsFirst ///< Columns are filled first, and a new element is wrapped to the next row if the column count would exceed \ref setWrap. }; Q_ENUMS(FillOrder) - + explicit QCPLayoutGrid(); virtual ~QCPLayoutGrid(); - + // getters: int rowCount() const { return mElements.size(); } int columnCount() const { return mElements.size() > 0 ? mElements.first().size() : 0; } @@ -1340,7 +1358,7 @@ public: int rowSpacing() const { return mRowSpacing; } int wrap() const { return mWrap; } FillOrder fillOrder() const { return mFillOrder; } - + // setters: void setColumnStretchFactor(int column, double factor); void setColumnStretchFactors(const QList &factors); @@ -1350,7 +1368,7 @@ public: void setRowSpacing(int pixels); void setWrap(int count); void setFillOrder(FillOrder order, bool rearrange=true); - + // reimplemented virtual methods: virtual void updateLayout() Q_DECL_OVERRIDE; virtual int elementCount() const Q_DECL_OVERRIDE { return rowCount()*columnCount(); } @@ -1359,9 +1377,9 @@ public: virtual bool take(QCPLayoutElement* element) Q_DECL_OVERRIDE; virtual QList elements(bool recursive) const Q_DECL_OVERRIDE; virtual void simplify() Q_DECL_OVERRIDE; - virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE; - virtual QSize maximumSizeHint() const Q_DECL_OVERRIDE; - + virtual QSize minimumOuterSizeHint() const Q_DECL_OVERRIDE; + virtual QSize maximumOuterSizeHint() const Q_DECL_OVERRIDE; + // non-virtual methods: QCPLayoutElement *element(int row, int column) const; bool addElement(int row, int column, QCPLayoutElement *element); @@ -1372,7 +1390,7 @@ public: void insertColumn(int newIndex); int rowColToIndex(int row, int column) const; void indexToRowCol(int index, int &row, int &column) const; - + protected: // property members: QList > mElements; @@ -1381,11 +1399,11 @@ protected: int mColumnSpacing, mRowSpacing; int mWrap; FillOrder mFillOrder; - + // non-virtual methods: void getMinimumRowColSizes(QVector *minColWidths, QVector *minRowHeights) const; void getMaximumRowColSizes(QVector *maxColWidths, QVector *maxRowHeights) const; - + private: Q_DISABLE_COPY(QCPLayoutGrid) }; @@ -1403,20 +1421,20 @@ public: ,ipBorderAligned ///< The element is aligned to one of the layout sides, see \ref setInsetAlignment }; Q_ENUMS(InsetPlacement) - + explicit QCPLayoutInset(); virtual ~QCPLayoutInset(); - + // getters: InsetPlacement insetPlacement(int index) const; Qt::Alignment insetAlignment(int index) const; QRectF insetRect(int index) const; - + // setters: void setInsetPlacement(int index, InsetPlacement placement); void setInsetAlignment(int index, Qt::Alignment alignment); void setInsetRect(int index, const QRectF &rect); - + // reimplemented virtual methods: virtual void updateLayout() Q_DECL_OVERRIDE; virtual int elementCount() const Q_DECL_OVERRIDE; @@ -1425,18 +1443,18 @@ public: virtual bool take(QCPLayoutElement* element) Q_DECL_OVERRIDE; virtual void simplify() Q_DECL_OVERRIDE {} virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + // non-virtual methods: void addElement(QCPLayoutElement *element, Qt::Alignment alignment); void addElement(QCPLayoutElement *element, const QRectF &rect); - + protected: // property members: QList mElements; QList mInsetPlacement; QList mInsetAlignment; QList mInsetRect; - + private: Q_DISABLE_COPY(QCPLayoutInset) }; @@ -1446,7 +1464,7 @@ Q_DECLARE_METATYPE(QCPLayoutInset::InsetPlacement) /* including file 'src/lineending.h', size 4426 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPLineEnding { @@ -1454,13 +1472,13 @@ class QCP_LIB_DECL QCPLineEnding public: /*! Defines the type of ending decoration for line-like items, e.g. an arrow. - + \image html QCPLineEnding.png - + The width and length of these decorations can be controlled with the functions \ref setWidth and \ref setLength. Some decorations like \ref esDisc, \ref esSquare, \ref esDiamond and \ref esBar only support a width, the length property is ignored. - + \see QCPItemLine::setHead, QCPItemLine::setTail, QCPItemCurve::setHead, QCPItemCurve::setTail, QCPAxis::setLowerEnding, QCPAxis::setUpperEnding */ enum EndingStyle { esNone ///< No ending decoration @@ -1475,28 +1493,28 @@ public: ,esSkewedBar ///< A bar that is skewed (skew controllable via \ref setLength) }; Q_ENUMS(EndingStyle) - + QCPLineEnding(); QCPLineEnding(EndingStyle style, double width=8, double length=10, bool inverted=false); - + // getters: EndingStyle style() const { return mStyle; } double width() const { return mWidth; } double length() const { return mLength; } bool inverted() const { return mInverted; } - + // setters: void setStyle(EndingStyle style); void setWidth(double width); void setLength(double length); void setInverted(bool inverted); - + // non-property methods: double boundingDistance() const; double realLength() const; void draw(QCPPainter *painter, const QCPVector2D &pos, const QCPVector2D &dir) const; void draw(QCPPainter *painter, const QCPVector2D &pos, double angle) const; - + protected: // property members: EndingStyle mStyle; @@ -1510,7 +1528,7 @@ Q_DECLARE_METATYPE(QCPLineEnding::EndingStyle) /* including file 'src/axis/axisticker.h', size 4177 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTicker { @@ -1518,7 +1536,7 @@ class QCP_LIB_DECL QCPAxisTicker public: /*! Defines the strategies that the axis ticker may follow when choosing the size of the tick step. - + \see setTickStepStrategy */ enum TickStepStrategy @@ -1527,29 +1545,29 @@ public: ,tssMeetTickCount ///< Less readable tick steps are allowed which in turn facilitates getting closer to the requested tick count }; Q_ENUMS(TickStepStrategy) - + QCPAxisTicker(); virtual ~QCPAxisTicker(); - + // getters: TickStepStrategy tickStepStrategy() const { return mTickStepStrategy; } int tickCount() const { return mTickCount; } double tickOrigin() const { return mTickOrigin; } - + // setters: void setTickStepStrategy(TickStepStrategy strategy); void setTickCount(int count); void setTickOrigin(double origin); - + // introduced virtual methods: virtual void generate(const QCPRange &range, const QLocale &locale, QChar formatChar, int precision, QVector &ticks, QVector *subTicks, QVector *tickLabels); - + protected: // property members: TickStepStrategy mTickStepStrategy; int mTickCount; double mTickOrigin; - + // introduced virtual methods: virtual double getTickStep(const QCPRange &range); virtual int getSubTickCount(double tickStep); @@ -1557,7 +1575,7 @@ protected: virtual QVector createTickVector(double tickStep, const QCPRange &range); virtual QVector createSubTickVector(int subTickCount, const QVector &ticks); virtual QVector createLabelVector(const QVector &ticks, const QLocale &locale, QChar formatChar, int precision); - + // non-virtual methods: void trimTicks(const QCPRange &range, QVector &ticks, bool keepOneOutlier) const; double pickClosest(double target, const QVector &candidates) const; @@ -1571,36 +1589,36 @@ Q_DECLARE_METATYPE(QSharedPointer) /* including file 'src/axis/axistickerdatetime.h', size 3289 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerDateTime : public QCPAxisTicker { public: QCPAxisTickerDateTime(); - + // getters: QString dateTimeFormat() const { return mDateTimeFormat; } Qt::TimeSpec dateTimeSpec() const { return mDateTimeSpec; } - + // setters: void setDateTimeFormat(const QString &format); void setDateTimeSpec(Qt::TimeSpec spec); void setTickOrigin(double origin); // hides base class method but calls baseclass implementation ("using" throws off IDEs and doxygen) void setTickOrigin(const QDateTime &origin); - + // static methods: static QDateTime keyToDateTime(double key); static double dateTimeToKey(const QDateTime dateTime); static double dateTimeToKey(const QDate date); - + protected: // property members: QString mDateTimeFormat; Qt::TimeSpec mDateTimeSpec; - + // non-property members: enum DateStrategy {dsNone, dsUniformTimeInDay, dsUniformDayInMonth} mDateStrategy; - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; virtual int getSubTickCount(double tickStep) Q_DECL_OVERRIDE; @@ -1611,8 +1629,8 @@ protected: /* end of 'src/axis/axistickerdatetime.h' */ -/* including file 'src/axis/axistickertime.h', size 3288 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/axis/axistickertime.h', size 3542 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerTime : public QCPAxisTicker { @@ -1620,41 +1638,41 @@ class QCP_LIB_DECL QCPAxisTickerTime : public QCPAxisTicker public: /*! Defines the logical units in which fractions of time spans can be expressed. - + \see setFieldWidth, setTimeFormat */ - enum TimeUnit { tuMilliseconds - ,tuSeconds - ,tuMinutes - ,tuHours - ,tuDays + enum TimeUnit { tuMilliseconds ///< Milliseconds, one thousandth of a second (%%z in \ref setTimeFormat) + ,tuSeconds ///< Seconds (%%s in \ref setTimeFormat) + ,tuMinutes ///< Minutes (%%m in \ref setTimeFormat) + ,tuHours ///< Hours (%%h in \ref setTimeFormat) + ,tuDays ///< Days (%%d in \ref setTimeFormat) }; Q_ENUMS(TimeUnit) - + QCPAxisTickerTime(); // getters: QString timeFormat() const { return mTimeFormat; } int fieldWidth(TimeUnit unit) const { return mFieldWidth.value(unit); } - + // setters: void setTimeFormat(const QString &format); void setFieldWidth(TimeUnit unit, int width); - + protected: // property members: QString mTimeFormat; QHash mFieldWidth; - + // non-property members: TimeUnit mSmallestUnit, mBiggestUnit; QHash mFormatPattern; - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; virtual int getSubTickCount(double tickStep) Q_DECL_OVERRIDE; virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) Q_DECL_OVERRIDE; - + // non-virtual methods: void replaceUnit(QString &text, TimeUnit unit, int value) const; }; @@ -1664,7 +1682,7 @@ Q_DECLARE_METATYPE(QCPAxisTickerTime::TimeUnit) /* including file 'src/axis/axistickerfixed.h', size 3308 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerFixed : public QCPAxisTicker { @@ -1673,7 +1691,7 @@ public: /*! Defines how the axis ticker may modify the specified tick step (\ref setTickStep) in order to control the number of ticks in the axis range. - + \see setScaleStrategy */ enum ScaleStrategy { ssNone ///< Modifications are not allowed, the specified tick step is absolutely fixed. This might cause a high tick density and overlapping labels if the axis range is zoomed out. @@ -1681,22 +1699,22 @@ public: ,ssPowers ///< An integer power of the specified tick step is allowed. }; Q_ENUMS(ScaleStrategy) - + QCPAxisTickerFixed(); - + // getters: double tickStep() const { return mTickStep; } ScaleStrategy scaleStrategy() const { return mScaleStrategy; } - + // setters: void setTickStep(double step); void setScaleStrategy(ScaleStrategy strategy); - + protected: // property members: double mTickStep; ScaleStrategy mScaleStrategy; - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; }; @@ -1706,46 +1724,46 @@ Q_DECLARE_METATYPE(QCPAxisTickerFixed::ScaleStrategy) /* including file 'src/axis/axistickertext.h', size 3085 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerText : public QCPAxisTicker { public: QCPAxisTickerText(); - + // getters: QMap &ticks() { return mTicks; } int subTickCount() const { return mSubTickCount; } - + // setters: void setTicks(const QMap &ticks); void setTicks(const QVector &positions, const QVector labels); void setSubTickCount(int subTicks); - + // non-virtual methods: void clear(); void addTick(double position, QString label); void addTicks(const QMap &ticks); void addTicks(const QVector &positions, const QVector &labels); - + protected: // property members: QMap mTicks; int mSubTickCount; - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; virtual int getSubTickCount(double tickStep) Q_DECL_OVERRIDE; virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) Q_DECL_OVERRIDE; virtual QVector createTickVector(double tickStep, const QCPRange &range) Q_DECL_OVERRIDE; - + }; /* end of 'src/axis/axistickertext.h' */ /* including file 'src/axis/axistickerpi.h', size 3911 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerPi : public QCPAxisTicker { @@ -1753,7 +1771,7 @@ class QCP_LIB_DECL QCPAxisTickerPi : public QCPAxisTicker public: /*! Defines how fractions should be displayed in tick labels. - + \see setFractionStyle */ enum FractionStyle { fsFloatingPoint ///< Fractions are displayed as regular decimal floating point numbers, e.g. "0.25" or "0.125". @@ -1761,36 +1779,36 @@ public: ,fsUnicodeFractions ///< Fractions are written using sub- and superscript UTF-8 digits and the fraction symbol. }; Q_ENUMS(FractionStyle) - + QCPAxisTickerPi(); - + // getters: QString piSymbol() const { return mPiSymbol; } double piValue() const { return mPiValue; } bool periodicity() const { return mPeriodicity; } FractionStyle fractionStyle() const { return mFractionStyle; } - + // setters: void setPiSymbol(QString symbol); void setPiValue(double pi); void setPeriodicity(int multiplesOfPi); void setFractionStyle(FractionStyle style); - + protected: // property members: QString mPiSymbol; double mPiValue; int mPeriodicity; FractionStyle mFractionStyle; - + // non-property members: double mPiTickStep; // size of one tick step in units of mPiValue - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; virtual int getSubTickCount(double tickStep) Q_DECL_OVERRIDE; virtual QString getTickLabel(double tick, const QLocale &locale, QChar formatChar, int precision) Q_DECL_OVERRIDE; - + // non-virtual methods: void simplifyFraction(int &numerator, int &denominator) const; QString fractionToString(int numerator, int denominator) const; @@ -1804,29 +1822,29 @@ Q_DECLARE_METATYPE(QCPAxisTickerPi::FractionStyle) /* including file 'src/axis/axistickerlog.h', size 2663 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisTickerLog : public QCPAxisTicker { public: QCPAxisTickerLog(); - + // getters: double logBase() const { return mLogBase; } int subTickCount() const { return mSubTickCount; } - + // setters: void setLogBase(double base); void setSubTickCount(int subTicks); - + protected: // property members: double mLogBase; int mSubTickCount; - + // non-property members: double mLogBaseLnInv; - + // reimplemented virtual methods: virtual double getTickStep(const QCPRange &range) Q_DECL_OVERRIDE; virtual int getSubTickCount(double tickStep) Q_DECL_OVERRIDE; @@ -1836,8 +1854,8 @@ protected: /* end of 'src/axis/axistickerlog.h' */ -/* including file 'src/axis/axis.h', size 20230 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/axis/axis.h', size 20634 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPGrid :public QCPLayerable { @@ -1852,7 +1870,7 @@ class QCP_LIB_DECL QCPGrid :public QCPLayerable /// \endcond public: explicit QCPGrid(QCPAxis *parentAxis); - + // getters: bool subGridVisible() const { return mSubGridVisible; } bool antialiasedSubGrid() const { return mAntialiasedSubGrid; } @@ -1860,7 +1878,7 @@ public: QPen pen() const { return mPen; } QPen subGridPen() const { return mSubGridPen; } QPen zeroLinePen() const { return mZeroLinePen; } - + // setters: void setSubGridVisible(bool visible); void setAntialiasedSubGrid(bool enabled); @@ -1868,24 +1886,24 @@ public: void setPen(const QPen &pen); void setSubGridPen(const QPen &pen); void setZeroLinePen(const QPen &pen); - + protected: // property members: bool mSubGridVisible; bool mAntialiasedSubGrid, mAntialiasedZeroLine; QPen mPen, mSubGridPen, mZeroLinePen; - + // non-property members: QCPAxis *mParentAxis; - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - + // non-virtual methods: void drawGridLines(QCPPainter *painter) const; void drawSubGridLines(QCPPainter *painter) const; - + friend class QCPAxis; }; @@ -1953,7 +1971,7 @@ public: Q_DECLARE_FLAGS(AxisTypes, AxisType) /*! Defines on which side of the axis the tick labels (numbers) shall appear. - + \see setTickLabelSide */ enum LabelSide { lsInside ///< Tick labels will be displayed inside the axis rect and clipped to the inner axis rect @@ -1980,10 +1998,10 @@ public: Q_ENUMS(SelectablePart) Q_FLAGS(SelectableParts) Q_DECLARE_FLAGS(SelectableParts, SelectablePart) - + explicit QCPAxis(QCPAxisRect *parent, AxisType type); virtual ~QCPAxis(); - + // getters: AxisType axisType() const { return mAxisType; } QCPAxisRect *axisRect() const { return mAxisRect; } @@ -2028,7 +2046,7 @@ public: QCPLineEnding lowerEnding() const; QCPLineEnding upperEnding() const; QCPGrid *grid() const { return mGrid; } - + // setters: Q_SLOT void setScaleType(QCPAxis::ScaleType type); Q_SLOT void setRange(const QCPRange &range); @@ -2074,10 +2092,10 @@ public: Q_SLOT void setSelectedParts(const QCPAxis::SelectableParts &selectedParts); void setLowerEnding(const QCPLineEnding &ending); void setUpperEnding(const QCPLineEnding &ending); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + // non-property methods: Qt::Orientation orientation() const { return mOrientation; } int pixelOrientation() const { return rangeReversed() != (orientation()==Qt::Vertical) ? -1 : 1; } @@ -2092,11 +2110,11 @@ public: QList plottables() const; QList graphs() const; QList items() const; - + static AxisType marginSideToAxisType(QCP::MarginSide side); static Qt::Orientation orientation(AxisType type) { return type==atBottom||type==atTop ? Qt::Horizontal : Qt::Vertical; } static AxisType opposite(AxisType type); - + signals: void rangeChanged(const QCPRange &newRange); void rangeChanged(const QCPRange &newRange, const QCPRange &oldRange); @@ -2140,7 +2158,7 @@ protected: QCPRange mRange; bool mRangeReversed; ScaleType mScaleType; - + // non-property members: QCPGrid *mGrid; QCPAxisPainterPrivate *mAxisPainter; @@ -2150,10 +2168,13 @@ protected: QVector mSubTickVector; bool mCachedMarginValid; int mCachedMargin; - + bool mDragging; + QCPRange mDragStartRange; + QCP::AntialiasedElements mAADragBackup, mNotAADragBackup; + // introduced virtual methods: virtual int calculateMargin(); - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; @@ -2161,7 +2182,12 @@ protected: // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + // mouse events: + virtual void mousePressEvent(QMouseEvent *event, const QVariant &details); + virtual void mouseMoveEvent(QMouseEvent *event, const QPointF &startPos); + virtual void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos); + virtual void wheelEvent(QWheelEvent *event); + // non-virtual methods: void setupTickVectors(); QPen getBasePen() const; @@ -2171,10 +2197,10 @@ protected: QFont getLabelFont() const; QColor getTickLabelColor() const; QColor getLabelColor() const; - + private: Q_DISABLE_COPY(QCPAxis) - + friend class QCustomPlot; friend class QCPGrid; friend class QCPAxisRect; @@ -2192,15 +2218,15 @@ class QCPAxisPainterPrivate public: explicit QCPAxisPainterPrivate(QCustomPlot *parentPlot); virtual ~QCPAxisPainterPrivate(); - + virtual void draw(QCPPainter *painter); virtual int size() const; void clearCache(); - + QRect axisSelectionBox() const { return mAxisSelectionBox; } QRect tickLabelsSelectionBox() const { return mTickLabelsSelectionBox; } QRect labelSelectionBox() const { return mLabelSelectionBox; } - + // public property members: QCPAxis::AxisType type; QPen basePen; @@ -2222,11 +2248,11 @@ public: double offset; // directly accessed by QCPAxis setters/getters bool abbreviateDecimalPowers; bool reversedEndings; - + QVector subTickPositions; QVector tickPositions; QVector tickLabels; - + protected: struct CachedLabel { @@ -2243,9 +2269,9 @@ protected: QByteArray mLabelParameterHash; // to determine whether mLabelCache needs to be cleared due to changed parameters QCache mLabelCache; QRect mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox; - + virtual QByteArray generateLabelParameterHash() const; - + virtual void placeTickLabel(QCPPainter *painter, double position, int distanceToAxis, const QString &text, QSize *tickLabelsSize); virtual void drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const; virtual TickLabelData getTickLabelData(const QFont &font, const QString &text) const; @@ -2257,7 +2283,7 @@ protected: /* including file 'src/scatterstyle.h', size 7275 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPScatterStyle { @@ -2317,7 +2343,7 @@ public: QCPScatterStyle(ScatterShape shape, const QPen &pen, const QBrush &brush, double size); QCPScatterStyle(const QPixmap &pixmap); QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush=Qt::NoBrush, double size=6); - + // getters: double size() const { return mSize; } ScatterShape shape() const { return mShape; } @@ -2351,7 +2377,7 @@ protected: QBrush mBrush; QPixmap mPixmap; QPainterPath mCustomPath; - + // non-property members: bool mPenDefined; }; @@ -2363,8 +2389,8 @@ Q_DECLARE_METATYPE(QCPScatterStyle::ScatterShape) /* end of 'src/scatterstyle.h' */ -/* including file 'src/datacontainer.h', size 4535 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/datacontainer.h', size 4596 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ /*! \relates QCPDataContainer Returns whether the sort key of \a a is less than the sort key of \a b. @@ -2375,22 +2401,22 @@ template inline bool qcpLessThanSortKey(const DataType &a, const DataType &b) { return a.sortKey() < b.sortKey(); } template -class QCP_LIB_DECL QCPDataContainer +class QCPDataContainer // no QCP_LIB_DECL, template class ends up in header (cpp included below) { public: typedef typename QVector::const_iterator const_iterator; typedef typename QVector::iterator iterator; - + QCPDataContainer(); - + // getters: int size() const { return mData.size()-mPreallocSize; } bool isEmpty() const { return size() == 0; } bool autoSqueeze() const { return mAutoSqueeze; } - + // setters: void setAutoSqueeze(bool enabled); - + // non-virtual methods: void set(const QCPDataContainer &data); void set(const QVector &data, bool alreadySorted=false); @@ -2404,7 +2430,7 @@ public: void clear(); void sort(); void squeeze(bool preAllocation=true, bool postAllocation=true); - + const_iterator constBegin() const { return mData.constBegin()+mPreallocSize; } const_iterator constEnd() const { return mData.constEnd(); } iterator begin() { return mData.begin()+mPreallocSize; } @@ -2416,16 +2442,16 @@ public: QCPRange valueRange(bool &foundRange, QCP::SignDomain signDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()); QCPDataRange dataRange() const { return QCPDataRange(0, size()); } void limitIteratorsToDataRange(const_iterator &begin, const_iterator &end, const QCPDataRange &dataRange) const; - + protected: // property members: bool mAutoSqueeze; - + // non-property memebers: QVector mData; int mPreallocSize; int mPreallocIteration; - + // non-virtual methods: void preallocateGrow(int minimumPreallocSize); void performAutoSqueeze(); @@ -2433,8 +2459,8 @@ protected: // include implementation in header since it is a class template: -/* including file 'src/datacontainer.cpp', size 31224 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/datacontainer.cpp', size 31349 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPDataContainer @@ -2510,27 +2536,27 @@ protected: /* start documentation of inline functions */ /*! \fn int QCPDataContainer::size() const - + Returns the number of data points in the container. */ /*! \fn bool QCPDataContainer::isEmpty() const - + Returns whether this container holds no data points. */ /*! \fn QCPDataContainer::const_iterator QCPDataContainer::constBegin() const - + Returns a const iterator to the first data point in this container. */ /*! \fn QCPDataContainer::const_iterator QCPDataContainer::constEnd() const - + Returns a const iterator to the element past the last data point in this container. */ /*! \fn QCPDataContainer::iterator QCPDataContainer::begin() const - + Returns a non-const iterator to the first data point in this container. You can manipulate the data points in-place through the non-const iterators, but great care must @@ -2539,9 +2565,9 @@ protected: */ /*! \fn QCPDataContainer::iterator QCPDataContainer::end() const - + Returns a non-const iterator to the element past the last data point in this container. - + You can manipulate the data points in-place through the non-const iterators, but great care must be taken when manipulating the sort key of a data point, see \ref sort, or the detailed description of this class. @@ -2581,7 +2607,7 @@ QCPDataContainer::QCPDataContainer() : Sets whether the container automatically decides when to release memory from its post- and preallocation pools when data points are removed. By default this is enabled and for typical applications shouldn't be changed. - + If auto squeeze is disabled, you can manually decide when to release pre-/postallocation with \ref squeeze. */ @@ -2597,9 +2623,9 @@ void QCPDataContainer::setAutoSqueeze(bool enabled) } /*! \overload - + Replaces the current data in this container with the provided \a data. - + \see add, remove */ template @@ -2610,12 +2636,12 @@ void QCPDataContainer::set(const QCPDataContainer &data) } /*! \overload - + Replaces the current data in this container with the provided \a data If you can guarantee that the data points in \a data have ascending order with respect to the DataType's sort key, set \a alreadySorted to true to avoid an unnecessary sorting run. - + \see add, remove */ template @@ -2629,9 +2655,9 @@ void QCPDataContainer::set(const QVector &data, bool already } /*! \overload - + Adds the provided \a data to the current data in this container. - + \see set, remove */ template @@ -2639,10 +2665,10 @@ void QCPDataContainer::add(const QCPDataContainer &data) { if (data.isEmpty()) return; - + const int n = data.size(); const int oldSize = size(); - + if (oldSize > 0 && !qcpLessThanSortKey(*constBegin(), *(data.constEnd()-1))) // prepend if new data keys are all smaller than or equal to existing ones { if (mPreallocSize < n) @@ -2660,10 +2686,10 @@ void QCPDataContainer::add(const QCPDataContainer &data) /*! Adds the provided data points in \a data to the current data. - + If you can guarantee that the data points in \a data have ascending order with respect to the DataType's sort key, set \a alreadySorted to true to avoid an unnecessary sorting run. - + \see set, remove */ template @@ -2676,10 +2702,10 @@ void QCPDataContainer::add(const QVector &data, bool already set(data, alreadySorted); return; } - + const int n = data.size(); const int oldSize = size(); - + if (alreadySorted && oldSize > 0 && !qcpLessThanSortKey(*constBegin(), *(data.constEnd()-1))) // prepend if new data is sorted and keys are all smaller than or equal to existing ones { if (mPreallocSize < n) @@ -2698,9 +2724,9 @@ void QCPDataContainer::add(const QVector &data, bool already } /*! \overload - + Adds the provided single data point to the current data. - + \see remove */ template @@ -2724,7 +2750,7 @@ void QCPDataContainer::add(const DataType &data) /*! Removes all data points with (sort-)keys smaller than or equal to \a sortKey. - + \see removeAfter, remove, clear */ template @@ -2756,7 +2782,7 @@ void QCPDataContainer::removeAfter(double sortKey) Removes all data points with (sort-)keys between \a sortKeyFrom and \a sortKeyTo. if \a sortKeyFrom is greater or equal to \a sortKeyTo, the function does nothing. To remove a single data point with known (sort-)key, use \ref remove(double sortKey). - + \see removeBefore, removeAfter, clear */ template @@ -2764,7 +2790,7 @@ void QCPDataContainer::remove(double sortKeyFrom, double sortKeyTo) { if (sortKeyFrom >= sortKeyTo || isEmpty()) return; - + QCPDataContainer::iterator it = std::lower_bound(begin(), end(), DataType::fromSortKey(sortKeyFrom), qcpLessThanSortKey); QCPDataContainer::iterator itEnd = std::upper_bound(it, end(), DataType::fromSortKey(sortKeyTo), qcpLessThanSortKey); mData.erase(it, itEnd); @@ -2773,12 +2799,12 @@ void QCPDataContainer::remove(double sortKeyFrom, double sortKeyTo) } /*! \overload - + Removes a single data point at \a sortKey. If the position is not known with absolute (binary) precision, consider using \ref remove(double sortKeyFrom, double sortKeyTo) with a small fuzziness interval around the suspected position, depeding on the precision with which the (sort-)key is known. - + \see removeBefore, removeAfter, clear */ template @@ -2798,7 +2824,7 @@ void QCPDataContainer::remove(double sortKey) /*! Removes all data points. - + \see remove, removeAfter, removeBefore */ template @@ -2828,11 +2854,11 @@ void QCPDataContainer::sort() /*! Frees all unused memory that is currently in the preallocation and postallocation pools. - + Note that QCPDataContainer automatically decides whether squeezing is necessary, if \ref setAutoSqueeze is left enabled. It should thus not be necessary to use this method for typical applications. - + The parameters \a preAllocation and \a postAllocation control whether pre- and/or post allocation should be freed, respectively. */ @@ -2873,7 +2899,7 @@ typename QCPDataContainer::const_iterator QCPDataContainer:: { if (isEmpty()) return constEnd(); - + QCPDataContainer::const_iterator it = std::lower_bound(constBegin(), constEnd(), DataType::fromSortKey(sortKey), qcpLessThanSortKey); if (expandedRange && it != constBegin()) // also covers it == constEnd case, and we know --constEnd is valid because mData isn't empty --it; @@ -2900,7 +2926,7 @@ typename QCPDataContainer::const_iterator QCPDataContainer:: { if (isEmpty()) return constEnd(); - + QCPDataContainer::const_iterator it = std::upper_bound(constBegin(), constEnd(), DataType::fromSortKey(sortKey), qcpLessThanSortKey); if (expandedRange && it != constEnd()) ++it; @@ -2912,14 +2938,14 @@ typename QCPDataContainer::const_iterator QCPDataContainer:: parameter \a foundRange indicates whether a sensible range was found. If this is false, you should not use the returned QCPRange (e.g. the data container is empty or all points have the same key). - + Use \a signDomain to control which sign of the key coordinates should be considered. This is relevant e.g. for logarithmic plots which can mathematically only display one sign domain at a time. - + If the DataType reports that its main key is equal to the sort key (\a sortKeyIsMainKey), as is the case for most plottables, this method uses this fact and finds the range very quickly. - + \see valueRange */ template @@ -2934,7 +2960,7 @@ QCPRange QCPDataContainer::keyRange(bool &foundRange, QCP::SignDomain bool haveLower = false; bool haveUpper = false; double current; - + QCPDataContainer::const_iterator it = constBegin(); QCPDataContainer::const_iterator itEnd = constEnd(); if (signDomain == QCP::sdBoth) // range may be anywhere @@ -3024,7 +3050,7 @@ QCPRange QCPDataContainer::keyRange(bool &foundRange, QCP::SignDomain ++it; } } - + foundRange = haveLower && haveUpper; return range; } @@ -3120,15 +3146,16 @@ QCPRange QCPDataContainer::valueRange(bool &foundRange, QCP::SignDomai } } } - + foundRange = haveLower && haveUpper; return range; } /*! Makes sure \a begin and \a end mark a data range that is both within the bounds of this data - container's data, as well as within the specified \a dataRange. - + container's data, as well as within the specified \a dataRange. The initial range described by + the passed iterators \a begin and \a end is never expanded, only contracted if necessary. + This function doesn't require for \a dataRange to be within the bounds of this data container's valid range. */ @@ -3142,11 +3169,11 @@ void QCPDataContainer::limitIteratorsToDataRange(const_iterator &begin } /*! \internal - + Increases the preallocation pool to have a size of at least \a minimumPreallocSize. Depending on the preallocation history, the container will grow by more than requested, to speed up future consecutive size increases. - + if \a minimumPreallocSize is smaller than or equal to the current preallocation pool size, this method does nothing. */ @@ -3155,11 +3182,11 @@ void QCPDataContainer::preallocateGrow(int minimumPreallocSize) { if (minimumPreallocSize <= mPreallocSize) return; - + int newPreallocSize = minimumPreallocSize; newPreallocSize += (1u<::preallocateGrow(int minimumPreallocSize) } /*! \internal - + This method decides, depending on the total allocation size and the size of the unused pre- and postallocation pools, whether it is sensible to reduce the pools in order to free up unused memory. It then possibly calls \ref squeeze to do the deallocation. - + If \ref setAutoSqueeze is enabled, this method is called automatically each time data points are removed from the container (e.g. \ref remove). - + \note when changing the decision parameters, care must be taken not to cause a back-and-forth between squeezing and reallocation due to the growth strategy of the internal QVector and \ref preallocateGrow. The hysteresis between allocation and deallocation should be made high enough @@ -3197,7 +3224,7 @@ void QCPDataContainer::performAutoSqueeze() shrinkPostAllocation = postAllocSize > usedSize*5; shrinkPreAllocation = mPreallocSize > usedSize*1.5; // preallocation can grow into postallocation, so can be smaller } - + if (shrinkPreAllocation || shrinkPostAllocation) squeeze(shrinkPreAllocation, shrinkPostAllocation); } @@ -3208,7 +3235,7 @@ void QCPDataContainer::performAutoSqueeze() /* including file 'src/plottable.h', size 8312 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPSelectionDecorator { @@ -3216,28 +3243,28 @@ class QCP_LIB_DECL QCPSelectionDecorator public: QCPSelectionDecorator(); virtual ~QCPSelectionDecorator(); - + // getters: QPen pen() const { return mPen; } QBrush brush() const { return mBrush; } QCPScatterStyle scatterStyle() const { return mScatterStyle; } QCPScatterStyle::ScatterProperties usedScatterProperties() const { return mUsedScatterProperties; } - + // setters: void setPen(const QPen &pen); void setBrush(const QBrush &brush); void setScatterStyle(const QCPScatterStyle &scatterStyle, QCPScatterStyle::ScatterProperties usedProperties=QCPScatterStyle::spPen); void setUsedScatterProperties(const QCPScatterStyle::ScatterProperties &properties); - + // non-virtual methods: void applyPen(QCPPainter *painter) const; void applyBrush(QCPPainter *painter) const; QCPScatterStyle getFinalScatterStyle(const QCPScatterStyle &unselectedStyle) const; - + // introduced virtual methods: virtual void copyFrom(const QCPSelectionDecorator *other); virtual void drawDecoration(QCPPainter *painter, QCPDataSelection selection); - + protected: // property members: QPen mPen; @@ -3246,10 +3273,10 @@ protected: QCPScatterStyle::ScatterProperties mUsedScatterProperties; // non-property members: QCPAbstractPlottable *mPlottable; - + // introduced virtual methods: virtual bool registerWithPlottable(QCPAbstractPlottable *plottable); - + private: Q_DISABLE_COPY(QCPSelectionDecorator) friend class QCPAbstractPlottable; @@ -3275,7 +3302,7 @@ class QCP_LIB_DECL QCPAbstractPlottable : public QCPLayerable public: QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPAbstractPlottable(); - + // getters: QString name() const { return mName; } bool antialiasedFill() const { return mAntialiasedFill; } @@ -3288,7 +3315,7 @@ public: bool selected() const { return !mSelection.isEmpty(); } QCPDataSelection selection() const { return mSelection; } QCPSelectionDecorator *selectionDecorator() const { return mSelectionDecorator; } - + // setters: void setName(const QString &name); void setAntialiasedFill(bool enabled); @@ -3306,7 +3333,7 @@ public: virtual QCPPlottableInterface1D *interface1D() { return 0; } virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const = 0; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const = 0; - + // non-property methods: void coordsToPixels(double key, double value, double &x, double &y) const; const QPointF coordsToPixels(double key, double value) const; @@ -3319,12 +3346,12 @@ public: bool addToLegend(); bool removeFromLegend(QCPLegend *legend) const; bool removeFromLegend() const; - + signals: void selectionChanged(bool selected); void selectionChanged(const QCPDataSelection &selection); void selectableChanged(QCP::SelectionType selectable); - + protected: // property members: QString mName; @@ -3335,7 +3362,7 @@ protected: QCP::SelectionType mSelectable; QCPDataSelection mSelection; QCPSelectionDecorator *mSelectionDecorator; - + // reimplemented virtual methods: virtual QRect clipRect() const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE = 0; @@ -3344,17 +3371,17 @@ protected: // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const = 0; - + // non-virtual methods: void applyFillAntialiasingHint(QCPPainter *painter) const; void applyScattersAntialiasingHint(QCPPainter *painter) const; private: Q_DISABLE_COPY(QCPAbstractPlottable) - + friend class QCustomPlot; friend class QCPAxis; friend class QCPPlottableLegendItem; @@ -3364,8 +3391,8 @@ private: /* end of 'src/plottable.h' */ -/* including file 'src/item.h', size 9368 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/item.h', size 9384 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemAnchor { @@ -3373,33 +3400,33 @@ class QCP_LIB_DECL QCPItemAnchor public: QCPItemAnchor(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString &name, int anchorId=-1); virtual ~QCPItemAnchor(); - + // getters: QString name() const { return mName; } virtual QPointF pixelPosition() const; - + protected: // property members: QString mName; - + // non-property members: QCustomPlot *mParentPlot; QCPAbstractItem *mParentItem; int mAnchorId; QSet mChildrenX, mChildrenY; - + // introduced virtual methods: virtual QCPItemPosition *toQCPItemPosition() { return 0; } - + // non-virtual methods: void addChildX(QCPItemPosition* pos); // called from pos when this anchor is set as parent void removeChildX(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted void addChildY(QCPItemPosition* pos); // called from pos when this anchor is set as parent void removeChildY(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted - + private: Q_DISABLE_COPY(QCPItemAnchor) - + friend class QCPItemPosition; }; @@ -3412,7 +3439,7 @@ public: /*! Defines the ways an item position can be specified. Thus it defines what the numbers passed to \ref setCoords actually mean. - + \see setType */ enum PositionType { ptAbsolute ///< Static positioning in pixels, starting from the top left corner of the viewport/widget. @@ -3425,10 +3452,10 @@ public: ,ptPlotCoords ///< Dynamic positioning at a plot coordinate defined by two axes (see \ref setAxes). }; Q_ENUMS(PositionType) - + QCPItemPosition(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString &name); virtual ~QCPItemPosition(); - + // getters: PositionType type() const { return typeX(); } PositionType typeX() const { return mPositionTypeX; } @@ -3442,8 +3469,8 @@ public: QCPAxis *keyAxis() const { return mKeyAxis.data(); } QCPAxis *valueAxis() const { return mValueAxis.data(); } QCPAxisRect *axisRect() const; - virtual QPointF pixelPosition() const; - + virtual QPointF pixelPosition() const Q_DECL_OVERRIDE; + // setters: void setType(PositionType type); void setTypeX(PositionType type); @@ -3456,7 +3483,7 @@ public: void setAxes(QCPAxis* keyAxis, QCPAxis* valueAxis); void setAxisRect(QCPAxisRect *axisRect); void setPixelPosition(const QPointF &pixelPosition); - + protected: // property members: PositionType mPositionTypeX, mPositionTypeY; @@ -3464,13 +3491,13 @@ protected: QPointer mAxisRect; double mKey, mValue; QCPItemAnchor *mParentAnchorX, *mParentAnchorY; - + // reimplemented virtual methods: virtual QCPItemPosition *toQCPItemPosition() Q_DECL_OVERRIDE { return this; } - + private: Q_DISABLE_COPY(QCPItemPosition) - + }; Q_DECLARE_METATYPE(QCPItemPosition::PositionType) @@ -3487,33 +3514,33 @@ class QCP_LIB_DECL QCPAbstractItem : public QCPLayerable public: explicit QCPAbstractItem(QCustomPlot *parentPlot); virtual ~QCPAbstractItem(); - + // getters: bool clipToAxisRect() const { return mClipToAxisRect; } QCPAxisRect *clipAxisRect() const; bool selectable() const { return mSelectable; } bool selected() const { return mSelected; } - + // setters: void setClipToAxisRect(bool clip); void setClipAxisRect(QCPAxisRect *rect); Q_SLOT void setSelectable(bool selectable); Q_SLOT void setSelected(bool selected); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE = 0; - + // non-virtual methods: QList positions() const { return mPositions; } QList anchors() const { return mAnchors; } QCPItemPosition *position(const QString &name) const; QCPItemAnchor *anchor(const QString &name) const; bool hasAnchor(const QString &name) const; - + signals: void selectionChanged(bool selected); void selectableChanged(bool selectable); - + protected: // property members: bool mClipToAxisRect; @@ -3521,7 +3548,7 @@ protected: QList mPositions; QList mAnchors; bool mSelectable, mSelected; - + // reimplemented virtual methods: virtual QCP::Interaction selectionCategory() const Q_DECL_OVERRIDE; virtual QRect clipRect() const Q_DECL_OVERRIDE; @@ -3530,18 +3557,18 @@ protected: // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual QPointF anchorPixelPosition(int anchorId) const; - + // non-virtual methods: double rectDistance(const QRectF &rect, const QPointF &pos, bool filledRect) const; QCPItemPosition *createPosition(const QString &name); QCPItemAnchor *createAnchor(const QString &name, int anchorId); - + private: Q_DISABLE_COPY(QCPAbstractItem) - + friend class QCustomPlot; friend class QCPItemAnchor; }; @@ -3549,8 +3576,8 @@ private: /* end of 'src/item.h' */ -/* including file 'src/core.h', size 14797 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/core.h', size 14886 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCustomPlot : public QWidget { @@ -3577,7 +3604,7 @@ public: ,limAbove ///< Layer is inserted above other layer }; Q_ENUMS(LayerInsertMode) - + /*! Defines with what timing the QCustomPlot surface is refreshed after a replot. @@ -3589,10 +3616,10 @@ public: ,rpQueuedReplot ///< Queues the entire replot for the next event loop iteration. This way multiple redundant replots can be avoided. The actual replot is then done with \ref rpRefreshHint priority. }; Q_ENUMS(RefreshPriority) - + explicit QCustomPlot(QWidget *parent = 0); virtual ~QCustomPlot(); - + // getters: QRect viewport() const { return mViewport; } double bufferDevicePixelRatio() const { return mBufferDevicePixelRatio; } @@ -3611,7 +3638,7 @@ public: QCP::SelectionRectMode selectionRectMode() const { return mSelectionRectMode; } QCPSelectionRect *selectionRect() const { return mSelectionRect; } bool openGl() const { return mOpenGl; } - + // setters: void setViewport(const QRect &rect); void setBufferDevicePixelRatio(double ratio); @@ -3635,7 +3662,7 @@ public: void setSelectionRectMode(QCP::SelectionRectMode mode); void setSelectionRect(QCPSelectionRect *selectionRect); void setOpenGl(bool enabled, int multisampling=16); - + // non-property methods: // plottable interface: QCPAbstractPlottable *plottable(int index); @@ -3647,7 +3674,7 @@ public: QList selectedPlottables() const; QCPAbstractPlottable *plottableAt(const QPointF &pos, bool onlySelectable=false) const; bool hasPlottable(QCPAbstractPlottable *plottable) const; - + // specialized interface for QCPGraph: QCPGraph *graph(int index) const; QCPGraph *graph() const; @@ -3668,7 +3695,7 @@ public: QList selectedItems() const; QCPAbstractItem *itemAt(const QPointF &pos, bool onlySelectable=false) const; bool hasItem(QCPAbstractItem *item) const; - + // layer interface: QCPLayer *layer(const QString &name) const; QCPLayer *layer(int index) const; @@ -3679,7 +3706,7 @@ public: bool addLayer(const QString &name, QCPLayer *otherLayer=0, LayerInsertMode insertMode=limAbove); bool removeLayer(QCPLayer *layer); bool moveLayer(QCPLayer *layer, QCPLayer *otherLayer, LayerInsertMode insertMode=limAbove); - + // axis rect/layout interface: int axisRectCount() const; QCPAxisRect* axisRect(int index=0) const; @@ -3687,11 +3714,11 @@ public: QCPLayoutElement* layoutElementAt(const QPointF &pos) const; QCPAxisRect* axisRectAt(const QPointF &pos) const; Q_SLOT void rescaleAxes(bool onlyVisiblePlottables=false); - + QList selectedAxes() const; QList selectedLegends() const; Q_SLOT void deselectAll(); - + bool savePdf(const QString &fileName, int width=0, int height=0, QCP::ExportPen exportPen=QCP::epAllowCosmetic, const QString &pdfCreator=QString(), const QString &pdfTitle=QString()); bool savePng(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1, int resolution=96, QCP::ResolutionUnit resolutionUnit=QCP::ruDotsPerInch); bool saveJpg(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1, int resolution=96, QCP::ResolutionUnit resolutionUnit=QCP::ruDotsPerInch); @@ -3700,17 +3727,17 @@ public: QPixmap toPixmap(int width=0, int height=0, double scale=1.0); void toPainter(QCPPainter *painter, int width=0, int height=0); Q_SLOT void replot(QCustomPlot::RefreshPriority refreshPriority=QCustomPlot::rpRefreshHint); - + QCPAxis *xAxis, *yAxis, *xAxis2, *yAxis2; QCPLegend *legend; - + signals: void mouseDoubleClick(QMouseEvent *event); void mousePress(QMouseEvent *event); void mouseMove(QMouseEvent *event); void mouseRelease(QMouseEvent *event); void mouseWheel(QWheelEvent *event); - + void plottableClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event); void plottableDoubleClick(QCPAbstractPlottable *plottable, int dataIndex, QMouseEvent *event); void itemClick(QCPAbstractItem *item, QMouseEvent *event); @@ -3719,11 +3746,11 @@ signals: void axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event); void legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event); void legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event); - + void selectionChangedByUser(); void beforeReplot(); void afterReplot(); - + protected: // property members: QRect mViewport; @@ -3749,13 +3776,15 @@ protected: QCP::SelectionRectMode mSelectionRectMode; QCPSelectionRect *mSelectionRect; bool mOpenGl; - + // non-property members: QList > mPaintBuffers; QPoint mMousePressPos; bool mMouseHasMoved; QPointer mMouseEventLayerable; + QPointer mMouseSignalLayerable; QVariant mMouseEventLayerableDetails; + QVariant mMouseSignalLayerableDetails; bool mReplotting; bool mReplotQueued; int mOpenGlMultisamples; @@ -3766,7 +3795,7 @@ protected: QSharedPointer mGlSurface; QSharedPointer mGlPaintDevice; #endif - + // reimplemented virtual methods: virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE; virtual QSize sizeHint() const Q_DECL_OVERRIDE; @@ -3777,7 +3806,7 @@ protected: virtual void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual void draw(QCPPainter *painter); virtual void updateLayout(); @@ -3786,7 +3815,7 @@ protected: Q_SLOT virtual void processRectSelection(QRect rect, QMouseEvent *event); Q_SLOT virtual void processRectZoom(QRect rect, QMouseEvent *event); Q_SLOT virtual void processPointSelection(QMouseEvent *event); - + // non-virtual methods: bool registerPlottable(QCPAbstractPlottable *plottable); bool registerGraph(QCPGraph *graph); @@ -3800,7 +3829,7 @@ protected: bool hasInvalidatedPaintBuffers(); bool setupOpenGl(); void freeOpenGl(); - + friend class QCPLegend; friend class QCPAxis; friend class QCPLayer; @@ -3815,12 +3844,13 @@ Q_DECLARE_METATYPE(QCustomPlot::RefreshPriority) /* end of 'src/core.h' */ -/* including file 'src/plottable1d.h', size 4250 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottable1d.h', size 4544 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ -class QCP_LIB_DECL QCPPlottableInterface1D +class QCPPlottableInterface1D { public: + virtual ~QCPPlottableInterface1D() {} // introduced pure virtual methods: virtual int dataCount() const = 0; virtual double dataMainKey(int index) const = 0; @@ -3835,47 +3865,47 @@ public: }; template -class QCP_LIB_DECL QCPAbstractPlottable1D : public QCPAbstractPlottable, public QCPPlottableInterface1D +class QCPAbstractPlottable1D : public QCPAbstractPlottable, public QCPPlottableInterface1D // no QCP_LIB_DECL, template class ends up in header (cpp included below) { // No Q_OBJECT macro due to template class - + public: QCPAbstractPlottable1D(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPAbstractPlottable1D(); - + // virtual methods of 1d plottable interface: - virtual int dataCount() const; - virtual double dataMainKey(int index) const; - virtual double dataSortKey(int index) const; - virtual double dataMainValue(int index) const; - virtual QCPRange dataValueRange(int index) const; - virtual QPointF dataPixelPosition(int index) const; - virtual bool sortKeyIsMainKey() const; - virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const; - virtual int findBegin(double sortKey, bool expandedRange=true) const; - virtual int findEnd(double sortKey, bool expandedRange=true) const; - - // virtual methods: - virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; - virtual QCPPlottableInterface1D *interface1D() { return this; } - + virtual int dataCount() const Q_DECL_OVERRIDE; + virtual double dataMainKey(int index) const Q_DECL_OVERRIDE; + virtual double dataSortKey(int index) const Q_DECL_OVERRIDE; + virtual double dataMainValue(int index) const Q_DECL_OVERRIDE; + virtual QCPRange dataValueRange(int index) const Q_DECL_OVERRIDE; + virtual QPointF dataPixelPosition(int index) const Q_DECL_OVERRIDE; + virtual bool sortKeyIsMainKey() const Q_DECL_OVERRIDE; + virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const Q_DECL_OVERRIDE; + virtual int findBegin(double sortKey, bool expandedRange=true) const Q_DECL_OVERRIDE; + virtual int findEnd(double sortKey, bool expandedRange=true) const Q_DECL_OVERRIDE; + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; + virtual QCPPlottableInterface1D *interface1D() Q_DECL_OVERRIDE { return this; } + protected: // property members: QSharedPointer > mDataContainer; - + // helpers for subclasses: void getDataSegments(QList &selectedSegments, QList &unselectedSegments) const; void drawPolyline(QCPPainter *painter, const QVector &lineData) const; private: Q_DISABLE_COPY(QCPAbstractPlottable1D) - + }; // include implementation in header since it is a class template: /* including file 'src/plottable1d.cpp', size 22240 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////// QCPPlottableInterface1D @@ -3907,55 +3937,55 @@ private: /* start documentation of pure virtual functions */ /*! \fn virtual int QCPPlottableInterface1D::dataCount() const = 0; - + Returns the number of data points of the plottable. */ /*! \fn virtual QCPDataSelection QCPPlottableInterface1D::selectTestRect(const QRectF &rect, bool onlySelectable) const = 0; - + Returns a data selection containing all the data points of this plottable which are contained (or hit by) \a rect. This is used mainly in the selection rect interaction for data selection (\ref dataselection "data selection mechanism"). - + If \a onlySelectable is true, an empty QCPDataSelection is returned if this plottable is not selectable (i.e. if \ref QCPAbstractPlottable::setSelectable is \ref QCP::stNone). - + \note \a rect must be a normalized rect (positive or zero width and height). This is especially important when using the rect of \ref QCPSelectionRect::accepted, which is not necessarily normalized. Use QRect::normalized() when passing a rect which might not be normalized. */ /*! \fn virtual double QCPPlottableInterface1D::dataMainKey(int index) const = 0 - + Returns the main key of the data point at the given \a index. - + What the main key is, is defined by the plottable's data type. See the \ref qcpdatacontainer-datatype "QCPDataContainer DataType" documentation for details about this naming convention. */ /*! \fn virtual double QCPPlottableInterface1D::dataSortKey(int index) const = 0 - + Returns the sort key of the data point at the given \a index. - + What the sort key is, is defined by the plottable's data type. See the \ref qcpdatacontainer-datatype "QCPDataContainer DataType" documentation for details about this naming convention. */ /*! \fn virtual double QCPPlottableInterface1D::dataMainValue(int index) const = 0 - + Returns the main value of the data point at the given \a index. - + What the main value is, is defined by the plottable's data type. See the \ref qcpdatacontainer-datatype "QCPDataContainer DataType" documentation for details about this naming convention. */ /*! \fn virtual QCPRange QCPPlottableInterface1D::dataValueRange(int index) const = 0 - + Returns the value range of the data point at the given \a index. - + What the value range is, is defined by the plottable's data type. See the \ref qcpdatacontainer-datatype "QCPDataContainer DataType" documentation for details about this naming convention. @@ -4049,10 +4079,10 @@ private: /* start documentation of inline functions */ /*! \fn QCPPlottableInterface1D *QCPAbstractPlottable1D::interface1D() - + Returns a \ref QCPPlottableInterface1D pointer to this plottable, providing access to its 1D interface. - + \seebaseclassmethod */ @@ -4188,7 +4218,7 @@ QCPDataSelection QCPAbstractPlottable1D::selectTestRect(const QRectF & return result; if (!mKeyAxis || !mValueAxis) return result; - + // convert rect given in pixels to ranges given in plot coordinates: double key1, value1, key2, value2; pixelsToCoords(rect.topLeft(), key1, value1); @@ -4204,7 +4234,7 @@ QCPDataSelection QCPAbstractPlottable1D::selectTestRect(const QRectF & } if (begin == end) return result; - + int currentSegmentBegin = -1; // -1 means we're currently not in a segment that's contained in rect for (typename QCPDataContainer::const_iterator it=begin; it!=end; ++it) { @@ -4221,7 +4251,7 @@ QCPDataSelection QCPAbstractPlottable1D::selectTestRect(const QRectF & // process potential last segment: if (currentSegmentBegin != -1) result.addDataRange(QCPDataRange(currentSegmentBegin, end-mDataContainer->constBegin()), false); - + result.simplify(); return result; } @@ -4258,11 +4288,11 @@ double QCPAbstractPlottable1D::selectTest(const QPointF &pos, bool onl return -1; if (!mKeyAxis || !mValueAxis) return -1; - + QCPDataSelection selectionResult; double minDistSqr = std::numeric_limits::max(); int minDistIndex = mDataContainer->size(); - + typename QCPDataContainer::const_iterator begin = mDataContainer->constBegin(); typename QCPDataContainer::const_iterator end = mDataContainer->constEnd(); if (DataType::sortKeyIsMainKey()) // we can assume that data is sorted by main key, so can reduce the searched key interval: @@ -4296,7 +4326,7 @@ double QCPAbstractPlottable1D::selectTest(const QPointF &pos, bool onl } if (minDistIndex != mDataContainer->size()) selectionResult.addDataRange(QCPDataRange(minDistIndex, minDistIndex+1), false); - + selectionResult.simplify(); if (details) details->setValue(selectionResult); @@ -4395,7 +4425,7 @@ void QCPAbstractPlottable1D::drawPolyline(QCPPainter *painter, const Q /* including file 'src/colorgradient.h', size 6243 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPColorGradient { @@ -4403,14 +4433,14 @@ class QCP_LIB_DECL QCPColorGradient public: /*! Defines the color spaces in which color interpolation between gradient stops can be performed. - + \see setColorInterpolation */ enum ColorInterpolation { ciRGB ///< Color channels red, green and blue are linearly interpolated ,ciHSV ///< Color channels hue, saturation and value are linearly interpolated (The hue is interpolated over the shortest angle distance) }; Q_ENUMS(ColorInterpolation) - + /*! Defines the available presets that can be loaded with \ref loadPreset. See the documentation there for an image of the presets. @@ -4429,25 +4459,25 @@ public: ,gpHues ///< Full hue cycle, with highest and lowest color red (suitable for periodic data, such as angles and phases, see \ref setPeriodic) }; Q_ENUMS(GradientPreset) - + QCPColorGradient(); QCPColorGradient(GradientPreset preset); bool operator==(const QCPColorGradient &other) const; bool operator!=(const QCPColorGradient &other) const { return !(*this == other); } - + // getters: int levelCount() const { return mLevelCount; } QMap colorStops() const { return mColorStops; } ColorInterpolation colorInterpolation() const { return mColorInterpolation; } bool periodic() const { return mPeriodic; } - + // setters: void setLevelCount(int n); void setColorStops(const QMap &colorStops); void setColorStopAt(double position, const QColor &color); void setColorInterpolation(ColorInterpolation interpolation); void setPeriodic(bool enabled); - + // non-property methods: void colorize(const double *data, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor=1, bool logarithmic=false); void colorize(const double *data, const unsigned char *alpha, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor=1, bool logarithmic=false); @@ -4455,18 +4485,18 @@ public: void loadPreset(GradientPreset preset); void clearColorStops(); QCPColorGradient inverted() const; - + protected: // property members: int mLevelCount; QMap mColorStops; ColorInterpolation mColorInterpolation; bool mPeriodic; - + // non-property members: QVector mColorBuffer; // have colors premultiplied with alpha (for usage with QImage::Format_ARGB32_Premultiplied) bool mColorBufferInvalidated; - + // non-virtual methods: bool stopsUseAlpha() const; void updateColorBuffer(); @@ -4477,17 +4507,17 @@ Q_DECLARE_METATYPE(QCPColorGradient::GradientPreset) /* end of 'src/colorgradient.h' */ -/* including file 'src/selectiondecorator-bracket.h', size 4426 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/selectiondecorator-bracket.h', size 4442 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPSelectionDecoratorBracket : public QCPSelectionDecorator { Q_GADGET public: - + /*! Defines which shape is drawn at the boundaries of selected data ranges. - + Some of the bracket styles further allow specifying a height and/or width, see \ref setBracketHeight and \ref setBracketWidth. */ @@ -4498,10 +4528,10 @@ public: ,bsUserStyle ///< Start custom bracket styles at this index when subclassing and reimplementing \ref drawBracket. }; Q_ENUMS(BracketStyle) - + QCPSelectionDecoratorBracket(); virtual ~QCPSelectionDecoratorBracket(); - + // getters: QPen bracketPen() const { return mBracketPen; } QBrush bracketBrush() const { return mBracketBrush; } @@ -4510,7 +4540,7 @@ public: BracketStyle bracketStyle() const { return mBracketStyle; } bool tangentToData() const { return mTangentToData; } int tangentAverage() const { return mTangentAverage; } - + // setters: void setBracketPen(const QPen &pen); void setBracketBrush(const QBrush &brush); @@ -4519,13 +4549,13 @@ public: void setBracketStyle(BracketStyle style); void setTangentToData(bool enabled); void setTangentAverage(int pointCount); - + // introduced virtual methods: virtual void drawBracket(QCPPainter *painter, int direction) const; - + // virtual methods: - virtual void drawDecoration(QCPPainter *painter, QCPDataSelection selection); - + virtual void drawDecoration(QCPPainter *painter, QCPDataSelection selection) Q_DECL_OVERRIDE; + protected: // property members: QPen mBracketPen; @@ -4535,19 +4565,19 @@ protected: BracketStyle mBracketStyle; bool mTangentToData; int mTangentAverage; - + // non-virtual methods: double getTangentAngle(const QCPPlottableInterface1D *interface1d, int dataIndex, int direction) const; QPointF getPixelCoordinates(const QCPPlottableInterface1D *interface1d, int dataIndex) const; - + }; Q_DECLARE_METATYPE(QCPSelectionDecoratorBracket::BracketStyle) /* end of 'src/selectiondecorator-bracket.h' */ -/* including file 'src/layoutelements/layoutelement-axisrect.h', size 7528 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-axisrect.h', size 7507 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAxisRect : public QCPLayoutElement { @@ -4562,7 +4592,7 @@ class QCP_LIB_DECL QCPAxisRect : public QCPLayoutElement public: explicit QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes=true); virtual ~QCPAxisRect(); - + // getters: QPixmap background() const { return mBackgroundPixmap; } QBrush backgroundBrush() const { return mBackgroundBrush; } @@ -4575,7 +4605,7 @@ public: QList rangeDragAxes(Qt::Orientation orientation); QList rangeZoomAxes(Qt::Orientation orientation); double rangeZoomFactor(Qt::Orientation orientation); - + // setters: void setBackground(const QPixmap &pm); void setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode=Qt::KeepAspectRatioByExpanding); @@ -4592,7 +4622,7 @@ public: void setRangeZoomAxes(QList horizontal, QList vertical); void setRangeZoomFactor(double horizontalFactor, double verticalFactor); void setRangeZoomFactor(double factor); - + // non-property methods: int axisCount(QCPAxis::AxisType type) const; QCPAxis *axis(QCPAxis::AxisType type, int index=0) const; @@ -4602,14 +4632,14 @@ public: QList addAxes(QCPAxis::AxisTypes types); bool removeAxis(QCPAxis *axis); QCPLayoutInset *insetLayout() const { return mInsetLayout; } - + void zoom(const QRectF &pixelRect); void zoom(const QRectF &pixelRect, const QList &affectedAxes); void setupFullAxesBox(bool connectRanges=false); QList plottables() const; QList graphs() const; QList items() const; - + // read-only interface imitating a QRect: int left() const { return mRect.left(); } int right() const { return mRect.right(); } @@ -4623,7 +4653,7 @@ public: QPoint bottomLeft() const { return mRect.bottomLeft(); } QPoint bottomRight() const { return mRect.bottomRight(); } QPoint center() const { return mRect.center(); } - + // reimplemented virtual methods: virtual void update(UpdatePhase phase) Q_DECL_OVERRIDE; virtual QList elements(bool recursive) const Q_DECL_OVERRIDE; @@ -4640,14 +4670,13 @@ protected: QList > mRangeDragHorzAxis, mRangeDragVertAxis; QList > mRangeZoomHorzAxis, mRangeZoomVertAxis; double mRangeZoomFactorHorz, mRangeZoomFactorVert; - + // non-property members: QList mDragStartHorzRange, mDragStartVertRange; QCP::AntialiasedElements mAADragBackup, mNotAADragBackup; - QPoint mDragStart; bool mDragging; QHash > mAxes; - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; @@ -4658,14 +4687,14 @@ protected: virtual void mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) Q_DECL_OVERRIDE; virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; - + // non-property methods: void drawBackground(QCPPainter *painter); void updateAxesOffset(QCPAxis::AxisType type); - + private: Q_DISABLE_COPY(QCPAxisRect) - + friend class QCustomPlot; }; @@ -4673,8 +4702,8 @@ private: /* end of 'src/layoutelements/layoutelement-axisrect.h' */ -/* including file 'src/layoutelements/layoutelement-legend.h', size 10392 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-legend.h', size 10397 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPAbstractLegendItem : public QCPLayoutElement { @@ -4690,7 +4719,7 @@ class QCP_LIB_DECL QCPAbstractLegendItem : public QCPLayoutElement /// \endcond public: explicit QCPAbstractLegendItem(QCPLegend *parent); - + // getters: QCPLegend *parentLegend() const { return mParentLegend; } QFont font() const { return mFont; } @@ -4699,7 +4728,7 @@ public: QColor selectedTextColor() const { return mSelectedTextColor; } bool selectable() const { return mSelectable; } bool selected() const { return mSelected; } - + // setters: void setFont(const QFont &font); void setTextColor(const QColor &color); @@ -4707,14 +4736,14 @@ public: void setSelectedTextColor(const QColor &color); Q_SLOT void setSelectable(bool selectable); Q_SLOT void setSelected(bool selected); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + signals: void selectionChanged(bool selected); void selectableChanged(bool selectable); - + protected: // property members: QCPLegend *mParentLegend; @@ -4723,7 +4752,7 @@ protected: QFont mSelectedFont; QColor mSelectedTextColor; bool mSelectable, mSelected; - + // reimplemented virtual methods: virtual QCP::Interaction selectionCategory() const Q_DECL_OVERRIDE; virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; @@ -4732,10 +4761,10 @@ protected: // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + private: Q_DISABLE_COPY(QCPAbstractLegendItem) - + friend class QCPLegend; }; @@ -4745,18 +4774,18 @@ class QCP_LIB_DECL QCPPlottableLegendItem : public QCPAbstractLegendItem Q_OBJECT public: QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlottable *plottable); - + // getters: QCPAbstractPlottable *plottable() { return mPlottable; } - + protected: // property members: QCPAbstractPlottable *mPlottable; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE; - + virtual QSize minimumOuterSizeHint() const Q_DECL_OVERRIDE; + // non-virtual methods: QPen getIconBorderPen() const; QColor getTextColor() const; @@ -4786,7 +4815,7 @@ class QCP_LIB_DECL QCPLegend : public QCPLayoutGrid public: /*! Defines the selectable parts of a legend - + \see setSelectedParts, setSelectableParts */ enum SelectablePart { spNone = 0x000 ///< 0x000 None @@ -4796,10 +4825,10 @@ public: Q_ENUMS(SelectablePart) Q_FLAGS(SelectableParts) Q_DECLARE_FLAGS(SelectableParts, SelectablePart) - + explicit QCPLegend(); virtual ~QCPLegend(); - + // getters: QPen borderPen() const { return mBorderPen; } QBrush brush() const { return mBrush; } @@ -4815,7 +4844,7 @@ public: QBrush selectedBrush() const { return mSelectedBrush; } QFont selectedFont() const { return mSelectedFont; } QColor selectedTextColor() const { return mSelectedTextColor; } - + // setters: void setBorderPen(const QPen &pen); void setBrush(const QBrush &brush); @@ -4832,10 +4861,10 @@ public: void setSelectedBrush(const QBrush &brush); void setSelectedFont(const QFont &font); void setSelectedTextColor(const QColor &color); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + // non-virtual methods: QCPAbstractLegendItem *item(int index) const; QCPPlottableLegendItem *itemWithPlottable(const QCPAbstractPlottable *plottable) const; @@ -4847,11 +4876,11 @@ public: bool removeItem(QCPAbstractLegendItem *item); void clearItems(); QList selectedItems() const; - + signals: void selectionChanged(QCPLegend::SelectableParts parts); void selectableChanged(QCPLegend::SelectableParts parts); - + protected: // property members: QPen mBorderPen, mIconBorderPen; @@ -4865,7 +4894,7 @@ protected: QBrush mSelectedBrush; QFont mSelectedFont; QColor mSelectedTextColor; - + // reimplemented virtual methods: virtual void parentPlotInitialized(QCustomPlot *parentPlot) Q_DECL_OVERRIDE; virtual QCP::Interaction selectionCategory() const Q_DECL_OVERRIDE; @@ -4874,14 +4903,14 @@ protected: // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + // non-virtual methods: QPen getBorderPen() const; QBrush getBrush() const; - + private: Q_DISABLE_COPY(QCPLegend) - + friend class QCustomPlot; friend class QCPAbstractLegendItem; }; @@ -4891,8 +4920,8 @@ Q_DECLARE_METATYPE(QCPLegend::SelectablePart) /* end of 'src/layoutelements/layoutelement-legend.h' */ -/* including file 'src/layoutelements/layoutelement-textelement.h', size 5343 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-textelement.h', size 5353 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPTextElement : public QCPLayoutElement { @@ -4912,7 +4941,7 @@ public: QCPTextElement(QCustomPlot *parentPlot, const QString &text, double pointSize); QCPTextElement(QCustomPlot *parentPlot, const QString &text, const QString &fontFamily, double pointSize); QCPTextElement(QCustomPlot *parentPlot, const QString &text, const QFont &font); - + // getters: QString text() const { return mText; } int textFlags() const { return mTextFlags; } @@ -4922,7 +4951,7 @@ public: QColor selectedTextColor() const { return mSelectedTextColor; } bool selectable() const { return mSelectable; } bool selected() const { return mSelected; } - + // setters: void setText(const QString &text); void setTextFlags(int flags); @@ -4932,19 +4961,19 @@ public: void setSelectedTextColor(const QColor &color); Q_SLOT void setSelectable(bool selectable); Q_SLOT void setSelected(bool selected); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual void mousePressEvent(QMouseEvent *event, const QVariant &details) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) Q_DECL_OVERRIDE; virtual void mouseDoubleClickEvent(QMouseEvent *event, const QVariant &details) Q_DECL_OVERRIDE; - + signals: void selectionChanged(bool selected); void selectableChanged(bool selectable); void clicked(QMouseEvent *event); void doubleClicked(QMouseEvent *event); - + protected: // property members: QString mText; @@ -4955,20 +4984,20 @@ protected: QColor mSelectedTextColor; QRect mTextBoundingRect; bool mSelectable, mSelected; - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE; - virtual QSize maximumSizeHint() const Q_DECL_OVERRIDE; + virtual QSize minimumOuterSizeHint() const Q_DECL_OVERRIDE; + virtual QSize maximumOuterSizeHint() const Q_DECL_OVERRIDE; // events: virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) Q_DECL_OVERRIDE; virtual void deselectEvent(bool *selectionStateChanged) Q_DECL_OVERRIDE; - + // non-virtual methods: QFont mainFont() const; QColor mainTextColor() const; - + private: Q_DISABLE_COPY(QCPTextElement) }; @@ -4978,8 +5007,8 @@ private: /* end of 'src/layoutelements/layoutelement-textelement.h' */ -/* including file 'src/layoutelements/layoutelement-colorscale.h', size 5907 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/layoutelements/layoutelement-colorscale.h', size 5923 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCPColorScaleAxisRectPrivate : public QCPAxisRect @@ -4998,7 +5027,7 @@ protected: using QCPAxisRect::mouseReleaseEvent; using QCPAxisRect::wheelEvent; using QCPAxisRect::update; - virtual void draw(QCPPainter *painter); + virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; void updateGradientImage(); Q_SLOT void axisSelectionChanged(QCPAxis::SelectableParts selectedParts); Q_SLOT void axisSelectableChanged(QCPAxis::SelectableParts selectableParts); @@ -5022,7 +5051,7 @@ class QCP_LIB_DECL QCPColorScale : public QCPLayoutElement public: explicit QCPColorScale(QCustomPlot *parentPlot); virtual ~QCPColorScale(); - + // getters: QCPAxis *axis() const { return mColorAxis.data(); } QCPAxis::AxisType type() const { return mType; } @@ -5033,7 +5062,7 @@ public: int barWidth () const { return mBarWidth; } bool rangeDrag() const; bool rangeZoom() const; - + // setters: void setType(QCPAxis::AxisType type); Q_SLOT void setDataRange(const QCPRange &dataRange); @@ -5043,14 +5072,14 @@ public: void setBarWidth(int width); void setRangeDrag(bool enabled); void setRangeZoom(bool enabled); - + // non-property methods: QList colorMaps() const; void rescaleDataRange(bool onlyVisibleMaps); - + // reimplemented virtual methods: virtual void update(UpdatePhase phase) Q_DECL_OVERRIDE; - + signals: void dataRangeChanged(const QCPRange &newRange); void dataScaleTypeChanged(QCPAxis::ScaleType scaleType); @@ -5063,11 +5092,11 @@ protected: QCPAxis::ScaleType mDataScaleType; QCPColorGradient mGradient; int mBarWidth; - + // non-property members: QPointer mAxisRect; QPointer mColorAxis; - + // reimplemented virtual methods: virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const Q_DECL_OVERRIDE; // events: @@ -5075,10 +5104,10 @@ protected: virtual void mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) Q_DECL_OVERRIDE; virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; - + private: Q_DISABLE_COPY(QCPColorScale) - + friend class QCPColorScaleAxisRectPrivate; }; @@ -5086,36 +5115,36 @@ private: /* end of 'src/layoutelements/layoutelement-colorscale.h' */ -/* including file 'src/plottables/plottable-graph.h', size 8826 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-graph.h', size 9294 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPGraphData { public: QCPGraphData(); QCPGraphData(double key, double value); - + inline double sortKey() const { return key; } inline static QCPGraphData fromSortKey(double sortKey) { return QCPGraphData(sortKey, 0); } inline static bool sortKeyIsMainKey() { return true; } - + inline double mainKey() const { return key; } inline double mainValue() const { return value; } - + inline QCPRange valueRange() const { return QCPRange(value, value); } - + double key, value; }; Q_DECLARE_TYPEINFO(QCPGraphData, Q_PRIMITIVE_TYPE); /*! \typedef QCPGraphDataContainer - + Container for storing \ref QCPGraphData points. The data is stored sorted by \a key. - + This template instantiation is the container in which QCPGraph holds its data. For details about the generic container, see the documentation of the class template \ref QCPDataContainer. - + \see QCPGraphData, QCPGraph::setData */ typedef QCPDataContainer QCPGraphDataContainer; @@ -5145,10 +5174,10 @@ public: ,lsImpulse ///< each data point is represented by a line parallel to the value axis, which reaches from the data point to the zero-value-line }; Q_ENUMS(LineStyle) - + explicit QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPGraph(); - + // getters: QSharedPointer data() const { return mDataContainer; } LineStyle lineStyle() const { return mLineStyle; } @@ -5156,7 +5185,7 @@ public: int scatterSkip() const { return mScatterSkip; } QCPGraph *channelFillGraph() const { return mChannelFillGraph.data(); } bool adaptiveSampling() const { return mAdaptiveSampling; } - + // setters: void setData(QSharedPointer data); void setData(const QVector &keys, const QVector &values, bool alreadySorted=false); @@ -5165,16 +5194,16 @@ public: void setScatterSkip(int skip); void setChannelFillGraph(QCPGraph *targetGraph); void setAdaptiveSampling(bool enabled); - + // non-property methods: void addData(const QVector &keys, const QVector &values, bool alreadySorted=false); void addData(double key, double value); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + protected: // property members: LineStyle mLineStyle; @@ -5182,20 +5211,20 @@ protected: int mScatterSkip; QPointer mChannelFillGraph; bool mAdaptiveSampling; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual void drawFill(QCPPainter *painter, QVector *lines) const; virtual void drawScatterPlot(QCPPainter *painter, const QVector &scatters, const QCPScatterStyle &style) const; virtual void drawLinePlot(QCPPainter *painter, const QVector &lines) const; virtual void drawImpulsePlot(QCPPainter *painter, const QVector &lines) const; - + virtual void getOptimizedLineData(QVector *lineData, const QCPGraphDataContainer::const_iterator &begin, const QCPGraphDataContainer::const_iterator &end) const; virtual void getOptimizedScatterData(QVector *scatterData, QCPGraphDataContainer::const_iterator begin, QCPGraphDataContainer::const_iterator end) const; - + // non-virtual methods: void getVisibleDataBounds(QCPGraphDataContainer::const_iterator &begin, QCPGraphDataContainer::const_iterator &end, const QCPDataRange &rangeRestriction) const; void getLines(QVector *lines, const QCPDataRange &dataRange) const; @@ -5205,17 +5234,18 @@ protected: QVector dataToStepRightLines(const QVector &data) const; QVector dataToStepCenterLines(const QVector &data) const; QVector dataToImpulseLines(const QVector &data) const; - void addFillBasePoints(QVector *lines) const; - void removeFillBasePoints(QVector *lines) const; - QPointF lowerFillBasePoint(double lowerKey) const; - QPointF upperFillBasePoint(double upperKey) const; - const QPolygonF getChannelFillPolygon(const QVector *lines) const; + QVector getNonNanSegments(const QVector *lineData, Qt::Orientation keyOrientation) const; + QVector > getOverlappingSegments(QVector thisSegments, const QVector *thisData, QVector otherSegments, const QVector *otherData) const; + bool segmentsIntersect(double aLower, double aUpper, double bLower, double bUpper, int &bPrecedence) const; + QPointF getFillBasePoint(QPointF matchingDataPoint) const; + const QPolygonF getFillPolygon(const QVector *lineData, QCPDataRange segment) const; + const QPolygonF getChannelFillPolygon(const QVector *lineData, QCPDataRange thisSegment, const QVector *otherData, QCPDataRange otherSegment) const; int findIndexBelowX(const QVector *data, double x) const; int findIndexAboveX(const QVector *data, double x) const; int findIndexBelowY(const QVector *data, double y) const; int findIndexAboveY(const QVector *data, double y) const; double pointDistance(const QPointF &pixelPoint, QCPGraphDataContainer::const_iterator &closestData) const; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -5225,36 +5255,36 @@ Q_DECLARE_METATYPE(QCPGraph::LineStyle) /* including file 'src/plottables/plottable-curve.h', size 7409 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPCurveData { public: QCPCurveData(); QCPCurveData(double t, double key, double value); - + inline double sortKey() const { return t; } inline static QCPCurveData fromSortKey(double sortKey) { return QCPCurveData(sortKey, 0, 0); } inline static bool sortKeyIsMainKey() { return false; } - + inline double mainKey() const { return key; } inline double mainValue() const { return value; } - + inline QCPRange valueRange() const { return QCPRange(value, value); } - + double t, key, value; }; Q_DECLARE_TYPEINFO(QCPCurveData, Q_PRIMITIVE_TYPE); /*! \typedef QCPCurveDataContainer - + Container for storing \ref QCPCurveData points. The data is stored sorted by \a t, so the \a sortKey() (returning \a t) is different from \a mainKey() (returning \a key). - + This template instantiation is the container in which QCPCurve holds its data. For details about the generic container, see the documentation of the class template \ref QCPDataContainer. - + \see QCPCurveData, QCPCurve::setData */ typedef QCPDataContainer QCPCurveDataContainer; @@ -5277,16 +5307,16 @@ public: ,lsLine ///< Data points are connected with a straight line }; Q_ENUMS(LineStyle) - + explicit QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPCurve(); - + // getters: QSharedPointer data() const { return mDataContainer; } QCPScatterStyle scatterStyle() const { return mScatterStyle; } int scatterSkip() const { return mScatterSkip; } LineStyle lineStyle() const { return mLineStyle; } - + // setters: void setData(QSharedPointer data); void setData(const QVector &t, const QVector &keys, const QVector &values, bool alreadySorted=false); @@ -5294,32 +5324,32 @@ public: void setScatterStyle(const QCPScatterStyle &style); void setScatterSkip(int skip); void setLineStyle(LineStyle style); - + // non-property methods: void addData(const QVector &t, const QVector &keys, const QVector &values, bool alreadySorted=false); void addData(const QVector &keys, const QVector &values); void addData(double t, double key, double value); void addData(double key, double value); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + protected: // property members: QCPScatterStyle mScatterStyle; int mScatterSkip; LineStyle mLineStyle; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual void drawCurveLine(QCPPainter *painter, const QVector &lines) const; virtual void drawScatterPlot(QCPPainter *painter, const QVector &points, const QCPScatterStyle &style) const; - + // non-virtual methods: void getCurveLines(QVector *lines, const QCPDataRange &dataRange, double penWidth) const; void getScatters(QVector *scatters, const QCPDataRange &dataRange, double scatterWidth) const; @@ -5330,7 +5360,7 @@ protected: bool getTraverse(double prevKey, double prevValue, double key, double value, double keyMin, double valueMax, double keyMax, double valueMin, QPointF &crossA, QPointF &crossB) const; void getTraverseCornerPoints(int prevRegion, int currentRegion, double keyMin, double valueMax, double keyMax, double valueMin, QVector &beforeTraverse, QVector &afterTraverse) const; double pointDistance(const QPointF &pixelPoint, QCPCurveDataContainer::const_iterator &closestData) const; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -5340,7 +5370,7 @@ Q_DECLARE_METATYPE(QCPCurve::LineStyle) /* including file 'src/plottables/plottable-bars.h', size 8924 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPBarsGroup : public QObject { @@ -5353,7 +5383,7 @@ public: /*! Defines the ways the spacing between bars in the group can be specified. Thus it defines what the number passed to \ref setSpacing actually means. - + \see setSpacingType, setSpacing */ enum SpacingType { stAbsolute ///< Bar spacing is in absolute pixels @@ -5361,18 +5391,18 @@ public: ,stPlotCoords ///< Bar spacing is in key coordinates and thus scales with the key axis range }; Q_ENUMS(SpacingType) - + QCPBarsGroup(QCustomPlot *parentPlot); virtual ~QCPBarsGroup(); - + // getters: SpacingType spacingType() const { return mSpacingType; } double spacing() const { return mSpacing; } - + // setters: void setSpacingType(SpacingType spacingType); void setSpacing(double spacing); - + // non-virtual methods: QList bars() const { return mBars; } QCPBars* bars(int index) const; @@ -5383,25 +5413,25 @@ public: void append(QCPBars *bars); void insert(int i, QCPBars *bars); void remove(QCPBars *bars); - + protected: // non-property members: QCustomPlot *mParentPlot; SpacingType mSpacingType; double mSpacing; QList mBars; - + // non-virtual methods: void registerBars(QCPBars *bars); void unregisterBars(QCPBars *bars); - + // virtual methods: double keyPixelOffset(const QCPBars *bars, double keyCoord); double getPixelSpacing(const QCPBars *bars, double keyCoord); - + private: Q_DISABLE_COPY(QCPBarsGroup) - + friend class QCPBars; }; Q_DECLARE_METATYPE(QCPBarsGroup::SpacingType) @@ -5412,28 +5442,28 @@ class QCP_LIB_DECL QCPBarsData public: QCPBarsData(); QCPBarsData(double key, double value); - + inline double sortKey() const { return key; } inline static QCPBarsData fromSortKey(double sortKey) { return QCPBarsData(sortKey, 0); } - inline static bool sortKeyIsMainKey() { return true; } - + inline static bool sortKeyIsMainKey() { return true; } + inline double mainKey() const { return key; } inline double mainValue() const { return value; } - + inline QCPRange valueRange() const { return QCPRange(value, value); } // note that bar base value isn't held in each QCPBarsData and thus can't/shouldn't be returned here - + double key, value; }; Q_DECLARE_TYPEINFO(QCPBarsData, Q_PRIMITIVE_TYPE); /*! \typedef QCPBarsDataContainer - + Container for storing \ref QCPBarsData points. The data is stored sorted by \a key. - + This template instantiation is the container in which QCPBars holds its data. For details about the generic container, see the documentation of the class template \ref QCPDataContainer. - + \see QCPBarsData, QCPBars::setData */ typedef QCPDataContainer QCPBarsDataContainer; @@ -5454,7 +5484,7 @@ public: /*! Defines the ways the width of the bar can be specified. Thus it defines what the number passed to \ref setWidth actually means. - + \see setWidthType, setWidth */ enum WidthType { wtAbsolute ///< Bar width is in absolute pixels @@ -5462,10 +5492,10 @@ public: ,wtPlotCoords ///< Bar width is in key coordinates and thus scales with the key axis range }; Q_ENUMS(WidthType) - + explicit QCPBars(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPBars(); - + // getters: double width() const { return mWidth; } WidthType widthType() const { return mWidthType; } @@ -5475,7 +5505,7 @@ public: QCPBars *barBelow() const { return mBarBelow.data(); } QCPBars *barAbove() const { return mBarAbove.data(); } QSharedPointer data() const { return mDataContainer; } - + // setters: void setData(QSharedPointer data); void setData(const QVector &keys, const QVector &values, bool alreadySorted=false); @@ -5484,20 +5514,20 @@ public: void setBarsGroup(QCPBarsGroup *barsGroup); void setBaseValue(double baseValue); void setStackingGap(double pixels); - + // non-property methods: void addData(const QVector &keys, const QVector &values, bool alreadySorted=false); void addData(double key, double value); void moveBelow(QCPBars *bars); void moveAbove(QCPBars *bars); - + // reimplemented virtual methods: virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const Q_DECL_OVERRIDE; virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; virtual QPointF dataPixelPosition(int index) const Q_DECL_OVERRIDE; - + protected: // property members: double mWidth; @@ -5506,18 +5536,18 @@ protected: double mBaseValue; double mStackingGap; QPointer mBarBelow, mBarAbove; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + // non-virtual methods: void getVisibleDataBounds(QCPBarsDataContainer::const_iterator &begin, QCPBarsDataContainer::const_iterator &end) const; QRectF getBarRect(double key, double value) const; void getPixelWidth(double key, double &lower, double &upper) const; double getStackedBaseValue(double key, bool positive) const; static void connectBars(QCPBars* lower, QCPBars* upper); - + friend class QCustomPlot; friend class QCPLegend; friend class QCPBarsGroup; @@ -5528,21 +5558,21 @@ Q_DECLARE_METATYPE(QCPBars::WidthType) /* including file 'src/plottables/plottable-statisticalbox.h', size 7516 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPStatisticalBoxData { public: QCPStatisticalBoxData(); QCPStatisticalBoxData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum, const QVector& outliers=QVector()); - + inline double sortKey() const { return key; } inline static QCPStatisticalBoxData fromSortKey(double sortKey) { return QCPStatisticalBoxData(sortKey, 0, 0, 0, 0, 0); } inline static bool sortKeyIsMainKey() { return true; } - + inline double mainKey() const { return key; } inline double mainValue() const { return median; } - + inline QCPRange valueRange() const { QCPRange result(minimum, maximum); @@ -5550,7 +5580,7 @@ public: result.expand(*it); return result; } - + double key, minimum, lowerQuartile, median, upperQuartile, maximum; QVector outliers; }; @@ -5558,13 +5588,13 @@ Q_DECLARE_TYPEINFO(QCPStatisticalBoxData, Q_MOVABLE_TYPE); /*! \typedef QCPStatisticalBoxDataContainer - + Container for storing \ref QCPStatisticalBoxData points. The data is stored sorted by \a key. - + This template instantiation is the container in which QCPStatisticalBox holds its data. For details about the generic container, see the documentation of the class template \ref QCPDataContainer. - + \see QCPStatisticalBoxData, QCPStatisticalBox::setData */ typedef QCPDataContainer QCPStatisticalBoxDataContainer; @@ -5583,7 +5613,7 @@ class QCP_LIB_DECL QCPStatisticalBox : public QCPAbstractPlottable1D data() const { return mDataContainer; } double width() const { return mWidth; } @@ -5604,17 +5634,17 @@ public: void setWhiskerAntialiased(bool enabled); void setMedianPen(const QPen &pen); void setOutlierStyle(const QCPScatterStyle &style); - + // non-property methods: void addData(const QVector &keys, const QVector &minimum, const QVector &lowerQuartile, const QVector &median, const QVector &upperQuartile, const QVector &maximum, bool alreadySorted=false); void addData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum, const QVector &outliers=QVector()); - + // reimplemented virtual methods: virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const Q_DECL_OVERRIDE; virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + protected: // property members: double mWidth; @@ -5623,20 +5653,20 @@ protected: bool mWhiskerAntialiased; QPen mMedianPen; QCPScatterStyle mOutlierStyle; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + // introduced virtual methods: virtual void drawStatisticalBox(QCPPainter *painter, QCPStatisticalBoxDataContainer::const_iterator it, const QCPScatterStyle &outlierStyle) const; - + // non-virtual methods: void getVisibleDataBounds(QCPStatisticalBoxDataContainer::const_iterator &begin, QCPStatisticalBoxDataContainer::const_iterator &end) const; QRectF getQuartileBox(QCPStatisticalBoxDataContainer::const_iterator it) const; QVector getWhiskerBackboneLines(QCPStatisticalBoxDataContainer::const_iterator it) const; QVector getWhiskerBarLines(QCPStatisticalBoxDataContainer::const_iterator it) const; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -5645,7 +5675,7 @@ protected: /* including file 'src/plottables/plottable-colormap.h', size 7070 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPColorMapData { @@ -5654,7 +5684,7 @@ public: ~QCPColorMapData(); QCPColorMapData(const QCPColorMapData &other); QCPColorMapData &operator=(const QCPColorMapData &other); - + // getters: int keySize() const { return mKeySize; } int valueSize() const { return mValueSize; } @@ -5664,7 +5694,7 @@ public: double data(double key, double value); double cell(int keyIndex, int valueIndex); unsigned char alpha(int keyIndex, int valueIndex); - + // setters: void setSize(int keySize, int valueSize); void setKeySize(int keySize); @@ -5675,7 +5705,7 @@ public: void setData(double key, double value, double z); void setCell(int keyIndex, int valueIndex, double z); void setAlpha(int keyIndex, int valueIndex, unsigned char alpha); - + // non-property methods: void recalculateDataBounds(); void clear(); @@ -5685,21 +5715,21 @@ public: bool isEmpty() const { return mIsEmpty; } void coordToCell(double key, double value, int *keyIndex, int *valueIndex) const; void cellToCoord(int keyIndex, int valueIndex, double *key, double *value) const; - + protected: // property members: int mKeySize, mValueSize; QCPRange mKeyRange, mValueRange; bool mIsEmpty; - + // non-property members: double *mData; unsigned char *mAlpha; QCPRange mDataBounds; bool mDataModified; - + bool createAlpha(bool initializeOpaque=true); - + friend class QCPColorMap; }; @@ -5718,7 +5748,7 @@ class QCP_LIB_DECL QCPColorMap : public QCPAbstractPlottable public: explicit QCPColorMap(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPColorMap(); - + // getters: QCPColorMapData *data() const { return mMapData; } QCPRange dataRange() const { return mDataRange; } @@ -5727,7 +5757,7 @@ public: bool tightBoundary() const { return mTightBoundary; } QCPColorGradient gradient() const { return mGradient; } QCPColorScale *colorScale() const { return mColorScale.data(); } - + // setters: void setData(QCPColorMapData *data, bool copy=false); Q_SLOT void setDataRange(const QCPRange &dataRange); @@ -5736,21 +5766,21 @@ public: void setInterpolate(bool enabled); void setTightBoundary(bool enabled); void setColorScale(QCPColorScale *colorScale); - + // non-property methods: void rescaleDataRange(bool recalculateDataBounds=false); Q_SLOT void updateLegendIcon(Qt::TransformationMode transformMode=Qt::SmoothTransformation, const QSize &thumbSize=QSize(32, 18)); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + signals: void dataRangeChanged(const QCPRange &newRange); void dataScaleTypeChanged(QCPAxis::ScaleType scaleType); void gradientChanged(const QCPColorGradient &newGradient); - + protected: // property members: QCPRange mDataRange; @@ -5760,19 +5790,19 @@ protected: bool mInterpolate; bool mTightBoundary; QPointer mColorScale; - + // non-property members: QImage mMapImage, mUndersampledMapImage; QPixmap mLegendIcon; bool mMapImageInvalidated; - + // introduced virtual methods: virtual void updateMapImage(); - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -5781,35 +5811,35 @@ protected: /* including file 'src/plottables/plottable-financial.h', size 8622 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPFinancialData { public: QCPFinancialData(); QCPFinancialData(double key, double open, double high, double low, double close); - + inline double sortKey() const { return key; } inline static QCPFinancialData fromSortKey(double sortKey) { return QCPFinancialData(sortKey, 0, 0, 0, 0); } - inline static bool sortKeyIsMainKey() { return true; } - + inline static bool sortKeyIsMainKey() { return true; } + inline double mainKey() const { return key; } inline double mainValue() const { return open; } - + inline QCPRange valueRange() const { return QCPRange(low, high); } // open and close must lie between low and high, so we don't need to check them - + double key, open, high, low, close; }; Q_DECLARE_TYPEINFO(QCPFinancialData, Q_PRIMITIVE_TYPE); /*! \typedef QCPFinancialDataContainer - + Container for storing \ref QCPFinancialData points. The data is stored sorted by \a key. - + This template instantiation is the container in which QCPFinancial holds its data. For details about the generic container, see the documentation of the class template \ref QCPDataContainer. - + \see QCPFinancialData, QCPFinancial::setData */ typedef QCPDataContainer QCPFinancialDataContainer; @@ -5839,20 +5869,20 @@ public: ,wtPlotCoords ///< width is in key coordinates and thus scales with the key axis range }; Q_ENUMS(WidthType) - + /*! Defines the possible representations of OHLC data in the plot. - + \see setChartStyle */ enum ChartStyle { csOhlc ///< Open-High-Low-Close bar representation ,csCandlestick ///< Candlestick representation }; Q_ENUMS(ChartStyle) - + explicit QCPFinancial(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPFinancial(); - + // getters: QSharedPointer data() const { return mDataContainer; } ChartStyle chartStyle() const { return mChartStyle; } @@ -5863,7 +5893,7 @@ public: QBrush brushNegative() const { return mBrushNegative; } QPen penPositive() const { return mPenPositive; } QPen penNegative() const { return mPenNegative; } - + // setters: void setData(QSharedPointer data); void setData(const QVector &keys, const QVector &open, const QVector &high, const QVector &low, const QVector &close, bool alreadySorted=false); @@ -5875,20 +5905,20 @@ public: void setBrushNegative(const QBrush &brush); void setPenPositive(const QPen &pen); void setPenNegative(const QPen &pen); - + // non-property methods: void addData(const QVector &keys, const QVector &open, const QVector &high, const QVector &low, const QVector &close, bool alreadySorted=false); void addData(double key, double open, double high, double low, double close); - + // reimplemented virtual methods: virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const Q_DECL_OVERRIDE; virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + // static methods: static QCPFinancialDataContainer timeSeriesToOhlc(const QVector &time, const QVector &value, double timeBinSize, double timeBinOffset = 0); - + protected: // property members: ChartStyle mChartStyle; @@ -5897,11 +5927,11 @@ protected: bool mTwoColored; QBrush mBrushPositive, mBrushNegative; QPen mPenPositive, mPenNegative; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; - + // non-virtual methods: void drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataContainer::const_iterator &begin, const QCPFinancialDataContainer::const_iterator &end, bool isSelected); void drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDataContainer::const_iterator &begin, const QCPFinancialDataContainer::const_iterator &end, bool isSelected); @@ -5910,7 +5940,7 @@ protected: double candlestickSelectTest(const QPointF &pos, const QCPFinancialDataContainer::const_iterator &begin, const QCPFinancialDataContainer::const_iterator &end, QCPFinancialDataContainer::const_iterator &closestDataPoint) const; void getVisibleDataBounds(QCPFinancialDataContainer::const_iterator &begin, QCPFinancialDataContainer::const_iterator &end) const; QRectF selectionHitBox(QCPFinancialDataContainer::const_iterator it) const; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -5919,8 +5949,8 @@ Q_DECLARE_METATYPE(QCPFinancial::ChartStyle) /* end of 'src/plottables/plottable-financial.h' */ -/* including file 'src/plottables/plottable-errorbar.h', size 7567 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* including file 'src/plottables/plottable-errorbar.h', size 7727 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPErrorBarsData { @@ -5928,7 +5958,7 @@ public: QCPErrorBarsData(); explicit QCPErrorBarsData(double error); QCPErrorBarsData(double errorMinus, double errorPlus); - + double errorMinus, errorPlus; }; Q_DECLARE_TYPEINFO(QCPErrorBarsData, Q_PRIMITIVE_TYPE); @@ -5962,7 +5992,7 @@ class QCP_LIB_DECL QCPErrorBars : public QCPAbstractPlottable, public QCPPlottab Q_PROPERTY(double symbolGap READ symbolGap WRITE setSymbolGap) /// \endcond public: - + /*! Defines in which orientation the error bars shall appear. If your data needs both error dimensions, create two \ref QCPErrorBars with different \ref ErrorType. @@ -5973,7 +6003,7 @@ public: ,etValueError ///< The errors are for the value dimension (bars appear parallel to the value axis) }; Q_ENUMS(ErrorType) - + explicit QCPErrorBars(QCPAxis *keyAxis, QCPAxis *valueAxis); virtual ~QCPErrorBars(); // getters: @@ -5982,7 +6012,7 @@ public: ErrorType errorType() const { return mErrorType; } double whiskerWidth() const { return mWhiskerWidth; } double symbolGap() const { return mSymbolGap; } - + // setters: void setData(QSharedPointer data); void setData(const QVector &error); @@ -5991,29 +6021,29 @@ public: void setErrorType(ErrorType type); void setWhiskerWidth(double pixels); void setSymbolGap(double pixels); - + // non-property methods: void addData(const QVector &error); void addData(const QVector &errorMinus, const QVector &errorPlus); void addData(double error); void addData(double errorMinus, double errorPlus); - + // virtual methods of 1d plottable interface: - virtual int dataCount() const; - virtual double dataMainKey(int index) const; - virtual double dataSortKey(int index) const; - virtual double dataMainValue(int index) const; - virtual QCPRange dataValueRange(int index) const; - virtual QPointF dataPixelPosition(int index) const; - virtual bool sortKeyIsMainKey() const; - virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const; - virtual int findBegin(double sortKey, bool expandedRange=true) const; - virtual int findEnd(double sortKey, bool expandedRange=true) const; - + virtual int dataCount() const Q_DECL_OVERRIDE; + virtual double dataMainKey(int index) const Q_DECL_OVERRIDE; + virtual double dataSortKey(int index) const Q_DECL_OVERRIDE; + virtual double dataMainValue(int index) const Q_DECL_OVERRIDE; + virtual QCPRange dataValueRange(int index) const Q_DECL_OVERRIDE; + virtual QPointF dataPixelPosition(int index) const Q_DECL_OVERRIDE; + virtual bool sortKeyIsMainKey() const Q_DECL_OVERRIDE; + virtual QCPDataSelection selectTestRect(const QRectF &rect, bool onlySelectable) const Q_DECL_OVERRIDE; + virtual int findBegin(double sortKey, bool expandedRange=true) const Q_DECL_OVERRIDE; + virtual int findEnd(double sortKey, bool expandedRange=true) const Q_DECL_OVERRIDE; + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; virtual QCPPlottableInterface1D *interface1D() Q_DECL_OVERRIDE { return this; } - + protected: // property members: QSharedPointer mDataContainer; @@ -6021,13 +6051,13 @@ protected: ErrorType mErrorType; double mWhiskerWidth; double mSymbolGap; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const Q_DECL_OVERRIDE; virtual QCPRange getKeyRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth) const Q_DECL_OVERRIDE; virtual QCPRange getValueRange(bool &foundRange, QCP::SignDomain inSignDomain=QCP::sdBoth, const QCPRange &inKeyRange=QCPRange()) const Q_DECL_OVERRIDE; - + // non-virtual methods: void getErrorBarLines(QCPErrorBarsDataContainer::const_iterator it, QVector &backbones, QVector &whiskers) const; void getVisibleDataBounds(QCPErrorBarsDataContainer::const_iterator &begin, QCPErrorBarsDataContainer::const_iterator &end, const QCPDataRange &rangeRestriction) const; @@ -6036,7 +6066,7 @@ protected: void getDataSegments(QList &selectedSegments, QList &unselectedSegments) const; bool errorBarVisible(int index) const; bool rectIntersectsLine(const QRectF &pixelRect, const QLineF &line) const; - + friend class QCustomPlot; friend class QCPLegend; }; @@ -6045,7 +6075,7 @@ protected: /* including file 'src/items/item-straightline.h', size 3117 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemStraightLine : public QCPAbstractItem { @@ -6057,28 +6087,28 @@ class QCP_LIB_DECL QCPItemStraightLine : public QCPAbstractItem public: explicit QCPItemStraightLine(QCustomPlot *parentPlot); virtual ~QCPItemStraightLine(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const point1; QCPItemPosition * const point2; - + protected: // property members: QPen mPen, mSelectedPen; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - + // non-virtual methods: QLineF getRectClippedStraightLine(const QCPVector2D &point1, const QCPVector2D &vec, const QRect &rect) const; QPen mainPen() const; @@ -6088,7 +6118,7 @@ protected: /* including file 'src/items/item-line.h', size 3407 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemLine : public QCPAbstractItem { @@ -6102,33 +6132,33 @@ class QCP_LIB_DECL QCPItemLine : public QCPAbstractItem public: explicit QCPItemLine(QCustomPlot *parentPlot); virtual ~QCPItemLine(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } QCPLineEnding head() const { return mHead; } QCPLineEnding tail() const { return mTail; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); void setHead(const QCPLineEnding &head); void setTail(const QCPLineEnding &tail); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const start; QCPItemPosition * const end; - + protected: // property members: QPen mPen, mSelectedPen; QCPLineEnding mHead, mTail; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - + // non-virtual methods: QLineF getRectClippedLine(const QCPVector2D &start, const QCPVector2D &end, const QRect &rect) const; QPen mainPen() const; @@ -6138,7 +6168,7 @@ protected: /* including file 'src/items/item-curve.h', size 3379 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemCurve : public QCPAbstractItem { @@ -6152,35 +6182,35 @@ class QCP_LIB_DECL QCPItemCurve : public QCPAbstractItem public: explicit QCPItemCurve(QCustomPlot *parentPlot); virtual ~QCPItemCurve(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } QCPLineEnding head() const { return mHead; } QCPLineEnding tail() const { return mTail; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); void setHead(const QCPLineEnding &head); void setTail(const QCPLineEnding &tail); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const start; QCPItemPosition * const startDir; QCPItemPosition * const endDir; QCPItemPosition * const end; - + protected: // property members: QPen mPen, mSelectedPen; QCPLineEnding mHead, mTail; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; - + // non-virtual methods: QPen mainPen() const; }; @@ -6189,7 +6219,7 @@ protected: /* including file 'src/items/item-rect.h', size 3688 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemRect : public QCPAbstractItem { @@ -6203,22 +6233,22 @@ class QCP_LIB_DECL QCPItemRect : public QCPAbstractItem public: explicit QCPItemRect(QCustomPlot *parentPlot); virtual ~QCPItemRect(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } QBrush brush() const { return mBrush; } QBrush selectedBrush() const { return mSelectedBrush; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); void setBrush(const QBrush &brush); void setSelectedBrush(const QBrush &brush); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const topLeft; QCPItemPosition * const bottomRight; QCPItemAnchor * const top; @@ -6227,18 +6257,18 @@ public: QCPItemAnchor * const bottom; QCPItemAnchor * const bottomLeft; QCPItemAnchor * const left; - + protected: enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft}; - + // property members: QPen mPen, mSelectedPen; QBrush mBrush, mSelectedBrush; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual QPointF anchorPixelPosition(int anchorId) const Q_DECL_OVERRIDE; - + // non-virtual methods: QPen mainPen() const; QBrush mainBrush() const; @@ -6248,7 +6278,7 @@ protected: /* including file 'src/items/item-text.h', size 5554 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemText : public QCPAbstractItem { @@ -6271,7 +6301,7 @@ class QCP_LIB_DECL QCPItemText : public QCPAbstractItem public: explicit QCPItemText(QCustomPlot *parentPlot); virtual ~QCPItemText(); - + // getters: QColor color() const { return mColor; } QColor selectedColor() const { return mSelectedColor; } @@ -6286,7 +6316,7 @@ public: Qt::Alignment textAlignment() const { return mTextAlignment; } double rotation() const { return mRotation; } QMargins padding() const { return mPadding; } - + // setters; void setColor(const QColor &color); void setSelectedColor(const QColor &color); @@ -6301,10 +6331,10 @@ public: void setTextAlignment(Qt::Alignment alignment); void setRotation(double degrees); void setPadding(const QMargins &padding); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const position; QCPItemAnchor * const topLeft; QCPItemAnchor * const top; @@ -6314,10 +6344,10 @@ public: QCPItemAnchor * const bottom; QCPItemAnchor * const bottomLeft; QCPItemAnchor * const left; - + protected: enum AnchorIndex {aiTopLeft, aiTop, aiTopRight, aiRight, aiBottomRight, aiBottom, aiBottomLeft, aiLeft}; - + // property members: QColor mColor, mSelectedColor; QPen mPen, mSelectedPen; @@ -6328,11 +6358,11 @@ protected: Qt::Alignment mTextAlignment; double mRotation; QMargins mPadding; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual QPointF anchorPixelPosition(int anchorId) const Q_DECL_OVERRIDE; - + // non-virtual methods: QPointF getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt::Alignment positionAlignment) const; QFont mainFont() const; @@ -6345,7 +6375,7 @@ protected: /* including file 'src/items/item-ellipse.h', size 3868 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemEllipse : public QCPAbstractItem { @@ -6359,22 +6389,22 @@ class QCP_LIB_DECL QCPItemEllipse : public QCPAbstractItem public: explicit QCPItemEllipse(QCustomPlot *parentPlot); virtual ~QCPItemEllipse(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } QBrush brush() const { return mBrush; } QBrush selectedBrush() const { return mSelectedBrush; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); void setBrush(const QBrush &brush); void setSelectedBrush(const QBrush &brush); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const topLeft; QCPItemPosition * const bottomRight; QCPItemAnchor * const topLeftRim; @@ -6386,18 +6416,18 @@ public: QCPItemAnchor * const bottomLeftRim; QCPItemAnchor * const left; QCPItemAnchor * const center; - + protected: enum AnchorIndex {aiTopLeftRim, aiTop, aiTopRightRim, aiRight, aiBottomRightRim, aiBottom, aiBottomLeftRim, aiLeft, aiCenter}; - + // property members: QPen mPen, mSelectedPen; QBrush mBrush, mSelectedBrush; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual QPointF anchorPixelPosition(int anchorId) const Q_DECL_OVERRIDE; - + // non-virtual methods: QPen mainPen() const; QBrush mainBrush() const; @@ -6407,7 +6437,7 @@ protected: /* including file 'src/items/item-pixmap.h', size 4373 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemPixmap : public QCPAbstractItem { @@ -6423,7 +6453,7 @@ class QCP_LIB_DECL QCPItemPixmap : public QCPAbstractItem public: explicit QCPItemPixmap(QCustomPlot *parentPlot); virtual ~QCPItemPixmap(); - + // getters: QPixmap pixmap() const { return mPixmap; } bool scaled() const { return mScaled; } @@ -6431,16 +6461,16 @@ public: Qt::TransformationMode transformationMode() const { return mTransformationMode; } QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } - + // setters; void setPixmap(const QPixmap &pixmap); void setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode=Qt::KeepAspectRatio, Qt::TransformationMode transformationMode=Qt::SmoothTransformation); void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const topLeft; QCPItemPosition * const bottomRight; QCPItemAnchor * const top; @@ -6449,10 +6479,10 @@ public: QCPItemAnchor * const bottom; QCPItemAnchor * const bottomLeft; QCPItemAnchor * const left; - + protected: enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft}; - + // property members: QPixmap mPixmap; QPixmap mScaledPixmap; @@ -6461,11 +6491,11 @@ protected: Qt::AspectRatioMode mAspectRatioMode; Qt::TransformationMode mTransformationMode; QPen mPen, mSelectedPen; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual QPointF anchorPixelPosition(int anchorId) const Q_DECL_OVERRIDE; - + // non-virtual methods: void updateScaledPixmap(QRect finalRect=QRect(), bool flipHorz=false, bool flipVert=false); QRect getFinalRect(bool *flippedHorz=0, bool *flippedVert=0) const; @@ -6476,7 +6506,7 @@ protected: /* including file 'src/items/item-tracer.h', size 4762 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemTracer : public QCPAbstractItem { @@ -6495,7 +6525,7 @@ class QCP_LIB_DECL QCPItemTracer : public QCPAbstractItem public: /*! The different visual appearances a tracer item can have. Some styles size may be controlled with \ref setSize. - + \see setStyle */ enum TracerStyle { tsNone ///< The tracer is not visible @@ -6533,7 +6563,7 @@ public: // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + // non-virtual methods: void updatePosition(); @@ -6562,7 +6592,7 @@ Q_DECLARE_METATYPE(QCPItemTracer::TracerStyle) /* including file 'src/items/item-bracket.h', size 3969 */ -/* commit 633339dadc92cb10c58ef3556b55570685fafb99 2016-09-13 23:54:56 +0200 */ +/* commit 9868e55d3b412f2f89766bb482fcf299e93a0988 2017-09-04 01:56:22 +0200 */ class QCP_LIB_DECL QCPItemBracket : public QCPAbstractItem { @@ -6577,7 +6607,7 @@ public: /*! Defines the various visual shapes of the bracket item. The appearance can be further modified by \ref setLength and \ref setPen. - + \see setStyle */ enum BracketStyle { bsSquare ///< A brace with angled edges @@ -6589,37 +6619,37 @@ public: explicit QCPItemBracket(QCustomPlot *parentPlot); virtual ~QCPItemBracket(); - + // getters: QPen pen() const { return mPen; } QPen selectedPen() const { return mSelectedPen; } double length() const { return mLength; } BracketStyle style() const { return mStyle; } - + // setters; void setPen(const QPen &pen); void setSelectedPen(const QPen &pen); void setLength(double length); void setStyle(BracketStyle style); - + // reimplemented virtual methods: virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const Q_DECL_OVERRIDE; - + QCPItemPosition * const left; QCPItemPosition * const right; QCPItemAnchor * const center; - + protected: // property members: enum AnchorIndex {aiCenter}; QPen mPen, mSelectedPen; double mLength; BracketStyle mStyle; - + // reimplemented virtual methods: virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE; virtual QPointF anchorPixelPosition(int anchorId) const Q_DECL_OVERRIDE; - + // non-virtual methods: QPen mainPen() const; }; From c380e172b032fa8ec46c8ab4e490ff8850dc19f8 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 11 Feb 2018 18:32:18 -0500 Subject: [PATCH 27/33] Add UI elements for a new remote connection system. Just UI and settings for now. --- connections/connectionwindow.cpp | 11 + connections/connectionwindow.h | 1 + mainsettingsdialog.cpp | 9 + ui/connectionwindow.ui | 33 +- ui/mainsettingsdialog.ui | 536 +++++++++++++++++-------------- 5 files changed, 343 insertions(+), 247 deletions(-) diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index 492a7aa..9ecd213 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -52,6 +52,7 @@ ConnectionWindow::ConnectionWindow(QWidget *parent) : connect(ui->rbGVRET, &QAbstractButton::clicked, this, &ConnectionWindow::handleConnTypeChanged); connect(ui->rbKvaser, &QAbstractButton::clicked, this, &ConnectionWindow::handleConnTypeChanged); connect(ui->rbSocketCAN, &QAbstractButton::clicked, this, &ConnectionWindow::handleConnTypeChanged); + connect(ui->rbRemote, &QAbstractButton::clicked, this, &ConnectionWindow::handleConnTypeChanged); connect(ui->tableConnections->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &ConnectionWindow::currentRowChanged); connect(ui->btnActivateAll, &QPushButton::clicked, this, &ConnectionWindow::handleEnableAll); connect(ui->btnDeactivateAll, &QPushButton::clicked, this, &ConnectionWindow::handleDisableAll); @@ -226,6 +227,7 @@ void ConnectionWindow::handleConnTypeChanged() if (ui->rbGVRET->isChecked()) selectSerial(); if (ui->rbKvaser->isChecked()) selectKvaser(); if (ui->rbSocketCAN->isChecked()) selectSocketCan(); + if (ui->rbRemote->isChecked()) selectRemote(); } @@ -327,6 +329,7 @@ void ConnectionWindow::handleSendText() { void ConnectionWindow::selectSerial() { + ui->lPort->setText("Port:"); /* set combobox page visible */ ui->stPort->setCurrentWidget(ui->cbPage); @@ -339,16 +342,24 @@ void ConnectionWindow::selectSerial() void ConnectionWindow::selectKvaser() { + ui->lPort->setText("Port:"); /* set combobox page visible */ ui->stPort->setCurrentWidget(ui->cbPage); } void ConnectionWindow::selectSocketCan() { + ui->lPort->setText("Port:"); /* set edit text page visible */ ui->stPort->setCurrentWidget(ui->etPage); } +void ConnectionWindow::selectRemote() +{ + ui->lPort->setText("Access Key:"); + ui->stPort->setCurrentWidget(ui->etPage); +} + void ConnectionWindow::setSpeed(int speed0) { } diff --git a/connections/connectionwindow.h b/connections/connectionwindow.h index 24bd0a8..3d000ba 100644 --- a/connections/connectionwindow.h +++ b/connections/connectionwindow.h @@ -69,6 +69,7 @@ private: void selectSerial(); void selectKvaser(); void selectSocketCan(); + void selectRemote(); bool isSocketCanAvailable(); int getSpeed(); QString getPortName(); diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index 8703855..2dd0a38 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -28,6 +28,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->cbValidate->setChecked(settings->value("Main/ValidateComm", true).toBool()); ui->spinPlaybackSpeed->setValue(settings->value("Playback/DefSpeed", 5).toInt()); ui->lineClockFormat->setText(settings->value("Main/TimeFormat", "MMM-dd HH:mm:ss.zzz").toString()); + ui->lineRemoteHost->setText(settings->value("Remote/Host", "api.savvycan.com").toString()); + ui->lineRemotePort->setText(settings->value("Remote/Port", "21315").toString()); // = 0x5343 = SC. Yep, really creative port number + ui->cbAutoStartRemote->setChecked(settings->value("Remote/AutoStart", false).toBool()); ui->spinFontSize->setValue(settings->value("Main/FontSize", ui->cbDisplayHex->font().pointSize()).toUInt()); @@ -76,6 +79,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : connect(ui->cbUseFiltered, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->lineClockFormat, SIGNAL(editingFinished()), this, SLOT(updateSettings())); connect(ui->cbUseOpenGL, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + connect(ui->cbAutoStartRemote, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + connect(ui->lineRemoteHost, SIGNAL(editingFinished()), this, SLOT(updateSettings())); + connect(ui->lineRemotePort, SIGNAL(editingFinished()), this, SLOT(updateSettings())); installEventFilter(this); } @@ -130,6 +136,9 @@ void MainSettingsDialog::updateSettings() settings->setValue("Main/UseOpenGL", ui->cbUseOpenGL->isChecked()); settings->setValue("Main/TimeFormat", ui->lineClockFormat->text()); settings->setValue("Main/FontSize", ui->spinFontSize->value()); + settings->setValue("Remote/Host", ui->lineRemoteHost->text()); + settings->setValue("Remote/Port", ui->lineRemotePort->text()); + settings->setValue("Remote/AutoStart", ui->cbAutoStartRemote->isChecked()); settings->sync(); emit updatedSettings(); diff --git a/ui/connectionwindow.ui b/ui/connectionwindow.ui index d8b48f7..197703f 100644 --- a/ui/connectionwindow.ui +++ b/ui/connectionwindow.ui @@ -80,18 +80,8 @@ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - GVRET Serial - - - true - - - - + + false @@ -101,7 +91,17 @@ - + + + + GVRET Serial + + + true + + + + false @@ -111,6 +111,13 @@ + + + + Remote Host + + + diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index c1e2fb8..05c7db9 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -6,260 +6,330 @@ 0 0 - 400 - 850 + 965 + 585 Main Settings - + - - - General Settings: - - - - - - Save/Restore window positions and sizes - - - - - - - Display values as hexadecimal - - - - - - - Require validation of GVRET connection - - - - - - - Time Keeping - - - - - - Seconds/Microseconds are dongle based - - - - - - - - - Seconds - - - - - - - Microseconds - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - System Clock - - - - - - - - - - - Time Format String: - - - - - - - - - - - - - - - Use filtered frames in sub-windows - - - - - - - OpenGL Accelerated AntiAliased Graphing - - - - - - - Font Size - - - - - - 7 - - - 15 - - - 9 - - - - - - - - - - - - - Main Form Settings: - - - - - - Autoscroll main frame window by default - - - - - - - - - - Flowview Settings: - - - - - - Use timestamp mode by default - - - - - - - Set Auto Reference by default - - - - - - - - - - Playback Window Settings: - - - - - - Loop by default - - - - - + + + + + Main Form Settings: + + - + - Default playback speed (ms) - - - - - - - 1000 + Autoscroll main frame window by default - - - + + + + + + General Settings: + + - + - Default Sending Bus + Save/Restore window positions and sizes - + + + Display values as hexadecimal + + + + + + + Require validation of GVRET connection + + + + + + + Use filtered frames in sub-windows + + + + + + + OpenGL Accelerated AntiAliased Graphing + + + + + + + Time Keeping + + + + + + Seconds/Microseconds are dongle based + + + + + + + + + Seconds + + + + + + + Microseconds + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + System Clock + + + + + + + + + + + Time Format String: + + + + + + + + + + + + + + + Font Size + + + + + + 7 + + + 15 + + + 9 + + + + + + + + + + Flowview Settings: + + + + + + Use timestamp mode by default + + + + + + + Set Auto Reference by default + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + - - - + + + - - - File Info and Comparator Settings: - - - - - - Auto expand all nodes - - - - - - - - - - Some settings will not take effect until the application is restarted - - - true - - + + + + + Playback Window Settings: + + + + + + Loop by default + + + + + + + + + Default playback speed (ms) + + + + + + + 1000 + + + + + + + + + + + Default Sending Bus + + + + + + + + + + + + + + + File Info and Comparator Settings: + + + + + + Auto expand all nodes + + + + + + + + + + Remote Connection: + + + + + + Host: + + + + + + + Port: + + + + + + + + + + + + + Auto start remote hosting + + + + + + + + + + Some settings will not take effect until the application is restarted + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + @@ -271,8 +341,6 @@ rbMicros rbSysClock lineClockFormat - cbUseFiltered - cbUseOpenGL cbMainAutoScroll cbFlowUseTimestamp cbFlowAutoRef From a3b8969fe04d5a8a663b65730c78765ad549f8c5 Mon Sep 17 00:00:00 2001 From: Fabian Off Date: Sat, 14 Apr 2018 23:43:07 +0200 Subject: [PATCH 28/33] implement reading CANHacker trace files --- framefileio.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++- framefileio.h | 1 + 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/framefileio.cpp b/framefileio.cpp index c4b9d35..c2d740a 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -140,6 +140,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache filters.append(QString(tr("Kvaser Log Hex (*.txt *.TXT)"))); filters.append(QString(tr("CANalyzer Ascii Log (*.asc *.ASC)"))); filters.append(QString(tr("CANalyzer Binary Log Files (*.blf *.BLF)"))); + filters.append(QString(tr("CANHacker Trace Files (*.trc *.TRC)"))); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setNameFilters(filters); @@ -174,6 +175,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache if (dialog.selectedNameFilter() == filters[12]) result = loadKvaserFile(filename, frameCache, true); if (dialog.selectedNameFilter() == filters[13]) result = loadCanalyzerASC(filename, frameCache); if (dialog.selectedNameFilter() == filters[14]) result = loadCanalyzerBLF(filename, frameCache); + if (dialog.selectedNameFilter() == filters[15]) result = loadCANHackerFile(filename, frameCache); progress.cancel(); @@ -295,7 +297,6 @@ tokens: 2 = ID 3-x = The data bytes */ - bool FrameFileIO::loadCRTDFile(QString filename, QVector* frames) { QFile *inFile = new QFile(filename); @@ -368,6 +369,75 @@ bool FrameFileIO::loadCRTDFile(QString filename, QVector* frames) return !foundErrors; } +// CANHacker trace format +// Time ID DLC Data Comment +// 00.000 00004000 8 36 47 19 43 01 00 00 80 +bool FrameFileIO::loadCANHackerFile(QString filename, QVector* frames) +{ + QFile *inFile = new QFile(filename); + CANFrame thisFrame; + QByteArray line; + int lineCounter = 0; + bool foundErrors = false; + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + { + delete inFile; + return false; + } + + line = inFile->readLine().toUpper(); //read out the header first and discard it. + + while (!inFile->atEnd()) { + lineCounter++; + if (lineCounter > 100) + { + qApp->processEvents(); + lineCounter = 0; + } + line = inFile->readLine().simplified(); + if (line.length() > 2) + { + QList tokens = line.split(' '); + int multiplier; + if (tokens.length() > 3) + { + int idxOfDecimal = tokens[0].indexOf('.'); + if (idxOfDecimal > -1) { + //int decimalPlaces = tokens[0].length() - tokens[0].indexOf('.') - 1; + //the result of the above is the # of digits after the decimal. + //This program deals in microsecond so turn the value into microseconds + multiplier = 1000000; //turn the decimal into full microseconds + } + else + { + multiplier = 1; //special case. Assume no decimal means microseconds + } + //qDebug() << "decimal places " << decimalPlaces; + thisFrame.timestamp = (int64_t)(tokens[0].toDouble() * multiplier); + thisFrame.ID = tokens[1].toInt(NULL, 16); + thisFrame.extended = (thisFrame.ID > 0x7FF); + thisFrame.isReceived = true; + thisFrame.bus = 0; + thisFrame.len = tokens[2].toInt(NULL, 16); + for (unsigned int d = 0; d < thisFrame.len; d++) + { + if (tokens[d + 3] != "") + { + thisFrame.data[d] = tokens[d + 3].toInt(NULL, 16); + } + else thisFrame.data[d] = 0; + } + frames->append(thisFrame); + } + else foundErrors = true; + } + } + inFile->close(); + delete inFile; + return !foundErrors; +} + bool FrameFileIO::saveCRTDFile(QString filename, const QVector* frames) { QFile *outFile = new QFile(filename); diff --git a/framefileio.h b/framefileio.h index 5015782..69d4ef1 100644 --- a/framefileio.h +++ b/framefileio.h @@ -44,6 +44,7 @@ public: static bool loadKvaserFile(QString, QVector*, bool); static bool loadCanalyzerASC(QString, QVector*); static bool loadCanalyzerBLF(QString, QVector*); + static bool loadCANHackerFile(QString filename, QVector* frames); static bool saveCRTDFile(QString, const QVector*); static bool saveNativeCSVFile(QString, const QVector*); static bool saveGenericCSVFile(QString, const QVector*); From 63ee973b9c9f27d857483e7eab128b1170ceea5e Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 17 Apr 2018 20:00:39 -0400 Subject: [PATCH 29/33] Changes to BLF file reading code --- blfhandler.cpp | 5 +++++ blfhandler.h | 1 + framefileio.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/blfhandler.cpp b/blfhandler.cpp index a86a0d5..b00c662 100644 --- a/blfhandler.cpp +++ b/blfhandler.cpp @@ -82,5 +82,10 @@ bool BLFHandler::loadBLF(QString filename, QVector* frames) } else return false; } + return true; +} + +bool BLFHandler::saveBLF(QString filename, QVector *frames) +{ return false; } diff --git a/blfhandler.h b/blfhandler.h index 15394c6..fc334c1 100644 --- a/blfhandler.h +++ b/blfhandler.h @@ -69,6 +69,7 @@ class BLFHandler public: BLFHandler(); bool loadBLF(QString filename, QVector* frames); + bool saveBLF(QString filename, QVector* frames); private: BLF_FILE_HEADER header; diff --git a/framefileio.cpp b/framefileio.cpp index c4b9d35..2255d26 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -594,7 +594,7 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector* frames) bool FrameFileIO::loadCanalyzerBLF(QString filename, QVector *frames) { BLFHandler blf; - blf.loadBLF(filename, frames); + return blf.loadBLF(filename, frames); } //The "native" file format for this program From 60abd154615e577de11d2a5ffc21f15051cbe18c Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 17 Apr 2018 20:01:53 -0400 Subject: [PATCH 30/33] Added a mode for TCP/IP network connection to a GVRET compatible device (ESP32RET supports this) --- connections/canconconst.h | 1 + connections/canconfactory.cpp | 12 ++-- connections/connectionwindow.cpp | 6 +- connections/gvretserial.cpp | 104 ++++++++++++++++++++++--------- connections/gvretserial.h | 3 + 5 files changed, 90 insertions(+), 36 deletions(-) diff --git a/connections/canconconst.h b/connections/canconconst.h index 386407a..fa117b3 100644 --- a/connections/canconconst.h +++ b/connections/canconconst.h @@ -17,6 +17,7 @@ namespace CANCon { GVRET_SERIAL, KVASER, SOCKETCAN, + REMOTE, NONE }; } diff --git a/connections/canconfactory.cpp b/connections/canconfactory.cpp index 259fd29..5042ac0 100644 --- a/connections/canconfactory.cpp +++ b/connections/canconfactory.cpp @@ -8,11 +8,13 @@ using namespace CANCon; CANConnection* CanConFactory::create(type pType, QString pPortName) { switch(pType) { - case SOCKETCAN: - return new SerialBusConnection(pPortName); - case GVRET_SERIAL: - return new GVRetSerial(pPortName); - default: {} + case SOCKETCAN: + return new SerialBusConnection(pPortName); + case GVRET_SERIAL: + return new GVRetSerial(pPortName); + case REMOTE: + return new GVRetSerial(pPortName); //it's a special case of GVRET connected over TCP/IP so it uses the same class + default: {} } return NULL; diff --git a/connections/connectionwindow.cpp b/connections/connectionwindow.cpp index 9ecd213..d0e3834 100644 --- a/connections/connectionwindow.cpp +++ b/connections/connectionwindow.cpp @@ -356,7 +356,7 @@ void ConnectionWindow::selectSocketCan() void ConnectionWindow::selectRemote() { - ui->lPort->setText("Access Key:"); + ui->lPort->setText("IP Address:"); ui->stPort->setCurrentWidget(ui->etPage); } @@ -394,6 +394,7 @@ void ConnectionWindow::setPortName(CANCon::type pType, QString pPortName) break; } case CANCon::SOCKETCAN: + case CANCon::REMOTE: { ui->lePort->setText(pPortName); break; @@ -416,6 +417,7 @@ QString ConnectionWindow::getPortName() case CANCon::KVASER: return ui->cbPort->currentText(); case CANCon::SOCKETCAN: + case CANCon::REMOTE: return ui->lePort->text(); default: qDebug() << "getPortName: can't get port"; @@ -429,7 +431,7 @@ CANCon::type ConnectionWindow::getConnectionType() if (ui->rbGVRET->isChecked()) return CANCon::GVRET_SERIAL; if (ui->rbKvaser->isChecked()) return CANCon::KVASER; if (ui->rbSocketCAN->isChecked()) return CANCon::SOCKETCAN; - + if (ui->rbRemote->isChecked()) return CANCon::REMOTE; qDebug() << "getConnectionType: error"; return CANCon::NONE; } diff --git a/connections/gvretserial.cpp b/connections/gvretserial.cpp index 0bc861c..98ecf54 100644 --- a/connections/gvretserial.cpp +++ b/connections/gvretserial.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "gvretserial.h" @@ -15,6 +16,7 @@ GVRetSerial::GVRetSerial(QString portName) : debugOutput("GVRetSerial()"); serial = NULL; + tcpClient = NULL; rx_state = IDLE; rx_step = 0; gotValidated = true; @@ -37,17 +39,24 @@ GVRetSerial::~GVRetSerial() void GVRetSerial::sendToSerial(const QByteArray &bytes) { - if (serial == NULL) + if (serial == NULL && tcpClient == NULL) { debugOutput("Attempt to write to serial port when it has not been initialized!"); return; } - if (!serial->isOpen()) + + if (serial && !serial->isOpen()) { debugOutput("Attempt to write to serial port when it is not open!"); return; } + if (tcpClient && !tcpClient->isOpen()) + { + debugOutput("Attempt to write to TCP/IP port when it is not open!"); + return; + } + QString buildDebug; buildDebug = "Write to serial -> "; foreach (int byt, bytes) { @@ -56,7 +65,8 @@ void GVRetSerial::sendToSerial(const QByteArray &bytes) } debugOutput(buildDebug); - serial->write(bytes); + if (serial) serial->write(bytes); + if (tcpClient) tcpClient->write(bytes); } void GVRetSerial::piStarted() @@ -271,29 +281,52 @@ void GVRetSerial::connectDevice() /* disconnect device */ if(serial) disconnectDevice(); + if(tcpClient) + disconnectDevice(); /* open new device */ - serial = new QSerialPort(QSerialPortInfo(getPort())); - if(!serial) { - qDebug() << "can't open serial port " << getPort(); - debugOutput("can't open serial port " + getPort()); - return; - } - debugOutput("Created Serial Port Object"); - - /* configure */ - serial->setDataBits(serial->Data8); - serial->setFlowControl(serial->HardwareControl); //this is important though - if (!serial->open(QIODevice::ReadWrite)) + if (getPort().contains('.')) //TCP/IP mode then since it looks like an IP address { - qDebug() << serial->errorString(); + tcpClient = new QTcpSocket(); + tcpClient->connectToHost(getPort(), 23); + connect(tcpClient, SIGNAL(readyRead()), this, SLOT(readSerialData())); + connect(tcpClient, SIGNAL(connected()), this, SLOT(tcpConnected())); } - serial->setDataTerminalReady(true); //you do need to set these or the fan gets dirty - serial->setRequestToSend(true); + else { + serial = new QSerialPort(QSerialPortInfo(getPort())); + if(!serial) { + qDebug() << "can't open serial port " << getPort(); + debugOutput("can't open serial port " + getPort()); + return; + } + debugOutput("Created Serial Port Object"); - debugOutput("Opened Serial Port"); + /* configure */ + serial->setDataBits(serial->Data8); + //serial->setFlowControl(serial->HardwareControl); //this is important though + serial->setFlowControl(serial->NoFlowControl); + serial->setBaudRate(1000000); + if (!serial->open(QIODevice::ReadWrite)) + { + qDebug() << serial->errorString(); + } + serial->setDataTerminalReady(false); //you do need to set these or the fan gets dirty + serial->setRequestToSend(false); + //serial->setDataTerminalReady(true); //you do need to set these or the fan gets dirty + //serial->setRequestToSend(true); + debugOutput("Opened Serial Port"); + /* connect reading event */ + connect(serial, SIGNAL(readyRead()), this, SLOT(readSerialData())); + connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(serialError(QSerialPort::SerialPortError))); + } + if (serial) tcpConnected(); //well, not a proper function name I guess... +} + +void GVRetSerial::tcpConnected() +{ + qDebug() << "Connected to GVRET Device!"; QByteArray output; output.append((unsigned char)0xE7); //this puts the device into binary comm mode output.append((unsigned char)0xE7); @@ -339,13 +372,8 @@ void GVRetSerial::connectDevice() stats.numHardwareBuses = mNumBuses; emit status(stats); } - - /* connect reading event */ - connect(serial, SIGNAL(readyRead()), this, SLOT(readSerialData())); - connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(serialError(QSerialPort::SerialPortError))); } - void GVRetSerial::disconnectDevice() { if (serial != NULL) { @@ -359,6 +387,16 @@ void GVRetSerial::disconnectDevice() { delete serial; serial = NULL; } + if (tcpClient != NULL) + { + if (tcpClient->isOpen()) + { + tcpClient->close(); + } + tcpClient->disconnect(); + delete tcpClient; + tcpClient = NULL; + } setStatus(CANCon::NOT_CONNECTED); CANConStatus stats; stats.conStatus = getStatus(); @@ -454,9 +492,13 @@ void GVRetSerial::connectionTimeout() void GVRetSerial::readSerialData() { - QByteArray data = serial->readAll(); + QByteArray data; unsigned char c; QString debugBuild; + + if (serial) data = serial->readAll(); + if (tcpClient) data = tcpClient->readAll(); + debugOutput("Got data from serial. Len = " % QString::number(data.length())); //qDebug() << (tr("Got data from serial. Len = %0").arg(data.length())); for (int i = 0; i < data.length(); i++) @@ -837,8 +879,11 @@ void GVRetSerial::procRXChar(unsigned char c) qDebug() << "SWCAN Baud = " << swcanBaud; qDebug() << "LIN1 Baud = " << lin1Baud; qDebug() << "LIN2 Baud = " << lin2Baud; - mBusData[2].mBus.setSpeed(swcanBaud); - mBusData[2].mBus.setEnabled(swcanEnabled); + if (getNumBuses() > 2) + { + mBusData[2].mBus.setSpeed(swcanBaud); + mBusData[2].mBus.setEnabled(swcanEnabled); + } setStatus(CANCon::CONNECTED); stats.conStatus = getStatus(); @@ -877,8 +922,8 @@ void GVRetSerial::handleTick() { if (!gotValidated && doValidation) { - if (serial == NULL) return; - if (serial->isOpen()) //if it's still false we have a problem... + if (serial == NULL && tcpClient == NULL) return; + if ( (serial && serial->isOpen()) || (tcpClient && tcpClient->isOpen())) //if it's still false we have a problem... { qDebug() << "Comm validation failed. "; @@ -894,6 +939,7 @@ void GVRetSerial::handleTick() else if (doValidation); //qDebug() << "Comm connection validated"; } if (doValidation && serial && serial->isOpen()) sendCommValidation(); + if (doValidation && tcpClient && tcpClient->isOpen()) sendCommValidation(); } diff --git a/connections/gvretserial.h b/connections/gvretserial.h index 345d0d8..6a54ad6 100644 --- a/connections/gvretserial.h +++ b/connections/gvretserial.h @@ -5,6 +5,7 @@ #include #include #include +#include /*************/ #include @@ -63,6 +64,7 @@ private slots: void connectionTimeout(); void readSerialData(); void serialError(QSerialPort::SerialPortError err); + void tcpConnected(); void handleTick(); private: @@ -81,6 +83,7 @@ protected: bool isAutoRestart; bool continuousTimeSync; QSerialPort *serial; + QTcpSocket *tcpClient; int framesRapid; STATE rx_state; uint32_t rx_step; From bc37da483d05ffca5501b51a58716b38e23e78e0 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 17 Apr 2018 20:04:00 -0400 Subject: [PATCH 31/33] Fix support in FlowView for realtime mode --- re/flowviewwindow.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index f0a87a7..84ab7e9 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -361,6 +361,9 @@ void FlowViewWindow::saveFileFlow() void FlowViewWindow::updatedFrames(int numFrames) { + QVectornewX[8]; + QVectornewY[8]; + CANFrame thisFrame; if (numFrames == -1) //all frames deleted. Kill the display { @@ -413,18 +416,18 @@ void FlowViewWindow::updatedFrames(int numFrames) if (ui->cbTimeGraph->isChecked()) { if (secondsMode){ - x[k].append((double)(thisFrame.timestamp) / 1000000.0); + newX[k].append((double)(thisFrame.timestamp) / 1000000.0); } else { - x[k].append(thisFrame.timestamp); + newX[k].append(thisFrame.timestamp); } } else { - x[k].append(x[k].count()); + newX[k].append(x[k].count()); } - y[k].append(thisFrame.data[k]); + newY[k].append(thisFrame.data[k]); needRefresh = true; } } @@ -440,7 +443,7 @@ void FlowViewWindow::updatedFrames(int numFrames) { for (int k = 0; k < 8; k++) { - graphRef[k]->setData(x[k], y[k]); + graphRef[k]->addData(newX[k], newY[k]); } ui->graphView->replot(); updateDataView(); From 87e159abbf36b439c89e2b5c07cc9bd7ee08972c Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 17 Apr 2018 20:04:34 -0400 Subject: [PATCH 32/33] Add script used to build documentation for SavvyCAN --- docs/build.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 docs/build.sh diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 0000000..2d567b1 --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,4 @@ +make qthelp +~/Qt/5.9.1/gcc_64/bin/qcollectiongenerator build/qthelp/SavvyCAN.qhcp +~/Qt/5.9.1/gcc_64/bin/assistant -collectionFile build/qthelp/SavvyCAN.qhc + From 827754aa1ced94d5eb8b045f3a9ff177964d95c8 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 23 Apr 2018 20:28:12 -0400 Subject: [PATCH 33/33] Remove some changes that only applied in a very specific circumstance, remove prototype and non general purpose entries from menus (you won't miss them) --- connections/gvretserial.cpp | 12 +++++----- mainwindow.cpp | 7 ++++++ ui/mainsettingsdialog.ui | 5 +++- ui/mainwindow.ui | 46 ++++++++++++++++++++++++++++++++++++- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/connections/gvretserial.cpp b/connections/gvretserial.cpp index 98ecf54..83a53ec 100644 --- a/connections/gvretserial.cpp +++ b/connections/gvretserial.cpp @@ -303,17 +303,17 @@ void GVRetSerial::connectDevice() /* configure */ serial->setDataBits(serial->Data8); - //serial->setFlowControl(serial->HardwareControl); //this is important though - serial->setFlowControl(serial->NoFlowControl); + serial->setFlowControl(serial->HardwareControl); //this is important though + //serial->setFlowControl(serial->NoFlowControl); serial->setBaudRate(1000000); if (!serial->open(QIODevice::ReadWrite)) { qDebug() << serial->errorString(); } - serial->setDataTerminalReady(false); //you do need to set these or the fan gets dirty - serial->setRequestToSend(false); - //serial->setDataTerminalReady(true); //you do need to set these or the fan gets dirty - //serial->setRequestToSend(true); + //serial->setDataTerminalReady(false); //you do need to set these or the fan gets dirty + //serial->setRequestToSend(false); + serial->setDataTerminalReady(true); //you do need to set these or the fan gets dirty + serial->setRequestToSend(true); debugOutput("Opened Serial Port"); /* connect reading event */ diff --git a/mainwindow.cpp b/mainwindow.cpp index be5883c..40df9e7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -135,6 +135,8 @@ MainWindow::MainWindow(QWidget *parent) : ui->statusBar->addWidget(&lbStatusConnected); ui->statusBar->addWidget(&lbStatusFilename); //ui->statusBar->addWidget(&lbStatusDatabase); + ui->lblRemoteConn->setVisible(false); + ui->lineRemoteKey->setVisible(false); ui->lbFPS->setText("0"); ui->lbNumFrames->setText("0"); @@ -168,6 +170,11 @@ MainWindow::MainWindow(QWidget *parent) : connectionWindow = new ConnectionWindow(); connect(this, SIGNAL(suspendCapturing(bool)), connectionWindow, SLOT(setSuspendAll(bool))); + ui->actionFirmware_Update->setVisible(false); + ui->actionMotorControlConfig->setVisible(false); + ui->actionSignal_Viewer->setVisible(false); + ui->actionSingle_Multi_State_2->setVisible(false); + installEventFilter(this); } diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index 05c7db9..1b790dd 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -7,7 +7,7 @@ 0 0 965 - 585 + 591 @@ -272,6 +272,9 @@ + + false + Remote Connection: diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 630c24b..26aa8df 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -26,7 +26,7 @@ SavvyCAN - + @@ -49,6 +49,47 @@ + + + + true + + + Remote Connection Active: + + + Qt::AlignCenter + + + + + + + true + + + + 1000 + 50 + + + + + 150 + 50 + + + + 8 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + @@ -159,6 +200,9 @@ + + false + Overwrite Mode

_DFA*5 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/ScriptingWindow.png b/docs/source/images/ScriptingWindow.png new file mode 100644 index 0000000000000000000000000000000000000000..95d39048401744e190e04df1feb8f33d4bfc6c4d GIT binary patch literal 139003 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