rendered paste body#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "canswerform.h"
#include <QPushButton>
#include <QFileDialog>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->questTextEdit->setEnabled(false);
createToolBar();
makeInterface();
}
void MainWindow::makeInterface()
{
QVBoxLayout *leftVbl = new QVBoxLayout;
leftVbl->addWidget(ui->questListView);
rightVbl = new QVBoxLayout;
rightVbl->addWidget(ui->questTextEdit, 1);
rightVbl->setSpacing(20);
testsWidget = new QWidget;
testsVbl = new QVBoxLayout;
testsWidget->setLayout(testsVbl);
ui->scrollArea->setWidget(testsWidget);
rightVbl->addWidget(ui->scrollArea,8);
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftVbl);
mainLayout->addLayout(rightVbl);
ui->centralWidget->setLayout(mainLayout);
}
void MainWindow::createToolBar()
{
//Add buttons into toolbar
newBtn = new QToolButton;
newBtn->setIcon(QIcon(":/icons/res/icons/filenew.png"));
newBtn->setToolTip(tr("Создать файл"));
newBtn->iconSize().setHeight(32);
newBtn->iconSize().setWidth(32);
connect(newBtn, SIGNAL(clicked()), this, SLOT(newFile()));
ui->mainToolBar->addWidget(newBtn);
loadBtn = new QToolButton;
loadBtn->setIcon(QIcon(":/icons/res/icons/fileopen.png"));
loadBtn->setToolTip(tr("Открыть файл"));
loadBtn->iconSize().setHeight(32);
loadBtn->iconSize().setWidth(32);
connect(loadBtn, SIGNAL(clicked()), this, SLOT(openFile()));
ui->mainToolBar->addWidget(loadBtn);
saveBtn = new QToolButton;
saveBtn->setIcon(QIcon(":/icons/res/icons/filesave.png"));
saveBtn->setToolTip(tr("Создать файл"));
saveBtn->iconSize().setHeight(32);
saveBtn->iconSize().setWidth(32);
connect(saveBtn, SIGNAL(clicked()), this, SLOT(saveFile()));
saveBtn->setEnabled(false);
ui->mainToolBar->addWidget(saveBtn);
ui->mainToolBar->addSeparator();
addQuest = new QToolButton;
addQuest->setIcon(QIcon(":/icons/res/icons/addquest.png"));
addQuest->setToolTip(tr("Создать файл"));
addQuest->iconSize().setHeight(32);
addQuest->iconSize().setWidth(32);
connect(addQuest, SIGNAL(clicked()), this, SLOT(addQuestion()));
addQuest->setEnabled(false);
ui->mainToolBar->addWidget(addQuest);
delQuest = new QToolButton;
delQuest->setIcon(QIcon(":/icons/res/icons/delquest.png"));
delQuest->setToolTip(tr("Создать файл"));
delQuest->iconSize().setHeight(32);
delQuest->iconSize().setWidth(32);
connect(delQuest, SIGNAL(clicked()), this, SLOT(delQuestion()));
delQuest->setEnabled(false);
ui->mainToolBar->addWidget(delQuest);
ui->mainToolBar->addSeparator();
saveQuestBtn = new QToolButton;
saveQuestBtn->setIcon(QIcon(":/icons/res/icons/savequest.png"));
saveQuestBtn->setToolTip(tr("Сохранить текущий вопрос"));
saveQuestBtn->iconSize().setHeight(32);
saveQuestBtn->iconSize().setWidth(32);
connect(saveQuestBtn, SIGNAL(clicked()), this, SLOT(saveItem()));
ui->mainToolBar->addWidget(saveQuestBtn);
saveQuestBtn->setEnabled(false);
addAnswerBtn = new QToolButton;
addAnswerBtn->setIcon(QIcon(":/icons/res/icons/add.png"));
addAnswerBtn->setToolTip(tr("Добавить ответ к вопросу"));
addAnswerBtn->iconSize().setHeight(32);
addAnswerBtn->iconSize().setWidth(32);
connect(addAnswerBtn, SIGNAL(clicked()), this, SLOT(addAnswer()));
addAnswerBtn->setEnabled(false);
ui->mainToolBar->addWidget(addAnswerBtn);
delAnswerBtn = new QToolButton;
delAnswerBtn->setIcon(QIcon(":/icons/res/icons/delanswer.png"));
delAnswerBtn->setToolTip(tr("Удалиить ответ"));
delAnswerBtn->iconSize().setHeight(32);
delAnswerBtn->iconSize().setWidth(32);
connect(delAnswerBtn, SIGNAL(clicked()), this, SLOT(delAnswer()));
delAnswerBtn->setEnabled(false);
ui->mainToolBar->addWidget(delAnswerBtn);
addPictBtn = new QToolButton;
addPictBtn->setIcon(QIcon(":/icons/res/icons/pict.png"));
addPictBtn->setToolTip(tr("Вставить картинку"));
addPictBtn->iconSize().setHeight(32);
addPictBtn->iconSize().setWidth(32);
connect(addPictBtn, SIGNAL(clicked()), this, SLOT(addPict()));
addPictBtn->setEnabled(false);
ui->mainToolBar->addWidget(addPictBtn);
ui->mainToolBar->addSeparator();
}
void MainWindow::openFile()
{
QString fileName;
fileName = QFileDialog::getOpenFileName(this, tr("Открыть файл..."), "", tr("Файлы тестов (*.t2p)"));
testModel = new CTestModel(fileName);
//Перенести в отдельный метод
ui->questListView->setModel(testModel);
selectionModel = ui->questListView->selectionModel();
connect(selectionModel, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(showSelectedItem( const QItemSelection &, const QItemSelection &)));
connect(this, SIGNAL(answerAdded(int,int)), testModel, SLOT(addEmptyAnswer(int,int)));
addQuest->setEnabled(true);
delQuest->setEnabled(true);
}
void MainWindow::saveFile()
{
saveBtn->setEnabled(false);
if (this->saveQuestBtn)
this->saveItem();
if (!testModel->writeTestList())
{
QMessageBox box(this);
box.setWindowTitle( tr("Test2Print") );
box.setText(tr("Ошибка записи в файл"));
box.setIcon( QMessageBox::Critical );
box.exec();
};
}
void MainWindow::addQuestion()
{
// if(!testModel->insertRow(testModel->rowCount()))
// {
// QMessageBox box(this);
// box.setWindowTitle( tr("QPass") );
// box.setText( tr("Error adding entry.") );
// box.setIcon( QMessageBox::Critical );
// box.exec();
// }
qDebug() << selectionModel;
selectionModel->clearSelection();
// selectionModel->setCurrentIndex(testModel->index(testModel->rowCount()-1, 0), QItemSelectionModel::SelectCurrent);
}
void MainWindow::delQuestion()
{
qDebug()<<"delQuest()";
}
void MainWindow::addAnswer()
{
CAnswerForm *answerForm = new CAnswerForm;
answerList.append(answerForm);
testsVbl->insertWidget(answerList.count()-1, answerForm);
connect(answerList.last(), SIGNAL(rightAnswerChecked()), this, SLOT(rightAnswerChecked()));
connect(answerList.last(), SIGNAL(answerChanged()), this, SLOT(answerChanged()));
connect(answerList.last(), SIGNAL(answerClicked(CAnswerForm*)), this, SLOT(answerClicked(CAnswerForm*)));
countAddAnswer++;
}
void MainWindow::delAnswer()
{
QModelIndex index;
index = selectionModel->selectedIndexes().at(0);
testModel->removeColumns(answerList.indexOf(this->curAnswerForm)*3+2,3,index);
answerList.remove(answerList.indexOf(this->curAnswerForm));
delete this->curAnswerForm;
}
void MainWindow::showSelectedItem( const QItemSelection & selected, const QItemSelection & deselected )
{
QModelIndexList list = selected.indexes();
QModelIndex item;
item = list[0];
int row = item.row();
if (list.count() == 1)
{
//Отображаем текст вопроса
ui->questTextEdit->setText((testModel->data(testModel->index(row, 1, item)).toString()));
//Создание ответов
int tmp=answerList.count();
for (int i=0; i<tmp; i++)
{
CAnswerForm *al;
al = answerList.last();
disconnect(al, SIGNAL(answerClicked(CAnswerForm*)), this, SLOT(answerClicked(CAnswerForm*)));
answerList.remove(answerList.count()-1);
delete al;
}
tmp=((testModel->columnCount(list[0])-2)/3);
/* 2 - заголовок вопроса из модели + текст вопроса из файла
* 3 - ответ содерижт текст ответа, верный ответ, коммент
*/
for (int i=0; i<tmp; i++)
{
CAnswerForm *al;
al = new CAnswerForm(this);
answerList.append(al);
testsVbl->insertWidget(i, answerList.last());
answerList.last()->show();
connect(answerList.last(), SIGNAL(rightAnswerChecked()), this, SLOT(rightAnswerChecked()));
connect(answerList.last(), SIGNAL(answerChanged()), this, SLOT(answerChanged()));
connect(answerList.last(), SIGNAL(answerClicked(CAnswerForm*)), this, SLOT(answerClicked(CAnswerForm*)));
}
}
//Обновляем все поля с ответами
for (int i=0; i<answerList.count(); i++)
{
answerList[i]->reset();
answerList[i]->setAnswer((testModel->data(testModel->index(row, i*3+2,item)).toString()));
answerList[i]->setRightAnswer((testModel->data(testModel->index(row, i*3+3,item)).toBool()));
}
saveQuestBtn->setEnabled(false);
saveBtn->setEnabled(false);
addAnswerBtn->setEnabled(true);
ui->questTextEdit->setEnabled(true);
countAddAnswer=0;
}
void MainWindow::saveItem()
{
//Создаем индекс на основе выделенного пользователем элемента listView
QModelIndex *index = new QModelIndex;
*index = selectionModel->selectedIndexes().at(0);
//проверка валидности itemа
int row;
if(index->isValid())
{
row = index->row();
if(row >= testModel->rowCount())
return;
}
else
row = selectionModel->selection().indexes()[0].row();
if (this->countAddAnswer > 0)
emit this->answerAdded(row, countAddAnswer);
//сохраняем все в модель
if(testModel->setData(testModel->index(row, 1,*index), ui->questTextEdit->toHtml()))
{
for (int i=0; i<answerList.count(); i++)
{
testModel->setData(testModel->index(row, i*3+2, *index), answerList.at(i)->getAnswer());
testModel->setData(testModel->index(row, i*3+3, *index), answerList.at(i)->isRightAnswer());
testModel->setData(testModel->index(row, i*3+4, *index), answerList.at(i)->getComment());
}
saveQuestBtn->setEnabled(false);
}
else
{
QMessageBox box(this);
box.setWindowTitle( tr("Test2Print") );
box.setText(tr("Ошибка сохранения"));
box.setIcon( QMessageBox::Critical );
box.exec();
}
countAddAnswer=0;
}
void MainWindow::rightAnswerChecked()
{
saveQuestBtn->setEnabled(true);
saveBtn->setEnabled(true);
}
void MainWindow::answerChanged()
{
saveQuestBtn->setEnabled(true);
saveBtn->setEnabled(true);
}
void MainWindow::commentChanged()
{
saveQuestBtn->setEnabled(true);
saveBtn->setEnabled(true);
}
void MainWindow::answerClicked(CAnswerForm *answerForm)
{
//запоминаем адрес answerForm'а,
//textEdit или checkBox которого получил фокус
this->curAnswerForm = answerForm;
this->delAnswerBtn->setEnabled(true);
}
void MainWindow::on_questTextEdit_textChanged()
{
saveQuestBtn->setEnabled(true);
saveBtn->setEnabled(true);
}
MainWindow::~MainWindow()
{
delete ui;
}