FileTreeEntityController.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import App from '../../../base'
  2. import iconTypeFromName from '../util/iconTypeFromName'
  3. App.controller(
  4. 'FileTreeEntityController',
  5. function ($scope, ide, $modal, $element) {
  6. $scope.MAX_DEPTH = 8
  7. $scope.select = function (e) {
  8. if (e.ctrlKey || e.metaKey) {
  9. e.stopPropagation()
  10. const initialMultiSelectCount = ide.fileTreeManager.multiSelectedCount()
  11. ide.fileTreeManager.toggleMultiSelectEntity($scope.entity)
  12. if (initialMultiSelectCount === 0) {
  13. // On first multi selection, also include the current active/open file.
  14. return ide.fileTreeManager.multiSelectSelectedEntity()
  15. }
  16. } else {
  17. ide.fileTreeManager.selectEntity($scope.entity)
  18. return $scope.$emit('entity:selected', $scope.entity)
  19. }
  20. }
  21. if ($scope.entity.type === 'doc') {
  22. $scope.$watch('entity.selected', function (isSelected) {
  23. if (isSelected) {
  24. $scope.$emit('entity-file:selected', $scope.entity)
  25. if (!_isEntryElVisible($element)) {
  26. $scope.$applyAsync(function () {
  27. $element[0].scrollIntoView()
  28. })
  29. }
  30. }
  31. })
  32. }
  33. function _isEntryElVisible($entryEl) {
  34. const viewportEl = $('.file-tree-list')
  35. const entryElTop = $entryEl.offset().top
  36. const entryElBottom = entryElTop + $entryEl.outerHeight()
  37. const entryListViewportElTop = viewportEl.offset().top
  38. const entryListViewportElBottom =
  39. entryListViewportElTop + viewportEl.height()
  40. return (
  41. entryElTop >= entryListViewportElTop &&
  42. entryElBottom <= entryListViewportElBottom
  43. )
  44. }
  45. $scope.iconTypeFromName = iconTypeFromName
  46. }
  47. )