⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 actionwindow.cpp

📁 robocuo相关资料robocuo相关资料
💻 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()&&current_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 + -