RoomControlView.swift 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //
  2. // RoomControlView.swift
  3. // fiveConstant
  4. //
  5. // Created by 李建 on 2023/2/13.
  6. //
  7. import SwiftUI
  8. struct RoomControlView: View {
  9. @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
  10. @EnvironmentObject var proState: ProgressState
  11. @State var roomInfo: RoomInfo
  12. var modeIcons = ["snow", "sun.max", "drop.degreesign.slash", "fanblades", "wind", "drop.degreesign"]
  13. var controller:RoomController
  14. var body: some View {
  15. VStack(spacing: 30) {
  16. // 标题栏
  17. HStack {
  18. Button(action: {
  19. self.presentationMode.wrappedValue.dismiss()
  20. }, label: {
  21. Image(systemName: "chevron.left")
  22. .foregroundColor(.gray)
  23. })
  24. Spacer()
  25. Text("\(roomInfo.name!)")
  26. .font(.title3).bold()
  27. Spacer()
  28. Image(systemName: "ellipsis")
  29. .font(.title2.bold())
  30. }
  31. // 滑动温度调节器
  32. CircularSliderView(roomInfo: roomInfo).onDragEnd { value in
  33. controller.SetTemp(value: value)
  34. }
  35. // 信息条
  36. HStack {
  37. VStack(spacing: 11) {
  38. Image(systemName: "thermometer.medium")
  39. .foregroundColor(Color("MainColor"))
  40. .font(.title2)
  41. Text("\(roomInfo.temperature!)℃")
  42. .foregroundColor(Color("SecondColor"))
  43. }
  44. Divider()
  45. .frame(height: 50)
  46. .padding()
  47. VStack(spacing: 11) {
  48. Image(systemName: "drop.degreesign")
  49. .foregroundColor(Color("MainColor"))
  50. .font(.title2)
  51. Text("\(roomInfo.humidity!)%")
  52. .foregroundColor(Color("SecondColor"))
  53. }
  54. Divider()
  55. .frame(height: 50)
  56. .padding()
  57. VStack(spacing: 11) {
  58. Image(systemName: "aqi.medium")
  59. .foregroundColor(Color("MainColor"))
  60. .font(.title2)
  61. Text("\(roomInfo.air_quality!)")
  62. .foregroundColor(Color("SecondColor"))
  63. }
  64. Divider()
  65. .frame(height: 50)
  66. .padding()
  67. VStack(spacing: 11) {
  68. Image(systemName: "carbon.dioxide.cloud")
  69. .foregroundColor(Color("MainColor"))
  70. .font(.title2)
  71. Text("\(roomInfo.co2)")
  72. .foregroundColor(Color("SecondColor"))
  73. }
  74. }
  75. // 风速调节器
  76. HStack {
  77. Image(systemName: "fanblades.fill")
  78. .foregroundColor(Color("SecondColor"))
  79. ZStack(alignment: .leading) {
  80. HStack {
  81. ForEach(1..<6, id: \.self) {index in
  82. Capsule()
  83. .fill(roomInfo.fan_speed! >= index ? Color("MainColor") :.gray.opacity(0.5))
  84. .frame(height: 14)
  85. .animation(.easeInOut, value: roomInfo.fan_speed! >= index)
  86. .onTapGesture {
  87. roomInfo.fan_speed = index
  88. controller.SetFanSpeed(value: index)
  89. }
  90. }
  91. }
  92. }
  93. }
  94. .padding(.leading, 20)
  95. .padding(.trailing, 20)
  96. // 模式调节
  97. ScrollView(.horizontal, showsIndicators: false) {
  98. HStack(spacing: 14) {
  99. ForEach(modeIcons.indices, id: \.self) { index in
  100. ModeButtonView(icon: modeIcons[index], roomData: $roomInfo, mode: index + 1).onTapGesture {
  101. roomInfo.mode = index + 1
  102. controller.SetMode(value: index + 1)
  103. }
  104. }
  105. }
  106. }
  107. // 底部按钮
  108. HStack {
  109. Button {
  110. } label: {
  111. Image(systemName: "power")
  112. .foregroundColor(.white)
  113. .font(.title)
  114. .frame(maxWidth: .infinity, maxHeight: 80)
  115. .background(roomInfo.power! ? Color("SecondColor") : .gray)
  116. .cornerRadius(10)
  117. .onTapGesture {
  118. if roomInfo.power! {
  119. controller.PowerOff()
  120. } else {
  121. controller.PowerOn()
  122. }
  123. }
  124. }
  125. Button {
  126. } label: {
  127. Image(systemName: "clock")
  128. .foregroundColor(.white)
  129. .font(.title)
  130. .frame(width: 100)
  131. .frame(maxHeight: 80)
  132. .background(Color(hex: 0xE9F2F2).cornerRadius(10))
  133. }
  134. }
  135. Spacer()
  136. }
  137. .navigationBarBackButtonHidden(true)
  138. .padding()
  139. }
  140. }
  141. struct RoomControlView_Previews: PreviewProvider {
  142. static let json = """
  143. {"record_id":"1t7svi03170copjp9iimtd3z005isbfj","name":"样板间","home_id":"1t7svi01jj7copaplj7q47n170kd6hw6","home_name":"李建的家","is_master":true,"control_number":"1","user_id":"","power":true,"set_temp":27,"air_quality":10,"co2":800,"temperature":7,"humidity":40,"mode":3,"fan_speed":4,"fan_value":1,"timer_status":false,"duration":0}
  144. """.data(using: .utf8)!
  145. static var previews: some View {
  146. let decoder = JSONDecoder()
  147. let product = try? decoder.decode(RoomInfo.self, from: json)
  148. RoomControlView(roomInfo: product!, controller: RoomController(roomId: "1t7svi03170copjp9iimtd3z005isbfj", gatewayId: "", controlNumber: "1"))
  149. .environmentObject(ProgressState())
  150. }
  151. }
  152. struct ModeButtonView: View {
  153. var icon: String = ""
  154. @Binding var roomData: RoomInfo
  155. var mode: Int
  156. var body: some View {
  157. ZStack {
  158. RoundedRectangle(cornerRadius: 10)
  159. .fill(mode == roomData.mode! ? Color("MainColor") :Color(hex: 0xF0F5F6))
  160. Image(systemName: icon)
  161. .font(.title)
  162. .foregroundColor(mode == roomData.mode! ? .white : Color(hex:0xC4C2C2))
  163. }
  164. .frame(width: 70, height: 70)
  165. }
  166. }