From 4afea2d2289a237c9d8bb647f3c571bf7c0a0da2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 09:55:12 -0700 Subject: [PATCH 01/31] Remove chat window docking --- interface/resources/images/pin.svg | 98 ------------------------ interface/resources/images/pinned.svg | 106 -------------------------- interface/src/ui/ChatWindow.cpp | 13 ---- interface/src/ui/ChatWindow.h | 1 - interface/ui/chatWindow.ui | 16 ---- 5 files changed, 234 deletions(-) delete mode 100644 interface/resources/images/pin.svg delete mode 100644 interface/resources/images/pinned.svg diff --git a/interface/resources/images/pin.svg b/interface/resources/images/pin.svg deleted file mode 100644 index ec968a1ec1..0000000000 --- a/interface/resources/images/pin.svg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - image/svg+xml - - Slice 1 - - - - - Slice 1 - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - diff --git a/interface/resources/images/pinned.svg b/interface/resources/images/pinned.svg deleted file mode 100644 index bda6f0e747..0000000000 --- a/interface/resources/images/pinned.svg +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - image/svg+xml - - Slice 1 - - - - - Slice 1 - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - - diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 635f1f3d10..c190169c43 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -323,16 +323,3 @@ void ChatWindow::scrollToBottom() { QScrollBar* verticalScrollBar = ui->messagesScrollArea->verticalScrollBar(); verticalScrollBar->setSliderPosition(verticalScrollBar->maximum()); } - -void ChatWindow::togglePinned() { - QMainWindow* mainWindow = Application::getInstance()->getWindow(); - mainWindow->removeDockWidget(this); - if (ui->togglePinnedButton->isChecked()) { - mainWindow->addDockWidget(ui->togglePinnedButton->isChecked() ? Qt::RightDockWidgetArea : Qt::NoDockWidgetArea, this); - } - if (!this->toggleViewAction()->isChecked()) { - this->toggleViewAction()->trigger(); - } - this->setFloating(!ui->togglePinnedButton->isChecked()); - setTitleBarWidget(ui->togglePinnedButton->isChecked()?new QWidget():titleBar); -} diff --git a/interface/src/ui/ChatWindow.h b/interface/src/ui/ChatWindow.h index 6a807f9b81..536ac17799 100644 --- a/interface/src/ui/ChatWindow.h +++ b/interface/src/ui/ChatWindow.h @@ -65,7 +65,6 @@ private: private slots: void connected(); void timeout(); - void togglePinned(); #ifdef HAVE_QXMPP void error(QXmppClient::Error error); void participantsChanged(); diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index 0372e00c09..1d06a1e99b 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -251,22 +251,6 @@ QPushButton:pressed { - - togglePinnedButton - clicked() - ChatWindow - togglePinned() - - - 390 - 42 - - - 550 - 42 - - - closeButton clicked() From cb1408d26d4048c712522de54cdb776fb02fd0a3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 10:01:35 -0700 Subject: [PATCH 02/31] Update chat window to use new Frameless Dialog The new dialog class needed to be updated to handle windows in different positions and windows that don't delete on close. --- interface/src/Menu.cpp | 19 +- interface/src/ui/ChatWindow.cpp | 38 +-- interface/src/ui/ChatWindow.h | 16 +- interface/src/ui/FramelessDialog.cpp | 72 +++-- interface/src/ui/FramelessDialog.h | 10 +- interface/src/ui/PreferencesDialog.cpp | 2 +- interface/ui/chatWindow.ui | 387 ++++++++++++------------- 7 files changed, 267 insertions(+), 277 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 272dc39eb3..508eaf61c3 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1060,23 +1060,22 @@ void Menu::showMetavoxelEditor() { void Menu::showChat() { QMainWindow* mainWindow = Application::getInstance()->getWindow(); if (!_chatWindow) { - mainWindow->addDockWidget(Qt::RightDockWidgetArea, _chatWindow = new ChatWindow()); + _chatWindow = new ChatWindow(mainWindow); } - if (!_chatWindow->toggleViewAction()->isChecked()) { - const QRect& windowGeometry = mainWindow->geometry(); - _chatWindow->move(windowGeometry.topRight().x() - _chatWindow->width(), - windowGeometry.topRight().y() + (windowGeometry.height() / 2) - (_chatWindow->height() / 2)); - - _chatWindow->resize(0, _chatWindow->height()); - _chatWindow->toggleViewAction()->trigger(); + if (_chatWindow->isHidden()) { + _chatWindow->show(); } } void Menu::toggleChat() { #ifdef HAVE_QXMPP _chatAction->setEnabled(XmppClient::getInstance().getXMPPClient().isConnected()); - if (!_chatAction->isEnabled() && _chatWindow && _chatWindow->toggleViewAction()->isChecked()) { - _chatWindow->toggleViewAction()->trigger(); + if (!_chatAction->isEnabled() && _chatWindow) { + if (_chatWindow->isHidden()) { + _chatWindow->show(); + } else { + _chatWindow->hide(); + } } #endif } diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index c190169c43..1f0f884f30 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -12,12 +12,10 @@ #include #include #include -#include #include #include #include #include -#include #include "Application.h" #include "FlowLayout.h" @@ -32,18 +30,16 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); -ChatWindow::ChatWindow() : +ChatWindow::ChatWindow(QWidget* parent) : + FramelessDialog(parent, 0, POSITION_RIGHT), ui(new Ui::ChatWindow), numMessagesAfterLastTimeStamp(0), _mousePressed(false), _mouseStartPosition() { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, false); - // remove the title bar (see the Qt docs on setTitleBarWidget), but we keep it for undocking - // - titleBar = titleBarWidget(); - setTitleBarWidget(new QWidget()); + ui->setupUi(this); FlowLayout* flowLayout = new FlowLayout(0, 4, 4); ui->usersWidget->setLayout(flowLayout); @@ -89,41 +85,23 @@ ChatWindow::~ChatWindow() { delete ui; } -void ChatWindow::mousePressEvent(QMouseEvent *e) { - if (e->button() == Qt::LeftButton && isFloating()) { - _mousePressed = true; - _mouseStartPosition = e->pos(); - } -} - -void ChatWindow::mouseMoveEvent(QMouseEvent *e) { - if (_mousePressed) { - move(mapToParent(e->pos() - _mouseStartPosition)); - } -} - -void ChatWindow::mouseReleaseEvent( QMouseEvent *e ) { - if ( e->button() == Qt::LeftButton ) { - _mousePressed = false; - } -} - void ChatWindow::keyPressEvent(QKeyEvent* event) { - QDockWidget::keyPressEvent(event); if (event->key() == Qt::Key_Escape) { hide(); + } else { + FramelessDialog::keyPressEvent(event); } } void ChatWindow::showEvent(QShowEvent* event) { - QDockWidget::showEvent(event); + FramelessDialog::showEvent(event); if (!event->spontaneous()) { - activateWindow(); ui->messagePlainTextEdit->setFocus(); } } bool ChatWindow::eventFilter(QObject* sender, QEvent* event) { + FramelessDialog::eventFilter(sender, event); if (sender == ui->messagePlainTextEdit) { if (event->type() != QEvent::KeyPress) { return false; diff --git a/interface/src/ui/ChatWindow.h b/interface/src/ui/ChatWindow.h index 536ac17799..399c9e917c 100644 --- a/interface/src/ui/ChatWindow.h +++ b/interface/src/ui/ChatWindow.h @@ -17,6 +17,7 @@ #include #include +#include "FramelessDialog.h" #ifdef HAVE_QXMPP @@ -29,23 +30,19 @@ namespace Ui { class ChatWindow; } -class ChatWindow : public QDockWidget { +class ChatWindow : public FramelessDialog { Q_OBJECT public: - ChatWindow(); + ChatWindow(QWidget* parent); ~ChatWindow(); - virtual void keyPressEvent(QKeyEvent *event); - virtual void showEvent(QShowEvent* event); - - virtual void mousePressEvent(QMouseEvent *e); - virtual void mouseMoveEvent(QMouseEvent *e); - virtual void mouseReleaseEvent(QMouseEvent *e); - protected: bool eventFilter(QObject* sender, QEvent* event); + virtual void keyPressEvent(QKeyEvent *event); + virtual void showEvent(QShowEvent* event); + private: #ifdef HAVE_QXMPP QString getParticipantName(const QString& participant); @@ -56,7 +53,6 @@ private: void scrollToBottom(); Ui::ChatWindow* ui; - QWidget* titleBar; int numMessagesAfterLastTimeStamp; QDateTime lastMessageStamp; bool _mousePressed; diff --git a/interface/src/ui/FramelessDialog.cpp b/interface/src/ui/FramelessDialog.cpp index 18e3bca89a..816c45b38a 100644 --- a/interface/src/ui/FramelessDialog.cpp +++ b/interface/src/ui/FramelessDialog.cpp @@ -14,8 +14,13 @@ const int RESIZE_HANDLE_WIDTH = 7; -FramelessDialog::FramelessDialog(QWidget *parent, Qt::WindowFlags flags) : -QDialog(parent, flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint) { +FramelessDialog::FramelessDialog(QWidget *parent, Qt::WindowFlags flags, Position position) : + QDialog(parent, flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint), + _position(position), + _selfHidden(false), + _isResizing(false), + _resizeInitialWidth(0) { + setAttribute(Qt::WA_DeleteOnClose); // handle rezize and move events @@ -29,29 +34,37 @@ bool FramelessDialog::eventFilter(QObject* sender, QEvent* event) { switch (event->type()) { case QEvent::Move: if (sender == parentWidget()) { - // move to upper left corner on app move - move(parentWidget()->geometry().topLeft()); + resizeAndPosition(false); } break; case QEvent::Resize: if (sender == parentWidget()) { - // keep full app height on resizing the app - setFixedHeight(parentWidget()->size().height()); + resizeAndPosition(false); } break; case QEvent::WindowStateChange: if (parentWidget()->isMinimized()) { - setHidden(true); - } else { + if (isVisible()) { + _selfHidden = true; + setHidden(true); + } + } else if (_selfHidden) { + _selfHidden = false; setHidden(false); } break; case QEvent::ApplicationDeactivate: // hide on minimize and focus lost - setHidden(true); + if (isVisible()) { + _selfHidden = true; + setHidden(true); + } break; case QEvent::ApplicationActivate: - setHidden(false); + if (_selfHidden) { + _selfHidden = false; + setHidden(false); + } break; default: break; @@ -70,21 +83,38 @@ void FramelessDialog::setStyleSheetFile(const QString& fileName) { } void FramelessDialog::showEvent(QShowEvent* event) { - // move to upper left corner - move(parentWidget()->geometry().topLeft()); + resizeAndPosition(); +} +void FramelessDialog::resizeAndPosition(bool resizeParent) { // keep full app height setFixedHeight(parentWidget()->size().height()); // resize parrent if width is smaller than this dialog - if (parentWidget()->size().width() < size().width()) { + if (resizeParent && parentWidget()->size().width() < size().width()) { parentWidget()->resize(size().width(), parentWidget()->size().height()); } + + if (_position == POSITION_LEFT) { + // move to upper left corner + move(parentWidget()->geometry().topLeft()); + } else if (_position == POSITION_RIGHT) { + // move to upper right corner + QPoint pos = parentWidget()->geometry().topRight(); + pos.setX(pos.x() - size().width()); + move(pos); + } } + void FramelessDialog::mousePressEvent(QMouseEvent* mouseEvent) { - if (abs(mouseEvent->pos().x() - size().width()) < RESIZE_HANDLE_WIDTH && mouseEvent->button() == Qt::LeftButton) { - _isResizing = true; - QApplication::setOverrideCursor(Qt::SizeHorCursor); + if (mouseEvent->button() == Qt::LeftButton) { + bool hitLeft = _position == POSITION_LEFT && abs(mouseEvent->pos().x() - size().width()) < RESIZE_HANDLE_WIDTH; + bool hitRight = _position == POSITION_RIGHT && mouseEvent->pos().x() < RESIZE_HANDLE_WIDTH; + if (hitLeft || hitRight) { + _isResizing = true; + _resizeInitialWidth = size().width(); + QApplication::setOverrideCursor(Qt::SizeHorCursor); + } } } @@ -95,6 +125,14 @@ void FramelessDialog::mouseReleaseEvent(QMouseEvent* mouseEvent) { void FramelessDialog::mouseMoveEvent(QMouseEvent* mouseEvent) { if (_isResizing) { - resize(mouseEvent->pos().x(), size().height()); + if (_position == POSITION_LEFT) { + resize(mouseEvent->pos().x(), size().height()); + } else if (_position == POSITION_RIGHT) { + setUpdatesEnabled(false); + resize(_resizeInitialWidth - mouseEvent->pos().x(), size().height()); + resizeAndPosition(); + _resizeInitialWidth = size().width(); + setUpdatesEnabled(true); + } } } diff --git a/interface/src/ui/FramelessDialog.h b/interface/src/ui/FramelessDialog.h index db9f6dfd6c..22666cca63 100644 --- a/interface/src/ui/FramelessDialog.h +++ b/interface/src/ui/FramelessDialog.h @@ -19,7 +19,10 @@ class FramelessDialog : public QDialog { Q_OBJECT public: - FramelessDialog(QWidget* parent = 0, Qt::WindowFlags flags = 0); + enum Position { POSITION_LEFT, POSITION_RIGHT }; + + FramelessDialog(QWidget* parent = 0, Qt::WindowFlags flags = 0, + Position position = POSITION_LEFT); void setStyleSheetFile(const QString& fileName); protected: @@ -31,7 +34,12 @@ protected: bool eventFilter(QObject* sender, QEvent* event); private: + void resizeAndPosition(bool resizeParent = true); + bool _isResizing; + int _resizeInitialWidth; + bool _selfHidden; ///< true when the dialog itself because of a window event (deactivation or minimization) + Position _position; }; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index a14e80e62f..cb998e783a 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -19,7 +19,7 @@ const int SCROLL_PANEL_BOTTOM_MARGIN = 30; const int OK_BUTTON_RIGHT_MARGIN = 30; const int BUTTONS_TOP_MARGIN = 24; -PreferencesDialog::PreferencesDialog(QWidget* parent, Qt::WindowFlags flags) : FramelessDialog(parent, flags) { +PreferencesDialog::PreferencesDialog(QWidget* parent, Qt::WindowFlags flags) : FramelessDialog(parent, flags, POSITION_LEFT) { ui.setupUi(this); setStyleSheetFile("styles/preferences.qss"); diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index 1d06a1e99b..78757ded38 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -1,13 +1,13 @@ ChatWindow - + 0 0 400 - 608 + 440 @@ -16,127 +16,95 @@ 238 - - font-family: Helvetica, Arial, sans-serif; - - - QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable - - - Qt::NoDockWidgetArea - Chat - - - - 0 - - - 8 - - - 8 - - - 8 - - - 8 - - - - - - 0 - 0 - - - - Connecting to XMPP... - - - Qt::AlignCenter - - - - - - - - - - 0 - 0 - - - - font-weight: bold; color: palette(shadow); margin-bottom: 4px; - - - online now: - - - - - - - - 0 - 0 - - - - - 16 - 16 - - - - Qt::NoFocus - - - - - - - ../resources/images/pin.svg - ../resources/images/pinned.svg../resources/images/pin.svg - - - true - - - true - - - false - - - true - - - - - - - - 0 - 0 - - - - - 16 - 16 - - - - Qt::NoFocus - - - QPushButton { + + font-family: Helvetica, Arial, sans-serif; + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 8 + + + 8 + + + 8 + + + 8 + + + + + + 0 + 0 + + + + Connecting to XMPP... + + + Qt::AlignCenter + + + + + + + + + + 0 + 0 + + + + font-weight: bold; color: palette(shadow); margin-bottom: 4px; + + + online now: + + + + + + + + 0 + 0 + + + + + 16 + 16 + + + + Qt::NoFocus + + + QPushButton { background-color: rgba( 0, 0, 0, 0% ); border: none; image: url(../resources/images/close.svg) @@ -148,102 +116,105 @@ QPushButton:pressed { border: none; image: url(../resources/images/close_down.svg) } - - - - - - true - - - - - - - - - - - - margin-top: 12px; - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 382 - 16 - + + + + + + true + + + + + + + + + + + + margin-top: 12px; + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 382 + 16 + + + + + 0 + 0 + + + + margin-top: 0px; + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + - + 0 0 - - margin-top: 0px; + + + 0 + 60 + + + + border-color: palette(dark); border-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContents + + + true - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - 0 - 0 - - - - - 0 - 60 - - - - border-color: palette(dark); border-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; - - - QFrame::NoFrame - - - Qt::ScrollBarAlwaysOff - - - QAbstractScrollArea::AdjustToContents - - - true - - - - - + + + + + messagePlainTextEdit + dockWidgetContents messagePlainTextEdit From 8aee81ae7ca2b36dc40e6003311861ed1c0473a2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 10:02:54 -0700 Subject: [PATCH 03/31] Update username in chat to use correct line height --- interface/src/ui/ChatMessageArea.cpp | 13 +++++++-- interface/src/ui/ChatMessageArea.h | 7 ++++- interface/src/ui/ChatWindow.cpp | 40 +++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/interface/src/ui/ChatMessageArea.cpp b/interface/src/ui/ChatMessageArea.cpp index f15b788990..929ad85d87 100644 --- a/interface/src/ui/ChatMessageArea.cpp +++ b/interface/src/ui/ChatMessageArea.cpp @@ -9,11 +9,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "Application.h" #include "ChatMessageArea.h" #include #include -ChatMessageArea::ChatMessageArea() : QTextBrowser() { +ChatMessageArea::ChatMessageArea(bool useFixedHeight) : QTextBrowser(), _useFixedHeight(useFixedHeight) { connect(document()->documentLayout(), &QAbstractTextDocumentLayout::documentSizeChanged, this, &ChatMessageArea::updateLayout); } @@ -34,7 +35,15 @@ void ChatMessageArea::setHtml(const QString& html) { } void ChatMessageArea::updateLayout() { - setFixedHeight(document()->size().height()); + if (_useFixedHeight) { + setFixedHeight(document()->size().height()); + updateGeometry(); + emit sizeChanged(size()); + } +} + +void ChatMessageArea::setSize(const QSize& size) { + setFixedHeight(size.height()); updateGeometry(); } diff --git a/interface/src/ui/ChatMessageArea.h b/interface/src/ui/ChatMessageArea.h index 1c49c60b08..48cfc01aec 100644 --- a/interface/src/ui/ChatMessageArea.h +++ b/interface/src/ui/ChatMessageArea.h @@ -19,14 +19,19 @@ const int CHAT_MESSAGE_LINE_HEIGHT = 130; class ChatMessageArea : public QTextBrowser { Q_OBJECT public: - ChatMessageArea(); + ChatMessageArea(bool useFixedHeight = true); virtual void setHtml(const QString& html); public slots: void updateLayout(); + void setSize(const QSize& size); + +signals: + void sizeChanged(QSize newSize); protected: virtual void wheelEvent(QWheelEvent* event); + bool _useFixedHeight; }; diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 1f0f884f30..c194e35fc1 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -240,13 +240,32 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { return; } - QLabel* userLabel = new QLabel(getParticipantName(message.from())); - userLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - userLabel->setStyleSheet("padding: 2px; font-weight: bold"); - userLabel->setAlignment(Qt::AlignTop | Qt::AlignRight); + // Create username label + ChatMessageArea* userLabel = new ChatMessageArea(false); + userLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); + userLabel->setWordWrapMode(QTextOption::NoWrap); + userLabel->setLineWrapMode(QTextEdit::NoWrap); + userLabel->setTextInteractionFlags(Qt::NoTextInteraction); + userLabel->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + userLabel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + userLabel->setReadOnly(true); + userLabel->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); - ChatMessageArea* messageArea = new ChatMessageArea(); + userLabel->setStyleSheet("padding: 2px;" + "font-weight: bold;" + "background-color: rgba(0, 0, 0, 0%);" + "border: 0;"); + QTextBlockFormat format; + format.setLineHeight(130, QTextBlockFormat::ProportionalHeight); + QTextCursor cursor = userLabel->textCursor(); + cursor.setBlockFormat(format); + cursor.insertText(getParticipantName(message.from())); + + userLabel->setAlignment(Qt::AlignRight); + + // Create message area + ChatMessageArea* messageArea = new ChatMessageArea(true); messageArea->setOpenLinks(true); messageArea->setOpenExternalLinks(true); messageArea->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); @@ -262,10 +281,11 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { "background-color: rgba(0, 0, 0, 0%);" "border: 0;"); + // Update background if this is a message from the current user bool fromSelf = getParticipantName(message.from()) == AccountManager::getInstance().getUsername(); if (fromSelf) { - userLabel->setStyleSheet(userLabel->styleSheet() + "; background-color: #e1e8ea"); - messageArea->setStyleSheet(messageArea->styleSheet() + "; background-color: #e1e8ea"); + userLabel->setStyleSheet(userLabel->styleSheet() + "background-color: #e1e8ea"); + messageArea->setStyleSheet(messageArea->styleSheet() + "background-color: #e1e8ea"); } messageArea->setHtml(message.body().replace(regexLinks, "\\1")); @@ -274,6 +294,12 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { ui->messagesGridLayout->addWidget(userLabel, ui->messagesGridLayout->rowCount(), 0); ui->messagesGridLayout->addWidget(messageArea, ui->messagesGridLayout->rowCount() - 1, 1); + // Force the height of the username area to match the height of the message area + connect(messageArea, &ChatMessageArea::sizeChanged, userLabel, &ChatMessageArea::setSize); + + // Force initial height to match message area + userLabel->setFixedHeight(messageArea->size().height()); + ui->messagesGridLayout->parentWidget()->updateGeometry(); Application::processEvents(); From bfb879d3e6a545f28cc66cd58f554464d828525e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 10:03:22 -0700 Subject: [PATCH 04/31] Update chat textbox to use correct line height --- interface/src/ui/ChatWindow.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index c194e35fc1..e26c0bcb94 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -48,11 +48,23 @@ ChatWindow::ChatWindow(QWidget* parent) : ui->messagesGridLayout->setColumnStretch(1, 3); ui->messagePlainTextEdit->installEventFilter(this); + ui->messagePlainTextEdit->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + + QTextCursor cursor(ui->messagePlainTextEdit->textCursor()); + + cursor.movePosition(QTextCursor::Start); + + QTextBlockFormat format = cursor.blockFormat(); + format.setLineHeight(130, QTextBlockFormat::ProportionalHeight); + + cursor.setBlockFormat(format); + + ui->messagePlainTextEdit->setTextCursor(cursor); if (!AccountManager::getInstance().isLoggedIn()) { ui->connectingToXMPPLabel->setText(tr("You must be logged in to chat with others.")); } - + #ifdef HAVE_QXMPP const QXmppClient& xmppClient = XmppClient::getInstance().getXMPPClient(); if (xmppClient.isConnected()) { From e8b6b7ab4de72f6c09dcba9735c66548531f9979 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 13:22:22 -0700 Subject: [PATCH 05/31] Update style of chat message links --- interface/src/ui/ChatWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index e26c0bcb94..c943607d71 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -300,6 +300,7 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { messageArea->setStyleSheet(messageArea->styleSheet() + "background-color: #e1e8ea"); } + messageArea->document()->setDefaultStyleSheet("a { text-decoration: none; font-weight: bold; color: #267077;}"); messageArea->setHtml(message.body().replace(regexLinks, "\\1")); bool atBottom = isAtBottom(); From 23d68d538c8bda8c7a82d95ecd9d1201800ab1ad Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 16 Apr 2014 14:05:38 -0700 Subject: [PATCH 06/31] Fix bug where multiple user/location popups appear --- interface/src/ui/ChatWindow.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index c943607d71..2849d0c748 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -113,7 +113,6 @@ void ChatWindow::showEvent(QShowEvent* event) { } bool ChatWindow::eventFilter(QObject* sender, QEvent* event) { - FramelessDialog::eventFilter(sender, event); if (sender == ui->messagePlainTextEdit) { if (event->type() != QEvent::KeyPress) { return false; @@ -135,14 +134,14 @@ bool ChatWindow::eventFilter(QObject* sender, QEvent* event) { } return true; } - } else { - if (event->type() != QEvent::MouseButtonRelease) { - return false; + } else if (event->type() == QEvent::MouseButtonRelease) { + QVariant userVar = sender->property("user"); + if (userVar.isValid()) { + Menu::getInstance()->goToUser("@" + userVar.toString()); + return true; } - QString user = sender->property("user").toString(); - Menu::getInstance()->goToUser(user); } - return false; + return FramelessDialog::eventFilter(sender, event); } #ifdef HAVE_QXMPP From 606a48d555642bb1aa3cdd1b2e7435d7376d56f7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 09:36:17 -0700 Subject: [PATCH 07/31] Fix issue with pref dialog disappearing With the frameless dialog being updated to support different types of window, the pref dialog was no longer able to rely on it to keep itself open in certain cases. The window flags were also updated to update after a "browse" call rather than in the slot so that it would still execute in the case of cancelled selection. --- interface/src/ui/PreferencesDialog.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 0f2216407f..550c616fc1 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -38,26 +38,34 @@ void PreferencesDialog::accept() { void PreferencesDialog::setHeadUrl(QString modelUrl) { ui.faceURLEdit->setText(modelUrl); - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } void PreferencesDialog::setSkeletonUrl(QString modelUrl) { ui.skeletonURLEdit->setText(modelUrl); - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); } void PreferencesDialog::openHeadModelBrowser() { setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + show(); + ModelsBrowser modelBrowser(Head); connect(&modelBrowser, &ModelsBrowser::selected, this, &PreferencesDialog::setHeadUrl); modelBrowser.browse(); + + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + show(); } void PreferencesDialog::openBodyModelBrowser() { setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + show(); + ModelsBrowser modelBrowser(Skeleton); connect(&modelBrowser, &ModelsBrowser::selected, this, &PreferencesDialog::setSkeletonUrl); modelBrowser.browse(); + + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + show(); } void PreferencesDialog::openSnapshotLocationBrowser() { From c1fa6b41e45bb9d4442afc2eee10cdded63ef919 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 13:19:36 -0700 Subject: [PATCH 08/31] Update chat window to use vertical layout --- interface/src/ui/ChatWindow.cpp | 55 +++++++++------------------------ interface/ui/chatWindow.ui | 10 +++--- 2 files changed, 18 insertions(+), 47 deletions(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 2849d0c748..ae5dd0185c 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -44,9 +44,6 @@ ChatWindow::ChatWindow(QWidget* parent) : FlowLayout* flowLayout = new FlowLayout(0, 4, 4); ui->usersWidget->setLayout(flowLayout); - ui->messagesGridLayout->setColumnStretch(0, 1); - ui->messagesGridLayout->setColumnStretch(1, 3); - ui->messagePlainTextEdit->installEventFilter(this); ui->messagePlainTextEdit->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); @@ -172,8 +169,8 @@ void ChatWindow::addTimeStamp() { bool atBottom = isAtBottom(); - ui->messagesGridLayout->addWidget(timeLabel, ui->messagesGridLayout->rowCount(), 0, 1, 2); - ui->messagesGridLayout->parentWidget()->updateGeometry(); + ui->messagesVBoxLayout->addWidget(timeLabel); + ui->messagesVBoxLayout->parentWidget()->updateGeometry(); Application::processEvents(); numMessagesAfterLastTimeStamp = 0; @@ -251,29 +248,8 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { return; } - // Create username label - ChatMessageArea* userLabel = new ChatMessageArea(false); - userLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - userLabel->setWordWrapMode(QTextOption::NoWrap); - userLabel->setLineWrapMode(QTextEdit::NoWrap); - userLabel->setTextInteractionFlags(Qt::NoTextInteraction); - userLabel->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - userLabel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - userLabel->setReadOnly(true); - userLabel->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); - - userLabel->setStyleSheet("padding: 2px;" - "font-weight: bold;" - "background-color: rgba(0, 0, 0, 0%);" - "border: 0;"); - - QTextBlockFormat format; - format.setLineHeight(130, QTextBlockFormat::ProportionalHeight); - QTextCursor cursor = userLabel->textCursor(); - cursor.setBlockFormat(format); - cursor.insertText(getParticipantName(message.from())); - - userLabel->setAlignment(Qt::AlignRight); + // Update background if this is a message from the current user + bool fromSelf = getParticipantName(message.from()) == AccountManager::getInstance().getUsername(); // Create message area ChatMessageArea* messageArea = new ChatMessageArea(true); @@ -289,30 +265,27 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { "padding-left: 2px;" "padding-top: 2px;" "padding-right: 20px;" + "margin: 0px;" + "color: #333333;" + "font-size: 14pt;" "background-color: rgba(0, 0, 0, 0%);" "border: 0;"); - // Update background if this is a message from the current user - bool fromSelf = getParticipantName(message.from()) == AccountManager::getInstance().getUsername(); + QString userLabel = getParticipantName(message.from()); if (fromSelf) { - userLabel->setStyleSheet(userLabel->styleSheet() + "background-color: #e1e8ea"); + userLabel = "" + userLabel + ": "; messageArea->setStyleSheet(messageArea->styleSheet() + "background-color: #e1e8ea"); + } else { + userLabel = "" + userLabel + ": "; } messageArea->document()->setDefaultStyleSheet("a { text-decoration: none; font-weight: bold; color: #267077;}"); - messageArea->setHtml(message.body().replace(regexLinks, "\\1")); + messageArea->setHtml(userLabel + message.body().replace(regexLinks, "\\1")); bool atBottom = isAtBottom(); - ui->messagesGridLayout->addWidget(userLabel, ui->messagesGridLayout->rowCount(), 0); - ui->messagesGridLayout->addWidget(messageArea, ui->messagesGridLayout->rowCount() - 1, 1); - // Force the height of the username area to match the height of the message area - connect(messageArea, &ChatMessageArea::sizeChanged, userLabel, &ChatMessageArea::setSize); - - // Force initial height to match message area - userLabel->setFixedHeight(messageArea->size().height()); - - ui->messagesGridLayout->parentWidget()->updateGeometry(); + ui->messagesVBoxLayout->addWidget(messageArea); + ui->messagesVBoxLayout->parentWidget()->updateGeometry(); Application::processEvents(); if (atBottom || fromSelf) { diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index 78757ded38..b516418f8c 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -159,7 +159,10 @@ QPushButton:pressed { margin-top: 0px; - + + + 0 + 0 @@ -172,9 +175,6 @@ QPushButton:pressed { 0 - - 0 - @@ -213,8 +213,6 @@ QPushButton:pressed { - messagePlainTextEdit - dockWidgetContents messagePlainTextEdit From 7a25d0661f5ff48818090e5ae004e6efffad3dba Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 13:20:00 -0700 Subject: [PATCH 09/31] Update style of chat messages --- interface/src/ui/ChatWindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index ae5dd0185c..78c667f41e 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -162,10 +162,10 @@ void ChatWindow::addTimeStamp() { if (!timeString.isEmpty()) { QLabel* timeLabel = new QLabel(timeString); timeLabel->setStyleSheet("color: palette(shadow);" - "background-color: palette(highlight);" + "background-color: white;" "padding: 4px;"); timeLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - timeLabel->setAlignment(Qt::AlignHCenter); + timeLabel->setAlignment(Qt::AlignLeft); bool atBottom = isAtBottom(); @@ -235,6 +235,7 @@ void ChatWindow::participantsChanged() { "padding-bottom: 2px;" "padding-left: 2px;" "border: 1px solid palette(shadow);" + "font-size: 14pt;" "font-weight: bold"); userLabel->setProperty("user", participantName); userLabel->setCursor(Qt::PointingHandCursor); From 3ee613b9d581bcb2e1aebd123aa13c97ddb32b4e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 13:20:17 -0700 Subject: [PATCH 10/31] Add right margin to user list area in chat --- interface/ui/chatWindow.ui | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index b516418f8c..34e6c6aeaf 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -128,7 +128,13 @@ QPushButton:pressed { - + + + #usersWidget { + margin-right: 20px; +} + + From 48a75616446a9b57cb280e806e15ba7593505679 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 13:38:13 -0700 Subject: [PATCH 11/31] Fix chat messages not being html escaped --- interface/src/ui/ChatWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 78c667f41e..5d3c5e5a75 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -281,7 +281,7 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { } messageArea->document()->setDefaultStyleSheet("a { text-decoration: none; font-weight: bold; color: #267077;}"); - messageArea->setHtml(userLabel + message.body().replace(regexLinks, "\\1")); + messageArea->setHtml(userLabel + message.body().toHtmlEscaped().replace(regexLinks, "\\1")); bool atBottom = isAtBottom(); From e2954f8614c018ddf594e08dd29122b4d18fcfb6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 13:49:10 -0700 Subject: [PATCH 12/31] Fix color and size of font in timestamp chat messages --- interface/src/ui/ChatWindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 5d3c5e5a75..ad59222202 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -161,8 +161,9 @@ void ChatWindow::addTimeStamp() { timeString.chop(1); if (!timeString.isEmpty()) { QLabel* timeLabel = new QLabel(timeString); - timeLabel->setStyleSheet("color: palette(shadow);" + timeLabel->setStyleSheet("color: #333333;" "background-color: white;" + "font-size: 14pt;" "padding: 4px;"); timeLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); timeLabel->setAlignment(Qt::AlignLeft); From f2112c665abc15ed0038af79cda1b7ca2e62f509 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 14:02:21 -0700 Subject: [PATCH 13/31] Disallow rich text from being pasted into the chat area --- interface/ui/chatWindow.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index 34e6c6aeaf..d63542bf7b 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -214,6 +214,9 @@ QPushButton:pressed { true + + false + From e1e9c11189d57383a98fc5381d5ee8e708300511 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 15:18:40 -0700 Subject: [PATCH 14/31] Add Menu slot to open urls --- interface/src/Menu.cpp | 11 +++++++++++ interface/src/Menu.h | 1 + 2 files changed, 12 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 9de6dfad3b..ad765c0e8e 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -906,6 +906,17 @@ void Menu::goToUser(const QString& user) { connect(manager, &LocationManager::multipleDestinationsFound, this, &Menu::multipleDestinationsDecision); } +/// Open a url, shortcutting any "hifi" scheme URLs to the local application. +void Menu::openUrl(const QUrl& url) { + if (url.scheme() == "hifi") { + QString path = url.toString(QUrl::RemoveScheme); + path = path.remove(QRegExp("^:?/*")); + goTo(path); + } else { + QDesktopServices::openUrl(url); + } +} + void Menu::multipleDestinationsDecision(const QJsonObject& userData, const QJsonObject& placeData) { QMessageBox msgBox; msgBox.setText("Both user and location exists with same name"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 40ed8efdc7..ff27810df5 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -153,6 +153,7 @@ public slots: void goTo(); void goToUser(const QString& user); void pasteToVoxel(); + void openUrl(const QUrl& url); void toggleLoginMenuItem(); From 795ddbc7bf9d9b4cda49c89a2e37ff2dca56fb87 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 15:19:13 -0700 Subject: [PATCH 15/31] Update ChatMessageArea to open urls via Menu::openUrl --- interface/src/ui/ChatMessageArea.cpp | 4 ++++ interface/src/ui/ChatWindow.cpp | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/ChatMessageArea.cpp b/interface/src/ui/ChatMessageArea.cpp index 929ad85d87..1e16a8a2db 100644 --- a/interface/src/ui/ChatMessageArea.cpp +++ b/interface/src/ui/ChatMessageArea.cpp @@ -15,8 +15,12 @@ #include ChatMessageArea::ChatMessageArea(bool useFixedHeight) : QTextBrowser(), _useFixedHeight(useFixedHeight) { + setOpenLinks(false); + connect(document()->documentLayout(), &QAbstractTextDocumentLayout::documentSizeChanged, this, &ChatMessageArea::updateLayout); + connect(this, &QTextBrowser::anchorClicked, + Menu::getInstance(), &Menu::openUrl); } void ChatMessageArea::setHtml(const QString& html) { diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index ad59222202..e1ee30b4b9 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -255,8 +255,6 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { // Create message area ChatMessageArea* messageArea = new ChatMessageArea(true); - messageArea->setOpenLinks(true); - messageArea->setOpenExternalLinks(true); messageArea->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); messageArea->setTextInteractionFlags(Qt::TextBrowserInteraction); messageArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); From 4f236c6bf45cc58ca60bf7d4b7a4a288d28cf7b9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 15:20:12 -0700 Subject: [PATCH 16/31] Add hifi link handling in chat for usernames and locations --- interface/src/ui/ChatWindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index e1ee30b4b9..9679e73132 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -29,6 +29,7 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); +const QRegularExpression regexHifiLinks("\\s([#@]\\S+)"); ChatWindow::ChatWindow(QWidget* parent) : FramelessDialog(parent, 0, POSITION_RIGHT), @@ -280,7 +281,10 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { } messageArea->document()->setDefaultStyleSheet("a { text-decoration: none; font-weight: bold; color: #267077;}"); - messageArea->setHtml(userLabel + message.body().toHtmlEscaped().replace(regexLinks, "\\1")); + QString messageText = message.body().toHtmlEscaped(); + messageText = messageText.replace(regexLinks, "\\1"); + messageText = messageText.replace(regexHifiLinks, "\\1"); + messageArea->setHtml(userLabel + messageText); bool atBottom = isAtBottom(); From 6437f76ed2488e02341e56f43fd04bb496a099bd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 15:50:40 -0700 Subject: [PATCH 17/31] Update username/location match in chat to be more lenient --- interface/src/ui/ChatWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 9679e73132..c459a6d426 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -29,7 +29,7 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); -const QRegularExpression regexHifiLinks("\\s([#@]\\S+)"); +const QRegularExpression regexHifiLinks("([#@]\\S+)"); ChatWindow::ChatWindow(QWidget* parent) : FramelessDialog(parent, 0, POSITION_RIGHT), From 3c9b6264a8354f514324f6a97992a67b01ad924a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 19:51:25 -0700 Subject: [PATCH 18/31] Add emoticons to chat --- interface/resources/images/cool.svg | 8 ++++++++ interface/resources/images/grin.svg | 8 ++++++++ interface/resources/images/happy.svg | 8 ++++++++ interface/resources/images/sad.svg | 8 ++++++++ interface/resources/images/smiley.svg | 8 ++++++++ interface/resources/images/tongue.svg | 8 ++++++++ interface/resources/images/wink.svg | 8 ++++++++ interface/src/ui/ChatWindow.cpp | 19 ++++++++++++++++++- interface/src/ui/ChatWindow.h | 1 + 9 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 interface/resources/images/cool.svg create mode 100644 interface/resources/images/grin.svg create mode 100644 interface/resources/images/happy.svg create mode 100644 interface/resources/images/sad.svg create mode 100644 interface/resources/images/smiley.svg create mode 100644 interface/resources/images/tongue.svg create mode 100644 interface/resources/images/wink.svg diff --git a/interface/resources/images/cool.svg b/interface/resources/images/cool.svg new file mode 100644 index 0000000000..2e8348108a --- /dev/null +++ b/interface/resources/images/cool.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/grin.svg b/interface/resources/images/grin.svg new file mode 100644 index 0000000000..8e36a16555 --- /dev/null +++ b/interface/resources/images/grin.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/happy.svg b/interface/resources/images/happy.svg new file mode 100644 index 0000000000..fe31d01991 --- /dev/null +++ b/interface/resources/images/happy.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/sad.svg b/interface/resources/images/sad.svg new file mode 100644 index 0000000000..0029bfded5 --- /dev/null +++ b/interface/resources/images/sad.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/smiley.svg b/interface/resources/images/smiley.svg new file mode 100644 index 0000000000..1b0e707bf6 --- /dev/null +++ b/interface/resources/images/smiley.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/tongue.svg b/interface/resources/images/tongue.svg new file mode 100644 index 0000000000..35361d2b2b --- /dev/null +++ b/interface/resources/images/tongue.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/resources/images/wink.svg b/interface/resources/images/wink.svg new file mode 100644 index 0000000000..b1aef4823d --- /dev/null +++ b/interface/resources/images/wink.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index c459a6d426..06608ef5e4 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -31,12 +31,14 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); const QRegularExpression regexHifiLinks("([#@]\\S+)"); + ChatWindow::ChatWindow(QWidget* parent) : FramelessDialog(parent, 0, POSITION_RIGHT), ui(new Ui::ChatWindow), numMessagesAfterLastTimeStamp(0), _mousePressed(false), - _mouseStartPosition() + _mouseStartPosition(), + _emoticonMap() { setAttribute(Qt::WA_DeleteOnClose, false); @@ -63,6 +65,14 @@ ChatWindow::ChatWindow(QWidget* parent) : ui->connectingToXMPPLabel->setText(tr("You must be logged in to chat with others.")); } + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":)")), new QString("../resources/images/smiley.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":D")), new QString("../resources/images/happy.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape("B)")), new QString("../resources/images/cool.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":O")), new QString("../resources/images/grin.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":(")), new QString("../resources/images/sad.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":P")), new QString("../resources/images/tongue.svg")); + _emoticonMap.insert(new QRegularExpression(QRegExp::escape(";)")), new QString("../resources/images/wink.svg")); + #ifdef HAVE_QXMPP const QXmppClient& xmppClient = XmppClient::getInstance().getXMPPClient(); if (xmppClient.isConnected()) { @@ -284,6 +294,13 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { QString messageText = message.body().toHtmlEscaped(); messageText = messageText.replace(regexLinks, "\\1"); messageText = messageText.replace(regexHifiLinks, "\\1"); + + QMapIterator it(_emoticonMap); + while (it.hasNext()) { + it.next(); + messageText.replace(*it.key(), ""); + } + messageArea->setHtml(userLabel + messageText); bool atBottom = isAtBottom(); diff --git a/interface/src/ui/ChatWindow.h b/interface/src/ui/ChatWindow.h index 399c9e917c..3dce35b1b2 100644 --- a/interface/src/ui/ChatWindow.h +++ b/interface/src/ui/ChatWindow.h @@ -57,6 +57,7 @@ private: QDateTime lastMessageStamp; bool _mousePressed; QPoint _mouseStartPosition; + QMap _emoticonMap; private slots: void connected(); From c0ae2fd7ae5b100af15a69f892205736271adc06 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 17 Apr 2014 19:53:59 -0700 Subject: [PATCH 19/31] Add QDesktopServices header to Menu.cpp --- interface/src/Menu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ad765c0e8e..5ff74f0ad9 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include From 9bea70ac54d3a11fd76bf7e77a30556993f86973 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 10:49:22 -0700 Subject: [PATCH 20/31] Revert "Add emoticons to chat" This reverts commit 3c9b6264a8354f514324f6a97992a67b01ad924a. --- interface/resources/images/cool.svg | 8 -------- interface/resources/images/grin.svg | 8 -------- interface/resources/images/happy.svg | 8 -------- interface/resources/images/sad.svg | 8 -------- interface/resources/images/smiley.svg | 8 -------- interface/resources/images/tongue.svg | 8 -------- interface/resources/images/wink.svg | 8 -------- interface/src/ui/ChatWindow.cpp | 19 +------------------ interface/src/ui/ChatWindow.h | 1 - 9 files changed, 1 insertion(+), 75 deletions(-) delete mode 100644 interface/resources/images/cool.svg delete mode 100644 interface/resources/images/grin.svg delete mode 100644 interface/resources/images/happy.svg delete mode 100644 interface/resources/images/sad.svg delete mode 100644 interface/resources/images/smiley.svg delete mode 100644 interface/resources/images/tongue.svg delete mode 100644 interface/resources/images/wink.svg diff --git a/interface/resources/images/cool.svg b/interface/resources/images/cool.svg deleted file mode 100644 index 2e8348108a..0000000000 --- a/interface/resources/images/cool.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/grin.svg b/interface/resources/images/grin.svg deleted file mode 100644 index 8e36a16555..0000000000 --- a/interface/resources/images/grin.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/happy.svg b/interface/resources/images/happy.svg deleted file mode 100644 index fe31d01991..0000000000 --- a/interface/resources/images/happy.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/sad.svg b/interface/resources/images/sad.svg deleted file mode 100644 index 0029bfded5..0000000000 --- a/interface/resources/images/sad.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/smiley.svg b/interface/resources/images/smiley.svg deleted file mode 100644 index 1b0e707bf6..0000000000 --- a/interface/resources/images/smiley.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/tongue.svg b/interface/resources/images/tongue.svg deleted file mode 100644 index 35361d2b2b..0000000000 --- a/interface/resources/images/tongue.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/resources/images/wink.svg b/interface/resources/images/wink.svg deleted file mode 100644 index b1aef4823d..0000000000 --- a/interface/resources/images/wink.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index 06608ef5e4..c459a6d426 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -31,14 +31,12 @@ const int NUM_MESSAGES_TO_TIME_STAMP = 20; const QRegularExpression regexLinks("((?:(?:ftp)|(?:https?))://\\S+)"); const QRegularExpression regexHifiLinks("([#@]\\S+)"); - ChatWindow::ChatWindow(QWidget* parent) : FramelessDialog(parent, 0, POSITION_RIGHT), ui(new Ui::ChatWindow), numMessagesAfterLastTimeStamp(0), _mousePressed(false), - _mouseStartPosition(), - _emoticonMap() + _mouseStartPosition() { setAttribute(Qt::WA_DeleteOnClose, false); @@ -65,14 +63,6 @@ ChatWindow::ChatWindow(QWidget* parent) : ui->connectingToXMPPLabel->setText(tr("You must be logged in to chat with others.")); } - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":)")), new QString("../resources/images/smiley.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":D")), new QString("../resources/images/happy.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape("B)")), new QString("../resources/images/cool.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":O")), new QString("../resources/images/grin.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":(")), new QString("../resources/images/sad.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(":P")), new QString("../resources/images/tongue.svg")); - _emoticonMap.insert(new QRegularExpression(QRegExp::escape(";)")), new QString("../resources/images/wink.svg")); - #ifdef HAVE_QXMPP const QXmppClient& xmppClient = XmppClient::getInstance().getXMPPClient(); if (xmppClient.isConnected()) { @@ -294,13 +284,6 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { QString messageText = message.body().toHtmlEscaped(); messageText = messageText.replace(regexLinks, "\\1"); messageText = messageText.replace(regexHifiLinks, "\\1"); - - QMapIterator it(_emoticonMap); - while (it.hasNext()) { - it.next(); - messageText.replace(*it.key(), ""); - } - messageArea->setHtml(userLabel + messageText); bool atBottom = isAtBottom(); diff --git a/interface/src/ui/ChatWindow.h b/interface/src/ui/ChatWindow.h index 3dce35b1b2..399c9e917c 100644 --- a/interface/src/ui/ChatWindow.h +++ b/interface/src/ui/ChatWindow.h @@ -57,7 +57,6 @@ private: QDateTime lastMessageStamp; bool _mousePressed; QPoint _mouseStartPosition; - QMap _emoticonMap; private slots: void connected(); From 951d5004e121947b4379ccd951368a5b85046d48 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 11:57:43 -0700 Subject: [PATCH 21/31] Add ChatInputArea with custom paste --- interface/src/ui/ChatMessageArea.h | 4 ++++ interface/ui/chatWindow.ui | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ChatMessageArea.h b/interface/src/ui/ChatMessageArea.h index 48cfc01aec..b726a31d76 100644 --- a/interface/src/ui/ChatMessageArea.h +++ b/interface/src/ui/ChatMessageArea.h @@ -33,6 +33,10 @@ protected: virtual void wheelEvent(QWheelEvent* event); bool _useFixedHeight; + void insertFromMimeData(const QMimeData* source) { + insertPlainText(source->text()); + }; + }; #endif // hifi_ChatMessageArea_h diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index d63542bf7b..28aa6a2390 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -186,7 +186,7 @@ QPushButton:pressed { - + 0 @@ -223,6 +223,13 @@ QPushButton:pressed { + + + ChatInputArea + QTextEdit +
ui/ChatInputArea.h
+
+
messagePlainTextEdit messagesScrollArea From 5fd585aab1c7206c749b7fd44b66e65e663c477d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 12:26:59 -0700 Subject: [PATCH 22/31] Fix error with cursor format getting reset when sending chat message --- interface/src/ui/ChatWindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index c459a6d426..d967e2305d 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -128,7 +128,9 @@ bool ChatWindow::eventFilter(QObject* sender, QEvent* event) { message.setBody(messageText); XmppClient::getInstance().getXMPPClient().sendPacket(message); #endif - ui->messagePlainTextEdit->document()->clear(); + QTextCursor cursor = ui->messagePlainTextEdit->textCursor(); + cursor.select(QTextCursor::Document); + cursor.removeSelectedText(); } return true; } From 95357a7c35063b8a44171ac9fd6e301aeb9e83da Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 12:30:40 -0700 Subject: [PATCH 23/31] Update chat input area to use a 14pt font --- interface/ui/chatWindow.ui | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index 28aa6a2390..b1448091c4 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -199,6 +199,12 @@ QPushButton:pressed { 60 + + + Helvetica,Arial,sans-serif + 14 + + border-color: palette(dark); border-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; From d56a4e169e726ea67f55b890fa57dfba9c1928d9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 15:24:21 -0700 Subject: [PATCH 24/31] Add ChatInputArea --- interface/src/ui/ChatInputArea.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 interface/src/ui/ChatInputArea.h diff --git a/interface/src/ui/ChatInputArea.h b/interface/src/ui/ChatInputArea.h new file mode 100644 index 0000000000..264a9932c6 --- /dev/null +++ b/interface/src/ui/ChatInputArea.h @@ -0,0 +1,28 @@ +// +// ChatInputArea.h +// interface/src/ui +// +// Created by Ryan Huffman on 4/11/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ChatInputArea_h +#define hifi_ChatInputArea_h + +#include + +class ChatInputArea : public QTextEdit { + Q_OBJECT +public: + ChatInputArea(QWidget* parent) : QTextEdit(parent) { }; + +protected: + void insertFromMimeData(const QMimeData* source) { + insertPlainText(source->text()); + }; +}; + +#endif // hifi_ChatInputArea_h From 1774f6c9bdcddf9219afacd478a9ed8bc1856e96 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 15:37:28 -0700 Subject: [PATCH 25/31] Add threshold to auto scroll --- interface/src/ui/ChatWindow.cpp | 10 +++++----- interface/src/ui/ChatWindow.h | 8 +++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/interface/src/ui/ChatWindow.cpp b/interface/src/ui/ChatWindow.cpp index d967e2305d..e0802c6bc5 100644 --- a/interface/src/ui/ChatWindow.cpp +++ b/interface/src/ui/ChatWindow.cpp @@ -171,7 +171,7 @@ void ChatWindow::addTimeStamp() { timeLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); timeLabel->setAlignment(Qt::AlignLeft); - bool atBottom = isAtBottom(); + bool atBottom = isNearBottom(); ui->messagesVBoxLayout->addWidget(timeLabel); ui->messagesVBoxLayout->parentWidget()->updateGeometry(); @@ -288,7 +288,7 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { messageText = messageText.replace(regexHifiLinks, "\\1"); messageArea->setHtml(userLabel + messageText); - bool atBottom = isAtBottom(); + bool atBottom = isNearBottom(); ui->messagesVBoxLayout->addWidget(messageArea); ui->messagesVBoxLayout->parentWidget()->updateGeometry(); @@ -308,13 +308,13 @@ void ChatWindow::messageReceived(const QXmppMessage& message) { #endif -bool ChatWindow::isAtBottom() { +bool ChatWindow::isNearBottom() { QScrollBar* verticalScrollBar = ui->messagesScrollArea->verticalScrollBar(); - return verticalScrollBar->sliderPosition() == verticalScrollBar->maximum(); + return verticalScrollBar->value() >= verticalScrollBar->maximum() - Ui::AUTO_SCROLL_THRESHOLD; } // Scroll chat message area to bottom. void ChatWindow::scrollToBottom() { QScrollBar* verticalScrollBar = ui->messagesScrollArea->verticalScrollBar(); - verticalScrollBar->setSliderPosition(verticalScrollBar->maximum()); + verticalScrollBar->setValue(verticalScrollBar->maximum()); } diff --git a/interface/src/ui/ChatWindow.h b/interface/src/ui/ChatWindow.h index 399c9e917c..104fbe1746 100644 --- a/interface/src/ui/ChatWindow.h +++ b/interface/src/ui/ChatWindow.h @@ -27,6 +27,12 @@ #endif namespace Ui { + + +// Maximum amount the chat can be scrolled up in order to auto scroll. +const int AUTO_SCROLL_THRESHOLD = 20; + + class ChatWindow; } @@ -49,7 +55,7 @@ private: #endif void startTimerForTimeStamps(); void addTimeStamp(); - bool isAtBottom(); + bool isNearBottom(); void scrollToBottom(); Ui::ChatWindow* ui; From 0cba95e7ad1f8550eec37743af415ba2b03f80a7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 15:37:49 -0700 Subject: [PATCH 26/31] Reorder property initialization in FramelessDialog --- interface/src/ui/FramelessDialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/FramelessDialog.cpp b/interface/src/ui/FramelessDialog.cpp index 816c45b38a..4919e99db6 100644 --- a/interface/src/ui/FramelessDialog.cpp +++ b/interface/src/ui/FramelessDialog.cpp @@ -16,10 +16,10 @@ const int RESIZE_HANDLE_WIDTH = 7; FramelessDialog::FramelessDialog(QWidget *parent, Qt::WindowFlags flags, Position position) : QDialog(parent, flags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint), - _position(position), - _selfHidden(false), _isResizing(false), - _resizeInitialWidth(0) { + _resizeInitialWidth(0), + _selfHidden(false), + _position(position) { setAttribute(Qt::WA_DeleteOnClose); From b0e1eab7ed19b1967d9514d8d35495024b3ea863 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 23 Apr 2014 16:15:51 -0700 Subject: [PATCH 27/31] Fix chat input textbox to use native scrollbar The border around the textedit was causing QT to use a non-native scrollbar. Moving the box into a frame that contains the border styling fixes this. --- interface/ui/chatWindow.ui | 85 ++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 21 deletions(-) diff --git a/interface/ui/chatWindow.ui b/interface/ui/chatWindow.ui index b1448091c4..4d223b2665 100644 --- a/interface/ui/chatWindow.ui +++ b/interface/ui/chatWindow.ui @@ -186,9 +186,9 @@ QPushButton:pressed { - + - + 0 0 @@ -196,33 +196,77 @@ QPushButton:pressed { 0 - 60 + 78 - - - Helvetica,Arial,sans-serif - 14 - - - border-color: palette(dark); border-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; + #chatFrame { +border-color: palette(dark); border-style: solid; border-left-width: 1px; border-right-width: 1px; border-bottom-width: 1px; +} QFrame::NoFrame - - Qt::ScrollBarAlwaysOff + + QFrame::Raised - - QAbstractScrollArea::AdjustToContents - - - true - - - false + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 60 + + + + + Helvetica,Arial,sans-serif + 14 + + + + + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContents + + + true + + + false + + + + @@ -237,7 +281,6 @@ QPushButton:pressed { - messagePlainTextEdit messagesScrollArea From ccad0aed9e68e993360cbadfb404c6f20bf01001 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 24 Apr 2014 14:54:01 -0700 Subject: [PATCH 28/31] Move ChatInputArea code in header to .cpp --- interface/src/ui/ChatInputArea.cpp | 19 +++++++++++++++++++ interface/src/ui/ChatInputArea.h | 7 +++---- 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 interface/src/ui/ChatInputArea.cpp diff --git a/interface/src/ui/ChatInputArea.cpp b/interface/src/ui/ChatInputArea.cpp new file mode 100644 index 0000000000..3e8fc84fe2 --- /dev/null +++ b/interface/src/ui/ChatInputArea.cpp @@ -0,0 +1,19 @@ +// +// ChatInputArea.cpp +// interface/src/ui +// +// Created by Ryan Huffman on 4/24/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ChatInputArea.h" + +ChatInputArea::ChatInputArea(QWidget* parent) : QTextEdit(parent) { +}; + +void ChatInputArea::insertFromMimeData(const QMimeData* source) { + insertPlainText(source->text()); +}; diff --git a/interface/src/ui/ChatInputArea.h b/interface/src/ui/ChatInputArea.h index 264a9932c6..31d1584df7 100644 --- a/interface/src/ui/ChatInputArea.h +++ b/interface/src/ui/ChatInputArea.h @@ -13,16 +13,15 @@ #define hifi_ChatInputArea_h #include +#include class ChatInputArea : public QTextEdit { Q_OBJECT public: - ChatInputArea(QWidget* parent) : QTextEdit(parent) { }; + ChatInputArea(QWidget* parent); protected: - void insertFromMimeData(const QMimeData* source) { - insertPlainText(source->text()); - }; + void insertFromMimeData(const QMimeData* source); }; #endif // hifi_ChatInputArea_h From 7b0981202848064059ccbcf691d077612a625aa8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 24 Apr 2014 14:54:26 -0700 Subject: [PATCH 29/31] Remove insertFromMimeData override in ChatMessageArea --- interface/src/ui/ChatMessageArea.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/interface/src/ui/ChatMessageArea.h b/interface/src/ui/ChatMessageArea.h index b726a31d76..57199538fd 100644 --- a/interface/src/ui/ChatMessageArea.h +++ b/interface/src/ui/ChatMessageArea.h @@ -32,11 +32,6 @@ signals: protected: virtual void wheelEvent(QWheelEvent* event); bool _useFixedHeight; - - void insertFromMimeData(const QMimeData* source) { - insertPlainText(source->text()); - }; - }; #endif // hifi_ChatMessageArea_h From b69fa73dfae82a38ab52327f9a763698e84b0df8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 24 Apr 2014 14:54:57 -0700 Subject: [PATCH 30/31] Unsplit a line in FramelessDialog --- interface/src/ui/FramelessDialog.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/ui/FramelessDialog.h b/interface/src/ui/FramelessDialog.h index 22666cca63..828602a5db 100644 --- a/interface/src/ui/FramelessDialog.h +++ b/interface/src/ui/FramelessDialog.h @@ -21,8 +21,7 @@ class FramelessDialog : public QDialog { public: enum Position { POSITION_LEFT, POSITION_RIGHT }; - FramelessDialog(QWidget* parent = 0, Qt::WindowFlags flags = 0, - Position position = POSITION_LEFT); + FramelessDialog(QWidget* parent = 0, Qt::WindowFlags flags = 0, Position position = POSITION_LEFT); void setStyleSheetFile(const QString& fileName); protected: From d88897ccc707be1e2624c951ae41adcc2d48bd4e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 24 Apr 2014 15:55:34 -0700 Subject: [PATCH 31/31] Add error box when going to user/location that doesn't exist --- interface/src/Application.h | 1 + interface/src/avatar/MyAvatar.cpp | 3 +++ interface/src/location/LocationManager.cpp | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/interface/src/Application.h b/interface/src/Application.h index fb48acb721..6bb2bf4c81 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 317f408aa7..b8a45aacd5 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -1178,6 +1179,8 @@ void MyAvatar::goToLocationFromResponse(const QJsonObject& jsonObject) { coordinateItems[2].toFloat()) - newOrientation * IDENTITY_FRONT * DISTANCE_TO_USER; setPosition(newPosition); emit transformChanged(); + } else { + QMessageBox::warning(Application::getInstance()->getWindow(), "", "That user or location could not be found."); } } diff --git a/interface/src/location/LocationManager.cpp b/interface/src/location/LocationManager.cpp index 8009551b6c..f80c331df4 100644 --- a/interface/src/location/LocationManager.cpp +++ b/interface/src/location/LocationManager.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include "Application.h" #include "LocationManager.h" @@ -118,6 +120,8 @@ void LocationManager::checkForMultipleDestinations() { Application::getInstance()->getAvatar()->goToLocationFromResponse(_placeData); return; } + + QMessageBox::warning(Application::getInstance()->getWindow(), "", "That user or location could not be found."); } }