Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(revision 70607)
+++ CMakeLists.txt	(working copy)
@@ -39,6 +39,8 @@
     main.cpp
     MainWindow.cpp
     ObjectsTreeView.cpp
+    LogView.cpp
+    ConsoleView.cpp
 )
 
 include_directories(${BRLCAD_INCLUDE_DIR})
Index: ConsoleView.cpp
===================================================================
--- ConsoleView.cpp	(nonexistent)
+++ ConsoleView.cpp	(working copy)
@@ -0,0 +1,114 @@
+/*                         C A M E R A V I E W . C P P
+ * BRL-CAD
+ *
+ * Copyright (c) 2018 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file ConsoleView.cpp
+ *
+ *  BRL-CAD Qt GUI:
+ *      implementation console command view
+ */
+
+#include "ConsoleView.h"
+
+#include <QScrollBar>
+#include <QTime> 
+
+ConsoleView::ConsoleView
+(
+    BRLCAD::ConstDatabase& database,
+    QWidget*               parent
+) : QPlainTextEdit(parent), m_database(database) {
+
+    // connect logger to brlcad 
+    document()->setMaximumBlockCount(100);
+    setUndoRedoEnabled(false);
+    m_userIdentity = "_user_"; 
+    ProcessCommandRequest("_message_"); 
+    CreateNewline(); 
+}
+
+void ConsoleView::CreateNewline(void) 
+{
+    QTime time          = QTime::currentTime(); 
+    QString currentTime = time.toString("hh:mm:ss");
+    appendPlainText(m_userIdentity + "@" + currentTime + " $  ");
+    m_fixedPosition = textCursor().position(); 
+}
+
+void ConsoleView::ProcessCommandRequest(const QString& input)
+{ 
+    // Output the response 
+    if(!input.isEmpty()) 
+    {
+        appendPlainText(input); 
+    }       
+}
+
+void ConsoleView::keyPressEvent(QKeyEvent *e)
+{
+    bool valid; 
+    switch (e->key()) 
+    {
+        case Qt::Key_Left:
+        case Qt::Key_Right:
+        case Qt::Key_Up:
+        case Qt::Key_Down:
+            valid = false; 
+            break; 
+        case Qt::Key_Backspace:
+            valid = textCursor().position() > m_fixedPosition; 
+            break; 
+        case Qt::Key_Return: 
+            ProcessCommandRequest(QString::number(m_fixedPosition)); 
+            CreateNewline(); 
+            valid = false; 
+            break; 
+        default:
+            valid = textCursor().position() >= m_fixedPosition;
+            break; 
+    }
+
+    if(valid)
+        QPlainTextEdit::keyPressEvent(e);   
+}
+
+void ConsoleView::mousePressEvent(QMouseEvent *e)
+{
+    Q_UNUSED(e)
+    setFocus();
+}
+
+void ConsoleView::mouseDoubleClickEvent(QMouseEvent *e)
+{
+    Q_UNUSED(e)
+}
+
+void ConsoleView::contextMenuEvent(QContextMenuEvent *e)
+{
+    Q_UNUSED(e)
+}
+
+ConsoleView::~ConsoleView(void)
+{
+}
+
Index: ConsoleView.h
===================================================================
--- ConsoleView.h	(nonexistent)
+++ ConsoleView.h	(working copy)
@@ -0,0 +1,63 @@
+/*                           C A M E R A V I E W . H
+ * BRL-CAD
+ *
+ * Copyright (c) 2018 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file ConsoleView.h
+ *
+ *  BRL-CAD Qt GUI:
+ *      declaration console command view
+ */
+
+
+#ifndef CONSOLEVIEW_H
+#define CONSOLEVIEW_H
+
+#include <QPlainTextEdit>
+
+#include <brlcad/ConstDatabase.h>
+#include <brlcad/globals.h>
+
+class ConsoleView : public QPlainTextEdit
+{
+    Q_OBJECT
+
+public:
+    ConsoleView(BRLCAD::ConstDatabase& database,
+                QWidget*               parent = 0);
+    ~ConsoleView(void); 
+protected:
+    void keyPressEvent(QKeyEvent *e)            override;
+    void mousePressEvent(QMouseEvent *e)        override;
+    void mouseDoubleClickEvent(QMouseEvent *e)  override;
+    void contextMenuEvent(QContextMenuEvent *e) override;
+
+private:
+    BRLCAD::ConstDatabase&  m_database;
+    int                     m_fixedPosition; 
+    QString                 m_userIdentity; 
+
+    void ProcessCommandRequest(const QString& input); 
+    void CreateNewline(void); 
+};
+
+#endif // CONSOLEVIEW_H
\ No newline at end of file
Index: LogView.cpp
===================================================================
--- LogView.cpp	(nonexistent)
+++ LogView.cpp	(working copy)
@@ -0,0 +1,58 @@
+/*                         C A M E R A V I E W . C P P
+ * BRL-CAD
+ *
+ * Copyright (c) 2018 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file LogView.cpp
+ *
+ *  BRL-CAD Qt GUI:
+ *      implementation log output view
+ */
+
+#include "LogView.h"
+
+class LogHandler : public BRLCAD::LogHandler 
+{
+public: 
+    LogHandler(LogView* editor) : m_editor(editor){editor->appendPlainText("hi");}
+    void operator()(const char* logString) {
+        m_editor->appendPlainText(QString::fromUtf8(logString));
+    }
+protected: 
+    LogHandler(const LogHandler&){}
+    const LogHandler& operator=(const LogHandler&) { return *this; }
+private: 
+    LogView* m_editor = nullptr;
+}; 
+
+
+LogView::LogView
+(
+    QWidget*       parent
+) : QPlainTextEdit(parent) {
+    LogHandler* logHandler = new LogHandler(this); 
+    BRLCAD::RegisterLogHandler(*logHandler); 
+    document()->setMaximumBlockCount(100);
+    setUndoRedoEnabled(false);
+    setReadOnly(true);
+}
+
Index: LogView.h
===================================================================
--- LogView.h	(nonexistent)
+++ LogView.h	(working copy)
@@ -0,0 +1,49 @@
+/*                           C A M E R A V I E W . H
+ * BRL-CAD
+ *
+ * Copyright (c) 2018 United States Government as represented by
+ * the U.S. Army Research Laboratory.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/** @file LogView.h
+ *
+ *  BRL-CAD Qt GUI:
+ *      declaration log output view
+ */
+
+
+#ifndef LOGVIEW_H
+#define LOGVIEW_H
+
+#include <QPlainTextEdit>
+
+#include <brlcad/ConstDatabase.h>
+#include <brlcad/globals.h>
+
+class LogView : public QPlainTextEdit
+{
+    Q_OBJECT
+
+public:
+    explicit LogView(QWidget* parent = 0);
+};
+
+
+#endif // LOGVIEW_H
\ No newline at end of file
Index: MainWindow.cpp
===================================================================
--- MainWindow.cpp	(revision 70607)
+++ MainWindow.cpp	(working copy)
@@ -33,10 +33,13 @@
 #include <QFileDialog>
 #include <QMessageBox>
 #include <QDockWidget>
+#include <QSettings> 
+#include <QDir> 
+#include <QDebug> 
+#include <QStandardPaths>
 
 #include "MainWindow.h"
 
-
 MainWindow::MainWindow
 (
     const char* file,
@@ -43,10 +46,13 @@
     QWidget*    parent
 ) : QMainWindow(parent),
     m_database() {
+    // find our settings file 
+    m_settingsFileName = QDir::currentPath() + "/settings.ini"; 
+
     // create menus for menuBar
     QAction* fileOpenAction = new QAction(tr("&Open File"));
     fileOpenAction->setShortcuts(QKeySequence::Open);
-    fileOpenAction->setStatusTip(tr("Open A Existing File"));
+    fileOpenAction->setStatusTip(tr("Open an Existing File"));
     connect(fileOpenAction, &QAction::triggered, this, &MainWindow::OpenFile);
 
     // adding actions to QMenu
@@ -59,7 +65,6 @@
 
     // the objects tree
     QDockWidget* objectsWidget = new QDockWidget(tr("Object Selection"));
-
     m_objectsTreeView = new ObjectsTreeView(m_database);
     objectsWidget->setWidget(m_objectsTreeView);
     addDockWidget(Qt::LeftDockWidgetArea, objectsWidget);
@@ -66,11 +71,25 @@
 
     // the projection control
     QDockWidget* cameraWidget = new QDockWidget(tr("Projection Settings"));
-
     m_cameraView = new CameraView(m_database, m_graphicView);
     cameraWidget->setWidget(m_cameraView);
     addDockWidget(Qt::RightDockWidgetArea, cameraWidget);
 
+    // the console view
+    QDockWidget* consoleWidget = new QDockWidget(tr("Console")); 
+    m_consoleView = new ConsoleView(m_database); 
+    consoleWidget->setWidget(m_consoleView); 
+    addDockWidget(Qt::BottomDockWidgetArea, consoleWidget); 
+
+    // display the logged information 
+    QDockWidget* logWidget = new QDockWidget(tr("Logging")); 
+    m_logView = new LogView(); 
+    logWidget->setWidget(m_logView); 
+    addDockWidget(Qt::BottomDockWidgetArea, logWidget); 
+
+    // tab console and log views together 
+    tabifyDockWidget(consoleWidget, logWidget);
+
     connect(m_objectsTreeView, &ObjectsTreeView::SelectionChanged, m_graphicView, &GraphicView::Update);
     connect(m_cameraView, &CameraView::Changed, m_graphicView, &GraphicView::UpdateTrafo);
 
@@ -78,16 +97,20 @@
 
     if (file != 0)
         LoadDatabase(file);
+
+    // show warning dialogs 
+    m_displayWarnings = true; 
+
+    // load our custom settings 
+    LoadSettings(); 
 }
 
 
 void MainWindow::OpenFile(void) {
     QString filePath = QFileDialog::getOpenFileName(this, tr("Open BRL-CAD database"), QString(), "BRL-CAD Database (*.g)");
-
     LoadDatabase(filePath.toUtf8().data());
 }
 
-
 void MainWindow::LoadDatabase
 (
     const char* fileName
@@ -104,3 +127,69 @@
         m_cameraView->Reset();
     }
 }
+
+void MainWindow::SaveSettings(void) { 
+    QSettings settings(m_settingsFileName, QSettings::IniFormat);
+
+    // save settings 
+    settings.beginGroup("MainWindow");
+    settings.setValue("size", size()); 
+    settings.setValue("fullscreen", isFullScreen()); 
+    settings.setValue("position", pos()); 
+    settings.endGroup();
+
+    settings.beginGroup("ObjectsTreeView"); 
+    // settings.setValue("dbdirectory", 0); 
+    settings.endGroup(); 
+}
+
+
+void MainWindow::LoadSettings(void) { 
+    QSettings settings(m_settingsFileName, QSettings::IniFormat);
+
+    // load settings 
+    //! begin the group / view and then update the values 
+    //! you can also set a default value like so: 
+    //! settings.setValue("x", defaultvalue).toType(); 
+    settings.beginGroup("MainWindow");
+    resize(settings.value("size").toSize()); 
+    move(settings.value("position").toPoint()); 
+    if(settings.value("fullscreen").toBool())
+        showMaximized();
+    settings.endGroup();
+
+    settings.beginGroup("ObjectsTreeView"); 
+    // settings.setValue("dbdirectory", 0); 
+    settings.endGroup(); 
+}
+
+void MainWindow::closeEvent
+(
+    QCloseEvent* e
+) { 
+    if(!m_displayWarnings)
+        return e->accept(); 
+
+    QMessageBox warningBox; 
+    warningBox.setText("Your Settings have been modified.");
+    warningBox.setInformativeText("Do you want to save your changes?");
+    warningBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+    warningBox.setDefaultButton(QMessageBox::Save);
+
+    int optionPicked = warningBox.exec(); 
+
+    switch(optionPicked) 
+    { 
+        case QMessageBox::Save: 
+            SaveSettings(); 
+        case QMessageBox::Discard: 
+            e->accept(); 
+            break; 
+        case QMessageBox::Cancel: 
+            e->ignore(); 
+            break; 
+        default: 
+            break; 
+    }
+}
+
Index: MainWindow.h
===================================================================
--- MainWindow.h	(revision 70607)
+++ MainWindow.h	(working copy)
@@ -32,6 +32,7 @@
 #define MAINWINDOW_H
 
 #include <QMainWindow>
+#include <QThread> 
 
 #include <brlcad/ConstDatabase.h>
 
@@ -38,22 +39,32 @@
 #include "ObjectsTreeView.h"
 #include "CameraView.h"
 #include "GraphicView.h"
+#include "ConsoleView.h" 
+#include "LogView.h" 
 
-
 class MainWindow : public QMainWindow {
-    Q_OBJECT
+    Q_OBJECT 
 public:
     MainWindow(const char* file,
-               QWidget*    parent = 0);
-
+               QWidget*    parent = 0);   
 private:
     BRLCAD::ConstDatabase m_database;
     GraphicView*          m_graphicView;
     ObjectsTreeView*      m_objectsTreeView;
     CameraView*           m_cameraView;
+    ConsoleView*          m_consoleView; 
+    LogView*              m_logView; 
 
+    bool                  m_displayWarnings; 
+    QString               m_settingsFileName; 
+
     void LoadDatabase(const char* fileName);
+    void LoadSettings(void); 
+    void SaveSettings(void); 
 
+protected: 
+    void closeEvent(QCloseEvent *e) override;
+
 private slots:
     void OpenFile(void);
 };
Index: main.cpp
===================================================================
--- main.cpp	(revision 70607)
+++ main.cpp	(working copy)
@@ -28,11 +28,10 @@
  *      the main function
  */
 
+#include "MainWindow.h"
 #include <QApplication>
 
-#include "MainWindow.h"
 
-
 int main(int argc, char *argv[])
 {
     QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
