From e788d746d480d1afc26f570a1ca01b1db1233e75 Mon Sep 17 00:00:00 2001 From: Stojce Slavkovski Date: Mon, 16 Dec 2013 22:43:17 +0100 Subject: [PATCH] added dialog for log data - importing Inconsolata.otf on application level - style sheet for dialog - changed menu behaviour for log data --- interface/resources/styles/Inconsolata.otf | Bin 0 -> 58464 bytes interface/resources/styles/log_dialog.qss | 10 +++ interface/src/Application.cpp | 35 +++++------ interface/src/Menu.cpp | 28 ++++++++- interface/src/Menu.h | 6 ++ interface/src/ui/LogDialog.cpp | 70 +++++++++++++++++++++ interface/src/ui/LogDialog.h | 41 ++++++++++++ 7 files changed, 170 insertions(+), 20 deletions(-) create mode 100644 interface/resources/styles/Inconsolata.otf create mode 100644 interface/resources/styles/log_dialog.qss create mode 100644 interface/src/ui/LogDialog.cpp create mode 100644 interface/src/ui/LogDialog.h diff --git a/interface/resources/styles/Inconsolata.otf b/interface/resources/styles/Inconsolata.otf new file mode 100644 index 0000000000000000000000000000000000000000..348889828d894b9b57fb6435497d5c034448cb1b GIT binary patch literal 58464 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%0Aw$I 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 z*E*Y3`WXYIvka0CappendLogLine(message.toLocal8Bit().constData()); } Application::Application(int& argc, char** argv, timeval &startup_time) : @@ -142,10 +142,21 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _pasteMode(false) { _applicationStartupTime = startup_time; + +#ifdef Q_OS_MAC + QString resourcesPath = QCoreApplication::applicationDirPath() + "/../Resources"; +#else + QString resourcesPath = QCoreApplication::applicationDirPath() + "/resources"; +#endif + + QFontDatabase::addApplicationFont(resourcesPath + "/styles/Inconsolata.otf"); _window->setWindowTitle("Interface"); + // call Menu getInstance static method to set up the menu + _window->setMenuBar(Menu::getInstance()); + qInstallMessageHandler(messageHandler); - + unsigned int listenPort = 0; // bind to an ephemeral port by default const char** constArgv = const_cast(argv); const char* portStr = getCmdOption(argc, constArgv, "--listenPort"); @@ -170,14 +181,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : // network receive thread and voxel parsing thread are both controlled by the --nonblocking command line _enableProcessVoxelsThread = _enableNetworkThread = !cmdOptionExists(argc, constArgv, "--nonblocking"); - - // setup QSettings -#ifdef Q_OS_MAC - QString resourcesPath = QCoreApplication::applicationDirPath() + "/../Resources"; -#else - QString resourcesPath = QCoreApplication::applicationDirPath() + "/resources"; -#endif - + // read the ApplicationInfo.ini file for Name/Version/Domain information QSettings applicationInfo(resourcesPath + "/info/ApplicationInfo.ini", QSettings::IniFormat); @@ -190,9 +194,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : setOrganizationDomain(applicationInfo.value("organizationDomain").toString()); _settings = new QSettings(this); - - // call Menu getInstance static method to set up the menu - _window->setMenuBar(Menu::getInstance()); // Check to see if the user passed in a command line option for loading a local // Voxel File. @@ -243,6 +244,9 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : } Application::~Application() { + + qInstallMessageHandler(NULL); + // make sure we don't call the idle timer any more delete idleTimer; @@ -3323,11 +3327,6 @@ void Application::displayOverlay() { if (Menu::getInstance()->isOptionChecked(MenuOption::CoverageMap)) { renderCoverageMap(); } - - - if (Menu::getInstance()->isOptionChecked(MenuOption::Log)) { - LogDisplay::instance.render(_glWidget->width(), _glWidget->height()); - } // Show chat entry field if (_chatEntryOn) { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 13510067cd..83fb70cee3 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -69,7 +69,8 @@ Menu::Menu() : _maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM), _voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), _boundaryLevelAdjust(0), - _maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS) + _maxVoxelPacketsPerSecond(DEFAULT_MAX_VOXEL_PPS), + _logDialog(NULL) { Application *appInstance = Application::getInstance(); @@ -261,7 +262,7 @@ Menu::Menu() : addDisabledActionAndSeparator(viewMenu, "Stats"); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats, Qt::Key_Slash); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L); + addActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::Key_L, this, SLOT(showLogDialog())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Oscilloscope, 0, true); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Bandwidth, 0, true); addActionToQMenuAndActionHash(viewMenu, MenuOption::BandwidthDetails, 0, this, SLOT(bandwidthDetails())); @@ -1007,6 +1008,29 @@ void Menu::pasteToVoxel() { sendFakeEnterEvent(); } +void Menu::appendLogLine(QString logLine) { + if (_logDialog) { + _logDialog->appendLogLine(logLine); + } +} + +void Menu::showLogDialog() { + if (! _logDialog) { + _logDialog = new LogDialog(Application::getInstance()->getGLWidget()); + connect(_logDialog, SIGNAL(closed()), SLOT(logDialogClosed())); + + _logDialog->show(); + } + _logDialog->raise(); +} + +void Menu::logDialogClosed() { + if (_logDialog) { + delete _logDialog; + _logDialog = NULL; + } +} + void Menu::bandwidthDetails() { if (! _bandwidthDialog) { _bandwidthDialog = new BandwidthDialog(Application::getInstance()->getGLWidget(), diff --git a/interface/src/Menu.h b/interface/src/Menu.h index aa3b925517..0ef507ca8b 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -13,6 +13,8 @@ #include #include +#include "ui/LogDialog.h" + enum FrustumDrawMode { FRUSTUM_DRAW_MODE_ALL, FRUSTUM_DRAW_MODE_VECTORS, @@ -47,6 +49,7 @@ public: void triggerOption(const QString& menuOption); QAction* getActionForOption(const QString& menuOption); bool isVoxelModeActionChecked(); + void appendLogLine(QString logLine); float getAudioJitterBufferSamples() const { return _audioJitterBufferSamples; } float getFieldOfView() const { return _fieldOfView; } @@ -81,6 +84,7 @@ public slots: void exportSettings(); void goToUser(); void pasteToVoxel(); + void showLogDialog(); private slots: void aboutApp(); @@ -96,6 +100,7 @@ private slots: void chooseVoxelPaintColor(); void runTests(); void resetSwatchColors(); + void logDialogClosed(); private: static Menu* _instance; @@ -141,6 +146,7 @@ private: int _boundaryLevelAdjust; QAction* _useVoxelShader; int _maxVoxelPacketsPerSecond; + LogDialog* _logDialog; }; namespace MenuOption { diff --git a/interface/src/ui/LogDialog.cpp b/interface/src/ui/LogDialog.cpp new file mode 100644 index 0000000000..7edffd2f83 --- /dev/null +++ b/interface/src/ui/LogDialog.cpp @@ -0,0 +1,70 @@ +// +// LogDialog.cpp +// interface +// +// Created by Stojce Slavkovski on 12/12/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#include +#include +#include + +#include "SharedUtil.h" +#include "ui/LogDialog.h" + +#define INITIAL_WIDTH_RATIO 0.3 +#define INITIAL_HEIGHT_RATIO 0.6 + +int cursorMeta = qRegisterMetaType("QTextCursor"); +int blockMeta = qRegisterMetaType("QTextBlock"); + +LogDialog::LogDialog(QWidget* parent) : + QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) { + + setWindowTitle("Log"); + + _logTextBox = new QPlainTextEdit(this); + _logTextBox->setReadOnly(true); + _logTextBox->show(); + + switchToResourcesParentIfRequired(); + QFile styleSheet("resources/styles/log_dialog.qss"); + + if (styleSheet.open(QIODevice::ReadOnly)) { + setStyleSheet(styleSheet.readAll()); + } + + QDesktopWidget* desktop = new QDesktopWidget(); + QRect screen = desktop->screenGeometry(); + resize((int)(screen.width() * INITIAL_WIDTH_RATIO), (int)(screen.height() * INITIAL_HEIGHT_RATIO)); + move(screen.center() - rect().center()); + delete desktop; +} + +LogDialog::~LogDialog() { + delete _logTextBox; +} + +void LogDialog::showEvent(QShowEvent *e) { + _logTextBox->clear(); +} + +void LogDialog::resizeEvent(QResizeEvent *e) { + _logTextBox->resize(width(), height()); +} + +void LogDialog::appendLogLine(QString logLine) { + if (isVisible()) { + _logTextBox->appendPlainText(logLine.simplified()); + _logTextBox->ensureCursorVisible(); + } +} + +void LogDialog::reject() { + this->QDialog::close(); +} + +void LogDialog::closeEvent(QCloseEvent* event) { + emit closed(); +} diff --git a/interface/src/ui/LogDialog.h b/interface/src/ui/LogDialog.h new file mode 100644 index 0000000000..6b847cd66f --- /dev/null +++ b/interface/src/ui/LogDialog.h @@ -0,0 +1,41 @@ +// +// LogDialog.h +// interface +// +// Created by Stojce Slavkovski on 12/12/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __interface__LogDialog__ +#define __interface__LogDialog__ + +#include +#include + +class LogDialog : public QDialog { + Q_OBJECT + +public: + LogDialog(QWidget* parent); + ~LogDialog(); + void appendLogLine(QString logLine); + +signals: + void closed(); + +public slots: + void reject(); + +protected: + // Emits a 'closed' signal when this dialog is closed. + void closeEvent(QCloseEvent* e); + void resizeEvent(QResizeEvent* e); + void showEvent(QShowEvent* e); + +private: + QPlainTextEdit* _logTextBox; + +}; + +#endif +