AppManag.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import {ApplicationInfo, RunApplicationInfo} from "@/types/application.ts";
  2. import {NavItem} from "@/components/appleBar/appleBar.ts";
  3. import message from "@/components/public/kui/message";
  4. import {computed, reactive} from "vue";
  5. export let Applications:ApplicationInfo[] = [
  6. {
  7. key: 'music',
  8. name: '音乐',
  9. pinyin: 'yinyue',
  10. en: 'music',
  11. icon: 'music',
  12. allowMulti: false,
  13. minHeight: 600,
  14. minWidth: 800,
  15. description: '音乐播放器',
  16. },
  17. {
  18. key: 'setting',
  19. name: '软件设置',
  20. pinyin: 'shezhi',
  21. en: 'setting',
  22. icon: 'setting',
  23. allowMulti: false,
  24. minHeight: 600,
  25. minWidth: 800,
  26. description: '软件设置',
  27. },
  28. ]
  29. // 已经启动的app 列表
  30. export let runningApplications:RunApplicationInfo[] = reactive([]);
  31. // 使用computed 根据 runningApplications 动态生成 navItems
  32. export const runNavComputed = computed(
  33. () => runningApplications.map(item => {
  34. let rawAppInfo = Applications.find(appInfo => appInfo.key === item.key)
  35. if(!rawAppInfo)
  36. {
  37. throw new Error(`app not found: ${item.key}`)
  38. }
  39. return {
  40. id: item.id,
  41. name: rawAppInfo.name,
  42. icon: rawAppInfo.icon,
  43. description: rawAppInfo.description,
  44. actionCode: item.id
  45. } as NavItem;
  46. }))
  47. function genAppId(key: string, num: number = 0): string {
  48. let appId = `${key}-${num}`
  49. let app = runningApplications.find(item => item.id === appId)
  50. if (app) {
  51. return genAppId(key, num + 1)
  52. }
  53. return appId
  54. }
  55. function runApp(appInfo: ApplicationInfo): RunApplicationInfo {
  56. let appId = genAppId(appInfo.key + runningApplications.length)
  57. console.log(appInfo.name);
  58. let app:RunApplicationInfo = {
  59. id: appId,
  60. key: appInfo.key,
  61. show: true,
  62. full: false,
  63. index: 0,
  64. showTitle: appInfo.name,
  65. }
  66. return app
  67. }
  68. export function openApp(key: string) {
  69. let appInfo = Applications.find(item => item.key === key)
  70. let app = null;
  71. if(!appInfo)
  72. {
  73. message.error(`应用不存在: ${key}`);
  74. return
  75. }
  76. if (appInfo.allowMulti) {
  77. // 允许多开
  78. app = runApp(appInfo)
  79. runningApplications.push(app)
  80. } else {
  81. // 不允许多开
  82. app = runningApplications.find(item => item.key === appInfo.key)
  83. if(!app){
  84. app = runApp(appInfo)
  85. runningApplications.push(app)
  86. } else {
  87. app.show = true
  88. }
  89. }
  90. }
  91. // 将指定app设置为最上端
  92. export function setAppTop(app: RunApplicationInfo) {
  93. for (let i = 0; i < runningApplications.length; i++)
  94. {
  95. let nextIndex = runningApplications[i].index - 1;
  96. if (runningApplications[i].id === app.id) {
  97. nextIndex = runningApplications.length
  98. }
  99. if (nextIndex <= 0 )
  100. {
  101. nextIndex = 1;
  102. }
  103. runningApplications[i].index = nextIndex;
  104. }
  105. }
  106. export function closeApp(app: RunApplicationInfo) {
  107. let appIndex = runningApplications.findIndex(item => item.id === app.id)
  108. if (appIndex === -1) {
  109. return console.error('app not found')
  110. }
  111. runningApplications.splice(appIndex, 1)
  112. }
  113. export function getRunAppNavigation(): NavItem[] {
  114. return runningApplications.map(item => {
  115. let rawAppInfo = Applications.find(appInfo => appInfo.key === item.key)
  116. if(!rawAppInfo)
  117. {
  118. throw new Error(`app not found: ${item.key}`)
  119. }
  120. return {
  121. id: item.id,
  122. name: rawAppInfo.name,
  123. icon: rawAppInfo.icon,
  124. description: rawAppInfo.description,
  125. actionCode: item.id
  126. } as NavItem;
  127. })
  128. }