Blame view

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