Blame view

app/gui/oven_control/autocookconfigwindow.cpp 11.4 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"
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
13
3f52600cc   김태훈   소스 코드 구조 개선
14
  AutoCookConfigWindow::AutoCookConfigWindow(QWidget *parent, Cook cook) :
6f96c947a   김태훈   GUI 0.1.4
15
16
      QMainWindow(parent),
      ui(new Ui::AutoCookConfigWindow),
6f96c947a   김태훈   GUI 0.1.4
17
18
19
20
21
22
      cook(cook)
  {
      ui->setupUi(this);
  
      ui->clockContainer->setParent(ui->upperStack);
      setAttribute(Qt::WA_DeleteOnClose);
6f96c947a   김태훈   GUI 0.1.4
23
24
25
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_1,
6f96c947a   김태훈   GUI 0.1.4
26
27
28
29
30
31
32
33
                      ui->configMinLabel_1,
                      ui->configMaxLabel_1,
                      ui->configCurrentLabel_1,
                      ui->configSlider_1
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_2,
6f96c947a   김태훈   GUI 0.1.4
34
35
36
37
38
39
40
41
                      ui->configMinLabel_2,
                      ui->configMaxLabel_2,
                      ui->configCurrentLabel_2,
                      ui->configSlider_2
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_3,
6f96c947a   김태훈   GUI 0.1.4
42
43
44
45
46
47
48
49
                      ui->configMinLabel_3,
                      ui->configMaxLabel_3,
                      ui->configCurrentLabel_3,
                      ui->configSlider_3
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_4,
6f96c947a   김태훈   GUI 0.1.4
50
51
52
53
54
55
56
57
                      ui->configMinLabel_4,
                      ui->configMaxLabel_4,
                      ui->configCurrentLabel_4,
                      ui->configSlider_4
                  });
      configWidgets.append(
                  ConfigWidget {
                      ui->configButton_5,
6f96c947a   김태훈   GUI 0.1.4
58
59
60
61
62
                      ui->configMinLabel_5,
                      ui->configMaxLabel_5,
                      ui->configCurrentLabel_5,
                      ui->configSlider_5
                  });
11c611782   김태훈   자동 요리 세부 사항 구현
63
64
      foreach (Slider *s, findChildren<Slider *>())
          connect(s, SIGNAL(sliderMoved(int)), SLOT(updateConfig()));
184bdebb4   김태훈   엔코더 구현
65
66
67
68
69
70
71
72
73
74
75
      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   김태훈   엔코더 구현
76
      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
      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   김태훈   자동 요리 세부 사항 구현
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  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   김태훈   엔코더 구현
173
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
  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   김태훈   자동 요리 관련 로직 전면 재작성
211
212
213
214
215
216
  }
  
  void AutoCookConfigWindow::setupUi()
  {
      ui->cookTypeIcon->setPixmap(Define::icon(cook.type));
      ui->selectCookButton->setText(cook.name);
6f96c947a   김태훈   GUI 0.1.4
217
218
      for (int idx = 0; idx < 5; idx++)
      {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
219
220
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
221
222
223
          {
              ConfigWidget cw = configWidgets.at(idx);
              cw.button->hide();
6f96c947a   김태훈   GUI 0.1.4
224
225
226
227
228
229
230
231
              cw.minimum->hide();
              cw.maximum->hide();
              cw.current->hide();
              cw.slider->hide();
          }
          else
          {
              ConfigWidget cw = configWidgets.at(idx);
11c611782   김태훈   자동 요리 세부 사항 구현
232
233
234
235
236
              cw.button->show();
              cw.minimum->show();
              cw.maximum->show();
              cw.current->show();
              cw.slider->show();
6f96c947a   김태훈   GUI 0.1.4
237
              cw.button->setStyleSheet(
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
238
239
                          "QPushButton { image: url("
                           + Define::icon(config.type)
184bdebb4   김태훈   엔코더 구현
240
                           + ") } QPushButton:pressed, QPushButton:focus { image: url("
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
241
                           + Define::iconOverlay(config.type)
6f96c947a   김태훈   GUI 0.1.4
242
                           + ") }");
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
243
244
              cw.minimum->setText(Define::minimum(config.type));
              cw.maximum->setText(Define::maximum(config.type));
6f96c947a   김태훈   GUI 0.1.4
245
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
246
              switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
247
              {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
248
              case Define::Time:
935b853a4   김태훈   새 슬라이더 적용
249
                  cw.slider->setSubPixmap(":/images/slider/sub_white.png");
6f96c947a   김태훈   GUI 0.1.4
250
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
251
              case Define::BurnDegree:
935b853a4   김태훈   새 슬라이더 적용
252
                  cw.slider->setSubPixmap(":/images/slider/sub_yellow.png");
6f96c947a   김태훈   GUI 0.1.4
253
                  break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
254
              case Define::Brightness:
935b853a4   김태훈   새 슬라이더 적용
255
                  cw.slider->setSubPixmap(":/images/slider/sub_red.png");
6f96c947a   김태훈   GUI 0.1.4
256
257
                  break;
              default:
935b853a4   김태훈   새 슬라이더 적용
258
                  cw.slider->setSubPixmap(":/images/slider/sub_blue.png");
6f96c947a   김태훈   GUI 0.1.4
259
260
                  break;
              }
935b853a4   김태훈   새 슬라이더 적용
261
262
263
264
265
266
              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
267
268
          }
      }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
269
      updateView();
6f96c947a   김태훈   GUI 0.1.4
270
271
272
273
274
275
  }
  
  void AutoCookConfigWindow::updateView()
  {
      for (int idx = 0; idx < 5; idx++)
      {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
276
277
          CookConfig config = cook.configs[idx];
          if (config.type == Define::ConfigNotUsed)
6f96c947a   김태훈   GUI 0.1.4
278
279
280
              continue;
  
          ConfigWidget cw = configWidgets.at(idx);
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
281
          switch (config.type)
6f96c947a   김태훈   GUI 0.1.4
282
          {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
283
          case Define::Time:
2bfd3a050   김태훈   환경 설정 대응
284
              cw.current->setText(Stringer::remainingTime(cook.time() * 1000, Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
285
              break;
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
286
          case Define::BurnDegree:
2bfd3a050   김태훈   환경 설정 대응
287
              cw.current->setText(Stringer::temperature(cook.coreTemp(), Stringer::fontSize14));
6f96c947a   김태훈   GUI 0.1.4
288
289
              break;
          default:
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
290
291
292
293
              cw.current->setText(QString().sprintf(
                      "%d"
                      "<span style=\"font-size:11pt;\">/%d</span>",
                      config.current, config.maximum));
6f96c947a   김태훈   GUI 0.1.4
294
295
296
              break;
          }
      }
6f96c947a   김태훈   GUI 0.1.4
297
298
299
300
  }
  
  void AutoCookConfigWindow::updateConfig()
  {
935b853a4   김태훈   새 슬라이더 적용
301
302
303
304
305
      cook.setConfig(ui->configSlider_1->sliderPosition(),
                     ui->configSlider_2->sliderPosition(),
                     ui->configSlider_3->sliderPosition(),
                     ui->configSlider_4->sliderPosition(),
                     ui->configSlider_5->sliderPosition());
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
306
307
308
  
      updateView();
  }
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
309
310
  void AutoCookConfigWindow::start()
  {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
311
312
313
314
      AutoCookWindow *w = new AutoCookWindow(parentWidget(), cook);
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
7d0288172   김태훈   기능 추가 구현
315
184bdebb4   김태훈   엔코더 구현
316
      connect(w, SIGNAL(back()), &afterThreeSecsTimer, SLOT(start()));
11c611782   김태훈   자동 요리 세부 사항 구현
317
      connect(w, SIGNAL(newWindow(AutoCookWindow*)), SLOT(connectNewWindow(AutoCookWindow*)));
6f96c947a   김태훈   GUI 0.1.4
318
  }
f588aa273   김태훈   부가 기능 로직 추가
319
320
321
322
323
324
325
326
327
328
329
  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   김태훈   자동 요리 관련 로직 전면 재작성
330
  void AutoCookConfigWindow::on_backButton_clicked()
6f96c947a   김태훈   GUI 0.1.4
331
  {
6a81d38e4   김태훈   자동 요리 관련 로직 전면 재작성
332
      close();
6f96c947a   김태훈   GUI 0.1.4
333
  }
f588aa273   김태훈   부가 기능 로직 추가
334
e00c6a2a9   김태훈   기능 추가 구현
335
336
337
338
339
340
341
342
343
  void AutoCookConfigWindow::on_configButton_clicked()
  {
      ConfigWindow *w = new ConfigWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
f588aa273   김태훈   부가 기능 로직 추가
344
345
346
347
348
349
  void AutoCookConfigWindow::on_favoritesButton_clicked()
  {
      ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
      p->showFullScreen();
  
      connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
184bdebb4   김태훈   엔코더 구현
350
      if (afterThreeSecsTimer.isActive())
f588aa273   김태훈   부가 기능 로직 추가
351
      {
184bdebb4   김태훈   엔코더 구현
352
353
          afterThreeSecsTimer.stop();
          connect(p, SIGNAL(rejected()), &afterThreeSecsTimer, SLOT(start()));
f588aa273   김태훈   부가 기능 로직 추가
354
355
      }
  }
e00c6a2a9   김태훈   기능 추가 구현
356
357
358
359
360
361
362
363
364
365
  
  void AutoCookConfigWindow::on_washButton_clicked()
  {
      WashWindow *w = new WashWindow(MainWindow::getInstance());
      w->setWindowModality(Qt::WindowModal);
      w->showFullScreen();
      w->raise();
  
      MainWindow::jump(w);
  }
184bdebb4   김태훈   엔코더 구현
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  
  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   김태훈   자동 요리 세부 사항 구현
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
  
  void AutoCookConfigWindow::on_selectCookButton_clicked()
  {
      AutoCookSelectionPopup *p = new AutoCookSelectionPopup(this, cook.type);
      p->showFullScreen();
      p->raise();
  
      connect(p, SIGNAL(selected(Cook)), SLOT(changeCook(Cook)));
  
      if (afterThreeSecsTimer.isActive())
      {
          afterThreeSecsTimer.stop();
          connect(p, SIGNAL(selected(Cook)), &afterThreeSecsTimer, SLOT(start()));
          connect(p, SIGNAL(canceled()), &afterThreeSecsTimer, SLOT(start()));
      }
  }