Mercurial > hg > octave-nkf
changeset 13330:583c15dd487b
Initial commit.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Tue, 05 Apr 2011 00:12:18 +0200 |
parents | |
children | 30469264a58f |
files | gui//Quint.pro gui//README gui//client.cpp gui//client.h gui//clientmanager.cpp gui//clientmanager.h gui//main.cpp gui//mainwindow.cpp gui//mainwindow.h gui//octaveterminal.cpp gui//octaveterminal.h |
diffstat | 11 files changed, 302 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/gui//Quint.pro @@ -0,0 +1,22 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-04-04T12:17:52 +# +#------------------------------------------------- + +QT += core gui webkit + +TARGET = Quint +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + octaveterminal.cpp \ + clientmanager.cpp \ + client.cpp + +HEADERS += mainwindow.h \ + octaveterminal.h \ + clientmanager.h \ + client.h
new file mode 100644 --- /dev/null +++ b/gui//client.cpp @@ -0,0 +1,29 @@ +#include "client.h" + +Client::Client(QString command) { + m_process.start(command, QProcess::ReadWrite); + connect(&m_process, SIGNAL(readyRead()), this, SLOT(reemitDataAvailable())); +} + +void Client::send(QString content) { + m_process.write(content.toLocal8Bit()); +} + +QString Client::fetch() { + QString fetchedInput(m_process.readAllStandardOutput()); + return fetchedInput; +} + +QString Client::errorMessage() { + QString error(m_process.readAllStandardError()); + return error; +} + +void Client::reemitDataAvailable() { + emit dataAvailable(); +} + +void Client::reemitErrorAvailable() { + emit errorAvailable(); +} +
new file mode 100644 --- /dev/null +++ b/gui//client.h @@ -0,0 +1,34 @@ +#ifndef CLIENT_H +#define CLIENT_H + +#include "clientmanager.h" +#include <QProcess> +#include <QObject> +#include <QMutex> + +class Client : public QObject { + Q_OBJECT + friend class ClientManager; + +public: + void send(QString content); + QString fetch(); + QString errorMessage(); + +signals: + void dataAvailable(); + void errorAvailable(); + +protected: + Client(QString command); + +private slots: + void reemitDataAvailable(); + void reemitErrorAvailable(); + +private: + QProcess m_process; + QMutex m_clientInRequest; +}; + +#endif // CLIENT_H
new file mode 100644 --- /dev/null +++ b/gui//clientmanager.cpp @@ -0,0 +1,16 @@ +#include "clientmanager.h" + +ClientManager ClientManager::m_clientManager; + +ClientManager::ClientManager() { +} + +ClientManager& ClientManager::clientManager() { + return ClientManager::m_clientManager; +} + +Client *ClientManager::startProcess(QString command) { + Client *client = new Client(command); + m_activeClients.push_back(client); + return client; +}
new file mode 100644 --- /dev/null +++ b/gui//clientmanager.h @@ -0,0 +1,21 @@ +#ifndef CLIENTMANAGER_H +#define CLIENTMANAGER_H + +#include <QList> +#include <QObject> +#include "client.h" + +class Client; +class ClientManager : public QObject { + Q_OBJECT +public: + static ClientManager& clientManager(); + Client *startProcess(QString command); + +private: + ClientManager(); + static ClientManager m_clientManager; + QList<Client*> m_activeClients; +}; + +#endif // CLIENTMANAGER_H
new file mode 100644 --- /dev/null +++ b/gui//main.cpp @@ -0,0 +1,11 @@ +#include <QtGui/QApplication> +#include "mainwindow.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +}
new file mode 100644 --- /dev/null +++ b/gui//mainwindow.cpp @@ -0,0 +1,37 @@ +#include "mainwindow.h" +#include "octaveterminal.h" + +#include <QMenuBar> +#include <QMenu> +#include <QAction> +#include <QtWebKit/QWebView> + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) { + showMaximized(); + m_mdiArea = new QMdiArea(); + setCentralWidget(m_mdiArea); + + addOctaveTerminal(); + loadWebPage("Online Manual", "http://www.gnu.org/software/octave/doc/interpreter/"); + m_mdiArea->setViewMode(QMdiArea::TabbedView); +} + +MainWindow::~MainWindow() { + +} + +void MainWindow::addOctaveTerminal() { + OctaveTerminal *octaveTerminal = new OctaveTerminal; + m_mdiArea->addSubWindow(octaveTerminal); + Client *octaveClient = ClientManager::clientManager().startProcess("octave"); + octaveTerminal->assignClient(octaveClient); +} + +void MainWindow::loadWebPage(QString title, QString url) { + + QWebView *webView = new QWebView(); + webView->setWindowTitle(title); + webView->load(QUrl(url)); + m_mdiArea->addSubWindow(webView); +}
new file mode 100644 --- /dev/null +++ b/gui//mainwindow.h @@ -0,0 +1,22 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QtGui/QMainWindow> +#include <QMdiArea> + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = 0); + ~MainWindow(); + + void addOctaveTerminal(); + void loadWebPage(QString title, QString url); + +private: + QMdiArea *m_mdiArea; +}; + +#endif // MAINWINDOW_H
new file mode 100644 --- /dev/null +++ b/gui//octaveterminal.cpp @@ -0,0 +1,71 @@ +#include "octaveterminal.h" +#include <QVBoxLayout> + + +OctaveTerminal::OctaveTerminal(QWidget *parent) : + QMdiSubWindow(parent), + m_client(0) { + setWindowTitle("Octave Terminal"); + + setWidget(new QWidget(this)); + m_menuBar = new QMenuBar(widget()); + m_octaveOutput = new QTextBrowser(widget()); + m_commandLine = new QLineEdit(widget()); + + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(m_menuBar); + layout->addWidget(m_octaveOutput); + layout->addWidget(m_commandLine); + widget()->setLayout(layout); + + QMenu *octaveMenu = m_menuBar->addMenu("Octave"); + QAction *showEnvironmentAction = octaveMenu->addAction("Show Environment (who)"); + + m_octaveOutput->setFontFamily("Monospace"); + m_octaveOutput->setReadOnly(true); + + blockUserInput(); + connect(m_commandLine, SIGNAL(returnPressed()), this, SLOT(sendCommand())); + connect(showEnvironmentAction, SIGNAL(triggered()), this, SLOT(showEnvironment())); +} + +void OctaveTerminal::sendCommand() { + QString command = m_commandLine->text(); + m_octaveOutput->setFontUnderline(true); + m_octaveOutput->append(command); + command.append("\n"); + m_client->send(command); + m_commandLine->clear(); +} + +void OctaveTerminal::blockUserInput() { + m_commandLine->setEnabled(false); +} + +void OctaveTerminal::allowUserInput() { + m_commandLine->setEnabled(true); + m_commandLine->setFocus(); +} + +void OctaveTerminal::assignClient(Client *client) { + m_client = client; + connect(client, SIGNAL(dataAvailable()), this, SLOT(fetchDataFromClient())); + connect(client, SIGNAL(errorAvailable()), this, SLOT(fetchErrorFromClient())); + allowUserInput(); +} + +void OctaveTerminal::showEnvironment() { + m_client->send("who\n"); +} + +void OctaveTerminal::fetchDataFromClient() { + QString fetchedData = m_client->fetch(); + m_octaveOutput->setFontUnderline(false); + m_octaveOutput->append(fetchedData); +} + +void OctaveTerminal::fetchErrorFromClient() { + QString error = m_client->errorMessage(); + m_octaveOutput->setFontUnderline(false); + m_octaveOutput->append(error); +}
new file mode 100644 --- /dev/null +++ b/gui//octaveterminal.h @@ -0,0 +1,39 @@ +#ifndef OCTAVETERMINAL_H +#define OCTAVETERMINAL_H + +#include <QMdiSubWindow> +#include <QLineEdit> +#include <QTextBrowser> +#include <QAction> +#include <QMenuBar> +#include <QMenu> + +#include "client.h" + +class OctaveTerminal : public QMdiSubWindow { + Q_OBJECT +public: + explicit OctaveTerminal(QWidget *parent = 0); + +signals: + +public slots: + void sendCommand(); + void blockUserInput(); + void allowUserInput(); + + void assignClient(Client* client); + void showEnvironment(); + +protected slots: + void fetchDataFromClient(); + void fetchErrorFromClient(); + +private: + QMenuBar *m_menuBar; + QTextBrowser *m_octaveOutput; + QLineEdit *m_commandLine; + Client *m_client; +}; + +#endif // OCTAVETERMINAL_H