From e593077b4baa5ce1879d68bacaf702dc7532ff6c Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Wed, 3 Aug 2016 09:39:27 -0700 Subject: [PATCH 01/13] basic display of user story feed (hardcoded switch place names vs feed) --- interface/resources/qml/AddressBarDialog.qml | 130 ++++++++++++++----- 1 file changed, 101 insertions(+), 29 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index b9e7941b76..df6a5837ac 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -49,9 +49,31 @@ Window { addressLine.text = card.path; toggleOrGo(true); } + property bool useFeed: false; property var allPlaces: []; + property var allStories: []; property int cardWidth: 200; property int cardHeight: 152; + function pastTime(timestamp) { // Answer a descriptive string + timestamp = new Date(timestamp); + var then = timestamp.getTime(), + now = Date.now(), + since = now - then, + ONE_MINUTE = 1000 * 60, + ONE_HOUR = ONE_MINUTE * 60, + hours = since / ONE_HOUR, + minutes = (hours % 1) * 60; + if (hours > 24) { + return timestamp.toDateString(); + } + if (hours > 1) { + return Math.floor(hours).toString() + ' hr ' + Math.floor(minutes) + ' min ago'; + } + if (minutes >= 2) { + return Math.floor(minutes).toString() + ' min ago'; + } + return 'about a minute ago'; + } AddressBarDialog { id: addressBarDialog @@ -76,10 +98,10 @@ Window { width: cardWidth; height: cardHeight; goFunction: goCard; - path: model.name + model.path; - thumbnail: model.thumbnail; - placeText: model.name; - usersText: model.online_users + ((model.online_users === 1) ? ' person' : ' people'); + path: model.place_name + model.path; + thumbnail: model.thumbnail_url; + placeText: model.place_name; + usersText: (model.created_at ? pastTime(model.created_at) : (model.online_users + ((model.online_users === 1) ? ' person' : ' people'))); hoverThunk: function () { ListView.view.currentIndex = index; } unhoverThunk: function () { ListView.view.currentIndex = -1; } } @@ -235,23 +257,31 @@ Window { return x; } - function handleError(error, data, cb) { // cb(error) and answer truthy if needed, else falsey + function handleError(url, error, data, cb) { // cb(error) and answer truthy if needed, else falsey if (!error && (data.status === 'success')) { return; } - cb(error || new Error(data.status + ': ' + data.error)); + if (!error) { // Create a message from the data + error = data.status + ': ' + data.error; + } + if (typeof(error) === 'string') { // Make a proper Error object + error = new Error(error); + } + error.message += ' in ' + url; // Include the url. + cb(error); return true; } function getPlace(placeData, cb) { // cb(error, side-effected-placeData), after adding path, thumbnails, and description - getRequest('https://metaverse.highfidelity.com/api/v1/places/' + placeData.name, function (error, data) { - if (handleError(error, data, cb)) { + var url = 'https://metaverse.highfidelity.com/api/v1/places/' + placeData.place_name; + getRequest(url, function (error, data) { + if (handleError(url, error, data, cb)) { return; } var place = data.data.place, previews = place.previews; placeData.path = place.path; if (previews && previews.thumbnail) { - placeData.thumbnail = previews.thumbnail; + placeData.thumbnail_url = previews.thumbnail; } if (place.description) { placeData.description = place.description; @@ -260,17 +290,28 @@ Window { cb(error, placeData); }); } + function makeModelData(data, optionalPlaceName) { // create a new obj from data + // ListModel elements will only ever have those properties that are defined by the first obj that is added. + // So here we make sure that we have all the properties we need, regardless of whether it is a place data or user story. + var name = optionalPlaceName || data.place_name, + tags = data.tags || [data.action], + description = data.description || ""; + return { + place_name: name, + path: data.path || "", + created_at: data.create_at || "8/3/2016", + thumbnail_url: data.thumbnail_url || "", + + tags: tags, + description: description, + online_users: data.online_users, + + searchText: [name].concat(tags, description).join(' ').toUpperCase() + } + } function mapDomainPlaces(domain, cb) { // cb(error, arrayOfDomainPlaceData) function addPlace(name, icb) { - getPlace({ - name: name, - tags: domain.tags, - thumbnail: "", - description: "", - path: "", - searchText: [name].concat(domain.tags).join(' ').toUpperCase(), - online_users: domain.online_users - }, icb); + getPlace(makeModelData(domain, name), icb); } // IWBNI we could get these results in order with most-recent-entered first. // In any case, we don't really need to preserve the domain.names order in the results. @@ -278,8 +319,11 @@ Window { } function suggestable(place) { - return (place.name !== AddressManager.hostname) // Not our entry, but do show other entry points to current domain. - && place.thumbnail + if (useFeed) { + return true; + } + return (place.place_name !== AddressManager.hostname) // Not our entry, but do show other entry points to current domain. + && place.thumbnail_url && place.online_users // at least one present means it's actually online && place.online_users <= 20; } @@ -298,8 +342,9 @@ Window { 'sort_order=desc', 'page=' + pageNumber ]; - getRequest('https://metaverse.highfidelity.com/api/v1/domains/all?' + params.join('&'), function (error, data) { - if (handleError(error, data, cb)) { + var url = 'https://metaverse.highfidelity.com/api/v1/domains/all?' + params.join('&'); + getRequest(url, function (error, data) { + if (handleError(url, error, data, cb)) { return; } asyncMap(data.data.domains, mapDomainPlaces, function (error, pageResults) { @@ -309,7 +354,7 @@ Window { // pageResults is now [ [ placeDataOneForDomainOne, placeDataTwoForDomainOne, ...], [ placeDataTwoForDomainTwo...] ] pageResults.forEach(function (domainResults) { allPlaces = allPlaces.concat(domainResults); - if (!addressLine.text) { // Don't add if the user is already filtering + if (!addressLine.text && !useFeed) { // Don't add if the user is already filtering domainResults.forEach(function (place) { if (suggestable(place)) { suggestions.append(place); @@ -324,9 +369,35 @@ Window { }); }); } + function getUserStoryPage(pageNumber, cb) { // cb(error) after all pages of domain data have been added to model + var url = 'https://metaverse.highfidelity.com/api/v1/user_stories?page=' + pageNumber; + getRequest(url, function (error, data) { + if (handleError(url, error, data, cb)) { + return; + } + // FIXME: For debugging until we have real data + data = {user_stories: [ + {created_at: "8/3/2016", action: "snapshot", path: "/4257.1,126.084,1335.45/0,-0.857368,0,0.514705", place_name: "SpiritMoving", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/c28/a26/f0-/thumbnail/hifi-place-c28a26f0-6991-4654-9c2b-e64228c06954.jpg?1456878797"}, + {created_at: "8/3/2016", action: "snapshot", path: "/10077.4,4003.6,9972.56/0,-0.410351,0,0.911928", place_name: "Ventura", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/1f5/e6b/00-/thumbnail/hifi-place-1f5e6b00-2bf0-4319-b9ae-a2344a72354c.png?1454321596"} + ]}; + + var stories = data.user_stories.map(makeModelData); + allStories = allStories.concat(stories); + if (!addressLine.text && useFeed) { // Don't add if the user is already filtering + stories.forEach(function (story) { + suggestions.append(story); + }); + } + if (data.current_page < data.total_pages) { + return getUserStoryPage(pageNumber + 1, cb); + } + cb(); + }); + } function filterChoicesByText() { suggestions.clear(); - var words = addressLine.text.toUpperCase().split(/\s+/).filter(identity); + var words = addressLine.text.toUpperCase().split(/\s+/).filter(identity), + data = useFeed ? allStories : allPlaces; function matches(place) { if (!words.length) { return suggestable(place); @@ -335,7 +406,7 @@ Window { return place.searchText.indexOf(word) >= 0; }); } - allPlaces.forEach(function (place) { + data.forEach(function (place) { if (matches(place)) { suggestions.append(place); } @@ -344,12 +415,13 @@ Window { function fillDestinations() { allPlaces = []; + allStories = []; suggestions.clear(); getDomainPage(1, function (error) { - if (error) { - console.log('domain query failed:', error); - } - console.log('domain query finished', allPlaces.length); + console.log('domain query', error, allPlaces.length); + }); + getUserStoryPage(1, function (error) { + console.log('user stories query', error, allStories.length); }); } From 188e525efcdea070d2b227be4ae09abc2b918538 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 3 Aug 2016 11:48:58 -0700 Subject: [PATCH 02/13] basic ugly feed/places toggle button --- interface/resources/qml/AddressBarDialog.qml | 21 ++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index df6a5837ac..de2e16ddfc 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -193,7 +193,24 @@ Window { helperText: "Go to: place, @user, /path, network address" onTextChanged: filterChoicesByText() } - + Rectangle { + color: "red"; + height: addressLine.height; + width: addressLine.height; + anchors { + left: addressLine.right; + bottom: addressLine.bottom; + } + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton + onClicked: { + console.log('fixme hrs toggle'); + useFeed = !useFeed; + filterChoicesByText(); + } + } + } } } @@ -299,7 +316,7 @@ Window { return { place_name: name, path: data.path || "", - created_at: data.create_at || "8/3/2016", + created_at: data.create_at || "", thumbnail_url: data.thumbnail_url || "", tags: tags, From 30327d81357316a5880cae84b2af3f241f08924f Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 3 Aug 2016 16:02:22 -0700 Subject: [PATCH 03/13] New buttons, with hover behavior. Also don't impose test data if the api gives data. --- interface/resources/images/backward.svg | 28 ++++ interface/resources/images/forward.svg | 28 ++++ interface/resources/images/home.svg | 46 +++++++ interface/resources/images/places.svg | 33 +++++ interface/resources/images/snap-feed.svg | 41 ++++++ interface/resources/qml/AddressBarDialog.qml | 131 ++++++++++--------- 6 files changed, 242 insertions(+), 65 deletions(-) create mode 100644 interface/resources/images/backward.svg create mode 100644 interface/resources/images/forward.svg create mode 100644 interface/resources/images/home.svg create mode 100644 interface/resources/images/places.svg create mode 100644 interface/resources/images/snap-feed.svg diff --git a/interface/resources/images/backward.svg b/interface/resources/images/backward.svg new file mode 100644 index 0000000000..9d36778aa3 --- /dev/null +++ b/interface/resources/images/backward.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/interface/resources/images/forward.svg b/interface/resources/images/forward.svg new file mode 100644 index 0000000000..65ec62f947 --- /dev/null +++ b/interface/resources/images/forward.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/interface/resources/images/home.svg b/interface/resources/images/home.svg new file mode 100644 index 0000000000..1e201a1a9d --- /dev/null +++ b/interface/resources/images/home.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/images/places.svg b/interface/resources/images/places.svg new file mode 100644 index 0000000000..6336ab111f --- /dev/null +++ b/interface/resources/images/places.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + diff --git a/interface/resources/images/snap-feed.svg b/interface/resources/images/snap-feed.svg new file mode 100644 index 0000000000..3eae156cd6 --- /dev/null +++ b/interface/resources/images/snap-feed.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index de2e16ddfc..5a92360488 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -14,6 +14,7 @@ import "controls" import "styles" import "windows" import "hifi" +import "hifi/toolbars" Window { id: root @@ -118,64 +119,43 @@ Window { property int inputAreaHeight: 56.0 * root.scale // Height of the background's input area property int inputAreaStep: (height - inputAreaHeight) / 2 - Image { + ToolbarButton { id: homeButton - source: "../images/home-button.svg" - width: 29 - height: 26 + imageURL: "../images/home.svg" + buttonState: 1 + defaultState: 1 + hoverState: 2 + onClicked: addressBarDialog.loadHome(); anchors { left: parent.left - leftMargin: parent.height + 2 * hifi.layout.spacing + leftMargin: parent.height verticalCenter: parent.verticalCenter } - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton - onClicked: { - addressBarDialog.loadHome() - } - } } - Image { - id: backArrow - source: addressBarDialog.backEnabled ? "../images/left-arrow.svg" : "../images/left-arrow-disabled.svg" - width: 22 - height: 26 + ToolbarButton { + id: backArrow; + imageURL: "../images/backward.svg"; + hoverState: addressBarDialog.backEnabled ? 2 : 0; + defaultState: addressBarDialog.backEnabled ? 1 : 0; + buttonState: addressBarDialog.backEnabled ? 1 : 0; // fixme: needs work + onClicked: addressBarDialog.loadBack(); anchors { left: homeButton.right - leftMargin: 2 * hifi.layout.spacing verticalCenter: parent.verticalCenter } - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton - onClicked: { - addressBarDialog.loadBack() - } - } } - - Image { - id: forwardArrow - source: addressBarDialog.forwardEnabled ? "../images/right-arrow.svg" : "../images/right-arrow-disabled.svg" - width: 22 - height: 26 + ToolbarButton { + id: forwardArrow; + imageURL: "../images/forward.svg"; + hoverState: addressBarDialog.forwardEnabled ? 2 : 0; + defaultState: addressBarDialog.forwardEnabled ? 1 : 0; + buttonState: addressBarDialog.forwardEnabled ? 1 : 0; // fixme: needs work + onClicked: addressBarDialog.loadForward(); anchors { left: backArrow.right - leftMargin: 2 * hifi.layout.spacing verticalCenter: parent.verticalCenter } - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton - onClicked: { - addressBarDialog.loadForward() - } - } } // FIXME replace with TextField @@ -183,37 +163,54 @@ Window { id: addressLine focus: true anchors { - fill: parent + top: parent.top + left: parent.left + bottom: parent.bottom + right: placesButton.left leftMargin: parent.height + parent.height + hifi.layout.spacing * 7 - rightMargin: hifi.layout.spacing * 2 + rightMargin: hifi.layout.spacing topMargin: parent.inputAreaStep + hifi.layout.spacing bottomMargin: parent.inputAreaStep + hifi.layout.spacing } font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.75 - helperText: "Go to: place, @user, /path, network address" + helperText: "Go to: place, @user, /path" //, network address" onTextChanged: filterChoicesByText() } - Rectangle { - color: "red"; - height: addressLine.height; - width: addressLine.height; + // These two are radio buttons. + ToolbarButton { + id: placesButton + imageURL: "../images/places.svg" + buttonState: 1 + defaultState: useFeed ? 0 : 1; + hoverState: useFeed ? 2 : -1; + onClicked: useFeed ? toggleFeed() : identity() anchors { - left: addressLine.right; + right: feedButton.left; bottom: addressLine.bottom; } - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton - onClicked: { - console.log('fixme hrs toggle'); - useFeed = !useFeed; - filterChoicesByText(); - } + } + ToolbarButton { + id: feedButton; + imageURL: "../images/snap-feed.svg"; + buttonState: 0 + defaultState: useFeed ? 1 : 0; + hoverState: useFeed ? -1 : 2; + onClicked: useFeed ? identity() : toggleFeed(); + anchors { + right: parent.right; + bottom: addressLine.bottom; + rightMargin: hifi.layout.spacing; } } } } + function toggleFeed () { + useFeed = !useFeed; + placesButton.buttonState = useFeed ? 0 : 1; + feedButton.buttonState = useFeed ? 1 : 0; + filterChoicesByText(); + } function getRequest(url, cb) { // cb(error, responseOfCorrectContentType) of url. General for 'get' text/html/json, but without redirects. // TODO: make available to other .qml. var request = new XMLHttpRequest(); @@ -393,12 +390,16 @@ Window { return; } // FIXME: For debugging until we have real data - data = {user_stories: [ - {created_at: "8/3/2016", action: "snapshot", path: "/4257.1,126.084,1335.45/0,-0.857368,0,0.514705", place_name: "SpiritMoving", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/c28/a26/f0-/thumbnail/hifi-place-c28a26f0-6991-4654-9c2b-e64228c06954.jpg?1456878797"}, - {created_at: "8/3/2016", action: "snapshot", path: "/10077.4,4003.6,9972.56/0,-0.410351,0,0.911928", place_name: "Ventura", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/1f5/e6b/00-/thumbnail/hifi-place-1f5e6b00-2bf0-4319-b9ae-a2344a72354c.png?1454321596"} - ]}; + if (!data.user_stories.length) { + data.user_stories = [ + {created_at: "8/3/2016", action: "snapshot", path: "/4257.1,126.084,1335.45/0,-0.857368,0,0.514705", place_name: "SpiritMoving", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/c28/a26/f0-/thumbnail/hifi-place-c28a26f0-6991-4654-9c2b-e64228c06954.jpg?1456878797"}, + {created_at: "8/3/2016", action: "snapshot", path: "/10077.4,4003.6,9972.56/0,-0.410351,0,0.911928", place_name: "Ventura", thumbnail_url:"https://hifi-metaverse.s3-us-west-1.amazonaws.com/images/places/previews/1f5/e6b/00-/thumbnail/hifi-place-1f5e6b00-2bf0-4319-b9ae-a2344a72354c.png?1454321596"} + ]; + } - var stories = data.user_stories.map(makeModelData); + var stories = data.user_stories.map(function (story) { // explicit single-argument function + return makeModelData(story); + }); allStories = allStories.concat(stories); if (!addressLine.text && useFeed) { // Don't add if the user is already filtering stories.forEach(function (story) { @@ -435,10 +436,10 @@ Window { allStories = []; suggestions.clear(); getDomainPage(1, function (error) { - console.log('domain query', error, allPlaces.length); + console.log('domain query', error || 'ok', allPlaces.length); }); getUserStoryPage(1, function (error) { - console.log('user stories query', error, allStories.length); + console.log('user stories query', error || 'ok', allStories.length); }); } From 8c6744e5e8308d4a212bf304b8332b9c347b450a Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 3 Aug 2016 16:18:41 -0700 Subject: [PATCH 04/13] new address bar graphic --- interface/resources/images/address-bar.svg | 97 ++++---------------- interface/resources/qml/AddressBarDialog.qml | 9 +- 2 files changed, 22 insertions(+), 84 deletions(-) diff --git a/interface/resources/images/address-bar.svg b/interface/resources/images/address-bar.svg index 56dc4f028c..76ad7c0547 100644 --- a/interface/resources/images/address-bar.svg +++ b/interface/resources/images/address-bar.svg @@ -1,81 +1,18 @@ - - - - - - image/svg+xml - - - - - - - - - - - + + + + + + + diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 5a92360488..0ae4d6d9ff 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -128,7 +128,7 @@ Window { onClicked: addressBarDialog.loadHome(); anchors { left: parent.left - leftMargin: parent.height + leftMargin: hifi.layout.spacing * 2 verticalCenter: parent.verticalCenter } } @@ -164,10 +164,10 @@ Window { focus: true anchors { top: parent.top - left: parent.left bottom: parent.bottom + left: forwardArrow.right right: placesButton.left - leftMargin: parent.height + parent.height + hifi.layout.spacing * 7 + leftMargin: hifi.layout.spacing * 4 rightMargin: hifi.layout.spacing topMargin: parent.inputAreaStep + hifi.layout.spacing bottomMargin: parent.inputAreaStep + hifi.layout.spacing @@ -186,6 +186,7 @@ Window { onClicked: useFeed ? toggleFeed() : identity() anchors { right: feedButton.left; + rightMargin: hifi.layout.spacing * 3; bottom: addressLine.bottom; } } @@ -199,7 +200,7 @@ Window { anchors { right: parent.right; bottom: addressLine.bottom; - rightMargin: hifi.layout.spacing; + rightMargin: hifi.layout.spacing * 3; } } } From 4d0c5c5d19cc9febe1e456e0d306976056c47a1b Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 3 Aug 2016 16:22:46 -0700 Subject: [PATCH 05/13] fix snapshot button hover --- scripts/system/snapshot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/snapshot.js b/scripts/system/snapshot.js index 87ea3f29ec..280bd3b5d0 100644 --- a/scripts/system/snapshot.js +++ b/scripts/system/snapshot.js @@ -16,7 +16,7 @@ var button = toolBar.addButton({ visible: true, buttonState: 1, defaultState: 1, - hoverState: 1, + hoverState: 2, alpha: 0.9, }); From c44ce0f5b59ad3f9249110f7def4fc8322a46723 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 3 Aug 2016 17:03:27 -0700 Subject: [PATCH 06/13] Fix forward/back button states. --- interface/resources/qml/AddressBarDialog.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 0ae4d6d9ff..fe44607b53 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -80,6 +80,9 @@ Window { id: addressBarDialog implicitWidth: backgroundImage.width implicitHeight: backgroundImage.height + // The buttons have their button state changed on hover, so we have to manually fix them up here + onBackEnabledChanged: backArrow.buttonState = addressBarDialog.backEnabled ? 1 : 0; + onForwardEnabledChanged: forwardArrow.buttonState = addressBarDialog.forwardEnabled ? 1 : 0; ListModel { id: suggestions } @@ -138,7 +141,7 @@ Window { imageURL: "../images/backward.svg"; hoverState: addressBarDialog.backEnabled ? 2 : 0; defaultState: addressBarDialog.backEnabled ? 1 : 0; - buttonState: addressBarDialog.backEnabled ? 1 : 0; // fixme: needs work + buttonState: addressBarDialog.backEnabled ? 1 : 0; onClicked: addressBarDialog.loadBack(); anchors { left: homeButton.right @@ -150,7 +153,7 @@ Window { imageURL: "../images/forward.svg"; hoverState: addressBarDialog.forwardEnabled ? 2 : 0; defaultState: addressBarDialog.forwardEnabled ? 1 : 0; - buttonState: addressBarDialog.forwardEnabled ? 1 : 0; // fixme: needs work + buttonState: addressBarDialog.forwardEnabled ? 1 : 0; onClicked: addressBarDialog.loadForward(); anchors { left: backArrow.right From 421707c5d84aaac954309b2945822aa51ea7042e Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 10:07:33 -0700 Subject: [PATCH 07/13] fix typo that was making user stories not show date --- interface/resources/qml/AddressBarDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index fe44607b53..fd2abd01f5 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -317,7 +317,7 @@ Window { return { place_name: name, path: data.path || "", - created_at: data.create_at || "", + created_at: data.created_at || "", thumbnail_url: data.thumbnail_url || "", tags: tags, From d39446f340157e3bb4ed1b666219d3d39217c367 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 10:36:17 -0700 Subject: [PATCH 08/13] no place name over user-story scroll items --- interface/resources/qml/AddressBarDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index fd2abd01f5..0c6288c828 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -104,8 +104,8 @@ Window { goFunction: goCard; path: model.place_name + model.path; thumbnail: model.thumbnail_url; - placeText: model.place_name; - usersText: (model.created_at ? pastTime(model.created_at) : (model.online_users + ((model.online_users === 1) ? ' person' : ' people'))); + placeText: model.created_at ? "" : model.place_name; + usersText: model.created_at ? pastTime(model.created_at) : (model.online_users + ((model.online_users === 1) ? ' person' : ' people')); hoverThunk: function () { ListView.view.currentIndex = index; } unhoverThunk: function () { ListView.view.currentIndex = -1; } } From f5d07f418679df39140ed9b9dffd11eef53928f3 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 11:55:31 -0700 Subject: [PATCH 09/13] helper text size and italic --- interface/resources/qml/AddressBarDialog.qml | 4 +++- interface/resources/qml/controls/TextInput.qml | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 0c6288c828..29cba76f1d 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -176,7 +176,9 @@ Window { bottomMargin: parent.inputAreaStep + hifi.layout.spacing } font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.75 - helperText: "Go to: place, @user, /path" //, network address" + helperText: "Go to: place, @user, /path, network address" + helperPixelSize: font.pixelSize * 0.75 + helperItalic: true onTextChanged: filterChoicesByText() } // These two are radio buttons. diff --git a/interface/resources/qml/controls/TextInput.qml b/interface/resources/qml/controls/TextInput.qml index b7ca6d2c1b..77e11177e1 100644 --- a/interface/resources/qml/controls/TextInput.qml +++ b/interface/resources/qml/controls/TextInput.qml @@ -12,6 +12,8 @@ Original.TextInput { verticalAlignment: Original.TextInput.AlignVCenter font.family: hifi.fonts.fontFamily font.pixelSize: hifi.fonts.pixelSize + property int helperPixelSize: font.pixelSize + property bool helperItalic: false /* Original.Rectangle { @@ -23,7 +25,8 @@ Original.TextInput { */ Text { anchors.fill: parent - font.pixelSize: parent.font.pixelSize + font.pixelSize: helperPixelSize + font.italic: helperItalic font.family: parent.font.family verticalAlignment: parent.verticalAlignment horizontalAlignment: parent.horizontalAlignment From 1ecb01feacea805d41f8ce39db9d47f00b785576 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 12:06:07 -0700 Subject: [PATCH 10/13] center the scroll --- interface/resources/qml/AddressBarDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 29cba76f1d..3e676b7340 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -94,7 +94,7 @@ Window { anchors { bottom: backgroundImage.top; bottomMargin: 2 * hifi.layout.spacing; - right: backgroundImage.right; + horizontalCenter: backgroundImage.horizontalCenter } model: suggestions; orientation: ListView.Horizontal; From 04bd98b15ffd9a7f73966bd543a5896179eafffc Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 12:33:50 -0700 Subject: [PATCH 11/13] new assets. remove margins between buttons (letting the graphics do the work) --- interface/resources/images/address-bar.svg | 12 ++-- interface/resources/images/backward.svg | 26 ++++---- interface/resources/images/forward.svg | 26 ++++---- interface/resources/images/home.svg | 62 +++++++++++--------- interface/resources/images/places.svg | 36 ++++++------ interface/resources/images/snap-feed.svg | 48 +++++++-------- interface/resources/qml/AddressBarDialog.qml | 9 ++- 7 files changed, 111 insertions(+), 108 deletions(-) diff --git a/interface/resources/images/address-bar.svg b/interface/resources/images/address-bar.svg index 76ad7c0547..a8cb158492 100644 --- a/interface/resources/images/address-bar.svg +++ b/interface/resources/images/address-bar.svg @@ -9,10 +9,10 @@ .st1{fill:#E6E7E8;} .st2{fill:#FFFFFF;} - - - + + + diff --git a/interface/resources/images/backward.svg b/interface/resources/images/backward.svg index 9d36778aa3..e4502fa80e 100644 --- a/interface/resources/images/backward.svg +++ b/interface/resources/images/backward.svg @@ -9,19 +9,19 @@ .st3{fill:#31D8FF;} - - - - + + + + diff --git a/interface/resources/images/forward.svg b/interface/resources/images/forward.svg index 65ec62f947..0c5cbe3d0c 100644 --- a/interface/resources/images/forward.svg +++ b/interface/resources/images/forward.svg @@ -9,19 +9,19 @@ .st3{fill:#31D8FF;} - - - - + + + + diff --git a/interface/resources/images/home.svg b/interface/resources/images/home.svg index 1e201a1a9d..7740dc9568 100644 --- a/interface/resources/images/home.svg +++ b/interface/resources/images/home.svg @@ -9,37 +9,41 @@ .st3{fill:#31D8FF;} - - - - - - + + - - + + + + + + + + + + diff --git a/interface/resources/images/places.svg b/interface/resources/images/places.svg index 6336ab111f..f70695d606 100644 --- a/interface/resources/images/places.svg +++ b/interface/resources/images/places.svg @@ -9,24 +9,24 @@ .st3{fill:#31D8FF;} - - - - - - - + + + + + + + diff --git a/interface/resources/images/snap-feed.svg b/interface/resources/images/snap-feed.svg index 3eae156cd6..c2dede6e0f 100644 --- a/interface/resources/images/snap-feed.svg +++ b/interface/resources/images/snap-feed.svg @@ -9,31 +9,31 @@ .st3{fill:#31D8FF;} - - - - - - - - + + + + + + + + - - + + diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 3e676b7340..7eb4de6bba 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -131,7 +131,7 @@ Window { onClicked: addressBarDialog.loadHome(); anchors { left: parent.left - leftMargin: hifi.layout.spacing * 2 + leftMargin: homeButton.width / 2 verticalCenter: parent.verticalCenter } } @@ -170,8 +170,8 @@ Window { bottom: parent.bottom left: forwardArrow.right right: placesButton.left - leftMargin: hifi.layout.spacing * 4 - rightMargin: hifi.layout.spacing + leftMargin: forwardArrow.width + rightMargin: placesButton.width topMargin: parent.inputAreaStep + hifi.layout.spacing bottomMargin: parent.inputAreaStep + hifi.layout.spacing } @@ -191,7 +191,6 @@ Window { onClicked: useFeed ? toggleFeed() : identity() anchors { right: feedButton.left; - rightMargin: hifi.layout.spacing * 3; bottom: addressLine.bottom; } } @@ -205,7 +204,7 @@ Window { anchors { right: parent.right; bottom: addressLine.bottom; - rightMargin: hifi.layout.spacing * 3; + rightMargin: feedButton.width / 2 } } } From 8a7bbbaaed84921548f4cfb8a8fbc45ca8b416ac Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 4 Aug 2016 12:37:09 -0700 Subject: [PATCH 12/13] limit user stories to first 100 --- interface/resources/qml/AddressBarDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 7eb4de6bba..5883872c95 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -411,7 +411,7 @@ Window { suggestions.append(story); }); } - if (data.current_page < data.total_pages) { + if ((data.current_page < data.total_pages) && (data.current_page <= 10)) { // just 10 pages = 100 stories for now return getUserStoryPage(pageNumber + 1, cb); } cb(); From f34030d276421e3e48be7afa6f837c04a09df994 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 9 Aug 2016 12:48:01 -0700 Subject: [PATCH 13/13] factor out metaverseBase to make it easier to repoint to a test server --- interface/resources/qml/AddressBarDialog.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 5883872c95..8590121fa0 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -55,6 +55,7 @@ Window { property var allStories: []; property int cardWidth: 200; property int cardHeight: 152; + property string metaverseBase: "https://metaverse.highfidelity.com/api/v1/"; function pastTime(timestamp) { // Answer a descriptive string timestamp = new Date(timestamp); var then = timestamp.getTime(), @@ -292,7 +293,7 @@ Window { } function getPlace(placeData, cb) { // cb(error, side-effected-placeData), after adding path, thumbnails, and description - var url = 'https://metaverse.highfidelity.com/api/v1/places/' + placeData.place_name; + var url = metaverseBase + 'places/' + placeData.place_name; getRequest(url, function (error, data) { if (handleError(url, error, data, cb)) { return; @@ -361,7 +362,7 @@ Window { 'sort_order=desc', 'page=' + pageNumber ]; - var url = 'https://metaverse.highfidelity.com/api/v1/domains/all?' + params.join('&'); + var url = metaverseBase + 'domains/all?' + params.join('&'); getRequest(url, function (error, data) { if (handleError(url, error, data, cb)) { return; @@ -389,7 +390,7 @@ Window { }); } function getUserStoryPage(pageNumber, cb) { // cb(error) after all pages of domain data have been added to model - var url = 'https://metaverse.highfidelity.com/api/v1/user_stories?page=' + pageNumber; + var url = metaverseBase + 'user_stories?page=' + pageNumber; getRequest(url, function (error, data) { if (handleError(url, error, data, cb)) { return;