PageRenderTime 26ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/examinationroom/src/ui/codewidget.cpp

https://github.com/cbreak-black/ExaminationRoom
C++ | 172 lines | 130 code | 21 blank | 21 comment | 6 complexity | b3e07a62ea7b4e406c79581ea9f0cd52 MD5 | raw file
  1. /*
  2. * codewidget.cpp
  3. * ExaminationRoom
  4. *
  5. * Created by cbreak on 29.05.08.
  6. * Copyright 2008 Gerhard Roethlin. All rights reserved.
  7. *
  8. */
  9. #include "codewidget.h"
  10. #include "program.h"
  11. #include <QAction>
  12. #include <QPushButton>
  13. #include <QSplitter>
  14. #include <QVBoxLayout>
  15. #include <QHBoxLayout>
  16. #include <QListWidget>
  17. #include <QTextEdit>
  18. #include <QUrl>
  19. #include <QFileDialog>
  20. #include <QFileInfo>
  21. #include <QDesktopServices>
  22. #include <QTextStream>
  23. namespace Examination
  24. {
  25. CodeWidget::CodeWidget(const QString &title, QWidget *parent, Qt::WindowFlags flags)
  26. : QDockWidget(title, parent, flags)
  27. {
  28. QSplitter * splitter = new QSplitter(Qt::Vertical, this);
  29. setWidget(splitter);
  30. // QAction * newAction = new QAction(tr("New"), this);
  31. // QAction * addAction = new QAction(tr("Add..."), this);
  32. // QAction * remAction = new QAction(tr("Remove"), this);
  33. // remAction->setShortcut(QKeySequence::Delete);
  34. // connect(newAction, SIGNAL(triggered()),
  35. // this, SLOT(newFile()));
  36. // connect(addAction, SIGNAL(triggered()),
  37. // this, SLOT(addFile()));
  38. // addAction(remAction);
  39. // connect(remAction, SIGNAL(triggered()),
  40. // this, SLOT(removeFile()));
  41. QWidget * buttonWidget = new QWidget();
  42. QHBoxLayout * buttonLayout = new QHBoxLayout();
  43. buttonWidget->setLayout(buttonLayout);
  44. QPushButton * pbNew = new QPushButton(tr("New"));
  45. QPushButton * pbAdd = new QPushButton(tr("Add..."));
  46. QPushButton * pbRem = new QPushButton(tr("Remove"));
  47. buttonLayout->addWidget(pbNew);
  48. buttonLayout->addWidget(pbAdd);
  49. buttonLayout->addWidget(pbRem);
  50. connect(pbNew, SIGNAL(clicked()),
  51. this, SLOT(newFile()));
  52. connect(pbAdd, SIGNAL(clicked()),
  53. this, SLOT(addFile()));
  54. connect(pbRem, SIGNAL(clicked()),
  55. this, SLOT(removeFile()));
  56. fileListView_ = new QListWidget();
  57. connect(fileListView_, SIGNAL(itemActivated(QListWidgetItem *)),
  58. this, SLOT(editFile(QListWidgetItem *)));
  59. connect(fileListView_, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
  60. this, SLOT(previewFile(QListWidgetItem *)));
  61. QWidget * topWidget = new QWidget();
  62. QVBoxLayout * topLayout = new QVBoxLayout();
  63. topWidget->setLayout(topLayout);
  64. topLayout->addWidget(buttonWidget);
  65. topLayout->addWidget(fileListView_);
  66. filePreview_ = new QTextEdit();
  67. filePreview_->setReadOnly(true);
  68. filePreview_->setFontFamily("Courier");
  69. filePreview_->setFontPointSize(11);
  70. splitter->addWidget(topWidget);
  71. splitter->addWidget(filePreview_);
  72. }
  73. // Accessors
  74. std::tr1::shared_ptr<Program> CodeWidget::program() const
  75. {
  76. return program_.lock();
  77. }
  78. void CodeWidget::setProgram(std::tr1::shared_ptr<Program> program)
  79. {
  80. using namespace std::tr1::placeholders;
  81. program_ = program;
  82. program->setCallbackFileLoad(std::tr1::bind(&CodeWidget::fileLoaded, this, _1));
  83. fileListView_->clear();
  84. }
  85. void CodeWidget::fileLoaded(const std::string & path)
  86. {
  87. new QListWidgetItem(QString::fromStdString(path), fileListView_);
  88. }
  89. void CodeWidget::newFile()
  90. {
  91. QString fileName = QFileDialog::getSaveFileName(this, "Save LUA File",
  92. "res/",
  93. "Lua Scene File (*.lua)");
  94. if (!fileName.isNull())
  95. {
  96. QFile outFile(fileName);
  97. outFile.open(QFile::WriteOnly | QFile::Text);
  98. outFile.write(QByteArray("-- Insert LUA code here\n"));
  99. QDir dir(QDir::currentPath());
  100. program()->loadLua(dir.relativeFilePath(fileName).toStdString());
  101. }
  102. }
  103. void CodeWidget::addFile()
  104. {
  105. // Set up lua engine and bindings
  106. QString fileName = QFileDialog::getOpenFileName(this, "Open LUA File",
  107. "res/scene.lua",
  108. "Lua Scene File (*.lua)");
  109. if (!fileName.isNull())
  110. {
  111. QDir dir(QDir::currentPath());
  112. program()->loadLua(dir.relativeFilePath(fileName).toStdString());
  113. }
  114. }
  115. void CodeWidget::removeFile()
  116. {
  117. QListWidgetItem * lwi = fileListView_->currentItem();
  118. if (program()->removeLua(lwi->text().toStdString()))
  119. {
  120. fileListView_->takeItem(fileListView_->currentRow());
  121. fileListView_->setCurrentRow(-1);
  122. delete lwi;
  123. }
  124. }
  125. void CodeWidget::editFile(QListWidgetItem * file)
  126. {
  127. QFileInfo inputFileInfo(file->text());
  128. if (inputFileInfo.exists())
  129. {
  130. QUrl fileUrl(inputFileInfo.absoluteFilePath());
  131. fileUrl.setScheme("file");
  132. QDesktopServices::openUrl(fileUrl);
  133. }
  134. }
  135. void CodeWidget::previewFile(QListWidgetItem * file)
  136. {
  137. if (file)
  138. {
  139. QFile inputFile(file->text());
  140. if (inputFile.open(QFile::ReadOnly | QFile::Text))
  141. {
  142. QTextStream stream(&inputFile);
  143. filePreview_->setPlainText(stream.readAll());
  144. }
  145. }
  146. else
  147. {
  148. filePreview_->clear();
  149. }
  150. }
  151. }