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