From 7130c579f5c8214d1ba8f13f0795867ae888de54 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 13 Jan 2015 17:56:34 -0800 Subject: [PATCH 01/10] First pass at Bookmarks class In-memory for starters. --- interface/src/Bookmarks.cpp | 54 +++++++++++++++++++++++++++++++++++++ interface/src/Bookmarks.h | 39 +++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 interface/src/Bookmarks.cpp create mode 100644 interface/src/Bookmarks.h diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp new file mode 100644 index 0000000000..c8879e1a8f --- /dev/null +++ b/interface/src/Bookmarks.cpp @@ -0,0 +1,54 @@ +// +// Bookmarks.cpp +// interface/src +// +// Created by David Rowe on 13 Jan 2015. +// Copyright 2015 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 "Bookmarks.h" + +Bookmarks::Bookmarks() { +} + +void Bookmarks::insert(QString name, QString address) { + QString key = name.toLower(); + + if (isValidName(name)) { + QJsonObject bookmark; + bookmark.insert("name", name); + bookmark.insert("address", address); + _bookmarks.insert(key, bookmark); + + if (contains(key)) { + qDebug() << "Added bookmark: " << name << ", " << address; + } else { + qDebug() << "Couldn't add bookmark: " << name << ", " << address; + } + } else { + qDebug() << "Invalid bookmark: " << name << ", " << address; + } +} + +void Bookmarks::remove(QString name) { + QString key = name.toLower(); + + _bookmarks.remove(key); + + if (!contains(key)) { + qDebug() << "Removed bookmark: " << name; + } else { + qDebug() << "Couldn't remove bookmark: " << name; + } +} + +bool Bookmarks::contains(QString name) { + return _bookmarks.contains(name.toLower()); +} + +bool Bookmarks::isValidName(QString name) { + return _nameRegExp.exactMatch(name); +} diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h new file mode 100644 index 0000000000..a2def873b0 --- /dev/null +++ b/interface/src/Bookmarks.h @@ -0,0 +1,39 @@ +// +// Bookmarks.h +// interface/src +// +// Created by David Rowe on 13 Jan 2015. +// Copyright 2015 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_Bookmarks_h +#define hifi_Bookmarks_h + +#include +#include +#include +#include +#include + +class Bookmarks: public QObject { + Q_OBJECT + +public: + Bookmarks(); + + void insert(QString name, QString address); // Overwrites any existing entry with same name. + void remove(QString name); + + bool contains(QString name); + bool isValidName(QString name); + +private: + QMap _bookmarks; // key: { name: string, address: string } + // key is a lowercase copy of name, used to make the bookmarks case insensitive. + const QRegExp _nameRegExp = QRegExp("^[\\w\\-]+$"); +}; + +#endif // hifi_Bookmarks_h \ No newline at end of file From fa6faa771a70eb405784bfe4a9e608564015c931 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 13 Jan 2015 22:39:16 -0800 Subject: [PATCH 02/10] Add bookmarks with Bookmark Location menu item The menu of bookmarks is kept sorted. --- interface/src/Application.cpp | 2 ++ interface/src/Application.h | 5 ++++ interface/src/Bookmarks.cpp | 28 +++++++------------ interface/src/Bookmarks.h | 10 +++---- interface/src/Menu.cpp | 51 +++++++++++++++++++++++++++++++++++ interface/src/Menu.h | 5 ++++ 6 files changed, 76 insertions(+), 25 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c8f93b0fa6..717ebdd749 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -310,6 +310,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _settings = new QSettings(this); _numChangedSettings = 0; + _bookmarks = new Bookmarks(); + #ifdef _WIN32 WSADATA WsaData; int wsaresult = WSAStartup(MAKEWORD(2,2), &WsaData); diff --git a/interface/src/Application.h b/interface/src/Application.h index d9ec5a1eae..70f7811555 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -38,6 +38,7 @@ #include #include "Audio.h" +#include "Bookmarks.h" #include "Camera.h" #include "DatagramProcessor.h" #include "Environment.h" @@ -296,6 +297,8 @@ public: QRect getDesirableApplicationGeometry(); RunningScriptsWidget* getRunningScriptsWidget() { return _runningScriptsWidget; } + Bookmarks* getBookmarks() const { return _bookmarks; } + signals: /// Fired when we're simulating; allows external parties to hook in. @@ -569,6 +572,8 @@ private: bool _isVSyncOn; bool _aboutToQuit; + + Bookmarks* _bookmarks; }; #endif // hifi_Application_h diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index c8879e1a8f..36f489fa6a 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -14,26 +14,22 @@ Bookmarks::Bookmarks() { } -void Bookmarks::insert(QString name, QString address) { +void Bookmarks::insert(const QString& name, const QString& address) { QString key = name.toLower(); - if (isValidName(name)) { - QJsonObject bookmark; - bookmark.insert("name", name); - bookmark.insert("address", address); - _bookmarks.insert(key, bookmark); + QJsonObject bookmark; + bookmark.insert("name", name); + bookmark.insert("address", address); + _bookmarks.insert(key, bookmark); - if (contains(key)) { - qDebug() << "Added bookmark: " << name << ", " << address; - } else { - qDebug() << "Couldn't add bookmark: " << name << ", " << address; - } + if (contains(key)) { + qDebug() << "Added bookmark: " << name << ", " << address; } else { - qDebug() << "Invalid bookmark: " << name << ", " << address; + qDebug() << "Couldn't add bookmark: " << name << ", " << address; } } -void Bookmarks::remove(QString name) { +void Bookmarks::remove(const QString& name) { QString key = name.toLower(); _bookmarks.remove(key); @@ -45,10 +41,6 @@ void Bookmarks::remove(QString name) { } } -bool Bookmarks::contains(QString name) { +bool Bookmarks::contains(const QString& name) const { return _bookmarks.contains(name.toLower()); } - -bool Bookmarks::isValidName(QString name) { - return _nameRegExp.exactMatch(name); -} diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index a2def873b0..f9c40d7523 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -16,7 +16,6 @@ #include #include #include -#include class Bookmarks: public QObject { Q_OBJECT @@ -24,16 +23,13 @@ class Bookmarks: public QObject { public: Bookmarks(); - void insert(QString name, QString address); // Overwrites any existing entry with same name. - void remove(QString name); - - bool contains(QString name); - bool isValidName(QString name); + void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. + void remove(const QString& name); + bool contains(const QString& name) const; private: QMap _bookmarks; // key: { name: string, address: string } // key is a lowercase copy of name, used to make the bookmarks case insensitive. - const QRegExp _nameRegExp = QRegExp("^[\\w\\-]+$"); }; #endif // hifi_Bookmarks_h \ No newline at end of file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 996bb6a641..fa93778085 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -123,6 +123,10 @@ Menu::Menu() : appInstance, SLOT(toggleRunningScriptsWidget())); addDisabledActionAndSeparator(fileMenu, "Go"); + addActionToQMenuAndActionHash(fileMenu, MenuOption::BookmarkLocation, 0, + this, SLOT(bookmarkLocation())); + _bookmarksMenu = fileMenu->addMenu(MenuOption::Bookmarks); + _bookmarksMenu->setEnabled(false); addActionToQMenuAndActionHash(fileMenu, MenuOption::NameLocation, Qt::CTRL | Qt::Key_N, @@ -1010,6 +1014,53 @@ void Menu::changeVSync() { Application::getInstance()->setVSyncEnabled(isOptionChecked(MenuOption::RenderTargetFramerateVSyncOn)); } +void Menu::bookmarkLocation() { + + QInputDialog bookmarkLocationDialog(Application::getInstance()->getWindow()); + bookmarkLocationDialog.setWindowTitle("Bookmark Location"); + bookmarkLocationDialog.setLabelText("Name:"); + bookmarkLocationDialog.setInputMode(QInputDialog::TextInput); + bookmarkLocationDialog.resize(400, 200); + + if (bookmarkLocationDialog.exec() == QDialog::Rejected) { + return; + } + + QString bookmarkName = bookmarkLocationDialog.textValue().trimmed(); + if (bookmarkName.length() == 0) { + return; + } + + AddressManager::SharedPointer addressManager = DependencyManager::get(); + QString bookmarkAddress = addressManager->currentAddress().toString(); + + Bookmarks* bookmarks = Application::getInstance()->getBookmarks(); + if (bookmarks->contains(bookmarkName)) { + QMessageBox duplicateBookmarkMessage; + duplicateBookmarkMessage.setIcon(QMessageBox::Warning); + duplicateBookmarkMessage.setText("The bookmark name you entered already exists in your list."); + duplicateBookmarkMessage.setInformativeText("Would you like to overwrite it?"); + duplicateBookmarkMessage.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + duplicateBookmarkMessage.setDefaultButton(QMessageBox::Yes); + if (duplicateBookmarkMessage.exec() == QMessageBox::No) { + return; + } + removeAction(_bookmarksMenu, bookmarkName); + } + + bookmarks->insert(bookmarkName, bookmarkAddress); + + QList menuItems = _bookmarksMenu->actions(); + int position = 0; + while (position < menuItems.count() && bookmarkName > menuItems[position]->text()) { + position += 1; + } + addActionToQMenuAndActionHash(_bookmarksMenu, bookmarkName, 0, + this, NULL, QAction::NoRole, position); + + _bookmarksMenu->setEnabled(true); +} + void Menu::displayNameLocationResponse(const QString& errorString) { if (!errorString.isEmpty()) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 6f30ca983b..52a785860e 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -200,6 +200,7 @@ private slots: void editAttachments(); void editAnimations(); void changePrivateKey(); + void bookmarkLocation(); void nameLocation(); void toggleLocationList(); void hmdToolsClosed(); @@ -307,6 +308,8 @@ private: bool _shouldRenderTableNeedsRebuilding = true; QMap _shouldRenderTable; + + QMenu* _bookmarksMenu; }; namespace MenuOption { @@ -334,6 +337,8 @@ namespace MenuOption { const QString Bandwidth = "Bandwidth Display"; const QString BandwidthDetails = "Bandwidth Details"; const QString BlueSpeechSphere = "Blue Sphere While Speaking"; + const QString BookmarkLocation = "Bookmark Location"; + const QString Bookmarks = "Bookmarks"; const QString CascadedShadows = "Cascaded"; const QString CachesSize = "Caches Size"; const QString Chat = "Chat..."; From 01f7efe76757f4ad7c31a1d3ee8e3c30bb035e7c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 13 Jan 2015 22:48:05 -0800 Subject: [PATCH 03/10] Remove ellipsis from Collide With menu item Noticed in passing. --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index fa93778085..7fc3c9bfd1 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -265,7 +265,7 @@ Menu::Menu() : addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ShiftHipsForIdleAnimations, 0, false, avatar, SLOT(updateMotionBehavior())); - QMenu* collisionsMenu = avatarMenu->addMenu("Collide With..."); + QMenu* collisionsMenu = avatarMenu->addMenu("Collide With"); addCheckableActionToQMenuAndActionHash(collisionsMenu, MenuOption::CollideAsRagdoll, 0, false, avatar, SLOT(onToggleRagdoll())); addCheckableActionToQMenuAndActionHash(collisionsMenu, MenuOption::CollideWithAvatars, From a78ab5a5b3e706c2ba9e35f09ec9cc91646e6a53 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 10:14:56 -0800 Subject: [PATCH 04/10] Teleport to selected bookmark --- interface/src/Menu.cpp | 15 +++++++++++++-- interface/src/Menu.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7fc3c9bfd1..c8c08e4828 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1050,17 +1050,28 @@ void Menu::bookmarkLocation() { bookmarks->insert(bookmarkName, bookmarkAddress); + QAction* teleportAction = new QAction(getMenu(MenuOption::Bookmarks)); + teleportAction->setData(bookmarkAddress); + connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); + QList menuItems = _bookmarksMenu->actions(); int position = 0; while (position < menuItems.count() && bookmarkName > menuItems[position]->text()) { position += 1; } - addActionToQMenuAndActionHash(_bookmarksMenu, bookmarkName, 0, - this, NULL, QAction::NoRole, position); + + addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, + QAction::NoRole, position); _bookmarksMenu->setEnabled(true); } +void Menu::teleportToBookmark() { + QAction *action = qobject_cast(sender()); + QString url = action->data().toString(); + DependencyManager::get()->handleLookupString(url); +} + void Menu::displayNameLocationResponse(const QString& errorString) { if (!errorString.isEmpty()) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 52a785860e..4f79125819 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -201,6 +201,7 @@ private slots: void editAnimations(); void changePrivateKey(); void bookmarkLocation(); + void teleportToBookmark(); void nameLocation(); void toggleLocationList(); void hmdToolsClosed(); From da58d5a38150e5e8125f0388f622faf289806f61 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 18:15:39 -0800 Subject: [PATCH 05/10] Delete Bookmark menu item and dialog box --- interface/src/Menu.cpp | 45 ++++++++++++++++++++++++++++++++++++++++-- interface/src/Menu.h | 3 +++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c8c08e4828..d45880a0b2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -127,6 +127,10 @@ Menu::Menu() : this, SLOT(bookmarkLocation())); _bookmarksMenu = fileMenu->addMenu(MenuOption::Bookmarks); _bookmarksMenu->setEnabled(false); + _deleteBookmarksMenu = addActionToQMenuAndActionHash(fileMenu, + MenuOption::DeleteBookmark, 0, + this, SLOT(deleteBookmark())); + _deleteBookmarksMenu->setEnabled(false); addActionToQMenuAndActionHash(fileMenu, MenuOption::NameLocation, Qt::CTRL | Qt::Key_N, @@ -1048,8 +1052,6 @@ void Menu::bookmarkLocation() { removeAction(_bookmarksMenu, bookmarkName); } - bookmarks->insert(bookmarkName, bookmarkAddress); - QAction* teleportAction = new QAction(getMenu(MenuOption::Bookmarks)); teleportAction->setData(bookmarkAddress); connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); @@ -1063,7 +1065,10 @@ void Menu::bookmarkLocation() { addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, QAction::NoRole, position); + bookmarks->insert(bookmarkName, bookmarkAddress); + _bookmarksMenu->setEnabled(true); + _deleteBookmarksMenu->setEnabled(true); } void Menu::teleportToBookmark() { @@ -1072,6 +1077,42 @@ void Menu::teleportToBookmark() { DependencyManager::get()->handleLookupString(url); } +void Menu::deleteBookmark() { + + QStringList bookmarkList; + QList menuItems = _bookmarksMenu->actions(); + for (int i = 0; i < menuItems.count(); i += 1) { + bookmarkList.append(menuItems[i]->text()); + } + + QInputDialog deleteBookmarkDialog(Application::getInstance()->getWindow()); + deleteBookmarkDialog.setWindowTitle("Delete Bookmark"); + deleteBookmarkDialog.setLabelText("Select the bookmark to delete"); + deleteBookmarkDialog.resize(400, 400); + deleteBookmarkDialog.setOption(QInputDialog::UseListViewForComboBoxItems); + deleteBookmarkDialog.setComboBoxItems(bookmarkList); + deleteBookmarkDialog.setOkButtonText("Delete"); + + if (deleteBookmarkDialog.exec() == QDialog::Rejected) { + return; + } + + QString bookmarkName = deleteBookmarkDialog.textValue().trimmed(); + if (bookmarkName.length() == 0) { + return; + } + + removeAction(_bookmarksMenu, bookmarkName); + + Bookmarks* bookmarks = Application::getInstance()->getBookmarks(); + bookmarks->remove(bookmarkName); + + if (_bookmarksMenu->actions().count() == 0) { + _bookmarksMenu->setEnabled(false); + _deleteBookmarksMenu->setEnabled(false); + } +} + void Menu::displayNameLocationResponse(const QString& errorString) { if (!errorString.isEmpty()) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 4f79125819..67d55b79b1 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -202,6 +202,7 @@ private slots: void changePrivateKey(); void bookmarkLocation(); void teleportToBookmark(); + void deleteBookmark(); void nameLocation(); void toggleLocationList(); void hmdToolsClosed(); @@ -311,6 +312,7 @@ private: QMap _shouldRenderTable; QMenu* _bookmarksMenu; + QAction* _deleteBookmarksMenu; }; namespace MenuOption { @@ -350,6 +352,7 @@ namespace MenuOption { const QString Collisions = "Collisions"; const QString Console = "Console..."; const QString ControlWithSpeech = "Control With Speech"; + const QString DeleteBookmark = "Delete Bookmark..."; const QString DontRenderEntitiesAsScene = "Don't Render Entities as Scene"; const QString DontDoPrecisionPicking = "Don't Do Precision Picking"; const QString DecreaseAvatarSize = "Decrease Avatar Size"; From 1ffe22d5e9470662cba632a78dda54cf677f69e6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 18:31:54 -0800 Subject: [PATCH 06/10] Sanitize bookmark names --- interface/src/Menu.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index d45880a0b2..24e5935887 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1031,6 +1031,10 @@ void Menu::bookmarkLocation() { } QString bookmarkName = bookmarkLocationDialog.textValue().trimmed(); + bookmarkName = bookmarkName.replace("\r\n", " "); + bookmarkName = bookmarkName.replace("\n", " "); + bookmarkName = bookmarkName.replace("\r", " "); + bookmarkName = bookmarkName.replace("\t", " "); if (bookmarkName.length() == 0) { return; } From d9bd7f019fe31dda672df552faf065a12c1fbcf5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 22:20:45 -0800 Subject: [PATCH 07/10] Simplify bookmark handling --- interface/src/Bookmarks.cpp | 17 +++++------------ interface/src/Bookmarks.h | 3 +-- interface/src/Menu.cpp | 2 +- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 36f489fa6a..23a637c1d9 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -15,14 +15,9 @@ Bookmarks::Bookmarks() { } void Bookmarks::insert(const QString& name, const QString& address) { - QString key = name.toLower(); + _bookmarks.insert(name, address); - QJsonObject bookmark; - bookmark.insert("name", name); - bookmark.insert("address", address); - _bookmarks.insert(key, bookmark); - - if (contains(key)) { + if (contains(name)) { qDebug() << "Added bookmark: " << name << ", " << address; } else { qDebug() << "Couldn't add bookmark: " << name << ", " << address; @@ -30,11 +25,9 @@ void Bookmarks::insert(const QString& name, const QString& address) { } void Bookmarks::remove(const QString& name) { - QString key = name.toLower(); + _bookmarks.remove(name); - _bookmarks.remove(key); - - if (!contains(key)) { + if (!contains(name)) { qDebug() << "Removed bookmark: " << name; } else { qDebug() << "Couldn't remove bookmark: " << name; @@ -42,5 +35,5 @@ void Bookmarks::remove(const QString& name) { } bool Bookmarks::contains(const QString& name) const { - return _bookmarks.contains(name.toLower()); + return _bookmarks.contains(name); } diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index f9c40d7523..3a3f7f74d1 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -28,8 +28,7 @@ public: bool contains(const QString& name) const; private: - QMap _bookmarks; // key: { name: string, address: string } - // key is a lowercase copy of name, used to make the bookmarks case insensitive. + QVariantMap _bookmarks; // { name: address, ... } }; #endif // hifi_Bookmarks_h \ No newline at end of file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 24e5935887..2f477d9711 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1069,7 +1069,7 @@ void Menu::bookmarkLocation() { addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, QAction::NoRole, position); - bookmarks->insert(bookmarkName, bookmarkAddress); + bookmarks->insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. _bookmarksMenu->setEnabled(true); _deleteBookmarksMenu->setEnabled(true); From 426cd71fc67f8b816111265221a43c8d654b3ac9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 22:58:13 -0800 Subject: [PATCH 08/10] Persist bookmarks to file --- interface/src/Application.cpp | 4 ++-- interface/src/Bookmarks.cpp | 34 ++++++++++++++++++++++++++++++++++ interface/src/Bookmarks.h | 7 +++++++ interface/src/Menu.cpp | 24 ++++++++++++++++++++++++ interface/src/Menu.h | 1 + 5 files changed, 68 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 717ebdd749..253a613f33 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -218,6 +218,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : qDebug() << "[VERSION] Build sequence: " << qPrintable(applicationVersion()); + _bookmarks = new Bookmarks(); // Before setting up the menu + // call Menu getInstance static method to set up the menu _window->setMenuBar(Menu::getInstance()); @@ -310,8 +312,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _settings = new QSettings(this); _numChangedSettings = 0; - _bookmarks = new Bookmarks(); - #ifdef _WIN32 WSADATA WsaData; int wsaresult = WSAStartup(MAKEWORD(2,2), &WsaData); diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 23a637c1d9..aa76914e8a 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -9,9 +9,15 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include +#include + #include "Bookmarks.h" Bookmarks::Bookmarks() { + _bookmarksFilename = QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/" + BOOKMARKS_FILENAME; + readFromFile(); } void Bookmarks::insert(const QString& name, const QString& address) { @@ -19,6 +25,7 @@ void Bookmarks::insert(const QString& name, const QString& address) { if (contains(name)) { qDebug() << "Added bookmark: " << name << ", " << address; + persistToFile(); } else { qDebug() << "Couldn't add bookmark: " << name << ", " << address; } @@ -29,6 +36,7 @@ void Bookmarks::remove(const QString& name) { if (!contains(name)) { qDebug() << "Removed bookmark: " << name; + persistToFile(); } else { qDebug() << "Couldn't remove bookmark: " << name; } @@ -37,3 +45,29 @@ void Bookmarks::remove(const QString& name) { bool Bookmarks::contains(const QString& name) const { return _bookmarks.contains(name); } + +void Bookmarks::readFromFile() { + QFile loadFile(_bookmarksFilename); + + if (!loadFile.open(QIODevice::ReadOnly)) { + qWarning("Couldn't open bookmarks file for reading"); + return; + } + + QByteArray data = loadFile.readAll(); + QJsonDocument json(QJsonDocument::fromJson(data)); + _bookmarks = json.object().toVariantMap(); +} + +void Bookmarks::persistToFile() { + QFile saveFile(_bookmarksFilename); + + if (!saveFile.open(QIODevice::WriteOnly)) { + qWarning("Couldn't open bookmarks file for writing"); + return; + } + + QJsonDocument json(QJsonObject::fromVariantMap(_bookmarks)); + QByteArray data = json.toJson(); + saveFile.write(data); +} diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 3a3f7f74d1..2f054bcdbc 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -27,8 +27,15 @@ public: void remove(const QString& name); bool contains(const QString& name) const; + QVariantMap* getBookmarks() { return &_bookmarks; }; + private: QVariantMap _bookmarks; // { name: address, ... } + + const QString BOOKMARKS_FILENAME = "bookmarks.json"; + QString _bookmarksFilename; + void readFromFile(); + void persistToFile(); }; #endif // hifi_Bookmarks_h \ No newline at end of file diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 2f477d9711..d849dab125 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -131,6 +131,7 @@ Menu::Menu() : MenuOption::DeleteBookmark, 0, this, SLOT(deleteBookmark())); _deleteBookmarksMenu->setEnabled(false); + loadBookmarks(); addActionToQMenuAndActionHash(fileMenu, MenuOption::NameLocation, Qt::CTRL | Qt::Key_N, @@ -1018,6 +1019,29 @@ void Menu::changeVSync() { Application::getInstance()->setVSyncEnabled(isOptionChecked(MenuOption::RenderTargetFramerateVSyncOn)); } +void Menu::loadBookmarks() { + QVariantMap* bookmarks = Application::getInstance()->getBookmarks()->getBookmarks(); + if (bookmarks->count() > 0) { + + QMapIterator i(*bookmarks); + while (i.hasNext()) { + i.next(); + + QString bookmarkName = i.key(); + QString bookmarkAddress = i.value().toString(); + + QAction* teleportAction = new QAction(getMenu(MenuOption::Bookmarks)); + teleportAction->setData(bookmarkAddress); + connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); + + addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, bookmarkName, 0, QAction::NoRole); + } + + _bookmarksMenu->setEnabled(true); + _deleteBookmarksMenu->setEnabled(true); + } +} + void Menu::bookmarkLocation() { QInputDialog bookmarkLocationDialog(Application::getInstance()->getWindow()); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 67d55b79b1..cbdb4d751a 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -311,6 +311,7 @@ private: bool _shouldRenderTableNeedsRebuilding = true; QMap _shouldRenderTable; + void loadBookmarks(); QMenu* _bookmarksMenu; QAction* _deleteBookmarksMenu; }; From ebe80075dc7fae970bd51c4ea92a72af9b6c7c1c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 14 Jan 2015 23:20:47 -0800 Subject: [PATCH 09/10] Tidy --- interface/src/Bookmarks.cpp | 8 ++++---- interface/src/Menu.cpp | 9 +++------ 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index aa76914e8a..d3ecf4097e 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -24,10 +24,10 @@ void Bookmarks::insert(const QString& name, const QString& address) { _bookmarks.insert(name, address); if (contains(name)) { - qDebug() << "Added bookmark: " << name << ", " << address; + qDebug() << "Added bookmark:" << name << "," << address; persistToFile(); } else { - qDebug() << "Couldn't add bookmark: " << name << ", " << address; + qWarning() << "Couldn't add bookmark: " << name << "," << address; } } @@ -35,10 +35,10 @@ void Bookmarks::remove(const QString& name) { _bookmarks.remove(name); if (!contains(name)) { - qDebug() << "Removed bookmark: " << name; + qDebug() << "Deleted bookmark:" << name; persistToFile(); } else { - qDebug() << "Couldn't remove bookmark: " << name; + qWarning() << "Couldn't delete bookmark:" << name; } } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index d849dab125..665c68396c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1055,10 +1055,7 @@ void Menu::bookmarkLocation() { } QString bookmarkName = bookmarkLocationDialog.textValue().trimmed(); - bookmarkName = bookmarkName.replace("\r\n", " "); - bookmarkName = bookmarkName.replace("\n", " "); - bookmarkName = bookmarkName.replace("\r", " "); - bookmarkName = bookmarkName.replace("\t", " "); + bookmarkName = bookmarkName.replace(QRegExp("(\r\n|[\r\n\t\v ])+"), " "); if (bookmarkName.length() == 0) { return; } @@ -1101,8 +1098,8 @@ void Menu::bookmarkLocation() { void Menu::teleportToBookmark() { QAction *action = qobject_cast(sender()); - QString url = action->data().toString(); - DependencyManager::get()->handleLookupString(url); + QString address = action->data().toString(); + DependencyManager::get()->handleLookupString(address); } void Menu::deleteBookmark() { From 52876ecb1675560e473485500e337c39f6409ad7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 15 Jan 2015 10:07:51 -0800 Subject: [PATCH 10/10] Fix merge --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index df4014cd77..ac1aa5ed53 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -1060,7 +1060,7 @@ void Menu::bookmarkLocation() { return; } - AddressManager::SharedPointer addressManager = DependencyManager::get(); + auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); Bookmarks* bookmarks = Application::getInstance()->getBookmarks();