📄 actionwindow.cpp
字号:
#include <fstream>#include <iostream>#include <sstream>#include <assert.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stddef.h>#include <stdio.h>#include <dirent.h>#include <QCloseEvent>#include <QMessageBox>#include <QTextStream>#include "ActionWindow.h"#include "ActionList.h"#include "ui_ActionWindow.h"#include "ActionList.h"#include "ui_ActionList.h"#include "NewState.h"#include "ui_NewState.h"#include "SendState.h"#include "ui_SendState.h"using namespace std;void ActionWindow::MakeArray(){ angles[0] = ui->ra1a; angles[1] = ui->la1a; angles[2] = ui->ra2a; angles[3] = ui->la2a; angles[4] = ui->ra3a; angles[5] = ui->la3a; angles[6] = ui->ra4a; angles[7] = ui->la4a; angles[8] = ui->rl1a; angles[9] = ui->ll1a; angles[10] = ui->rl2a; angles[11] = ui->ll2a; angles[12] = ui->rl3a; angles[13] = ui->ll3a; angles[14] = ui->rl4a; angles[15] = ui->ll4a; angles[16] = ui->rl5a; angles[17] = ui->ll5a; angles[18] = ui->rl6a; angles[19] = ui->ll6a; gains[0] = ui->ra1g; gains[1] = ui->la1g; gains[2] = ui->ra2g; gains[3] = ui->la2g; gains[4] = ui->ra3g; gains[5] = ui->la3g; gains[6] = ui->ra4g; gains[7] = ui->la4g; gains[8] = ui->rl1g; gains[9] = ui->ll1g; gains[10] = ui->rl2g; gains[11] = ui->ll2g; gains[12] = ui->rl3g; gains[13] = ui->ll3g; gains[14] = ui->rl4g; gains[15] = ui->ll4g; gains[16] = ui->rl5g; gains[17] = ui->ll5g; gains[18] = ui->rl6g; gains[19] = ui->ll6g; precisions[0] = ui->ra1p; precisions[1] = ui->la1p; precisions[2] = ui->ra2p; precisions[3] = ui->la2p; precisions[4] = ui->ra3p; precisions[5] = ui->la3p; precisions[6] = ui->ra4p; precisions[7] = ui->la4p; precisions[8] = ui->rl1p; precisions[9] = ui->ll1p; precisions[10] = ui->rl2p; precisions[11] = ui->ll2p; precisions[12] = ui->rl3p; precisions[13] = ui->ll3p; precisions[14] = ui->rl4p; precisions[15] = ui->ll4p; precisions[16] = ui->rl5p; precisions[17] = ui->ll5p; precisions[18] = ui->rl6p; precisions[19] = ui->ll6p;}void ActionWindow::MakeConnections(){ QObject::connect(ui->min_time, SIGNAL(textEdited(QString)), this, SLOT(fields_edited())); QObject::connect(ui->max_time, SIGNAL(textEdited(QString)), this, SLOT(fields_edited()));/* QObject::connect(ui->action_name, SIGNAL(textEdited(QString)), this, SLOT(fields_edited())); QObject::connect(ui->repeat_index, SIGNAL(valueChanged(int)), this, SLOT(fields_edited()));*/ for(int i=0;i<20;i++) { QObject::connect(angles[i], SIGNAL(textEdited(QString)), this, SLOT(fields_edited())); QObject::connect(gains [i], SIGNAL(textEdited(QString)), this, SLOT(fields_edited())); QObject::connect(precisions[i], SIGNAL(valueChanged(int)), this, SLOT(fields_edited())); }}ActionWindow::ActionWindow(){ setFixedSize(500,570); listDialog = new ActionList(); listDialog->setFixedSize(150,190); insertDialog = new NewState(); insertDialog->setFixedSize(170,204); sendDialog = new SendState(this,&pipe); sendDialog->setFixedSize(240,120); emitting_by_code = false; ui = new Ui_ActionEditor; ui->setupUi(this); ui->select->setTracking(true); MakeArray(); MakeConnections(); modified = false; on_New_clicked(); fileDialog = NULL; mkfifo("mkfifo /tmp/trainer_pipe", 0666); pipe=0;}bool ActionWindow::AskForSave(){ int ret = QMessageBox::question(this, tr("Trainer"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save); if(ret==QMessageBox::Save) { if(fileName=="") return on_saveas_clicked(); else { on_save_clicked(); return true; } }else return ret==QMessageBox::Discard;}void ActionWindow::on_New_clicked(){ if(!modified || AskForSave()) { fileName = ""; modified = false; actionList.clear(); actionList.push_back(action()); act = &actionList[0]; ApplyAction(); }}void ActionWindow::on_open_clicked(){ if(!modified || AskForSave()) { QString dir="/home"; if(fileName != "") { int i; for(i=int(fileName.length())-1; i>=0&&fileName[i]!='/'; i--); dir = fileName.left(i); } QString s; if(fileDialog==NULL) { fileDialog = new QFileDialog(this, "Open File", dir, "Action files (*.rad)"); fileDialog->setDefaultSuffix("rad"); } fileDialog->setWindowTitle("Open File"); fileDialog->setDirectory(dir); fileDialog->setAcceptMode(QFileDialog::AcceptOpen); fileDialog->setFileMode(QFileDialog::ExistingFile); int x=fileDialog->exec(); QStringList l=fileDialog->selectedFiles(); if(x && l.size() && (s = l[0]) != "") { fileName = s; OpenFile(); } }}void ActionWindow::on_save_clicked(){ if(fileName!="") { ofstream out(fileName.toStdString().c_str()); for(unsigned i=0;i<actionList.size();i++) actionList[i].save(out); modified = false; UpdateControls(); }}bool ActionWindow::on_saveas_clicked(){ QString dir="/home"; if(fileName != "") { int i; for(i=int(fileName.length())-1; i>=0&&fileName[i]!='/'; i--); dir = fileName.left(i); } if(fileDialog==NULL) { fileDialog = new QFileDialog(this, "Open File", dir, "Action files (*.rad)"); fileDialog->setDefaultSuffix("rad"); } fileDialog->setWindowTitle("Save File"); fileDialog->setDirectory(dir); fileDialog->setAcceptMode(QFileDialog::AcceptSave); fileDialog->setFileMode(QFileDialog::AnyFile); int x = fileDialog->exec(); QStringList l=fileDialog->selectedFiles(); /*cout<<x<<" "<<l.size()<<endl; for(int i=0;i<l.size();i++) cout<<l[i].toStdString()<<endl; */ if(x && l.size() && l[0]!="") { fileName = l[0]; on_save_clicked(); return true; } return false;}void ActionWindow::OpenFile(){ ifstream fin(fileName.toStdString().c_str()); actionList.clear(); action tmp; while(tmp.load(fin)) actionList.push_back(tmp); int n=actionList.size(); if(n==0) QMessageBox::critical(this, "Warning", "Empty or bad formated File"); else { listDialog->ui->list->clear(); for(int i=n-1;i>=0;i--) listDialog->ui->list->insertItem(0, QString::fromStdString(actionList[i].name)); listDialog->selected = -1; listDialog->exec(); if(listDialog->selected == -1) return; n = listDialog->selected; act = &actionList[n]; modified = false; UpdateControls(); ApplyAction(); ui->actionList->clear(); n = actionList.size(); for(int i=n-1;i>=0;i--) ui->actionList->insertItem(0, QString::fromStdString(actionList[i].name)); }}void ActionWindow::on_actionList_itemDoubleClicked(QListWidgetItem *item){ int selected = ui->actionList->row(item); act = &actionList[selected]; modified = false; UpdateControls(); ApplyAction();}void ActionWindow::ApplyAction(){ ui->action_name -> setText(QString::fromStdString(act->name)); emitting_by_code=true; ui->repeat_index-> setValue(act->repeat); emitting_by_code=false; current_state = 0; UpdateControls();}void ActionWindow::UpdateControls(){ emitting_by_code = true; ui->save->setEnabled(modified&&fileName!=""); ui->repeat_index->setMaximum(act->arr.size()); if(ui->repeat_index->value() > act->arr.size()) ui->repeat_index->setValue(act->arr.size()); ui->select->setMaximum(max(int(act->arr.size())-1,0)); ui->select->resize( min(26+(30*max(int(act->arr.size())-1 , 0)) , 280) , 16 ); ui->select->setEnabled(act->arr.size()); ui->State ->setEnabled(act->arr.size()); ui->remove->setEnabled(act->arr.size()); ui->go_left ->setEnabled(act->arr.size()>1 && current_state>0); ui->go_right->setEnabled(act->arr.size()>1 && current_state<int(act->arr.size())-1); state *s,t; if(act->arr.size()==0) s=&t; else s=&(act->arr[current_state]); ui->select->setValue(current_state); QString str; QTextStream(&str) << current_state << " / " << act->arr.size(); ui->state->setText(str); if(s->min_time<0) ui->min_time->setText(""); else ui->min_time->setText(QString::number(s->min_time,'f',1)); if(s->max_time<0) ui->max_time->setText(""); else ui->max_time->setText(QString::number(s->max_time,'f',1)); for(int i=0;i<20;i++) if(s->imp[i]) { angles[i]->setText(QString::number(s->angle[i],'f',0)); gains[i]->setText(QString::number(s->gain[i],'f',0)); precisions[i]->setValue((int)(s->precision[i])); }else { angles[i]->setText(""); gains[i]->setText(""); precisions[i]->setValue(3); } emitting_by_code = false;}void ActionWindow::on_action_name_textEdited(const QString &q){// cout<<q.toStdString()<<" "<<ui->action_name->text().toStdString()<<endl; QString p = q.simplified(); for(int i=0;i<p.length();i++) if(p[i].isSpace()) p[i]='_'; ui->action_name->setText(p); if(p=="") p="_"; act->name = p.toStdString(); modified = true;}void ActionWindow::on_repeat_index_valueChanged(int a){ if(emitting_by_code) return ; act->repeat = a; modified = true; UpdateControls();}void ActionWindow::on_select_valueChanged(int a){ current_state = a; UpdateControls();}void ActionWindow::on_insert_clicked(){ insertDialog->ui->select->setMaximum(act->arr.size()); insertDialog->ui->select->setValue(act->arr.size()); insertDialog->sel=-1; insertDialog->n=act->arr.size()+1; insertDialog->on_select_valueChanged(act->arr.size()); insertDialog->ui->frame->setEnabled(act->arr.size()); insertDialog->ui->New->setChecked(true); insertDialog->ui->select->setEnabled(act->arr.size()); insertDialog->exec(); if(insertDialog->sel!=-1) { if(insertDialog->ui->New->isChecked()) act->arr.insert(act->arr.begin()+insertDialog->sel,state()); else act->arr.insert(act->arr.begin()+insertDialog->sel,act->arr[current_state]); current_state = insertDialog->sel; modified = true; UpdateControls(); }}void ActionWindow::on_remove_clicked(){ assert(act->arr.size()); act->arr.erase(act->arr.begin()+current_state); if(current_state==act->arr.size()&¤t_state) current_state--; modified = true; UpdateControls();}void ActionWindow::on_go_left_clicked(){ assert(current_state); swap(act->arr[current_state],act->arr[current_state-1]); current_state--; modified = true; UpdateControls(); }void ActionWindow::on_go_right_clicked(){ assert(current_state<int(act->arr.size())-1); swap(act->arr[current_state],act->arr[current_state+1]); current_state++; modified = true; UpdateControls();}void ActionWindow::fields_edited(){ if(emitting_by_code) return; assert(act->arr.size()); modified = true; QString s,t; ui->min_time->setText(s=ui->min_time->text().simplified()); if(s=="") act->arr[current_state].min_time = -1; else act->arr[current_state].min_time = s.toDouble(); ui->max_time->setText(s=ui->max_time->text().simplified()); if(s=="") act->arr[current_state].max_time = -1; else act->arr[current_state].max_time = s.toDouble(); for(int i=0;i<20;i++) { s=angles[i]->text().simplified(); t=gains[i]->text().simplified(); if(s=="" && t=="") act->arr[current_state].imp[i] = false; else { act->arr[current_state].imp[i] = true; act->arr[current_state].angle[i] = s.toDouble(); act->arr[current_state].gain[i] = t.toDouble(); act->arr[current_state].precision[i] = precisions[i]->value(); } } if(fileName!="") ui->save->setEnabled(true);}void ActionWindow::on_clear_clicked(){ emitting_by_code = true; ui->min_time->setText(""); ui->max_time->setText(""); for(int i=0;i<20;i++) { angles[i]->setText(""); gains[i]->setText(""); precisions[i]->setValue(3); } emitting_by_code = false; fields_edited();}void ActionWindow::on_zero_clicked(){ emitting_by_code = true; ui->min_time->setText("100"); ui->max_time->setText("100"); for(int i=0;i<20;i++) { angles[i]->setText("0"); gains[i]->setText("10"); precisions[i]->setValue(3); } emitting_by_code = false; fields_edited();}void ActionWindow::SaveChange(const string &s){ cout<<s<<endl;}void ActionWindow::on_send_action_clicked(){ if(pipe==0) pipe=open("/tmp/trainer_pipe", O_RDWR | O_NONBLOCK); ostringstream oss; act->save(oss); string s=oss.str(); write(pipe, s.c_str(), s.length());}void ActionWindow::on_send_action_2_clicked(){ sendDialog->ui->from->setMaximum(act->arr.size()-1); sendDialog->ui->from->setValue(0); sendDialog->ui-> to ->setMaximum(act->arr.size()-1); sendDialog->ui-> to ->setMaximum(act->arr.size()-1); sendDialog->show();}void ActionWindow::closeEvent(QCloseEvent *event){ if(modified) if(AskForSave()) event->accept(); else event->ignore();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -