Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Unified Diff: tracing/tracing/ui/analysis/analysis_view.html

Issue 2023283002: [polymer] Rewrite the analysis tab view (Closed) Base URL: git@github.com:zeptonaut/catapult.git@polymer10_rewrite_tab_view2
Patch Set: Code review Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tracing/tracing/ui/analysis/analysis_view.html
diff --git a/tracing/tracing/ui/analysis/analysis_view.html b/tracing/tracing/ui/analysis/analysis_view.html
index 677ec7a30039941c4e3f7d786da1b0a7f0c60e6b..d5724aa70bc4958577e5870e29acfeae758a94bb 100644
--- a/tracing/tracing/ui/analysis/analysis_view.html
+++ b/tracing/tracing/ui/analysis/analysis_view.html
@@ -79,25 +79,73 @@ using custom elements specialized for different event types.
(function() {
var EventRegistry = tr.model.EventRegistry;
+ /** Returns the label that goes next to the list of tabs. */
+ function getTabStripLabel(numEvents) {
+ if (numEvents === 0)
+ return 'Nothing selected. Tap stuff.';
+ else if (numEvents === 1)
+ return '1 item selected.';
+ return numEvents + ' items selected.';
+ }
+
+ /**
+ * Returns the tab label for the analysis sub-view associated with the
+ * specified event type and number of events.
+ */
+ function getTabLabel(eventTypeName, numEvents) {
+ var camelLabel = numEvents === 1 ?
+ EventRegistry.getUserFriendlySingularName(eventTypeName) :
+ EventRegistry.getUserFriendlyPluralName(eventTypeName);
+ return camelLabel + ' (' + numEvents + ')';
+ }
+
+ /**
+ * Returns the HTML tag for the analysis sub-view associated with the
+ * specified event type and number of events.
+ */
+ function getSubViewTagName(eventTypeName, numEvents) {
+ var eventTypeInfo =
+ EventRegistry.getEventTypeInfoByTypeName(eventTypeName);
+ return numEvents === 1 ?
+ eventTypeInfo.metadata.singleViewElementName :
+ eventTypeInfo.metadata.multiViewElementName;
+ }
+
+ /**
+ * Returns a new analysis sub-view for the selection and throws an error if no
+ * such sub-view exists.
+ */
+ function createSubView(eventTypeName, selection) {
+ var subView = document.createElement(
+ getSubViewTagName(eventTypeName, selection.length));
+
+ // Unregistered elements with valid names (i.e. names that have a hyphen
+ // in them) inherit from HTMLElement. Unregistered elements with
+ // invalid names inherit from HTMLUnknownElement.
+ if (subView.constructor === HTMLElement ||
+ subView.constructor === HTMLUnknownElement)
+ throw new Error('Element not registered: ' + tagName);
+
+ subView.tabLabel = getTabLabel(eventTypeName, selection.length);
+ subView.selection = selection;
+ return subView;
+ }
+
Polymer({
is: 'tr-ui-a-analysis-view',
ready: function() {
- this.tabView_ = document.createElement('tr-ui-a-tab-view');
- this.tabView_.style.flex = '1 1 auto';
- Polymer.dom(this).appendChild(this.tabView_);
this.brushingStateController_ = undefined;
- this.onSelectedTabChange_ = this.onSelectedTabChange_.bind(this);
- this.onSelectionChanged_ = this.onSelectionChanged_.bind(this);
+ this.lastSelection_ = undefined;
+ this.tabView_ = document.createElement('tr-ui-a-tab-view');
+ this.tabView_.addEventListener(
+ 'selected-tab-change', this.onSelectedSubViewChanged_.bind(this));
- this.lastSeenSelection_ = new tr.model.EventSet();
+ Polymer.dom(this).appendChild(this.tabView_);
},
set tallMode(value) {
- if (value)
- Polymer.dom(this).classList.add('tall-mode');
- else
- Polymer.dom(this).classList.remove('tall-mode');
+ Polymer.dom(this).classList.toggle('tall-mode', value);
},
get tallMode() {
@@ -113,15 +161,19 @@ using custom elements specialized for different event types.
},
set brushingStateController(brushingStateController) {
- if (this.brushingStateController) {
+ if (this.brushingStateController_) {
this.brushingStateController_.removeEventListener(
- 'change', this.onSelectionChanged_);
+ 'change', this.onSelectionChanged_.bind(this));
}
+
this.brushingStateController_ = brushingStateController;
if (this.brushingStateController) {
this.brushingStateController_.addEventListener(
- 'change', this.onSelectionChanged_);
+ 'change', this.onSelectionChanged_.bind(this));
}
+
+ // The new brushing controller may have a different selection than the
+ // last one, so we have to refresh the subview.
this.onSelectionChanged_();
},
@@ -130,131 +182,40 @@ using custom elements specialized for different event types.
},
onSelectionChanged_: function(e) {
- var selection = this.brushingStateController_.selection;
-
- var selectionHasSameValue = this.lastSeenSelection_.equals(selection);
- this.lastSeenSelection_ = selection;
- if (selectionHasSameValue)
+ if (this.lastSelection_ && this.selection.equals(this.lastSelection_))
return;
-
- var lastSelectedTabTagName;
- var lastSelectedTabTypeName;
- if (this.tabView_.selectedTab) {
- lastSelectedTabTagName = this.tabView_.selectedTab.tagName;
- lastSelectedTabTypeName = this.tabView_.selectedTab._eventTypeName;
- }
+ this.lastSelection_ = this.selection;
this.tallMode = false;
+ this.tabView_.clearSubViews();
- var previouslySelectedTab = this.tabView_.selectedTab;
- this.tabView_.removeEventListener(
- 'selected-tab-change', this.onSelectedTabChange_);
-
- var previousSubViews = {};
- for (var i = 0; i < Polymer.dom(this.tabView_).children.length; i++) {
- var previousSubView = Polymer.dom(this.tabView_).children[i];
- previousSubViews[previousSubView._eventTypeName] = previousSubView;
- }
-
- this.tabView_.saveTabStates();
- Polymer.dom(this.tabView_).textContent = '';
- if (selection.length == 0) {
- this.tabView_.tabStripHeadingText = 'Nothing selected. Tap stuff.';
- } else if (selection.length == 1) {
- this.tabView_.tabStripHeadingText = '1 item selected: ';
- } else {
- this.tabView_.tabStripHeadingText = selection.length +
- ' items selected: ';
- }
-
- var eventsByBaseTypeName = selection.getEventsOrganizedByBaseType(true);
-
- var numBaseTypesToAnalyze = tr.b.dictionaryLength(eventsByBaseTypeName);
- for (var eventTypeName in eventsByBaseTypeName) {
- var subSelection = eventsByBaseTypeName[eventTypeName];
- var subView = this.createSubViewForSelection_(
- eventTypeName, subSelection, previousSubViews[eventTypeName]);
- // Store the eventTypeName for future tab restoration.
- subView._eventTypeName = eventTypeName;
- Polymer.dom(this.tabView_).appendChild(subView);
-
- subView.selection = subSelection;
- }
-
- // Restore the tab type that was previously selected. First try by tag
- // name.
- var tab;
- if (lastSelectedTabTagName)
- tab = Polymer.dom(this.tabView_).querySelector(lastSelectedTabTagName);
-
- // If that fails, look for a tab with that typeName.
- if (!tab && lastSelectedTabTypeName) {
- var tab = tr.b.findFirstInArray(
- Polymer.dom(this.tabView_).children, function(tab) {
- return tab._eventTypeName === lastSelectedTabTypeName;
- });
- }
- // If all else fails, pick the first tab.
- if (!tab)
- tab = Polymer.dom(this.tabView_).firstChild;
-
- this.tabView_.selectedTab = tab;
- this.onSelectedTabChange_();
+ this.tabView_.label = getTabStripLabel(this.selection.length);
+ var eventsByBaseTypeName =
+ this.selection.getEventsOrganizedByBaseType(true);
- this.tabView_.addEventListener(
- 'selected-tab-change', this.onSelectedTabChange_);
+ tr.b.iterItems(eventsByBaseTypeName, function(eventTypeName, events) {
+ var subView = createSubView(eventTypeName, events);
+ this.tabView_.addSubView(subView);
+ }, this);
},
- createSubViewForSelection_: function(eventTypeName, subSelection,
- previousSubView) {
- // Find.
- var eventTypeInfo = EventRegistry.getEventTypeInfoByTypeName(
- eventTypeName);
- var singleMode = subSelection.length == 1;
- var tagName;
- if (subSelection.length === 1)
- tagName = eventTypeInfo.metadata.singleViewElementName;
- else
- tagName = eventTypeInfo.metadata.multiViewElementName;
-
- // if (!tr.ui.b.getPolymerElementNamed(tagName))
- // throw new Error('Element not registered: ' + tagName);
+ onSelectedSubViewChanged_: function() {
+ var selectedSubView = this.tabView_.selectedSubView;
- // Create if necessary.
- var subView;
- if (previousSubView &&
- previousSubView.tagName === tagName.toUpperCase())
- subView = previousSubView;
- else
- subView = document.createElement(tagName);
-
- if (subView.constructor === HTMLElement)
- throw new Error('Element not registered: ' + tagName);
- // Set label.
- var camelLabel;
- if (subSelection.length === 1)
- camelLabel = EventRegistry.getUserFriendlySingularName(eventTypeName);
- else
- camelLabel = EventRegistry.getUserFriendlyPluralName(eventTypeName);
- subView.tabLabel = camelLabel + ' (' + subSelection.length + ')';
+ if (!selectedSubView) {
+ this.tallMode = false;
+ this.maybeChangeRelatedEvents_(undefined);
+ return;
+ }
- return subView;
+ this.tallMode = selectedSubView.requiresTallView;
+ this.maybeChangeRelatedEvents_(selectedSubView.relatedEventsToHighlight);
},
- onSelectedTabChange_: function() {
- var brushingStateController = this.brushingStateController_;
- if (this.tabView_.selectedTab) {
- var selectedTab = this.tabView_.selectedTab;
- this.tallMode = selectedTab.requiresTallView;
- if (brushingStateController) {
- var rlth = selectedTab.relatedEventsToHighlight;
- brushingStateController.changeAnalysisViewRelatedEvents(rlth);
- }
- } else {
- this.tallMode = false;
- if (brushingStateController)
- brushingStateController.changeAnalysisViewRelatedEvents(undefined);
- }
+ /** Changes the highlighted related events if possible. */
+ maybeChangeRelatedEvents_: function(events) {
+ if (this.brushingStateController)
+ this.brushingStateController.changeAnalysisViewRelatedEvents(events);
}
});
})();

Powered by Google App Engine
This is Rietveld 408576698