From f811971a422c1f7058601541391ce78a0d0e5591 Mon Sep 17 00:00:00 2001 From: Menithal Date: Sun, 25 Jun 2017 21:57:07 +0300 Subject: [PATCH] Avatar Bookmarking --- interface/src/AvatarBookmarks.cpp | 48 ++++++++++++++++++++----- interface/src/AvatarBookmarks.h | 10 ++++-- interface/src/Bookmarks.cpp | 56 ++++++++++++++++++++++------- interface/src/Bookmarks.h | 15 ++++---- interface/src/LocationBookmarks.cpp | 18 ++++++++-- interface/src/LocationBookmarks.h | 4 +-- 6 files changed, 115 insertions(+), 36 deletions(-) diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index db2a240b92..31c0e94073 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -58,16 +58,39 @@ void AvatarBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteAvatarBookmark); QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); - Bookmarks::setupMenus(menubar, menu); + for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it) { + addBookmarkToMenu(menubar, it.key(), it.value()); + } + Bookmarks::sortActions(menubar, _bookmarksMenu); } void AvatarBookmarks::changeToBookmarkedAvatar() { QAction* action = qobject_cast(sender()); - const QString& address = action->data().toString(); - auto myAvatar = DependencyManager::get()->getMyAvatar(); - myAvatar->useFullAvatarURL(address); + + + // TODO: Phase this out eventually. + if (action->data().type() == QVariant::String) { + // Legacy avatar bookmark. + + myAvatar->useFullAvatarURL(action->data().toString()); + qCDebug(interfaceapp) << " Using Legacy Avatar Bookmark "; + } + else { + // TODO: this is where the entry is interpreted. + const QMap bookmark = action->data().toMap(); + // Not magic value. This is the current made version, and if it changes this interpreter should be updated to handle the new one separately. + if (bookmark.value(ENTRY_VERSION) == 3) { + + myAvatar->useFullAvatarURL(bookmark.value(ENTRY_AVATAR_URL).toString()); + myAvatar->setAttachmentsVariant(bookmark.value(ENTRY_AVATAR_ATTACHMENTS).toList()); + } + else { + qCDebug(interfaceapp) << " Bookmark entry does not match client version, make sure client has a handler for the new AvatarBookmark"; + } + } + } void AvatarBookmarks::addBookmark() { @@ -83,13 +106,22 @@ void AvatarBookmarks::addBookmark() { } auto myAvatar = DependencyManager::get()->getMyAvatar(); - const QString& bookmarkAddress = myAvatar->getSkeletonModelURL().toString(); - Bookmarks::addBookmarkToFile(bookmarkName, bookmarkAddress); + + const QString& avatarUrl = myAvatar->getSkeletonModelURL().toString(); + const QVariantList& attachments = myAvatar->getAttachmentsVariant(); + + // If Avatar attachments ever change, this is where to update them, when saving remember to also append to AVATAR_BOOKMARK_VERSION + QVariantMap *bookmark = new QVariantMap; + bookmark->insert(ENTRY_VERSION, AVATAR_BOOKMARK_VERSION); + bookmark->insert(ENTRY_AVATAR_URL, avatarUrl); + bookmark->insert(ENTRY_AVATAR_ATTACHMENTS, attachments); + + Bookmarks::addBookmarkToFile(bookmarkName, *bookmark); } -void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { +void AvatarBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark) { QAction* changeAction = _bookmarksMenu->newAction(); - changeAction->setData(address); + changeAction->setData(bookmark); connect(changeAction, SIGNAL(triggered()), this, SLOT(changeToBookmarkedAvatar())); if (!_isMenuSorted) { menubar->addActionToQMenuAndActionHash(_bookmarksMenu, changeAction, name, 0, QAction::NoRole); diff --git a/interface/src/AvatarBookmarks.h b/interface/src/AvatarBookmarks.h index dc5a0aee6e..4136f5edca 100644 --- a/interface/src/AvatarBookmarks.h +++ b/interface/src/AvatarBookmarks.h @@ -21,18 +21,22 @@ class AvatarBookmarks: public Bookmarks, public Dependency { public: AvatarBookmarks(); - - void setupMenus(Menu* menubar, MenuWrapper* menu) override; + void setupMenus(Menu* menubar, MenuWrapper* menu); public slots: void addBookmark(); protected: - void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark); void readFromFile(); private: const QString AVATARBOOKMARKS_FILENAME = "avatarbookmarks.json"; + const QString ENTRY_AVATAR_URL = "avatarUrl"; + const QString ENTRY_AVATAR_ATTACHMENTS = "attachments"; + const QString ENTRY_VERSION = "version"; + + const int AVATAR_BOOKMARK_VERSION = 3; private slots: void changeToBookmarkedAvatar(); diff --git a/interface/src/Bookmarks.cpp b/interface/src/Bookmarks.cpp index 4cbc17f8ce..f495e5b502 100644 --- a/interface/src/Bookmarks.cpp +++ b/interface/src/Bookmarks.cpp @@ -28,7 +28,7 @@ Bookmarks::Bookmarks() : _isMenuSorted(false) { } - +/** void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { // Enable/Disable menus as needed enableMenuItems(_bookmarks.count() > 0); @@ -36,11 +36,41 @@ void Bookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { // Load Bookmarks for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it) { QString bookmarkName = it.key(); - QString bookmarkAddress = it.value().toString(); - addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + + QMap *avatarData; + QVariant::Type type = it.value().type; + + if (type == QVariant::Map){ + QMap& map = it.value().toMap; + + // Convert to map and get version.- + if (map.contains("version")){ + auto version = map.find("version"); + + if (version == AVATAR_BOOKMARK_VERSION) { + addBookmarkToMenu(menubar, bookmarkName, map); + } + } + else { + //Not valid. Skip? + } + } + else if (type == QVariant::String) { + // Bookmark String type, generic usually for avatars or locations. + QString bookmarkAddress = it.value().toString(); + avatarData = new QVariantMap; + + avatarData->insert(); + + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + } + else { + // Unexpected Type + } + } } - +*/ void Bookmarks::deleteBookmark() { QStringList bookmarkList; QList menuItems = _bookmarksMenu->actions(); @@ -67,7 +97,7 @@ void Bookmarks::deleteBookmark() { } } -void Bookmarks::addBookmarkToFile(const QString& bookmarkName, const QString& bookmarkAddress) { +void Bookmarks::addBookmarkToFile(const QString& bookmarkName, const QVariant& bookmark) { Menu* menubar = Menu::getInstance(); if (contains(bookmarkName)) { auto offscreenUi = DependencyManager::get(); @@ -75,7 +105,6 @@ void Bookmarks::addBookmarkToFile(const QString& bookmarkName, const QString& bo "The bookmark name you entered already exists in your list.", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); duplicateBookmarkMessage->setProperty("informativeText", "Would you like to overwrite it?"); - auto result = offscreenUi->waitForMessageBoxResult(duplicateBookmarkMessage); if (result != QMessageBox::Yes) { return; @@ -83,19 +112,20 @@ void Bookmarks::addBookmarkToFile(const QString& bookmarkName, const QString& bo removeBookmarkFromMenu(menubar, bookmarkName); } - addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); - insert(bookmarkName, bookmarkAddress); // Overwrites any item with the same bookmarkName. + addBookmarkToMenu(menubar, bookmarkName, bookmark); + insert(bookmarkName, bookmark); // Overwrites any item with the same bookmarkName. enableMenuItems(true); } -void Bookmarks::insert(const QString& name, const QString& address) { - _bookmarks.insert(name, address); +void Bookmarks::insert(const QString& name, const QVariant& bookmark) { + _bookmarks.insert(name, bookmark); if (contains(name)) { - qCDebug(interfaceapp) << "Added bookmark:" << name << "," << address; + qCDebug(interfaceapp) << "Added bookmark:" << name; persistToFile(); - } else { - qWarning() << "Couldn't add bookmark: " << name << "," << address; + } + else { + qWarning() << "Couldn't add bookmark: " << name; } } diff --git a/interface/src/Bookmarks.h b/interface/src/Bookmarks.h index 6c322197cc..aa3b95c6de 100644 --- a/interface/src/Bookmarks.h +++ b/interface/src/Bookmarks.h @@ -27,18 +27,20 @@ class Bookmarks: public QObject { public: Bookmarks(); - virtual void setupMenus(Menu* menubar, MenuWrapper* menu); + virtual void setupMenus(Menu* menubar, MenuWrapper* menu) = 0; QString addressForBookmark(const QString& name) const; protected: - virtual void addBookmarkToFile(const QString& bookmarkName, const QString& bookmarkAddress); - virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) = 0; + void addBookmarkToFile(const QString& bookmarkName, const QVariant& bookmark); + virtual void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& bookmark) = 0; void enableMenuItems(bool enabled); - void readFromFile(); - void insert(const QString& name, const QString& address); // Overwrites any existing entry with same name. + virtual void readFromFile(); + void insert(const QString& name, const QVariant& address); // Overwrites any existing entry with same name. void sortActions(Menu* menubar, MenuWrapper* menu); int getMenuItemLocation(QList actions, const QString& name) const; - + + bool Bookmarks::contains(const QString& name) const; + QVariantMap _bookmarks; // { name: url, ... } QPointer _bookmarksMenu; QPointer _deleteBookmarksAction; @@ -50,7 +52,6 @@ protected slots: private: void remove(const QString& name); - bool contains(const QString& name) const; static bool sortOrder(QAction* a, QAction* b); void persistToFile(); diff --git a/interface/src/LocationBookmarks.cpp b/interface/src/LocationBookmarks.cpp index b79adcf1b7..eee6cdf3c8 100644 --- a/interface/src/LocationBookmarks.cpp +++ b/interface/src/LocationBookmarks.cpp @@ -41,13 +41,25 @@ void LocationBookmarks::setupMenus(Menu* menubar, MenuWrapper* menu) { _deleteBookmarksAction = menubar->addActionToQMenuAndActionHash(menu, MenuOption::DeleteBookmark); QObject::connect(_deleteBookmarksAction, SIGNAL(triggered()), this, SLOT(deleteBookmark()), Qt::QueuedConnection); - Bookmarks::setupMenus(menubar, menu); + // Legacy Location to Bookmark. + + // Enable/Disable menus as needed + enableMenuItems(_bookmarks.count() > 0); + + // Load Bookmarks + for (auto it = _bookmarks.begin(); it != _bookmarks.end(); ++it) { + QString bookmarkName = it.key(); + QString bookmarkAddress = it.value().toString(); + addBookmarkToMenu(menubar, bookmarkName, bookmarkAddress); + } + Bookmarks::sortActions(menubar, _bookmarksMenu); } void LocationBookmarks::setHomeLocation() { auto addressManager = DependencyManager::get(); QString bookmarkAddress = addressManager->currentAddress().toString(); + Bookmarks::addBookmarkToFile(HOME_BOOKMARK, bookmarkAddress); } @@ -74,7 +86,7 @@ void LocationBookmarks::addBookmark() { Bookmarks::addBookmarkToFile(bookmarkName, bookmarkAddress); } -void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) { +void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& address) { QAction* teleportAction = _bookmarksMenu->newAction(); teleportAction->setData(address); connect(teleportAction, SIGNAL(triggered()), this, SLOT(teleportToBookmark())); @@ -85,4 +97,4 @@ void LocationBookmarks::addBookmarkToMenu(Menu* menubar, const QString& name, co menubar->addActionToQMenuAndActionHash(_bookmarksMenu, teleportAction, name, 0, QAction::NoRole); Bookmarks::sortActions(menubar, _bookmarksMenu); } -} +} \ No newline at end of file diff --git a/interface/src/LocationBookmarks.h b/interface/src/LocationBookmarks.h index 1324e96574..76f008cc55 100644 --- a/interface/src/LocationBookmarks.h +++ b/interface/src/LocationBookmarks.h @@ -22,14 +22,14 @@ class LocationBookmarks : public Bookmarks, public Dependency { public: LocationBookmarks(); - void setupMenus(Menu* menubar, MenuWrapper* menu) override; + void setupMenus(Menu* menubar, MenuWrapper* menu); static const QString HOME_BOOKMARK; public slots: void addBookmark(); protected: - void addBookmarkToMenu(Menu* menubar, const QString& name, const QString& address) override; + void addBookmarkToMenu(Menu* menubar, const QString& name, const QVariant& address); private: const QString LOCATIONBOOKMARKS_FILENAME = "bookmarks.json";