/*Copyright © 2018 Hasan Yavuz ÖzderyaThis file is part of serialplot.serialplot is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.serialplot is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with serialplot. If not, see <http://www.gnu.org/licenses/>.*/#include <QTime>#include <QMenuBar>#include <QKeySequence>#include <QFileDialog>#include <QFile>#include <QTextStream>#include <QVector>#include <QPointF>#include <QIcon>#include <QtDebug>#include "mainwindow.h"#include "snapshotmanager.h"SnapshotManager::SnapshotManager(MainWindow* mainWindow,ChannelManager* channelMan) :_menu("&Snapshots"),_takeSnapshotAction("&Take Snapshot", this),loadSnapshotAction("&Load Snapshots", this),clearAction("&Clear Snapshots", this){_mainWindow = mainWindow;_channelMan = channelMan;_takeSnapshotAction.setToolTip("Take a snapshot of current plot");_takeSnapshotAction.setShortcut(QKeySequence("F5"));_takeSnapshotAction.setIcon(QIcon::fromTheme("camera"));loadSnapshotAction.setToolTip("Load snapshots from CSV files");clearAction.setToolTip("Delete all snapshots");connect(&_takeSnapshotAction, SIGNAL(triggered(bool)),this, SLOT(takeSnapshot()));connect(&clearAction, SIGNAL(triggered(bool)),this, SLOT(clearSnapshots()));connect(&loadSnapshotAction, SIGNAL(triggered(bool)),this, SLOT(loadSnapshots()));updateMenu();}SnapshotManager::~SnapshotManager(){for (auto snapshot : snapshots){delete snapshot;}}Snapshot* SnapshotManager::makeSnapshot(){QString name = QTime::currentTime().toString("'Snapshot ['HH:mm:ss']'");auto snapshot = new Snapshot(_mainWindow, name, *(_channelMan->infoModel()));unsigned numOfChannels = _channelMan->numOfChannels();unsigned numOfSamples = _channelMan->numOfSamples();for (unsigned ci = 0; ci < numOfChannels; ci++){snapshot->data.append(QVector<QPointF>(numOfSamples));for (unsigned i = 0; i < numOfSamples; i++){snapshot->data[ci][i] = QPointF(i, _channelMan->channelBuffer(ci)->sample(i));}}return snapshot;}void SnapshotManager::takeSnapshot(){addSnapshot(makeSnapshot());}void SnapshotManager::addSnapshot(Snapshot* snapshot, bool update_menu){snapshots.append(snapshot);QObject::connect(snapshot, &Snapshot::deleteRequested,this, &SnapshotManager::deleteSnapshot);if (update_menu) updateMenu();}void SnapshotManager::updateMenu(){_menu.clear();_menu.addAction(&_takeSnapshotAction);_menu.addAction(&loadSnapshotAction);if (snapshots.size()){_menu.addSeparator();for (auto ss : snapshots){_menu.addAction(ss->showAction());}_menu.addSeparator();_menu.addAction(&clearAction);}}void SnapshotManager::clearSnapshots(){for (auto snapshot : snapshots){delete snapshot;}snapshots.clear();updateMenu();}void SnapshotManager::deleteSnapshot(Snapshot* snapshot){snapshots.removeOne(snapshot);snapshot->deleteLater(); // regular delete causes a crash when triggered from menuupdateMenu();}void SnapshotManager::loadSnapshots(){auto files = QFileDialog::getOpenFileNames(_mainWindow, tr("Load CSV File"));for (auto f : files){if (!f.isNull()) loadSnapshotFromFile(f);}updateMenu();}void SnapshotManager::loadSnapshotFromFile(QString fileName){QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){qCritical() << "Couldn't open file: " << fileName;qCritical() << file.errorString();return;}// read first row as headlines and determine number of channelsauto headLine = QString(file.readLine());QStringList channelNames = headLine.split(',');unsigned numOfChannels = channelNames.size();// read dataQVector<QVector<QPointF>> data(numOfChannels);QTextStream ts(&file);QString line;unsigned lineNum = 1;while (ts.readLineInto(&line)){// parse lineauto split = line.split(',');if (split.size() != (int) numOfChannels){qCritical() << "Parsing error at line " << lineNum<< ": number of columns is not consistent.";qCritical() << "Line " << lineNum << ": " << line;return;}for (unsigned ci = 0; ci < numOfChannels; ci++){// parse columnbool ok;double y = split[ci].toDouble(&ok);if (!ok){qCritical() << "Parsing error at line " << lineNum<< ", column " << ci<< ": can't convert \"" << split[ci]<< "\" to double.";return;}data[ci].append(QPointF(lineNum-1, y));}lineNum++;}auto snapshot = new Snapshot(_mainWindow, QFileInfo(fileName).baseName(),ChannelInfoModel(channelNames), true);snapshot->data = data;addSnapshot(snapshot, false);}QMenu* SnapshotManager::menu(){return &_menu;}QAction* SnapshotManager::takeSnapshotAction(){return &_takeSnapshotAction;}bool SnapshotManager::isAllSaved(){for (auto snapshot : snapshots){if (!snapshot->isSaved()) return false;}return true;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。