All pastes #2056244 Raw Edit

Unnamed

public text v1 · immutable
#2056244 ·published 2011-05-10 13:52 UTC
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;
}