Blame view

app/gui/oven_control/autocookconfigwindow.cpp 10.3 KB
6f96c947a   김태훈   GUI 0.1.4
1
2
  #include "autocookconfigwindow.h"
  #include "ui_autocookconfigwindow.h"
184bdebb4   김태훈   엔코더 구현
3
  #include <QKeyEvent>
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
4
  #include "autocookwindow.h"
f588aa273   김태훈   부가 기능 로직 추가
5
  #include "confirmpopup.h"
2bfd3a050   김태훈   환경 설정 대응
6
  #include "stringer.h"
f588aa273   김태훈   부가 기능 로직 추가
7
  #include "favoritenamepopup.h"
bbd7d8f29   김태훈   버튼 음향 추가
8
  #include "soundplayer.h"
e00c6a2a9   김태훈   기능 추가 구현
9
10
11
  #include "configwindow.h"
  #include "washwindow.h"
  #include "mainwindow.h"
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
12
3f52600cc   김태훈   소스 코드 구조 개선
13
  AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Cook cook) :
6f96c947a   김태훈   GUI 0.1.4
14
15
      QMainWindow(parent),
      ui(new Ui::AutoCookConfigWindow),
6f96c947a   김태훈   GUI 0.1.4
16
17
18
19
20
21
      cook(cook)
  {
      ui->setupUi(this);
  
      ui->clockContainer->setParent(ui->upperStack);
      setAttribute(Qt::WA_DeleteOnClose);
6f96c947a   김태훈   GUI 0.1.4
22
23
24
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_1,
6f96c947a   김태훈   GUI 0.1.4
25
26
27
28
29
30
31
32
                      ui->configMinLabel_1,
                      ui->configMaxLabel_1,
                      ui->configCurrentLabel_1,
                      ui->configSlider_1
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_2,
6f96c947a   김태훈   GUI 0.1.4
33
34
35
36
37
38
39
40
                      ui->configMinLabel_2,
                      ui->configMaxLabel_2,
                      ui->configCurrentLabel_2,
                      ui->configSlider_2
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_3,
6f96c947a   김태훈   GUI 0.1.4
41
42
43
44
45
46
47
48
                      ui->configMinLabel_3,
                      ui->configMaxLabel_3,
                      ui->configCurrentLabel_3,
                      ui->configSlider_3
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_4,
6f96c947a   김태훈   GUI 0.1.4
49
50
51
52
53
54
55
56
                      ui->configMinLabel_4,
                      ui->configMaxLabel_4,
                      ui->configCurrentLabel_4,
                      ui->configSlider_4
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_5,
6f96c947a   김태훈   GUI 0.1.4
57
58
59
60
61
                      ui->configMinLabel_5,
                      ui->configMaxLabel_5,
                      ui->configCurrentLabel_5,
                      ui->configSlider_5
                  });
184bdebb4   김태훈   엔코더 구현
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
      setupUi();
  
      afterThreeSecsTimer.setSingleShot(true);
      afterThreeSecsTimer.setInterval(3000);
      connect(&afterThreeSecsTimer, SIGNAL(timeout()), SLOT(afterThreeSecs()));
  
      foreach (QPushButton *button, findChildren<QPushButton *>())
          connect(button, &QPushButton::pressed, SoundPlayer::playClick);
  
      foreach (QWidget *w, findChildren<QWidget *>())
          w->installEventFilter(this);
  
      installEventFilter(this);
  
      setFocus();
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
77
184bdebb4   김태훈   엔코더 구현
78
79
80
81
82
83
84
85
86
87
88
      afterThreeSecsTimer.start();
  }
  
  AutoCookConfigWindow::~AutoCookConfigWindow()
  {
      delete ui;
  }
  
  bool AutoCookConfigWindow::eventFilter(QObject */*watched*/, QEvent *event)
  {
      switch (event->type())
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
89
      {
184bdebb4   김태훈   엔코더 구현
90
91
92
93
94
95
96
97
98
      case QEvent::KeyPress:
      case QEvent::KeyRelease:
      case QEvent::MouseButtonPress:
      case QEvent::MouseButtonRelease:
      case QEvent::MouseMove:
          afterThreeSecsTimer.start();
          break;
      default:
          break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
99
      }
184bdebb4   김태훈   엔코더 구현
100
101
      return false;
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
102
184bdebb4   김태훈   엔코더 구현
103
104
105
  void AutoCookConfigWindow::keyPressEvent(QKeyEvent *event)
  {
      switch (event->key())
bbd7d8f29   김태훈   버튼 음향 추가
106
      {
184bdebb4   김태훈   엔코더 구현
107
108
109
110
111
112
113
114
115
      case 0x01000030:    // Turn left
          onEncoderLeft();
          break;
      case 0x01000031:    // Push
          pushed = focusWidget();
          break;
      case 0x01000032:    // Turn right
          onEncoderRight();
          break;
bbd7d8f29   김태훈   버튼 음향 추가
116
      }
184bdebb4   김태훈   엔코더 구현
117
  }
bbd7d8f29   김태훈   버튼 음향 추가
118
184bdebb4   김태훈   엔코더 구현
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
  void AutoCookConfigWindow::keyReleaseEvent(QKeyEvent *event)
  {
      switch (event->key())
      {
      case 0x01000030:    // Turn left
          onEncoderLeft();
          break;
      case 0x01000031:    // Push
          if (focusWidget() == pushed)
              onEncoderClicked(pushed);
  
          pushed = NULL;
          break;
      case 0x01000032:    // Turn right
          onEncoderRight();
          break;
      }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
136
  }
184bdebb4   김태훈   엔코더 구현
137
  void AutoCookConfigWindow::afterThreeSecs()
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
138
  {
184bdebb4   김태훈   엔코더 구현
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
      Slider *slider = qobject_cast<Slider *>(focusWidget());
      if (slider)
      {
          if (slider == ui->configSlider_1)
              ui->configButton_1->setFocus();
          else if (slider == ui->configSlider_2)
              ui->configButton_2->setFocus();
          else if (slider == ui->configSlider_3)
              ui->configButton_3->setFocus();
          else if (slider == ui->configSlider_4)
              ui->configButton_4->setFocus();
          else if (slider == ui->configSlider_5)
              ui->configButton_5->setFocus();
  
          afterThreeSecsTimer.start();
      }
      else
          start();
  }
  
  void AutoCookConfigWindow::onEncoderLeft()
  {
      focusPreviousChild();
  }
  
  void AutoCookConfigWindow::onEncoderRight()
  {
      focusNextChild();
  }
  
  void AutoCookConfigWindow::onEncoderClicked(QWidget *clicked)
  {
      if (clicked == NULL)
          return;
  
      if (clicked->inherits("QPushButton"))
      {
          QPushButton *pb = qobject_cast<QPushButton *>(clicked);
          if (pb)
              pb->click();
      }
      else if (clicked->inherits("Slider"))
      {
          Slider *slider = qobject_cast<Slider *>(clicked);
          if (slider)
          {
              if (slider == ui->configSlider_1)
                  ui->configButton_1->setFocus();
              else if (slider == ui->configSlider_2)
                  ui->configButton_2->setFocus();
              else if (slider == ui->configSlider_3)
                  ui->configButton_3->setFocus();
              else if (slider == ui->configSlider_4)
                  ui->configButton_4->setFocus();
              else if (slider == ui->configSlider_5)
                  ui->configButton_5->setFocus();
          }
      }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
197
198
199
200
201
202
  }
  
  void AutoCookConfigWindow::setupUi()
  {
      ui->cookTypeIcon->setPixmap(Define::icon(cook.type));
      ui->selectCookButton->setText(cook.name);
6f96c947a   김태훈   GUI 0.1.4
203
204
      for (int idx = 0; idx < 5; idx++)
      {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
205
206
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
207
208
209
          {
              ConfigWidget cw = configWidgets.at(idx);
              cw.button->hide();
6f96c947a   김태훈   GUI 0.1.4
210
211
212
213
214
215
216
217
218
              cw.minimum->hide();
              cw.maximum->hide();
              cw.current->hide();
              cw.slider->hide();
          }
          else
          {
              ConfigWidget cw = configWidgets.at(idx);
              cw.button->setStyleSheet(
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
219
220
                          "QPushButton { image: url("
                           + Define::icon(config.type)
184bdebb4   김태훈   엔코더 구현
221
                           + ") } QPushButton:pressed, QPushButton:focus { image: url("
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
222
                           + Define::iconOverlay(config.type)
6f96c947a   김태훈   GUI 0.1.4
223
                           + ") }");
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
224
225
              cw.minimum->setText(Define::minimum(config.type));
              cw.maximum->setText(Define::maximum(config.type));
6f96c947a   김태훈   GUI 0.1.4
226
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
227
              switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
228
              {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
229
              case Define::Time:
935b853a4   김태훈   새 슬라이더 적용
230
                  cw.slider->setSubPixmap(":/images/slider/sub_white.png");
6f96c947a   김태훈   GUI 0.1.4
231
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
232
              case Define::BurnDegree:
935b853a4   김태훈   새 슬라이더 적용
233
                  cw.slider->setSubPixmap(":/images/slider/sub_yellow.png");
6f96c947a   김태훈   GUI 0.1.4
234
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
235
              case Define::Brightness:
935b853a4   김태훈   새 슬라이더 적용
236
                  cw.slider->setSubPixmap(":/images/slider/sub_red.png");
6f96c947a   김태훈   GUI 0.1.4
237
238
                  break;
              default:
935b853a4   김태훈   새 슬라이더 적용
239
                  cw.slider->setSubPixmap(":/images/slider/sub_blue.png");
6f96c947a   김태훈   GUI 0.1.4
240
241
                  break;
              }
935b853a4   김태훈   새 슬라이더 적용
242
243
244
245
246
247
248
249
              cw.slider->blockSignals(true);
              cw.slider->setMinimum(1);
              cw.slider->setMaximum(config.maximum);
              cw.slider->setValue(config.current);
              cw.slider->blockSignals(false);
              cw.slider->bigTickInterval = 1;
  
              connect(cw.slider, SIGNAL(sliderMoved(int)), SLOT(updateConfig()));
6f96c947a   김태훈   GUI 0.1.4
250
251
          }
      }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
252
      updateView();
6f96c947a   김태훈   GUI 0.1.4
253
254
255
256
257
258
  }
  
  void AutoCookConfigWindow::updateView()
  {
      for (int idx = 0; idx < 5; idx++)
      {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
259
260
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
261
262
263
              continue;
  
          ConfigWidget cw = configWidgets.at(idx);
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
264
          switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
265
          {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
266
          case Define::Time:
2bfd3a050   김태훈   환경 설정 대응
267
              cw.current->setText(Stringer::remainingTime(cook.time() * 1000, Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
268
              break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
269
          case Define::BurnDegree:
2bfd3a050   김태훈   환경 설정 대응
270
              cw.current->setText(Stringer::temperature(cook.coreTemp(), Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
271
272
              break;
          default:
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
273
274
275
276
              cw.current->setText(QString().sprintf(
                      "%d"
                      "<span style=\"font-size:11pt;\">/%d</span>",
                      config.current, config.maximum));
6f96c947a   김태훈   GUI 0.1.4
277
278
279
              break;
          }
      }
6f96c947a   김태훈   GUI 0.1.4
280
281
282
283
  }
  
  void AutoCookConfigWindow::updateConfig()
  {
935b853a4   김태훈   새 슬라이더 적용
284
285
286
287
288
      cook.setConfig(ui->configSlider_1->sliderPosition(),
                     ui->configSlider_2->sliderPosition(),
                     ui->configSlider_3->sliderPosition(),
                     ui->configSlider_4->sliderPosition(),
                     ui->configSlider_5->sliderPosition());
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
289
290
291
  
      updateView();
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
292
293
  void AutoCookConfigWindow::start()
  {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
294
295
296
297
      AutoCookWindow *w = new AutoCookWindow(parentWidget(), cook);
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
7d0288172   김태훈   기능 추가 구현
298
184bdebb4   김태훈   엔코더 구현
299
      connect(w, SIGNAL(back()), &afterThreeSecsTimer, SLOT(start()));
6f96c947a   김태훈   GUI 0.1.4
300
  }
f588aa273   김태훈   부가 기능 로직 추가
301
302
303
304
305
306
307
308
309
310
311
  void AutoCookConfigWindow::addFavorite()
  {
      AutoCookSetting s;
      s.type = cook.type;
      s.root = cook.root;
      for (int i = 0; i < 5; i++)
          s.configs[i] = cook.configs[i].current;
  
      FavoriteNamePopup *p = new FavoriteNamePopup(this, s);
      p->showFullScreen();
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
312
  void AutoCookConfigWindow::on_backButton_clicked()
6f96c947a   김태훈   GUI 0.1.4
313
  {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
314
      close();
6f96c947a   김태훈   GUI 0.1.4
315
  }
f588aa273   김태훈   부가 기능 로직 추가
316
e00c6a2a9   김태훈   기능 추가 구현
317
318
319
320
321
322
323
324
325
  void AutoCookConfigWindow::on_configButton_clicked()
  {
      ConfigWindow *w = new ConfigWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
f588aa273   김태훈   부가 기능 로직 추가
326
327
328
329
330
331
  void AutoCookConfigWindow::on_favoritesButton_clicked()
  {
      ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
      p->showFullScreen();
  
      connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
184bdebb4   김태훈   엔코더 구현
332
      if (afterThreeSecsTimer.isActive())
f588aa273   김태훈   부가 기능 로직 추가
333
      {
184bdebb4   김태훈   엔코더 구현
334
335
          afterThreeSecsTimer.stop();
          connect(p, SIGNAL(rejected()), &afterThreeSecsTimer, SLOT(start()));
f588aa273   김태훈   부가 기능 로직 추가
336
337
      }
  }
e00c6a2a9   김태훈   기능 추가 구현
338
339
340
341
342
343
344
345
346
347
  
  void AutoCookConfigWindow::on_washButton_clicked()
  {
      WashWindow *w = new WashWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
184bdebb4   김태훈   엔코더 구현
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
  
  void AutoCookConfigWindow::on_configButton_1_clicked()
  {
      ui->configSlider_1->setFocus();
  }
  
  void AutoCookConfigWindow::on_configButton_2_clicked()
  {
      ui->configSlider_2->setFocus();
  }
  
  void AutoCookConfigWindow::on_configButton_3_clicked()
  {
      ui->configSlider_3->setFocus();
  }
  
  void AutoCookConfigWindow::on_configButton_4_clicked()
  {
      ui->configSlider_4->setFocus();
  }
  
  void AutoCookConfigWindow::on_configButton_5_clicked()
  {
      ui->configSlider_5->setFocus();
  }