Blame view

app/gui/oven_control/autocookconfigwindow.cpp 12.6 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
      foreach (Slider *s, findChildren<Slider *>())
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
65
66
      {
          connect(s, SIGNAL(sliderPressed()), SLOT(updateView()));
11c611782   김태훈   자동 요리 세부 사항 구현
67
          connect(s, SIGNAL(sliderMoved(int)), SLOT(updateConfig()));
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
68
      }
11c611782   김태훈   자동 요리 세부 사항 구현
69
184bdebb4   김태훈   엔코더 구현
70
71
72
73
74
75
76
77
78
79
80
      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   김태훈   엔코더 구현
81
      setFocus();
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
82
184bdebb4   김태훈   엔코더 구현
83
84
85
86
87
88
89
90
91
92
93
      afterThreeSecsTimer.start();
  }
  
  AutoCookConfigWindow::~AutoCookConfigWindow()
  {
      delete ui;
  }
  
  bool AutoCookConfigWindow::eventFilter(QObject */*watched*/, QEvent *event)
  {
      switch (event->type())
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
94
      {
184bdebb4   김태훈   엔코더 구현
95
96
97
98
99
100
101
102
103
      case QEvent::KeyPress:
      case QEvent::KeyRelease:
      case QEvent::MouseButtonPress:
      case QEvent::MouseButtonRelease:
      case QEvent::MouseMove:
          afterThreeSecsTimer.start();
          break;
      default:
          break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
104
      }
184bdebb4   김태훈   엔코더 구현
105
106
      return false;
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
107
184bdebb4   김태훈   엔코더 구현
108
109
110
  void AutoCookConfigWindow::keyPressEvent(QKeyEvent *event)
  {
      switch (event->key())
bbd7d8f29   김태훈   버튼 음향 추가
111
      {
184bdebb4   김태훈   엔코더 구현
112
113
114
115
116
117
118
119
120
      case 0x01000030:    // Turn left
          onEncoderLeft();
          break;
      case 0x01000031:    // Push
          pushed = focusWidget();
          break;
      case 0x01000032:    // Turn right
          onEncoderRight();
          break;
bbd7d8f29   김태훈   버튼 음향 추가
121
      }
184bdebb4   김태훈   엔코더 구현
122
  }
bbd7d8f29   김태훈   버튼 음향 추가
123
184bdebb4   김태훈   엔코더 구현
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  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   김태훈   자동 요리 관련 로직 전면 재작성
141
  }
184bdebb4   김태훈   엔코더 구현
142
  void AutoCookConfigWindow::afterThreeSecs()
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
143
  {
184bdebb4   김태훈   엔코더 구현
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
      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   김태훈   자동 요리 세부 사항 구현
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  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   김태훈   엔코더 구현
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
212
213
214
215
  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   김태훈   자동 요리 관련 로직 전면 재작성
216
217
218
219
220
221
  }
  
  void AutoCookConfigWindow::setupUi()
  {
      ui->cookTypeIcon->setPixmap(Define::icon(cook.type));
      ui->selectCookButton->setText(cook.name);
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
222
223
224
225
226
      QString styleSheet("\
  QPushButton { image: url(%1); }\
  QPushButton:pressed,\
  QPushButton:focus { image: url(%2); }\
  QPushButton:checked { image: url(%3); }");
6f96c947a   김태훈   GUI 0.1.4
227
228
      for (int idx = 0; idx < 5; idx++)
      {
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
229
          ConfigWidget cw = configWidgets.at(idx);
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
230
231
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
232
          {
6f96c947a   김태훈   GUI 0.1.4
233
              cw.button->hide();
6f96c947a   김태훈   GUI 0.1.4
234
235
236
237
238
239
240
              cw.minimum->hide();
              cw.maximum->hide();
              cw.current->hide();
              cw.slider->hide();
          }
          else
          {
11c611782   김태훈   자동 요리 세부 사항 구현
241
242
243
244
245
              cw.button->show();
              cw.minimum->show();
              cw.maximum->show();
              cw.current->show();
              cw.slider->show();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
246
247
248
249
              cw.button->setStyleSheet(styleSheet
                                       .arg(Define::icon(config.type))
                                       .arg(Define::iconOverlay(config.type))
                                       .arg(Define::iconActiveted(config.type)));
6f96c947a   김태훈   GUI 0.1.4
250
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
251
252
              cw.minimum->setText(Define::minimum(config.type));
              cw.maximum->setText(Define::maximum(config.type));
6f96c947a   김태훈   GUI 0.1.4
253
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
254
              switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
255
              {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
256
              case Define::Time:
935b853a4   김태훈   새 슬라이더 적용
257
                  cw.slider->setSubPixmap(":/images/slider/sub_white.png");
6f96c947a   김태훈   GUI 0.1.4
258
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
259
              case Define::BurnDegree:
935b853a4   김태훈   새 슬라이더 적용
260
                  cw.slider->setSubPixmap(":/images/slider/sub_yellow.png");
6f96c947a   김태훈   GUI 0.1.4
261
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
262
              case Define::Brightness:
935b853a4   김태훈   새 슬라이더 적용
263
                  cw.slider->setSubPixmap(":/images/slider/sub_red.png");
6f96c947a   김태훈   GUI 0.1.4
264
265
                  break;
              default:
935b853a4   김태훈   새 슬라이더 적용
266
                  cw.slider->setSubPixmap(":/images/slider/sub_blue.png");
6f96c947a   김태훈   GUI 0.1.4
267
268
                  break;
              }
935b853a4   김태훈   새 슬라이더 적용
269
270
271
272
273
274
              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
275
276
          }
      }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
277
      updateView();
6f96c947a   김태훈   GUI 0.1.4
278
279
280
281
282
283
  }
  
  void AutoCookConfigWindow::updateView()
  {
      for (int idx = 0; idx < 5; idx++)
      {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
284
285
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
286
287
288
              continue;
  
          ConfigWidget cw = configWidgets.at(idx);
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
289
          switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
290
          {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
291
          case Define::Time:
2bfd3a050   김태훈   환경 설정 대응
292
              cw.current->setText(Stringer::remainingTime(cook.time() * 1000, Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
293
              break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
294
          case Define::BurnDegree:
2bfd3a050   김태훈   환경 설정 대응
295
              cw.current->setText(Stringer::temperature(cook.coreTemp(), Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
296
297
              break;
          default:
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
298
299
300
301
              cw.current->setText(QString().sprintf(
                      "%d"
                      "<span style=\"font-size:11pt;\">/%d</span>",
                      config.current, config.maximum));
6f96c947a   김태훈   GUI 0.1.4
302
303
304
              break;
          }
      }
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
305
306
307
308
309
310
311
  
      QWidget *focused = focusWidget();
      ui->configButton_1->setChecked(focused == ui->configSlider_1);
      ui->configButton_2->setChecked(focused == ui->configSlider_2);
      ui->configButton_3->setChecked(focused == ui->configSlider_3);
      ui->configButton_4->setChecked(focused == ui->configSlider_4);
      ui->configButton_5->setChecked(focused == ui->configSlider_5);
6f96c947a   김태훈   GUI 0.1.4
312
313
314
315
  }
  
  void AutoCookConfigWindow::updateConfig()
  {
935b853a4   김태훈   새 슬라이더 적용
316
317
318
319
320
      cook.setConfig(ui->configSlider_1->sliderPosition(),
                     ui->configSlider_2->sliderPosition(),
                     ui->configSlider_3->sliderPosition(),
                     ui->configSlider_4->sliderPosition(),
                     ui->configSlider_5->sliderPosition());
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
321
322
323
  
      updateView();
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
324
325
  void AutoCookConfigWindow::start()
  {
68c06e96f   김태훈   자동 요리 세부 사항 구현
326
      setFocus();
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
327
328
329
330
      AutoCookWindow *w = new AutoCookWindow(parentWidget(), cook);
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
7d0288172   김태훈   기능 추가 구현
331
184bdebb4   김태훈   엔코더 구현
332
      connect(w, SIGNAL(back()), &afterThreeSecsTimer, SLOT(start()));
11c611782   김태훈   자동 요리 세부 사항 구현
333
      connect(w, SIGNAL(newWindow(AutoCookWindow*)), SLOT(connectNewWindow(AutoCookWindow*)));
6f96c947a   김태훈   GUI 0.1.4
334
  }
f588aa273   김태훈   부가 기능 로직 추가
335
336
337
338
339
340
341
342
343
344
345
  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   김태훈   자동 요리 관련 로직 전면 재작성
346
  void AutoCookConfigWindow::on_backButton_clicked()
6f96c947a   김태훈   GUI 0.1.4
347
  {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
348
      close();
6f96c947a   김태훈   GUI 0.1.4
349
  }
f588aa273   김태훈   부가 기능 로직 추가
350
e00c6a2a9   김태훈   기능 추가 구현
351
352
353
354
355
356
357
358
359
  void AutoCookConfigWindow::on_configButton_clicked()
  {
      ConfigWindow *w = new ConfigWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
f588aa273   김태훈   부가 기능 로직 추가
360
361
362
363
364
365
  void AutoCookConfigWindow::on_favoritesButton_clicked()
  {
      ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
      p->showFullScreen();
  
      connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
184bdebb4   김태훈   엔코더 구현
366
      if (afterThreeSecsTimer.isActive())
f588aa273   김태훈   부가 기능 로직 추가
367
      {
184bdebb4   김태훈   엔코더 구현
368
369
          afterThreeSecsTimer.stop();
          connect(p, SIGNAL(rejected()), &afterThreeSecsTimer, SLOT(start()));
f588aa273   김태훈   부가 기능 로직 추가
370
371
      }
  }
e00c6a2a9   김태훈   기능 추가 구현
372
373
374
375
376
377
378
379
380
381
  
  void AutoCookConfigWindow::on_washButton_clicked()
  {
      WashWindow *w = new WashWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
184bdebb4   김태훈   엔코더 구현
382
383
384
385
  
  void AutoCookConfigWindow::on_configButton_1_clicked()
  {
      ui->configSlider_1->setFocus();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
386
      updateView();
184bdebb4   김태훈   엔코더 구현
387
388
389
390
391
  }
  
  void AutoCookConfigWindow::on_configButton_2_clicked()
  {
      ui->configSlider_2->setFocus();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
392
      updateView();
184bdebb4   김태훈   엔코더 구현
393
394
395
396
397
  }
  
  void AutoCookConfigWindow::on_configButton_3_clicked()
  {
      ui->configSlider_3->setFocus();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
398
      updateView();
184bdebb4   김태훈   엔코더 구현
399
400
401
402
403
  }
  
  void AutoCookConfigWindow::on_configButton_4_clicked()
  {
      ui->configSlider_4->setFocus();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
404
      updateView();
184bdebb4   김태훈   엔코더 구현
405
406
407
408
409
  }
  
  void AutoCookConfigWindow::on_configButton_5_clicked()
  {
      ui->configSlider_5->setFocus();
07441dbd3   김태훈   엔코더 관련 디자인 변경 대비
410
      updateView();
184bdebb4   김태훈   엔코더 구현
411
  }
11c611782   김태훈   자동 요리 세부 사항 구현
412
413
414
  
  void AutoCookConfigWindow::on_selectCookButton_clicked()
  {
68c06e96f   김태훈   자동 요리 세부 사항 구현
415
      setFocus();
11c611782   김태훈   자동 요리 세부 사항 구현
416
417
418
419
420
      AutoCookSelectionPopup *p = new AutoCookSelectionPopup(this, cook.type);
      p->showFullScreen();
      p->raise();
  
      connect(p, SIGNAL(selected(Cook)), SLOT(changeCook(Cook)));
68c06e96f   김태훈   자동 요리 세부 사항 구현
421
422
      connect(p, SIGNAL(selected(Cook)), SLOT(setFocus()));
      connect(p, SIGNAL(canceled()), SLOT(setFocus()));
11c611782   김태훈   자동 요리 세부 사항 구현
423
424
425
426
427
428
429
430
  
      if (afterThreeSecsTimer.isActive())
      {
          afterThreeSecsTimer.stop();
          connect(p, SIGNAL(selected(Cook)), &afterThreeSecsTimer, SLOT(start()));
          connect(p, SIGNAL(canceled()), &afterThreeSecsTimer, SLOT(start()));
      }
  }
68c06e96f   김태훈   자동 요리 세부 사항 구현
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  
  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()));
      }
  }