Commit 271dda4aeeda7c4b1af130baa230894c91700b09

Authored by 김태훈
1 parent 40f5d047f8
Exists in master and in 2 other branches fhd, fhd-demo

엔코더 구현

- 수동 요리
- 세척 모드
app/gui/oven_control/confirmpopup.cpp
1 1 #include "confirmpopup.h"
2 2 #include "ui_confirmpopup.h"
3 3  
  4 +#include <QKeyEvent>
  5 +
4 6 #include "soundplayer.h"
5 7  
6 8 ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
... ... @@ -12,6 +14,8 @@ ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
12 14  
13 15 foreach (QPushButton *button, findChildren<QPushButton *>())
14 16 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
  17 +
  18 + setFocus();
15 19 }
16 20  
17 21 ConfirmPopup::~ConfirmPopup()
... ... @@ -19,6 +23,41 @@ ConfirmPopup::~ConfirmPopup()
19 23 delete ui;
20 24 }
21 25  
  26 +void ConfirmPopup::keyPressEvent(QKeyEvent *event)
  27 +{
  28 + switch (event->key())
  29 + {
  30 + case 0x01000030: // Turn left
  31 + onEncoderLeft();
  32 + break;
  33 + case 0x01000031: // Push
  34 + pushed = focusWidget();
  35 + break;
  36 + case 0x01000032: // Turn right
  37 + onEncoderRight();
  38 + break;
  39 + }
  40 +}
  41 +
  42 +void ConfirmPopup::keyReleaseEvent(QKeyEvent *event)
  43 +{
  44 + switch (event->key())
  45 + {
  46 + case 0x01000030: // Turn left
  47 + onEncoderLeft();
  48 + break;
  49 + case 0x01000031: // Push
  50 + if (focusWidget() == pushed)
  51 + onEncoderClicked(pushed);
  52 +
  53 + pushed = NULL;
  54 + break;
  55 + case 0x01000032: // Turn right
  56 + onEncoderRight();
  57 + break;
  58 + }
  59 +}
  60 +
22 61 void ConfirmPopup::on_okButton_clicked()
23 62 {
24 63 deleteLater();
... ... @@ -30,3 +69,28 @@ void ConfirmPopup::on_cancelButton_clicked()
30 69 deleteLater();
31 70 emit rejected();
32 71 }
  72 +
  73 +void ConfirmPopup::onEncoderLeft()
  74 +{
  75 + QWidget *focused = focusWidget();
  76 + if (focused == this || focused == ui->okButton)
  77 + ui->cancelButton->setFocus();
  78 + else
  79 + focusPreviousChild();
  80 +}
  81 +
  82 +void ConfirmPopup::onEncoderRight()
  83 +{
  84 + QWidget *focused = focusWidget();
  85 + if (focused == this || focused == ui->cancelButton)
  86 + ui->okButton->setFocus();
  87 + else
  88 + focusNextChild();
  89 +}
  90 +
  91 +void ConfirmPopup::onEncoderClicked(QWidget *clicked)
  92 +{
  93 + QPushButton *b = qobject_cast<QPushButton *>(clicked);
  94 + if (b)
  95 + b->click();
  96 +}
... ...
app/gui/oven_control/confirmpopup.h
... ... @@ -19,6 +19,10 @@ public:
19 19 explicit ConfirmPopup(QWidget *parent, QString text);
20 20 ~ConfirmPopup();
21 21  
  22 +protected:
  23 + void keyPressEvent(QKeyEvent *event);
  24 + void keyReleaseEvent(QKeyEvent *event);
  25 +
22 26 private slots:
23 27 void on_okButton_clicked();
24 28  
... ... @@ -26,6 +30,12 @@ private slots:
26 30  
27 31 private:
28 32 Ui::ConfirmPopup *ui;
  33 +
  34 + QWidget *pushed = NULL;
  35 +
  36 + void onEncoderLeft();
  37 + void onEncoderRight();
  38 + void onEncoderClicked(QWidget *clicked);
29 39 };
30 40  
31 41 #endif // CONFIRMPOPUP_H
... ...
app/gui/oven_control/cooldownpopup.cpp
1 1 #include "cooldownpopup.h"
2 2 #include "ui_cooldownpopup.h"
3 3  
  4 +#include <QKeyEvent>
  5 +
4 6 #include "soundplayer.h"
5 7 #include "stringer.h"
6 8  
... ... @@ -57,6 +59,14 @@ CooldownPopup::CooldownPopup(QWidget *parent, Oven *oven) :
57 59  
58 60 foreach (QPushButton *button, findChildren<QPushButton *>())
59 61 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
  62 +
  63 + focusTempButtonTimer.setSingleShot(true);
  64 + focusTempButtonTimer.setInterval(3000);
  65 + connect(&focusTempButtonTimer, SIGNAL(timeout()), SLOT(focusTempButton()));
  66 +
  67 + connect(ui->tempSlider, SIGNAL(sliderMoved(int)), &focusTempButtonTimer, SLOT(start()));
  68 +
  69 + ui->background->setFocus();
60 70 }
61 71  
62 72 CooldownPopup::~CooldownPopup()
... ... @@ -64,6 +74,41 @@ CooldownPopup::~CooldownPopup()
64 74 delete ui;
65 75 }
66 76  
  77 +void CooldownPopup::keyPressEvent(QKeyEvent *event)
  78 +{
  79 + switch (event->key())
  80 + {
  81 + case 0x01000030: // Turn left
  82 + onEncoderLeft();
  83 + break;
  84 + case 0x01000031: // Push
  85 + pushed = focusWidget();
  86 + break;
  87 + case 0x01000032: // Turn right
  88 + onEncoderRight();
  89 + break;
  90 + }
  91 +}
  92 +
  93 +void CooldownPopup::keyReleaseEvent(QKeyEvent *event)
  94 +{
  95 + switch (event->key())
  96 + {
  97 + case 0x01000030: // Turn left
  98 + onEncoderLeft();
  99 + break;
  100 + case 0x01000031: // Push
  101 + if (focusWidget() == pushed)
  102 + onEncoderClicked(pushed);
  103 +
  104 + pushed = NULL;
  105 + break;
  106 + case 0x01000032: // Turn right
  107 + onEncoderRight();
  108 + break;
  109 + }
  110 +}
  111 +
67 112 void CooldownPopup::start()
68 113 {
69 114 started = true;
... ... @@ -95,10 +140,8 @@ void CooldownPopup::updateView()
95 140 int temp;
96 141 if (showingCurrentTemp)
97 142 temp = oven->currentTemp();
98   - else if (ui->tempSlider->isSliderDown())
99   - temp = ui->tempSlider->sliderPosition();
100 143 else
101   - temp = ui->tempSlider->value();
  144 + temp = ui->tempSlider->sliderPosition();
102 145  
103 146 ui->tempCurrentLabel->setText(Stringer::temperature(temp, Stringer::fontSize14));
104 147  
... ... @@ -129,11 +172,7 @@ void CooldownPopup::updateView()
129 172 if (lastDisplayedHumidification != oven->humidification())
130 173 {
131 174 lastDisplayedHumidification = oven->humidification();
132   -
133   - if (oven->humidification())
134   - ui->humidificationButton->setStyleSheet("background-image: url(:/images/cooldown/side_nozzle_ov.png);");
135   - else
136   - ui->humidificationButton->setStyleSheet("background-image: url(:/images/cooldown/side_nozzle.png);");
  175 + ui->humidificationButton->setChecked(oven->humidification());
137 176 }
138 177  
139 178 if (started && !oven->door())
... ... @@ -227,3 +266,50 @@ void CooldownPopup::on_humidificationButton_clicked()
227 266 else
228 267 oven->startHumidification();
229 268 }
  269 +
  270 +void CooldownPopup::on_tempButton_clicked()
  271 +{
  272 + ui->tempSlider->setFocus();
  273 + focusTempButtonTimer.start();
  274 +}
  275 +
  276 +void CooldownPopup::focusTempButton()
  277 +{
  278 + if (focusWidget() == ui->tempSlider)
  279 + ui->tempButton->setFocus();
  280 +}
  281 +
  282 +void CooldownPopup::onEncoderLeft()
  283 +{
  284 + QWidget *focused = focusWidget();
  285 + if (focused == ui->background)
  286 + ui->humidificationButton->setFocus();
  287 + else
  288 + focusPreviousChild();
  289 +}
  290 +
  291 +void CooldownPopup::onEncoderRight()
  292 +{
  293 + if (focusWidget() == ui->humidificationButton)
  294 + ui->background->setFocus();
  295 + else
  296 + focusNextChild();
  297 +}
  298 +
  299 +void CooldownPopup::onEncoderClicked(QWidget *clicked)
  300 +{
  301 + if (clicked == ui->background)
  302 + close();
  303 + else if (clicked->inherits("QPushButton"))
  304 + {
  305 + QPushButton *b = qobject_cast<QPushButton *>(clicked);
  306 + if (b)
  307 + b->click();
  308 + }
  309 + else if (clicked->inherits("Slider"))
  310 + {
  311 + Slider *slider = qobject_cast<Slider *>(clicked);
  312 + if (slider == ui->tempSlider)
  313 + ui->tempButton->setFocus();
  314 + }
  315 +}
... ...
app/gui/oven_control/cooldownpopup.h
... ... @@ -18,6 +18,10 @@ public:
18 18 explicit CooldownPopup(QWidget *parent = 0, Oven *oven = 0);
19 19 ~CooldownPopup();
20 20  
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
21 25 private slots:
22 26 void start();
23 27 void stop();
... ... @@ -39,6 +43,10 @@ private slots:
39 43  
40 44 void on_humidificationButton_clicked();
41 45  
  46 + void on_tempButton_clicked();
  47 +
  48 + void focusTempButton();
  49 +
42 50 private:
43 51 Ui::CooldownPopup *ui;
44 52 Oven *oven;
... ... @@ -56,6 +64,13 @@ private:
56 64  
57 65 int lastDisplayedFanLevel;
58 66 bool lastDisplayedHumidification;
  67 +
  68 + QTimer focusTempButtonTimer;
  69 + QWidget *pushed = NULL;
  70 +
  71 + void onEncoderLeft();
  72 + void onEncoderRight();
  73 + void onEncoderClicked(QWidget *clicked);
59 74 };
60 75  
61 76 #endif // COOLDOWNPOPUP_H
... ...
app/gui/oven_control/cooldownpopup.ui
... ... @@ -14,6 +14,7 @@
14 14 <string notr="true">#closeButton { border: none; }
15 15 #closeButton_2 { border: none; }
16 16 #background { background-image: url(:/images/background/popup/373.png); }
  17 +#background:focus { border: 4px solid gray; }
17 18  
18 19 QPushButton {
19 20 background-position: center;
... ... @@ -85,6 +86,9 @@ height: 33px;
85 86 <height>373</height>
86 87 </rect>
87 88 </property>
  89 + <property name="focusPolicy">
  90 + <enum>Qt::TabFocus</enum>
  91 + </property>
88 92 <widget class="QPushButton" name="tempButton">
89 93 <property name="geometry">
90 94 <rect>
... ... @@ -96,7 +100,7 @@ height: 33px;
96 100 </property>
97 101 <property name="styleSheet">
98 102 <string notr="true">QPushButton { image: url(:/images/slider_icon/cooldown.png); }
99   -QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }</string>
  103 +QPushButton::pressed, QPushButton:focus { image: url(:/images/slider_icon/cooldown_ov.png); }</string>
100 104 </property>
101 105 <property name="text">
102 106 <string notr="true"/>
... ... @@ -116,7 +120,7 @@ QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }&lt;/stri
116 120 </property>
117 121 <property name="styleSheet">
118 122 <string notr="true">QPushButton { background-image: url(:/images/cooldown/run.png); }
119   -QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }</string>
  123 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cooldown/run_ov.png); }</string>
120 124 </property>
121 125 <property name="text">
122 126 <string/>
... ... @@ -149,11 +153,15 @@ QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }&lt;/st
149 153 </property>
150 154 <property name="styleSheet">
151 155 <string notr="true">QPushButton { background-image: url(:/images/cooldown/side_nozzle.png); }
152   -QPushButton:pressed { background-image: url(:/images/cooldown/side_nozzle_ov.png); }</string>
  156 +QPushButton:checked { background-image: url(:/images/cooldown/side_nozzle_ov.png); }
  157 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cooldown/side_nozzle_ov.png); }</string>
153 158 </property>
154 159 <property name="text">
155 160 <string/>
156 161 </property>
  162 + <property name="checkable">
  163 + <bool>true</bool>
  164 + </property>
157 165 </widget>
158 166 <widget class="QLabel" name="tempMaxLabel">
159 167 <property name="enabled">
... ...
app/gui/oven_control/coretempsettingpopup.cpp
1 1 #include "coretempsettingpopup.h"
2 2 #include "ui_coretempsettingpopup.h"
3 3  
  4 +#include <QKeyEvent>
  5 +
4 6 #include "config.h"
5 7 #include "soundplayer.h"
6 8 #include "stringer.h"
... ... @@ -77,6 +79,14 @@ CoreTempSettingPopup::CoreTempSettingPopup(QWidget *parent) :
77 79 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
78 80  
79 81 updateView();
  82 +
  83 + ui->background->setFocus();
  84 +
  85 + focusCoreTempButtonTimer.setSingleShot(true);
  86 + focusCoreTempButtonTimer.setInterval(3000);
  87 + connect(&focusCoreTempButtonTimer, SIGNAL(timeout()), SLOT(focusCoreTempButton()));
  88 +
  89 + connect(ui->coreTempSlider, SIGNAL(sliderMoved(int)), &focusCoreTempButtonTimer, SLOT(start()));
80 90 }
81 91  
82 92 CoreTempSettingPopup::~CoreTempSettingPopup()
... ... @@ -84,6 +94,90 @@ CoreTempSettingPopup::~CoreTempSettingPopup()
84 94 delete ui;
85 95 }
86 96  
  97 +void CoreTempSettingPopup::keyPressEvent(QKeyEvent *event)
  98 +{
  99 + switch (event->key())
  100 + {
  101 + case 0x01000030: // Turn left
  102 + onEncoderLeft();
  103 + break;
  104 + case 0x01000031: // Push
  105 + pushed = focusWidget();
  106 + break;
  107 + case 0x01000032: // Turn right
  108 + onEncoderRight();
  109 + break;
  110 + }
  111 +}
  112 +
  113 +void CoreTempSettingPopup::keyReleaseEvent(QKeyEvent *event)
  114 +{
  115 + switch (event->key())
  116 + {
  117 + case 0x01000030: // Turn left
  118 + onEncoderLeft();
  119 + break;
  120 + case 0x01000031: // Push
  121 + if (focusWidget() == pushed)
  122 + onEncoderClicked(pushed);
  123 +
  124 + pushed = NULL;
  125 + break;
  126 + case 0x01000032: // Turn right
  127 + onEncoderRight();
  128 + break;
  129 + }
  130 +}
  131 +
  132 +void CoreTempSettingPopup::onEncoderLeft()
  133 +{
  134 + QWidget *focused = focusWidget();
  135 + if (focused == ui->background)
  136 + ui->applyButton->setFocus();
  137 + else if (focused->inherits("QPushButton"))
  138 + focusPreviousChild();
  139 +}
  140 +
  141 +void CoreTempSettingPopup::onEncoderRight()
  142 +{
  143 + QWidget *focused = focusWidget();
  144 + if (focused == ui->applyButton)
  145 + ui->background->setFocus();
  146 + else if (focused == ui->background || focused->inherits("QPushButton"))
  147 + focusNextChild();
  148 +}
  149 +
  150 +void CoreTempSettingPopup::onEncoderClicked(QWidget *clicked)
  151 +{
  152 + QWidget *focused = clicked;
  153 + if (focused == ui->background)
  154 + close();
  155 + else if (focused->inherits("QPushButton"))
  156 + {
  157 + QPushButton *pb = qobject_cast<QPushButton *>(focused);
  158 + if (pb)
  159 + pb->click();
  160 + }
  161 + else if (focused->inherits("Slider"))
  162 + {
  163 + Slider *slider = qobject_cast<Slider *>(focused);
  164 + if (slider)
  165 + {
  166 + if (slider->value() != slider->sliderPosition())
  167 + slider->setValue(slider->sliderPosition());
  168 +
  169 + if (slider == ui->coreTempSlider)
  170 + ui->coreTempButton->setFocus();
  171 + }
  172 + }
  173 +}
  174 +
  175 +void CoreTempSettingPopup::focusCoreTempButton()
  176 +{
  177 + if (focusWidget() == ui->coreTempSlider)
  178 + ui->coreTempButton->setFocus();
  179 +}
  180 +
87 181 void CoreTempSettingPopup::updateView()
88 182 {
89 183 int coreTemp = ui->coreTempSlider->sliderPosition();
... ... @@ -117,3 +211,9 @@ void CoreTempSettingPopup::on_applyButton_clicked()
117 211 oven->setInterTempEnabled(true);
118 212 close();
119 213 }
  214 +
  215 +void CoreTempSettingPopup::on_coreTempButton_clicked()
  216 +{
  217 + ui->coreTempSlider->setFocus();
  218 + focusCoreTempButtonTimer.start();
  219 +}
... ...
app/gui/oven_control/coretempsettingpopup.h
... ... @@ -2,6 +2,7 @@
2 2 #define CORETEMPSETTINGPOPUP_H
3 3  
4 4 #include <QWidget>
  5 +#include <QTimer>
5 6  
6 7 #include "oven.h"
7 8  
... ... @@ -17,14 +18,28 @@ public:
17 18 explicit CoreTempSettingPopup(QWidget *parent = 0);
18 19 ~CoreTempSettingPopup();
19 20  
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
20 25 private:
21 26 Ui::CoreTempSettingPopup *ui;
22 27 Oven *oven;
23 28  
  29 + QTimer focusCoreTempButtonTimer;
  30 + QWidget *pushed = NULL;
  31 +
  32 + void onEncoderLeft();
  33 + void onEncoderRight();
  34 + void onEncoderClicked(QWidget *clicked);
  35 +
  36 +
24 37 private slots:
25 38 void updateView();
26 39 void on_cancelButton_clicked();
27 40 void on_applyButton_clicked();
  41 + void on_coreTempButton_clicked();
  42 + void focusCoreTempButton();
28 43 };
29 44  
30 45 #endif // CORETEMPSETTINGPOPUP_H
... ...
app/gui/oven_control/coretempsettingpopup.ui
... ... @@ -13,9 +13,15 @@
13 13 <property name="styleSheet">
14 14 <string notr="true">#background {
15 15 background-image: url(:/images/background/manual_core.png);
  16 +background-origin: border;
16 17 margin-top: -720px;
17 18 }
18 19  
  20 +#background:focus {
  21 +border: 4px solid gray;
  22 +border-top: 724px solid gray;
  23 +}
  24 +
19 25 QPushButton[style=&quot;icon&quot;] {
20 26 background-image: url(:/images/slider_icon/background.png);
21 27 background-repeat: no-repeat;
... ... @@ -61,6 +67,9 @@ height: 33px;
61 67 <height>730</height>
62 68 </rect>
63 69 </property>
  70 + <property name="focusPolicy">
  71 + <enum>Qt::TabFocus</enum>
  72 + </property>
64 73 </widget>
65 74 <widget class="QLabel" name="label_2">
66 75 <property name="geometry">
... ... @@ -150,7 +159,7 @@ height: 33px;
150 159 </property>
151 160 <property name="styleSheet">
152 161 <string notr="true">QPushButton { background-image: url(:/images/manual_button/ok.png); }
153   -QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); }</string>
  162 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/ok_ov.png); }</string>
154 163 </property>
155 164 <property name="text">
156 165 <string>확인/적용하기</string>
... ... @@ -437,7 +446,8 @@ QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); }
437 446 </property>
438 447 <property name="styleSheet">
439 448 <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp_enabled.png); }
440   -QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
  449 +QPushButton:checked { image: url(:/images/slider_icon/core_temp_ov.png); }
  450 +QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
441 451 </property>
442 452 <property name="style" stdset="0">
443 453 <string>icon</string>
... ... @@ -657,7 +667,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri
657 667 </property>
658 668 <property name="styleSheet">
659 669 <string notr="true">QPushButton { background-image: url(:/images/manual_button/back.png); }
660   -QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png); }</string>
  670 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/back_ov.png); }</string>
661 671 </property>
662 672 <property name="text">
663 673 <string>이전으로</string>
... ... @@ -1004,6 +1014,9 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
1004 1014 <height>140</height>
1005 1015 </rect>
1006 1016 </property>
  1017 + <property name="focusPolicy">
  1018 + <enum>Qt::ClickFocus</enum>
  1019 + </property>
1007 1020 </widget>
1008 1021 </widget>
1009 1022 <customwidgets>
... ... @@ -1014,6 +1027,12 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
1014 1027 <container>1</container>
1015 1028 </customwidget>
1016 1029 </customwidgets>
  1030 + <tabstops>
  1031 + <tabstop>background</tabstop>
  1032 + <tabstop>coreTempButton</tabstop>
  1033 + <tabstop>cancelButton</tabstop>
  1034 + <tabstop>applyButton</tabstop>
  1035 + </tabstops>
1017 1036 <resources>
1018 1037 <include location="resources.qrc"/>
1019 1038 </resources>
... ...
app/gui/oven_control/manualcookwindow.cpp
... ... @@ -125,6 +125,27 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
125 125 showCurrentTempTimer.setInterval(1000);
126 126 connect(&showCurrentTempTimer, SIGNAL(timeout()), SLOT(showCurrentTemp()));
127 127  
  128 + focusHumidityButtonTimer.setSingleShot(true);
  129 + focusHumidityButtonTimer.setInterval(3000);
  130 + connect(&focusHumidityButtonTimer, SIGNAL(timeout()), SLOT(focusHumidityButton()));
  131 +
  132 + focusTempButtonTimer.setSingleShot(true);
  133 + focusTempButtonTimer.setInterval(3000);
  134 + connect(&focusTempButtonTimer, SIGNAL(timeout()), SLOT(focusTempButton()));
  135 +
  136 + focusTimeButtonTimer.setSingleShot(true);
  137 + focusTimeButtonTimer.setInterval(3000);
  138 + connect(&focusTimeButtonTimer, SIGNAL(timeout()), SLOT(focusTimeButton()));
  139 +
  140 + focusInterTempButtonTimer.setSingleShot(true);
  141 + focusInterTempButtonTimer.setInterval(3000);
  142 + connect(&focusInterTempButtonTimer, SIGNAL(timeout()), SLOT(focusInterTempButton()));
  143 +
  144 + connect(ui->humiditySlider, SIGNAL(sliderMoved(int)), &focusHumidityButtonTimer, SLOT(start()));
  145 + connect(ui->tempSlider, SIGNAL(sliderMoved(int)), &focusTempButtonTimer, SLOT(start()));
  146 + connect(ui->timeSlider, SIGNAL(sliderMoved(int)), &focusTimeButtonTimer, SLOT(start()));
  147 + connect(ui->interTempSlider, SIGNAL(sliderMoved(int)), &focusInterTempButtonTimer, SLOT(start()));
  148 +
128 149 connect(oven, SIGNAL(changed(Oven*)), this, SLOT(onOvenUpdated(Oven*)));
129 150 oven->setDefault(mode);
130 151  
... ... @@ -135,6 +156,8 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
135 156 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
136 157  
137 158 QTimer::singleShot(0, this, SLOT(setupAnimation()));
  159 +
  160 + setFocus();
138 161 }
139 162  
140 163 ManualCookWindow::ManualCookWindow(QWidget *parent, ManualCookSetting setting)
... ... @@ -159,6 +182,55 @@ ManualCookWindow::~ManualCookWindow()
159 182 delete ui;
160 183 }
161 184  
  185 +void ManualCookWindow::keyPressEvent(QKeyEvent *event)
  186 +{
  187 + switch (event->key())
  188 + {
  189 + case 0x01000030: // Turn left
  190 + onEncoderLeft();
  191 + break;
  192 + case 0x01000031: // Push
  193 + if (focusWidget() != this)
  194 + {
  195 + pushed = focusWidget();
  196 +
  197 + if (pushed == ui->humidityButton)
  198 + on_humidityButton_pressed();
  199 + else if (pushed == ui->tempButton)
  200 + on_tempButton_pressed();
  201 +
  202 + }
  203 + break;
  204 + case 0x01000032: // Turn right
  205 + onEncoderRight();
  206 + break;
  207 + }
  208 +}
  209 +
  210 +void ManualCookWindow::keyReleaseEvent(QKeyEvent *event)
  211 +{
  212 + switch (event->key())
  213 + {
  214 + case 0x01000030: // Turn left
  215 + onEncoderLeft();
  216 + break;
  217 + case 0x01000031: // Push
  218 + if (focusWidget() == ui->humidityButton)
  219 + on_humidityButton_released();
  220 + else if (focusWidget() == ui->tempButton)
  221 + on_tempButton_released();
  222 +
  223 + if (focusWidget() == pushed)
  224 + onEncoderClicked(pushed);
  225 +
  226 + pushed = NULL;
  227 + break;
  228 + case 0x01000032: // Turn right
  229 + onEncoderRight();
  230 + break;
  231 + }
  232 +}
  233 +
162 234 void ManualCookWindow::setupAnimation()
163 235 {
164 236 ui->openDoorAnimation->load(":/images/animation/door_big_09.png");
... ... @@ -178,16 +250,28 @@ void ManualCookWindow::updateView()
178 250 switch (oven->mode())
179 251 {
180 252 case Define::DryMode:
  253 + if (ui->steamButton->isChecked())
  254 + ui->steamButton->setChecked(false);
  255 + if (ui->combiButton->isChecked())
  256 + ui->combiButton->setChecked(false);
181 257 if (!ui->dryheatButton->isChecked())
182 258 ui->dryheatButton->setChecked(true);
183 259 break;
184 260 case Define::SteamMode:
185 261 if (!ui->steamButton->isChecked())
186 262 ui->steamButton->setChecked(true);
  263 + if (ui->combiButton->isChecked())
  264 + ui->combiButton->setChecked(false);
  265 + if (ui->dryheatButton->isChecked())
  266 + ui->dryheatButton->setChecked(false);
187 267 break;
188 268 case Define::CombiMode:
  269 + if (ui->steamButton->isChecked())
  270 + ui->steamButton->setChecked(false);
189 271 if (!ui->combiButton->isChecked())
190 272 ui->combiButton->setChecked(true);
  273 + if (ui->dryheatButton->isChecked())
  274 + ui->dryheatButton->setChecked(false);
191 275 break;
192 276 default:
193 277 break;
... ... @@ -196,7 +280,7 @@ void ManualCookWindow::updateView()
196 280 int humidity;
197 281 if (showCurrentHumidity_)
198 282 humidity = oven->currentHumidity();
199   - else if (ui->humiditySlider->isSliderDown())
  283 + else if (ui->humiditySlider->isSliderDown() || focusWidget() == ui->humiditySlider)
200 284 humidity = ui->humiditySlider->sliderPosition();
201 285 else
202 286 humidity = oven->humidity();
... ... @@ -217,7 +301,7 @@ void ManualCookWindow::updateView()
217 301 int temp;
218 302 if (showCurrentTemp_)
219 303 temp = oven->currentTemp();
220   - else if (ui->tempSlider->isSliderDown())
  304 + else if (ui->tempSlider->isSliderDown() || focusWidget() == ui->tempSlider)
221 305 temp = ui->tempSlider->sliderPosition();
222 306 else
223 307 temp = oven->temp();
... ... @@ -235,25 +319,21 @@ void ManualCookWindow::updateView()
235 319 ui->tempSlider->setValue(temp);
236 320 ui->tempSlider->blockSignals(old);
237 321  
238   - int msecs;
239   - if (ui->timeSlider->isSliderDown())
240   - msecs = sliderToTime(ui->timeSlider->sliderPosition()) * 1000;
  322 + int msecs = oven->msecs();
  323 + if (ui->timeSlider->isSliderMoved())
  324 + ui->timeLabel->setText(Stringer::remainingTime(sliderToTime(ui->timeSlider->sliderPosition()) * 1000, Stringer::fontSize14));
241 325 else
242   - msecs = oven->msecs();
  326 + ui->timeLabel->setText(Stringer::remainingTime(msecs, Stringer::fontSize14));
243 327  
244   - if (msecs != lastViewTime)
  328 + if (focusWidget() != ui->timeSlider)
245 329 {
246   - lastViewTime = msecs;
247   -
248 330 bool old = ui->timeSlider->blockSignals(true);
249 331 ui->timeSlider->setSliderPosition(timeToSlider(msecs / 1000));
250 332 ui->timeSlider->blockSignals(old);
251   -
252   - ui->timeLabel->setText(Stringer::remainingTime(msecs, Stringer::fontSize14));
253 333 }
254 334  
255 335 int interTemp;
256   - if (ui->interTempSlider->isSliderDown())
  336 + if (ui->interTempSlider->isSliderDown() || focusWidget() == ui->interTempSlider)
257 337 interTemp = ui->interTempSlider->sliderPosition();
258 338 else
259 339 interTemp = oven->interTemp();
... ... @@ -264,23 +344,7 @@ void ManualCookWindow::updateView()
264 344 if (interTempEnabled != lastViewInterTempEnabled)
265 345 {
266 346 lastViewInterTempEnabled = oven->interTempEnabled();
267   -
268   - if (interTempEnabled)
269   - ui->interTempButton->setStyleSheet("\
270   -QPushButton {\
271   - image: url(:/images/slider_icon/core_temp_enabled.png);\
272   -}\
273   -QPushButton:pressed {\
274   - image: url(:/images/slider_icon/core_temp_ov.png);\
275   -}");
276   - else
277   - ui->interTempButton->setStyleSheet("\
278   -QPushButton {\
279   - image: url(:/images/slider_icon/core_temp.png);\
280   -}\
281   -QPushButton:pressed {\
282   - image: url(:/images/slider_icon/core_temp_ov.png);\
283   -}");
  347 + ui->interTempButton->setChecked(interTempEnabled);
284 348 }
285 349  
286 350 lastViewInterTemp = interTemp;
... ... @@ -312,32 +376,70 @@ QPushButton:pressed {\
312 376 "border-image: url(:/images/manual_button/run.png)");
313 377 }
314 378  
315   - bool damper = oven->damper();
316   - if (damper != lastViewDamper)
  379 + if (showFrontButtons)
317 380 {
318   - lastViewDamper = damper;
319   -
320   - if (damper)
321   - ui->damperButton->setStyleSheet(
322   - "background-image: url(:/images/manual_button/damper_open.png)");
  381 + ui->preheatButton->show();
  382 + ui->damperButton->show();
  383 + ui->humidificationButton->show();
  384 + if (oven->cooking())
  385 + ui->repeatButton->show();
323 386 else
324   - ui->damperButton->setStyleSheet(
325   - "background-image: url(:/images/manual_button/damper_close.png)");
326   - }
  387 + ui->repeatButton->hide();
327 388  
328   - bool humidification = oven->humidification();
329   - if (humidification != lastViewHumidification)
  389 + ui->cooldownButton->hide();
  390 + ui->fanButton->hide();
  391 + ui->reserveButton->hide();
  392 + ui->favoriteButton->hide();
  393 + }
  394 + else
330 395 {
331   - lastViewHumidification = humidification;
  396 + ui->preheatButton->hide();
  397 + ui->damperButton->hide();
  398 + ui->humidificationButton->hide();
  399 + ui->repeatButton->hide();
332 400  
333   - if (humidification)
334   - ui->humidificationButton->setStyleSheet(
335   - "background-image: url(:/images/manual_button/side_nozzle_open.png)");
  401 + ui->cooldownButton->show();
  402 + ui->fanButton->show();
  403 + if (oven->cooking())
  404 + {
  405 + ui->reserveButton->hide();
  406 + ui->favoriteButton->hide();
  407 + }
336 408 else
337   - ui->humidificationButton->setStyleSheet(
338   - "background-image: url(:/images/manual_button/side_nozzle_close.png)");
  409 + {
  410 + ui->reserveButton->show();
  411 + ui->favoriteButton->show();
  412 + }
339 413 }
340 414  
  415 + bool damper = oven->damper();
  416 + ui->damperButton->setChecked(damper);
  417 +// if (damper != lastViewDamper)
  418 +// {
  419 +// lastViewDamper = damper;
  420 +
  421 +// if (damper)
  422 +// ui->damperButton->setStyleSheet(
  423 +// "background-image: url(:/images/manual_button/damper_open.png)");
  424 +// else
  425 +// ui->damperButton->setStyleSheet(
  426 +// "background-image: url(:/images/manual_button/damper_close.png)");
  427 +// }
  428 +
  429 + bool humidification = oven->humidification();
  430 + ui->humidificationButton->setChecked(humidification);
  431 +// if (humidification != lastViewHumidification)
  432 +// {
  433 +// lastViewHumidification = humidification;
  434 +
  435 +// if (humidification)
  436 +// ui->humidificationButton->setStyleSheet(
  437 +// "background-image: url(:/images/manual_button/side_nozzle_open.png)");
  438 +// else
  439 +// ui->humidificationButton->setStyleSheet(
  440 +// "background-image: url(:/images/manual_button/side_nozzle_close.png)");
  441 +// }
  442 +
341 443 int fan = oven->fan();
342 444 if (fan != lastViewFan)
343 445 {
... ... @@ -376,20 +478,6 @@ QPushButton:pressed {\
376 478 ui->upperStack->setCurrentIndex(1);
377 479 else
378 480 ui->upperStack->setCurrentIndex(0);
379   -
380   - if (oven->cooking())
381   - {
382   - ui->reserveButton->hide();
383   - ui->favoriteButton->hide();
384   - ui->repeatButton->show();
385   - }
386   - else
387   - {
388   - ui->reserveButton->show();
389   - ui->favoriteButton->show();
390   - ui->repeatButton->hide();
391   - }
392   -
393 481 }
394 482  
395 483 void ManualCookWindow::showCurrentHumidity()
... ... @@ -588,6 +676,159 @@ void ManualCookWindow::onMonitor3Timeout()
588 676 close();
589 677 }
590 678  
  679 +void ManualCookWindow::onEncoderLeft()
  680 +{
  681 + QWidget *focused = focusWidget();
  682 + if (focused == NULL)
  683 + focusPreviousChild();
  684 + else if (focused == this || focused->inherits("QPushButton"))
  685 + {
  686 + focusPreviousChild();
  687 + focused = focusWidget();
  688 +
  689 + if (focused == ui->steamButton)
  690 + {
  691 + if (oven->mode() == Define::SteamMode)
  692 + focusPreviousChild();
  693 + }
  694 + else if (focused == ui->combiButton)
  695 + {
  696 + if (oven->mode() == Define::CombiMode)
  697 + focusPreviousChild();
  698 + }
  699 + else if (focused == ui->dryheatButton)
  700 + {
  701 + if (oven->mode() == Define::DryMode)
  702 + focusPreviousChild();
  703 + }
  704 + }
  705 +}
  706 +
  707 +void ManualCookWindow::onEncoderRight()
  708 +{
  709 + QWidget *focused = focusWidget();
  710 + if (focused == NULL)
  711 + focusNextChild();
  712 + else if (focused == this)
  713 + {
  714 + switch (oven->mode())
  715 + {
  716 + case Define::DryMode:
  717 + case Define::SteamMode:
  718 + ui->tempButton->setFocus();
  719 + break;
  720 + default:
  721 + ui->humidityButton->setFocus();
  722 + }
  723 + }
  724 + else if (focused->inherits("QPushButton"))
  725 + {
  726 + focusNextChild();
  727 + focused = focusWidget();
  728 +
  729 + if (focused == ui->steamButton)
  730 + {
  731 + if (oven->mode() == Define::SteamMode)
  732 + focusNextChild();
  733 + }
  734 + else if (focused == ui->combiButton)
  735 + {
  736 + if (oven->mode() == Define::CombiMode)
  737 + focusNextChild();
  738 + }
  739 + else if (focused == ui->dryheatButton)
  740 + {
  741 + if (oven->mode() == Define::DryMode)
  742 + focusNextChild();
  743 + }
  744 + }
  745 +}
  746 +
  747 +void ManualCookWindow::onEncoderClicked(QWidget *clicked)
  748 +{
  749 + QWidget *focused = clicked;
  750 + if (focused == NULL)
  751 + return;
  752 +
  753 + if (focused->inherits("QPushButton"))
  754 + {
  755 + QPushButton *pb = qobject_cast<QPushButton *>(focused);
  756 + if (pb)
  757 + {
  758 + pb->click();
  759 +
  760 + if (pb == ui->steamButton || pb == ui->dryheatButton)
  761 + ui->tempButton->setFocus();
  762 + else if (pb == ui->combiButton)
  763 + ui->humidityButton->setFocus();
  764 + }
  765 + }
  766 + else if (focused->inherits("Slider"))
  767 + {
  768 + Slider *slider = qobject_cast<Slider *>(focused);
  769 + if (slider)
  770 + {
  771 + if (slider->value() != slider->sliderPosition())
  772 + slider->setValue(slider->sliderPosition());
  773 +
  774 + if (slider == ui->humiditySlider)
  775 + ui->humidityButton->setFocus();
  776 + else if (slider == ui->tempSlider)
  777 + ui->tempButton->setFocus();
  778 + else if (slider == ui->timeSlider)
  779 + ui->timeButton->setFocus();
  780 + else if (slider == ui->interTempSlider)
  781 + ui->interTempButton->setFocus();
  782 + }
  783 + }
  784 +}
  785 +
  786 +void ManualCookWindow::focusHumidityButton()
  787 +{
  788 + if (focusWidget() == ui->humiditySlider)
  789 + {
  790 + oven->setHumidity(ui->humiditySlider->value());
  791 + ui->humidityButton->setFocus();
  792 + }
  793 +}
  794 +
  795 +void ManualCookWindow::focusTempButton()
  796 +{
  797 + if (focusWidget() == ui->tempSlider)
  798 + {
  799 + oven->setTemp(ui->tempSlider->value());
  800 + ui->tempButton->setFocus();
  801 + }
  802 +}
  803 +
  804 +void ManualCookWindow::focusTimeButton()
  805 +{
  806 + if (focusWidget() == ui->timeSlider)
  807 + {
  808 + if (ui->timeSlider->isSliderMoved())
  809 + oven->setTime(sliderToTime(ui->timeSlider->value()));
  810 + ui->timeButton->setFocus();
  811 + }
  812 +}
  813 +
  814 +void ManualCookWindow::focusInterTempButton()
  815 +{
  816 + if (focusWidget() == ui->interTempSlider)
  817 + {
  818 + oven->setInterTemp(ui->interTempSlider->value());
  819 + ui->interTempButton->setFocus();
  820 + }
  821 +}
  822 +
  823 +void ManualCookWindow::focusAgain()
  824 +{
  825 + if (focused)
  826 + {
  827 + focused->setFocus();
  828 + focused = NULL;
  829 + }
  830 +}
  831 +
591 832 void ManualCookWindow::on_steamButton_clicked()
592 833 {
593 834 setOvenDefault(Define::SteamMode);
... ... @@ -629,6 +870,27 @@ void ManualCookWindow::on_tempButton_released()
629 870 hideCurrentTemp();
630 871 }
631 872  
  873 +void ManualCookWindow::on_humidityButton_clicked()
  874 +{
  875 + ui->humiditySlider->setFocus();
  876 +
  877 + focusHumidityButtonTimer.start();
  878 +}
  879 +
  880 +void ManualCookWindow::on_tempButton_clicked()
  881 +{
  882 + ui->tempSlider->setFocus();
  883 +
  884 + focusTempButtonTimer.start();
  885 +}
  886 +
  887 +void ManualCookWindow::on_timeButton_clicked()
  888 +{
  889 + ui->timeSlider->setFocus();
  890 +
  891 + focusTimeButtonTimer.start();
  892 +}
  893 +
632 894 void ManualCookWindow::on_interTempButton_clicked()
633 895 {
634 896 if (oven->interTempEnabled())
... ... @@ -637,6 +899,9 @@ void ManualCookWindow::on_interTempButton_clicked()
637 899 {
638 900 CoreTempSettingPopup *p = new CoreTempSettingPopup(this);
639 901 p->show();
  902 +
  903 + focused = ui->interTempButton;
  904 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
640 905 }
641 906 }
642 907  
... ... @@ -664,6 +929,9 @@ void ManualCookWindow::on_preheatButton_clicked()
664 929 PreheatPopup *p = new PreheatPopup(this, oven);
665 930 p->setWindowModality(Qt::WindowModal);
666 931 p->showFullScreen();
  932 +
  933 + focused = ui->preheatButton;
  934 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
667 935 }
668 936  
669 937 void ManualCookWindow::on_damperButton_clicked()
... ... @@ -713,6 +981,9 @@ void ManualCookWindow::on_cooldownButton_clicked()
713 981 CooldownPopup *p = new CooldownPopup(this, oven);
714 982 p->setWindowModality(Qt::WindowModal);
715 983 p->showFullScreen();
  984 +
  985 + focused = ui->cooldownButton;
  986 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
716 987 }
717 988  
718 989 void ManualCookWindow::on_reserveButton_clicked()
... ... @@ -725,6 +996,9 @@ void ManualCookWindow::on_reserveButton_clicked()
725 996 connect(p, SIGNAL(timeout()), SLOT(start()));
726 997 connect(p, SIGNAL(canceled()), &startCookingTimer, SLOT(start()));
727 998 p->showFullScreen();
  999 +
  1000 + focused = ui->reserveButton;
  1001 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
728 1002 }
729 1003 }
730 1004  
... ... @@ -736,6 +1010,8 @@ void ManualCookWindow::on_favoriteButton_clicked()
736 1010 ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
737 1011 p->showFullScreen();
738 1012  
  1013 + focused = ui->favoriteButton;
  1014 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
739 1015 connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
740 1016  
741 1017 if (startCookingTimer.isActive())
... ... @@ -745,14 +1021,11 @@ void ManualCookWindow::on_favoriteButton_clicked()
745 1021 }
746 1022 }
747 1023  
748   -void ManualCookWindow::on_goBackStackButton_clicked()
749   -{
750   - ui->buttonStack->setCurrentIndex(1);
751   -}
752   -
753 1024 void ManualCookWindow::on_goFrontStackButton_clicked()
754 1025 {
755   - ui->buttonStack->setCurrentIndex(0);
  1026 + showFrontButtons = !showFrontButtons;
  1027 +
  1028 + updateView();
756 1029 }
757 1030  
758 1031 void ManualCookWindow::on_backButton_clicked()
... ... @@ -769,6 +1042,9 @@ void ManualCookWindow::on_configButton_clicked()
769 1042 p->showFullScreen();
770 1043  
771 1044 connect(p, SIGNAL(accepted()), SLOT(jumpConfig()));
  1045 +
  1046 + focused = ui->configButton;
  1047 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
772 1048 }
773 1049 else
774 1050 {
... ... @@ -789,6 +1065,9 @@ void ManualCookWindow::on_favoritesButton_clicked()
789 1065 p->showFullScreen();
790 1066  
791 1067 connect(p, SIGNAL(accepted()), SLOT(jumpFavorites()));
  1068 +
  1069 + focused = ui->favoritesButton;
  1070 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
792 1071 }
793 1072 else
794 1073 {
... ... @@ -810,6 +1089,9 @@ void ManualCookWindow::on_washButton_clicked()
810 1089 p->showFullScreen();
811 1090  
812 1091 connect(p, SIGNAL(accepted()), SLOT(jumpWash()));
  1092 +
  1093 + focused = ui->washButton;
  1094 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
813 1095 }
814 1096 else
815 1097 {
... ... @@ -844,8 +1126,8 @@ int ManualCookWindow::sliderToTime(int value)
844 1126 int ManualCookWindow::timeToSlider(int secs)
845 1127 {
846 1128 if (secs <= 180 * 60)
847   - return secs / 60;
  1129 + return qCeil((qreal) secs / 60);
848 1130 if (secs <= 360 * 60)
849   - return 180 + (secs - 180 * 60) / 2 / 60;
850   - return 270 + (secs - 360 * 60) / 15 / 60;
  1131 + return 180 + qCeil((qreal) (secs - 180 * 60) / 2 / 60);
  1132 + return 270 + qCeil((qreal) (secs - 360 * 60) / 15 / 60);
851 1133 }
... ...
app/gui/oven_control/manualcookwindow.h
... ... @@ -2,6 +2,7 @@
2 2 #define MANUALCOOKWINDOW_H
3 3  
4 4 #include <QMainWindow>
  5 +#include <QKeyEvent>
5 6  
6 7 #include "oven.h"
7 8 #include "udphandler.h"
... ... @@ -20,6 +21,10 @@ public:
20 21 explicit ManualCookWindow(QWidget *parent, ManualCookSetting setting);
21 22 ~ManualCookWindow();
22 23  
  24 +protected:
  25 + void keyPressEvent(QKeyEvent *event);
  26 + void keyReleaseEvent(QKeyEvent *event);
  27 +
23 28 signals:
24 29 void cookStopRequested();
25 30  
... ... @@ -47,6 +52,16 @@ private slots:
47 52 void onMonitor2Timeout();
48 53 void onMonitor3Timeout();
49 54  
  55 + void onEncoderLeft();
  56 + void onEncoderRight();
  57 + void onEncoderClicked(QWidget *clicked);
  58 +
  59 + void focusHumidityButton();
  60 + void focusTempButton();
  61 + void focusTimeButton();
  62 + void focusInterTempButton();
  63 + void focusAgain();
  64 +
50 65 void on_steamButton_clicked();
51 66 void on_combiButton_clicked();
52 67 void on_dryheatButton_clicked();
... ... @@ -55,6 +70,10 @@ private slots:
55 70 void on_humidityButton_released();
56 71 void on_tempButton_pressed();
57 72 void on_tempButton_released();
  73 +
  74 + void on_humidityButton_clicked();
  75 + void on_tempButton_clicked();
  76 + void on_timeButton_clicked();
58 77 void on_interTempButton_clicked();
59 78  
60 79 void on_runStopButton_clicked();
... ... @@ -66,7 +85,6 @@ private slots:
66 85 void on_cooldownButton_clicked();
67 86 void on_reserveButton_clicked();
68 87 void on_favoriteButton_clicked();
69   - void on_goBackStackButton_clicked();
70 88 void on_goFrontStackButton_clicked();
71 89  
72 90 void on_backButton_clicked();
... ... @@ -77,6 +95,8 @@ private slots:
77 95  
78 96 void on_timeSlider_valueChanged();
79 97  
  98 +
  99 +
80 100 private:
81 101 Ui::ManualCookWindow *ui;
82 102 Oven *oven;
... ... @@ -105,6 +125,8 @@ private:
105 125 bool lastViewHumidification;
106 126 int lastViewFan;
107 127  
  128 + bool showFrontButtons = true;
  129 +
108 130 int monitorLevel;
109 131 QTimer monitor1;
110 132 QTimer monitor2;
... ... @@ -117,6 +139,14 @@ private:
117 139  
118 140 int sliderToTime(int value);
119 141 int timeToSlider(int secs);
  142 +
  143 + QWidget *pushed = NULL;
  144 + QWidget *focused = NULL;
  145 +
  146 + QTimer focusHumidityButtonTimer;
  147 + QTimer focusTempButtonTimer;
  148 + QTimer focusTimeButtonTimer;
  149 + QTimer focusInterTempButtonTimer;
120 150 };
121 151  
122 152 #endif // MANUALCOOKWINDOW_H
... ...
app/gui/oven_control/manualcookwindow.ui
... ... @@ -41,6 +41,12 @@ background-position: center;
41 41 border: none;
42 42 }
43 43  
  44 +QPushButton[style=&quot;tool&quot;] {
  45 +border: none;
  46 +background-repeat: no-repeat;
  47 +background-position: center;
  48 +}
  49 +
44 50 QSlider::groove {
45 51 background-image: url(:/images/slider/groove_ticks.png);
46 52 background-repeat: no-repeat;
... ... @@ -133,8 +139,8 @@ height: 33px;
133 139 </property>
134 140 <property name="styleSheet">
135 141 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_combi_hide.png); }
136   -QPushButton:pressed { background-image: url(:/images/cook_mode/big_combi_ov.png); }
137   -QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }</string>
  142 +QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
  143 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_combi_ov.png); }</string>
138 144 </property>
139 145 <property name="text">
140 146 <string>콤비</string>
... ... @@ -143,7 +149,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
143 149 <bool>true</bool>
144 150 </property>
145 151 <property name="autoExclusive">
146   - <bool>true</bool>
  152 + <bool>false</bool>
147 153 </property>
148 154 <property name="style" stdset="0">
149 155 <string notr="true">mode</string>
... ... @@ -160,8 +166,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
160 166 </property>
161 167 <property name="styleSheet">
162 168 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_steam_hide.png); }
163   -QPushButton:pressed { background-image: url(:/images/cook_mode/big_steam_ov.png); }
164   -QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }</string>
  169 +QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
  170 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_steam_ov.png); }</string>
165 171 </property>
166 172 <property name="text">
167 173 <string>스팀</string>
... ... @@ -170,7 +176,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
170 176 <bool>true</bool>
171 177 </property>
172 178 <property name="autoExclusive">
173   - <bool>true</bool>
  179 + <bool>false</bool>
174 180 </property>
175 181 <property name="style" stdset="0">
176 182 <string notr="true">mode</string>
... ... @@ -187,8 +193,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
187 193 </property>
188 194 <property name="styleSheet">
189 195 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_dryheat_hide.png); }
190   -QPushButton:pressed { background-image: url(:/images/cook_mode/big_dryheat_ov.png); }
191   -QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); }</string>
  196 +QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); }
  197 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/cook_mode/big_dryheat_ov.png); }</string>
192 198 </property>
193 199 <property name="text">
194 200 <string>건열</string>
... ... @@ -197,7 +203,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
197 203 <bool>true</bool>
198 204 </property>
199 205 <property name="autoExclusive">
200   - <bool>true</bool>
  206 + <bool>false</bool>
201 207 </property>
202 208 <property name="style" stdset="0">
203 209 <string notr="true">mode</string>
... ... @@ -223,7 +229,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
223 229 </property>
224 230 <property name="styleSheet">
225 231 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
226   -QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
  232 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
227 233 </property>
228 234 <property name="text">
229 235 <string/>
... ... @@ -240,7 +246,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str
240 246 </property>
241 247 <property name="styleSheet">
242 248 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
243   -QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
  249 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
244 250 </property>
245 251 <property name="text">
246 252 <string/>
... ... @@ -257,7 +263,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s
257 263 </property>
258 264 <property name="styleSheet">
259 265 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites_manual.png); }
260   -QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov.png); }</string>
  266 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/favorites_manual_ov.png); }</string>
261 267 </property>
262 268 <property name="text">
263 269 <string/>
... ... @@ -274,7 +280,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov.
274 280 </property>
275 281 <property name="styleSheet">
276 282 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); }
277   -QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
  283 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/wash_ov.png); }</string>
278 284 </property>
279 285 <property name="text">
280 286 <string/>
... ... @@ -291,7 +297,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }&lt;/str
291 297 </property>
292 298 <property name="styleSheet">
293 299 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
294   -QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
  300 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
295 301 </property>
296 302 <property name="text">
297 303 <string/>
... ... @@ -497,7 +503,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str
497 503 </property>
498 504 <property name="styleSheet">
499 505 <string notr="true">QPushButton { image: url(:/images/slider_icon/temp.png); }
500   -QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }</string>
  506 +QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/temp_ov.png); }</string>
501 507 </property>
502 508 <property name="style" stdset="0">
503 509 <string notr="true">icon</string>
... ... @@ -631,248 +637,6 @@ QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }&lt;/string&gt;
631 637 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
632 638 </property>
633 639 </widget>
634   - <widget class="QStackedWidget" name="buttonStack">
635   - <property name="geometry">
636   - <rect>
637   - <x>337</x>
638   - <y>1319</y>
639   - <width>563</width>
640   - <height>131</height>
641   - </rect>
642   - </property>
643   - <property name="styleSheet">
644   - <string notr="true">QPushButton {
645   -background-repeat: no-repeat;
646   -background-position: center;
647   -border: none;
648   -}</string>
649   - </property>
650   - <property name="currentIndex">
651   - <number>0</number>
652   - </property>
653   - <widget class="QWidget" name="frontButtonStack">
654   - <widget class="QPushButton" name="goBackStackButton">
655   - <property name="geometry">
656   - <rect>
657   - <x>448</x>
658   - <y>0</y>
659   - <width>112</width>
660   - <height>131</height>
661   - </rect>
662   - </property>
663   - <property name="styleSheet">
664   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
665   -QPushButton:pressed { background-image: url(:/images/manual_button/next_ov.png); }</string>
666   - </property>
667   - </widget>
668   - <widget class="QWidget" name="sysLine_7" native="true">
669   - <property name="geometry">
670   - <rect>
671   - <x>336</x>
672   - <y>36</y>
673   - <width>2</width>
674   - <height>58</height>
675   - </rect>
676   - </property>
677   - <property name="styleSheet">
678   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
679   - </property>
680   - </widget>
681   - <widget class="QPushButton" name="humidificationButton">
682   - <property name="geometry">
683   - <rect>
684   - <x>224</x>
685   - <y>0</y>
686   - <width>112</width>
687   - <height>131</height>
688   - </rect>
689   - </property>
690   - <property name="styleSheet">
691   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/side_nozzle_close.png); }</string>
692   - </property>
693   - </widget>
694   - <widget class="QWidget" name="sysLine_8" native="true">
695   - <property name="geometry">
696   - <rect>
697   - <x>224</x>
698   - <y>36</y>
699   - <width>2</width>
700   - <height>58</height>
701   - </rect>
702   - </property>
703   - <property name="styleSheet">
704   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
705   - </property>
706   - </widget>
707   - <widget class="QPushButton" name="preheatButton">
708   - <property name="geometry">
709   - <rect>
710   - <x>0</x>
711   - <y>0</y>
712   - <width>112</width>
713   - <height>131</height>
714   - </rect>
715   - </property>
716   - <property name="styleSheet">
717   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/preheat.png); }
718   -QPushButton:pressed { background-image: url(:/images/manual_button/preheat_ov.png); }</string>
719   - </property>
720   - </widget>
721   - <widget class="QPushButton" name="repeatButton">
722   - <property name="geometry">
723   - <rect>
724   - <x>336</x>
725   - <y>0</y>
726   - <width>112</width>
727   - <height>131</height>
728   - </rect>
729   - </property>
730   - <property name="styleSheet">
731   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/repeat.png); }
732   -QPushButton:pressed { background-image: url(:/images/manual_button/repeat_ov.png); }</string>
733   - </property>
734   - </widget>
735   - <widget class="QWidget" name="sysLine_9" native="true">
736   - <property name="geometry">
737   - <rect>
738   - <x>112</x>
739   - <y>36</y>
740   - <width>2</width>
741   - <height>58</height>
742   - </rect>
743   - </property>
744   - <property name="styleSheet">
745   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
746   - </property>
747   - </widget>
748   - <widget class="QPushButton" name="damperButton">
749   - <property name="geometry">
750   - <rect>
751   - <x>112</x>
752   - <y>0</y>
753   - <width>112</width>
754   - <height>131</height>
755   - </rect>
756   - </property>
757   - <property name="styleSheet">
758   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/damper_close.png); }</string>
759   - </property>
760   - </widget>
761   - </widget>
762   - <widget class="QWidget" name="backButtonStack">
763   - <widget class="QPushButton" name="goFrontStackButton">
764   - <property name="geometry">
765   - <rect>
766   - <x>448</x>
767   - <y>0</y>
768   - <width>112</width>
769   - <height>131</height>
770   - </rect>
771   - </property>
772   - <property name="styleSheet">
773   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
774   -QPushButton:pressed { background-image: url(:/images/manual_button/next_ov.png); }</string>
775   - </property>
776   - </widget>
777   - <widget class="QWidget" name="sysLine_10" native="true">
778   - <property name="geometry">
779   - <rect>
780   - <x>112</x>
781   - <y>36</y>
782   - <width>2</width>
783   - <height>58</height>
784   - </rect>
785   - </property>
786   - <property name="styleSheet">
787   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
788   - </property>
789   - </widget>
790   - <widget class="QPushButton" name="reserveButton">
791   - <property name="geometry">
792   - <rect>
793   - <x>224</x>
794   - <y>0</y>
795   - <width>112</width>
796   - <height>131</height>
797   - </rect>
798   - </property>
799   - <property name="styleSheet">
800   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/reserve.png); }
801   -QPushButton:pressed { background-image: url(:/images/manual_button/reserve_ov.png); }</string>
802   - </property>
803   - </widget>
804   - <widget class="QWidget" name="sysLine_11" native="true">
805   - <property name="geometry">
806   - <rect>
807   - <x>224</x>
808   - <y>36</y>
809   - <width>2</width>
810   - <height>58</height>
811   - </rect>
812   - </property>
813   - <property name="styleSheet">
814   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
815   - </property>
816   - </widget>
817   - <widget class="QPushButton" name="cooldownButton">
818   - <property name="geometry">
819   - <rect>
820   - <x>0</x>
821   - <y>0</y>
822   - <width>112</width>
823   - <height>131</height>
824   - </rect>
825   - </property>
826   - <property name="styleSheet">
827   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/cooldown.png); }
828   -QPushButton:pressed { background-image: url(:/images/manual_button/cooldown_ov.png); }</string>
829   - </property>
830   - <property name="checkable">
831   - <bool>true</bool>
832   - </property>
833   - </widget>
834   - <widget class="QPushButton" name="favoriteButton">
835   - <property name="geometry">
836   - <rect>
837   - <x>336</x>
838   - <y>0</y>
839   - <width>112</width>
840   - <height>131</height>
841   - </rect>
842   - </property>
843   - <property name="styleSheet">
844   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/favorites.png); }
845   -QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov.png); }</string>
846   - </property>
847   - </widget>
848   - <widget class="QWidget" name="sysLine_12" native="true">
849   - <property name="geometry">
850   - <rect>
851   - <x>336</x>
852   - <y>36</y>
853   - <width>2</width>
854   - <height>58</height>
855   - </rect>
856   - </property>
857   - <property name="styleSheet">
858   - <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
859   - </property>
860   - </widget>
861   - <widget class="QPushButton" name="fanButton">
862   - <property name="geometry">
863   - <rect>
864   - <x>112</x>
865   - <y>0</y>
866   - <width>112</width>
867   - <height>131</height>
868   - </rect>
869   - </property>
870   - <property name="styleSheet">
871   - <string notr="true">QPushButton { background-image: url(:/images/manual_button/fan_4.png); }</string>
872   - </property>
873   - </widget>
874   - </widget>
875   - </widget>
876 640 <widget class="QLabel" name="steamLabel_4">
877 641 <property name="enabled">
878 642 <bool>true</bool>
... ... @@ -946,7 +710,11 @@ QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov.
946 710 </property>
947 711 <property name="styleSheet">
948 712 <string notr="true">QPushButton { image: url(:/images/slider_icon/humidity.png); }
949   -QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }</string>
  713 +QPushButton:checked { image: url(:/images/slider_icon/humidity_ov.png); }
  714 +QPushButton:pressed, QPushButton:focus { border: 2px dotted white; border-radius: 70px; }</string>
  715 + </property>
  716 + <property name="checkable">
  717 + <bool>true</bool>
950 718 </property>
951 719 <property name="style" stdset="0">
952 720 <string notr="true">icon</string>
... ... @@ -963,7 +731,11 @@ QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }&lt;/strin
963 731 </property>
964 732 <property name="styleSheet">
965 733 <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp.png); }
966   -QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
  734 +QPushButton:checked { image: url(:/images/slider_icon/core_temp_enabled.png); }
  735 +QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/core_temp_ov.png); }</string>
  736 + </property>
  737 + <property name="checkable">
  738 + <bool>true</bool>
967 739 </property>
968 740 <property name="style" stdset="0">
969 741 <string notr="true">icon</string>
... ... @@ -980,7 +752,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri
980 752 </property>
981 753 <property name="styleSheet">
982 754 <string notr="true">QPushButton { image: url(:/images/slider_icon/time.png); }
983   -QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }</string>
  755 +QPushButton:pressed, QPushButton:focus { image: url(:/images/slider_icon/time_ov.png); }</string>
984 756 </property>
985 757 <property name="style" stdset="0">
986 758 <string notr="true">icon</string>
... ... @@ -1132,42 +904,288 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt;
1132 904 <property name="geometry">
1133 905 <rect>
1134 906 <x>185</x>
1135   - <y>875</y>
  907 + <y>915</y>
1136 908 <width>666</width>
1137   - <height>140</height>
  909 + <height>60</height>
1138 910 </rect>
1139 911 </property>
  912 + <property name="focusPolicy">
  913 + <enum>Qt::ClickFocus</enum>
  914 + </property>
1140 915 </widget>
1141 916 <widget class="Slider" name="humiditySlider" native="true">
1142 917 <property name="geometry">
1143 918 <rect>
1144 919 <x>185</x>
1145   - <y>725</y>
  920 + <y>765</y>
1146 921 <width>666</width>
1147   - <height>140</height>
  922 + <height>60</height>
1148 923 </rect>
1149 924 </property>
  925 + <property name="focusPolicy">
  926 + <enum>Qt::ClickFocus</enum>
  927 + </property>
1150 928 </widget>
1151 929 <widget class="Slider" name="timeSlider" native="true">
1152 930 <property name="geometry">
1153 931 <rect>
1154 932 <x>185</x>
1155   - <y>1025</y>
  933 + <y>1065</y>
1156 934 <width>666</width>
1157   - <height>140</height>
  935 + <height>60</height>
1158 936 </rect>
1159 937 </property>
  938 + <property name="focusPolicy">
  939 + <enum>Qt::ClickFocus</enum>
  940 + </property>
1160 941 </widget>
1161 942 <widget class="Slider" name="interTempSlider" native="true">
1162 943 <property name="geometry">
1163 944 <rect>
1164 945 <x>185</x>
1165   - <y>1175</y>
  946 + <y>1215</y>
1166 947 <width>666</width>
1167   - <height>140</height>
  948 + <height>60</height>
  949 + </rect>
  950 + </property>
  951 + <property name="focusPolicy">
  952 + <enum>Qt::ClickFocus</enum>
  953 + </property>
  954 + </widget>
  955 + <widget class="QPushButton" name="cooldownButton">
  956 + <property name="geometry">
  957 + <rect>
  958 + <x>337</x>
  959 + <y>1319</y>
  960 + <width>112</width>
  961 + <height>131</height>
  962 + </rect>
  963 + </property>
  964 + <property name="styleSheet">
  965 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/cooldown.png); }
  966 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/cooldown_ov.png); }</string>
  967 + </property>
  968 + <property name="checkable">
  969 + <bool>true</bool>
  970 + </property>
  971 + <property name="style" stdset="0">
  972 + <string>tool</string>
  973 + </property>
  974 + </widget>
  975 + <widget class="QPushButton" name="goFrontStackButton">
  976 + <property name="geometry">
  977 + <rect>
  978 + <x>785</x>
  979 + <y>1319</y>
  980 + <width>112</width>
  981 + <height>131</height>
  982 + </rect>
  983 + </property>
  984 + <property name="styleSheet">
  985 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/next.png); }
  986 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/next_ov.png); }</string>
  987 + </property>
  988 + <property name="style" stdset="0">
  989 + <string>tool</string>
  990 + </property>
  991 + </widget>
  992 + <widget class="QPushButton" name="favoriteButton">
  993 + <property name="geometry">
  994 + <rect>
  995 + <x>673</x>
  996 + <y>1319</y>
  997 + <width>112</width>
  998 + <height>131</height>
  999 + </rect>
  1000 + </property>
  1001 + <property name="styleSheet">
  1002 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/favorites.png); }
  1003 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/favorites_ov.png); }</string>
  1004 + </property>
  1005 + <property name="style" stdset="0">
  1006 + <string>tool</string>
  1007 + </property>
  1008 + </widget>
  1009 + <widget class="QPushButton" name="reserveButton">
  1010 + <property name="geometry">
  1011 + <rect>
  1012 + <x>561</x>
  1013 + <y>1319</y>
  1014 + <width>112</width>
  1015 + <height>131</height>
1168 1016 </rect>
1169 1017 </property>
  1018 + <property name="styleSheet">
  1019 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/reserve.png); }
  1020 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/reserve_ov.png); }</string>
  1021 + </property>
  1022 + <property name="style" stdset="0">
  1023 + <string>tool</string>
  1024 + </property>
  1025 + </widget>
  1026 + <widget class="QPushButton" name="fanButton">
  1027 + <property name="geometry">
  1028 + <rect>
  1029 + <x>449</x>
  1030 + <y>1319</y>
  1031 + <width>112</width>
  1032 + <height>131</height>
  1033 + </rect>
  1034 + </property>
  1035 + <property name="styleSheet">
  1036 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/fan_4.png); }</string>
  1037 + </property>
  1038 + <property name="style" stdset="0">
  1039 + <string>tool</string>
  1040 + </property>
  1041 + </widget>
  1042 + <widget class="QWidget" name="sysLine_8" native="true">
  1043 + <property name="geometry">
  1044 + <rect>
  1045 + <x>561</x>
  1046 + <y>1355</y>
  1047 + <width>2</width>
  1048 + <height>58</height>
  1049 + </rect>
  1050 + </property>
  1051 + <property name="styleSheet">
  1052 + <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
  1053 + </property>
  1054 + </widget>
  1055 + <widget class="QWidget" name="sysLine_7" native="true">
  1056 + <property name="geometry">
  1057 + <rect>
  1058 + <x>673</x>
  1059 + <y>1355</y>
  1060 + <width>2</width>
  1061 + <height>58</height>
  1062 + </rect>
  1063 + </property>
  1064 + <property name="styleSheet">
  1065 + <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
  1066 + </property>
  1067 + </widget>
  1068 + <widget class="QPushButton" name="damperButton">
  1069 + <property name="geometry">
  1070 + <rect>
  1071 + <x>449</x>
  1072 + <y>1319</y>
  1073 + <width>112</width>
  1074 + <height>131</height>
  1075 + </rect>
  1076 + </property>
  1077 + <property name="styleSheet">
  1078 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/damper_close.png); }
  1079 +QPushButton:checked, QPushButton:focus { background-image: url(:/images/manual_button/damper_open.png); }</string>
  1080 + </property>
  1081 + <property name="checkable">
  1082 + <bool>true</bool>
  1083 + </property>
  1084 + <property name="style" stdset="0">
  1085 + <string>tool</string>
  1086 + </property>
  1087 + </widget>
  1088 + <widget class="QPushButton" name="repeatButton">
  1089 + <property name="geometry">
  1090 + <rect>
  1091 + <x>673</x>
  1092 + <y>1319</y>
  1093 + <width>112</width>
  1094 + <height>131</height>
  1095 + </rect>
  1096 + </property>
  1097 + <property name="styleSheet">
  1098 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/repeat.png); }
  1099 +QPushButton:pressed { background-image: url(:/images/manual_button/repeat_ov.png); }</string>
  1100 + </property>
  1101 + <property name="style" stdset="0">
  1102 + <string>tool</string>
  1103 + </property>
  1104 + </widget>
  1105 + <widget class="QPushButton" name="preheatButton">
  1106 + <property name="geometry">
  1107 + <rect>
  1108 + <x>337</x>
  1109 + <y>1319</y>
  1110 + <width>112</width>
  1111 + <height>131</height>
  1112 + </rect>
  1113 + </property>
  1114 + <property name="styleSheet">
  1115 + <string notr="true">QPushButton { background-image: url(:/images/manual_button/preheat.png); }
  1116 +QPushButton:pressed, QPushButton:focus { background-image: url(:/images/manual_button/preheat_ov.png); }</string>
  1117 + </property>
  1118 + <property name="style" stdset="0">
  1119 + <string>tool</string>
  1120 + </property>
  1121 + </widget>
  1122 + <widget class="QPushButton" name="humidificationButton">
  1123 + <property name="geometry">
  1124 + <rect>
  1125 + <x>561</x>
  1126 + <y>1319</y>
  1127 + <width>112</width>
  1128 + <height>131</height>
  1129 + </rect>
  1130 + </property>
  1131 + <property name="styleSheet">
  1132 + <string notr="true">QPushButton, QPushButton:checked:pressed { background-image: url(:/images/manual_button/side_nozzle_close.png); }
  1133 +QPushButton:checked, QPushButton:focus, QPushButton:pressed { background-image: url(:/images/manual_button/side_nozzle_open.png); }</string>
  1134 + </property>
  1135 + <property name="checkable">
  1136 + <bool>true</bool>
  1137 + </property>
  1138 + <property name="style" stdset="0">
  1139 + <string>tool</string>
  1140 + </property>
  1141 + </widget>
  1142 + <widget class="QWidget" name="sysLine_9" native="true">
  1143 + <property name="geometry">
  1144 + <rect>
  1145 + <x>449</x>
  1146 + <y>1355</y>
  1147 + <width>2</width>
  1148 + <height>58</height>
  1149 + </rect>
  1150 + </property>
  1151 + <property name="styleSheet">
  1152 + <string notr="true">background-image: url(:/images/line/manual_button.png);</string>
  1153 + </property>
1170 1154 </widget>
  1155 + <zorder>goFrontStackButton</zorder>
  1156 + <zorder>fanButton</zorder>
  1157 + <zorder>reserveButton</zorder>
  1158 + <zorder>favoriteButton</zorder>
  1159 + <zorder>cooldownButton</zorder>
  1160 + <zorder>preheatButton</zorder>
  1161 + <zorder>damperButton</zorder>
  1162 + <zorder>repeatButton</zorder>
  1163 + <zorder>humidificationButton</zorder>
  1164 + <zorder>upperStack</zorder>
  1165 + <zorder>combiButton</zorder>
  1166 + <zorder>steamButton</zorder>
  1167 + <zorder>dryheatButton</zorder>
  1168 + <zorder>bottomBar</zorder>
  1169 + <zorder>steamLabel_3</zorder>
  1170 + <zorder>steamLabel_2</zorder>
  1171 + <zorder>timeLabel</zorder>
  1172 + <zorder>tempButton</zorder>
  1173 + <zorder>tempLabel</zorder>
  1174 + <zorder>humidityLabel</zorder>
  1175 + <zorder>steamLabel_4</zorder>
  1176 + <zorder>humidityButton</zorder>
  1177 + <zorder>interTempButton</zorder>
  1178 + <zorder>timeButton</zorder>
  1179 + <zorder>interTempLabel</zorder>
  1180 + <zorder>steamLabel_5</zorder>
  1181 + <zorder>runStopButton</zorder>
  1182 + <zorder>tempSlider</zorder>
  1183 + <zorder>humiditySlider</zorder>
  1184 + <zorder>timeSlider</zorder>
  1185 + <zorder>interTempSlider</zorder>
  1186 + <zorder>sysLine_8</zorder>
  1187 + <zorder>sysLine_7</zorder>
  1188 + <zorder>sysLine_9</zorder>
1171 1189 </widget>
1172 1190 </widget>
1173 1191 <customwidgets>
... ... @@ -1194,6 +1212,30 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt;
1194 1212 <container>1</container>
1195 1213 </customwidget>
1196 1214 </customwidgets>
  1215 + <tabstops>
  1216 + <tabstop>steamButton</tabstop>
  1217 + <tabstop>combiButton</tabstop>
  1218 + <tabstop>dryheatButton</tabstop>
  1219 + <tabstop>humidityButton</tabstop>
  1220 + <tabstop>tempButton</tabstop>
  1221 + <tabstop>timeButton</tabstop>
  1222 + <tabstop>interTempButton</tabstop>
  1223 + <tabstop>runStopButton</tabstop>
  1224 + <tabstop>preheatButton</tabstop>
  1225 + <tabstop>cooldownButton</tabstop>
  1226 + <tabstop>damperButton</tabstop>
  1227 + <tabstop>fanButton</tabstop>
  1228 + <tabstop>humidificationButton</tabstop>
  1229 + <tabstop>reserveButton</tabstop>
  1230 + <tabstop>repeatButton</tabstop>
  1231 + <tabstop>favoriteButton</tabstop>
  1232 + <tabstop>goFrontStackButton</tabstop>
  1233 + <tabstop>backButton</tabstop>
  1234 + <tabstop>configButton</tabstop>
  1235 + <tabstop>favoritesButton</tabstop>
  1236 + <tabstop>washButton</tabstop>
  1237 + <tabstop>helpButton</tabstop>
  1238 + </tabstops>
1197 1239 <resources>
1198 1240 <include location="resources.qrc"/>
1199 1241 </resources>
... ...
app/gui/oven_control/preheatpopup.cpp
1 1 #include "preheatpopup.h"
2 2 #include "ui_preheatpopup.h"
3 3  
  4 +#include <QKeyEvent>
  5 +
4 6 #include "stringer.h"
5 7  
6 8 PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
... ... @@ -28,9 +30,13 @@ PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
28 30 ui->preheatGauge->setMinimum(oven->currentTemp());
29 31 ui->preheatGauge->setValue(oven->currentTemp());
30 32  
  33 + ui->infoButton->hide();
  34 +
31 35 updateView();
32 36  
33 37 start();
  38 +
  39 + ui->background->setFocus();
34 40 }
35 41  
36 42 PreheatPopup::~PreheatPopup()
... ... @@ -38,6 +44,21 @@ PreheatPopup::~PreheatPopup()
38 44 delete ui;
39 45 }
40 46  
  47 +void PreheatPopup::keyReleaseEvent(QKeyEvent *event)
  48 +{
  49 + switch (event->key())
  50 + {
  51 + case 0x01000030: // Turn left
  52 + break;
  53 + case 0x01000031: // Push
  54 + stop();
  55 + close();
  56 + break;
  57 + case 0x01000032: // Turn right
  58 + break;
  59 + }
  60 +}
  61 +
41 62 void PreheatPopup::updateView()
42 63 {
43 64 ui->timeLabel->setText(Stringer::remainingTime(oven->msecs(), Stringer::fontSize14));
... ...
app/gui/oven_control/preheatpopup.h
... ... @@ -18,6 +18,9 @@ public:
18 18 explicit PreheatPopup(QWidget *parent = 0, Oven *oven = 0);
19 19 ~PreheatPopup();
20 20  
  21 +protected:
  22 + void keyReleaseEvent(QKeyEvent *event);
  23 +
21 24 private slots:
22 25 void updateView();
23 26 void start();
... ...
app/gui/oven_control/preheatpopup.ui
... ... @@ -13,7 +13,10 @@
13 13 <property name="styleSheet">
14 14 <string notr="true">#closeButton { border: none; }
15 15 #closeButton_2 { border: none; }
16   -#background { background-image: url(:/images/background/popup/696.png); }</string>
  16 +#background { background-image: url(:/images/background/popup/696.png); }
  17 +
  18 +
  19 +QWidget#background:focus { border: 4px solid gray; }</string>
17 20 </property>
18 21 <widget class="QPushButton" name="closeButton">
19 22 <property name="geometry">
... ... @@ -24,6 +27,9 @@
24 27 <height>426</height>
25 28 </rect>
26 29 </property>
  30 + <property name="focusPolicy">
  31 + <enum>Qt::NoFocus</enum>
  32 + </property>
27 33 <property name="text">
28 34 <string/>
29 35 </property>
... ... @@ -37,6 +43,9 @@
37 43 <height>696</height>
38 44 </rect>
39 45 </property>
  46 + <property name="focusPolicy">
  47 + <enum>Qt::TabFocus</enum>
  48 + </property>
40 49 <widget class="QLabel" name="humidityLabel">
41 50 <property name="geometry">
42 51 <rect>
... ... @@ -378,6 +387,9 @@
378 387 <height>290</height>
379 388 </rect>
380 389 </property>
  390 + <property name="focusPolicy">
  391 + <enum>Qt::NoFocus</enum>
  392 + </property>
381 393 <property name="styleSheet">
382 394 <string notr="true">border: #000000</string>
383 395 </property>
... ... @@ -659,6 +671,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
659 671 <height>290</height>
660 672 </rect>
661 673 </property>
  674 + <property name="focusPolicy">
  675 + <enum>Qt::NoFocus</enum>
  676 + </property>
662 677 <property name="styleSheet">
663 678 <string notr="true">border: #000000</string>
664 679 </property>
... ... @@ -789,6 +804,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
789 804 <height>478</height>
790 805 </rect>
791 806 </property>
  807 + <property name="focusPolicy">
  808 + <enum>Qt::NoFocus</enum>
  809 + </property>
792 810 <property name="text">
793 811 <string/>
794 812 </property>
... ... @@ -814,6 +832,13 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
814 832 <container>1</container>
815 833 </customwidget>
816 834 </customwidgets>
  835 + <tabstops>
  836 + <tabstop>background</tabstop>
  837 + <tabstop>infoButton</tabstop>
  838 + <tabstop>humidityGaugeButton</tabstop>
  839 + <tabstop>selectCookButton_2</tabstop>
  840 + <tabstop>heatGaugeButton</tabstop>
  841 + </tabstops>
817 842 <resources>
818 843 <include location="resources.qrc"/>
819 844 </resources>
... ...
app/gui/oven_control/slider.cpp
... ... @@ -8,6 +8,7 @@ Slider::Slider(QWidget *parent) : QWidget(parent),
8 8 isSliderDown_(false),
9 9 sliderPosition_(0), value_(0), minimum_(0), maximum_(1),
10 10 subVisible_(true),
  11 + focused(false), isSliderMoved_(false),
11 12 tickInterval(0), bigTickInterval(0)
12 13 {
13 14 groove.load(":/images/slider/groove.png");
... ... @@ -95,16 +96,76 @@ int Slider::sliderPosition()
95 96  
96 97 void Slider::setSliderPosition(int value)
97 98 {
  99 + value = qBound(minimum_, value, maximum_);
  100 +
98 101 if (sliderPosition_ == value)
99 102 return;
100 103  
101 104 sliderPosition_ = value;
  105 + if (focused)
  106 + isSliderMoved_ = true;
102 107  
103 108 emit sliderMoved(value);
104 109  
105 110 update();
106 111 }
107 112  
  113 +bool Slider::isSliderMoved()
  114 +{
  115 + return isSliderMoved_;
  116 +}
  117 +
  118 +void Slider::focusInEvent(QFocusEvent */*event*/)
  119 +{
  120 + focused = true;
  121 +}
  122 +
  123 +void Slider::focusOutEvent(QFocusEvent *event)
  124 +{
  125 + QWidget::focusOutEvent(event);
  126 +
  127 + focused = false;
  128 +
  129 + if (isSliderMoved_)
  130 + {
  131 + isSliderMoved_ = false;
  132 + value_ = sliderPosition_;
  133 + emit valueChanged(value_);
  134 + }
  135 +}
  136 +
  137 +void Slider::keyPressEvent(QKeyEvent *event)
  138 +{
  139 + switch (event->key())
  140 + {
  141 + case 0x01000030: // Turn left
  142 + decrease();
  143 + break;
  144 + case 0x01000031: // Push
  145 + event->ignore();
  146 + break;
  147 + case 0x01000032: // Turn right
  148 + increase();
  149 + break;
  150 + }
  151 +}
  152 +
  153 +void Slider::keyReleaseEvent(QKeyEvent *event)
  154 +{
  155 + switch (event->key())
  156 + {
  157 + case 0x01000030: // Turn left
  158 + decrease();
  159 + break;
  160 + case 0x01000031: // Push
  161 + event->ignore();
  162 + break;
  163 + case 0x01000032: // Turn right
  164 + increase();
  165 + break;
  166 + }
  167 +}
  168 +
108 169 void Slider::mouseMoveEvent(QMouseEvent *event)
109 170 {
110 171 if (!isSliderDown_)
... ... @@ -124,12 +185,7 @@ void Slider::mouseReleaseEvent(QMouseEvent */*event*/)
124 185 {
125 186 isSliderDown_ = false;
126 187  
127   - if (sliderPosition_ == value_)
128   - return;
129   -
130 188 emit sliderReleased();
131   -
132   - setValue(sliderPosition_);
133 189 }
134 190  
135 191 void Slider::paintEvent(QPaintEvent */*event*/)
... ... @@ -206,6 +262,7 @@ void Slider::updatePixmapPosition()
206 262  
207 263 void Slider::setValue(int value)
208 264 {
  265 + value = qBound(minimum_, value, maximum_);
209 266 if (value == value_)
210 267 return;
211 268  
... ... @@ -215,3 +272,13 @@ void Slider::setValue(int value)
215 272  
216 273 emit valueChanged(value);
217 274 }
  275 +
  276 +void Slider::increase()
  277 +{
  278 + setSliderPosition(sliderPosition_ + 1);
  279 +}
  280 +
  281 +void Slider::decrease()
  282 +{
  283 + setSliderPosition(sliderPosition_ - 1);
  284 +}
... ...
app/gui/oven_control/slider.h
... ... @@ -25,6 +25,8 @@ class Slider : public QWidget
25 25 QPoint subPoint;
26 26  
27 27 bool subVisible_;
  28 + bool focused;
  29 + bool isSliderMoved_;
28 30  
29 31 public:
30 32 explicit Slider(QWidget *parent = 0);
... ... @@ -44,6 +46,7 @@ public:
44 46 bool isSliderDown();
45 47 int sliderPosition();
46 48 void setSliderPosition(int value);
  49 + bool isSliderMoved();
47 50  
48 51 QList<int> ticks;
49 52 QList<int> bigTicks;
... ... @@ -52,6 +55,10 @@ public:
52 55 int bigTickInterval;
53 56  
54 57 protected:
  58 + virtual void focusInEvent(QFocusEvent *event);
  59 + virtual void focusOutEvent(QFocusEvent *event);
  60 + virtual void keyPressEvent(QKeyEvent *event);
  61 + virtual void keyReleaseEvent(QKeyEvent *event);
55 62 virtual void mouseMoveEvent(QMouseEvent *event);
56 63 virtual void mousePressEvent(QMouseEvent *event);
57 64 virtual void mouseReleaseEvent(QMouseEvent *event);
... ... @@ -71,7 +78,8 @@ signals:
71 78  
72 79 public slots:
73 80 void setValue(int value);
74   -
  81 + void increase();
  82 + void decrease();
75 83 };
76 84  
77 85 #endif // SLIDER_H
... ...
app/gui/oven_control/washwindow.cpp
... ... @@ -2,6 +2,7 @@
2 2 #include "ui_washwindow.h"
3 3  
4 4 #include <QSignalMapper>
  5 +#include <QKeyEvent>
5 6  
6 7 #include "soundplayer.h"
7 8 #include "dirtylevel.h"
... ... @@ -53,6 +54,8 @@ WashWindow::WashWindow(QWidget *parent) :
53 54 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
54 55  
55 56 updateGauge();
  57 +
  58 + setFocus();
56 59 }
57 60  
58 61 WashWindow::~WashWindow()
... ... @@ -60,6 +63,41 @@ WashWindow::~WashWindow()
60 63 delete ui;
61 64 }
62 65  
  66 +void WashWindow::keyPressEvent(QKeyEvent *event)
  67 +{
  68 + switch (event->key())
  69 + {
  70 + case 0x01000030: // Turn left
  71 + onEncoderLeft();
  72 + break;
  73 + case 0x01000031: // Push
  74 + pushed = focusWidget();
  75 + break;
  76 + case 0x01000032: // Turn right
  77 + onEncoderRight();
  78 + break;
  79 + }
  80 +}
  81 +
  82 +void WashWindow::keyReleaseEvent(QKeyEvent *event)
  83 +{
  84 + switch (event->key())
  85 + {
  86 + case 0x01000030: // Turn left
  87 + onEncoderLeft();
  88 + break;
  89 + case 0x01000031: // Push
  90 + if (focusWidget() == pushed)
  91 + onEncoderClicked(pushed);
  92 +
  93 + pushed = NULL;
  94 + break;
  95 + case 0x01000032: // Turn right
  96 + onEncoderRight();
  97 + break;
  98 + }
  99 +}
  100 +
63 101 void WashWindow::start(int type)
64 102 {
65 103 if (selected)
... ... @@ -273,3 +311,20 @@ void WashWindow::on_helpButton_clicked()
273 311 {
274 312  
275 313 }
  314 +
  315 +void WashWindow::onEncoderLeft()
  316 +{
  317 + focusPreviousChild();
  318 +}
  319 +
  320 +void WashWindow::onEncoderRight()
  321 +{
  322 + focusNextChild();
  323 +}
  324 +
  325 +void WashWindow::onEncoderClicked(QWidget *clicked)
  326 +{
  327 + QPushButton *b = qobject_cast<QPushButton *>(clicked);
  328 + if (b)
  329 + b->click();
  330 +}
... ...
app/gui/oven_control/washwindow.h
... ... @@ -18,16 +18,20 @@ public:
18 18 explicit WashWindow(QWidget *parent = 0);
19 19 ~WashWindow();
20 20  
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
21 25 private slots:
22 26 void start(int type);
23 27 void stop();
24 28 void returnToClock();
25 29 void updateGauge();
  30 +
26 31 void onChanged();
27   - void on_backButton_clicked();
28 32  
  33 + void on_backButton_clicked();
29 34 void on_configButton_clicked();
30   -
31 35 void on_helpButton_clicked();
32 36  
33 37 private:
... ... @@ -42,6 +46,12 @@ private:
42 46 int type;
43 47  
44 48 QTimer returnToClockTimer;
  49 +
  50 + QWidget *pushed = NULL;
  51 +
  52 + void onEncoderLeft();
  53 + void onEncoderRight();
  54 + void onEncoderClicked(QWidget *clicked);
45 55 };
46 56  
47 57 #endif // WASHWINDOW_H
... ...
app/gui/oven_control/washwindow.ui
... ... @@ -482,7 +482,7 @@ border: none;
482 482 </property>
483 483 <property name="styleSheet">
484 484 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); }
485   -QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
  485 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/back_ov.png); }</string>
486 486 </property>
487 487 <property name="text">
488 488 <string/>
... ... @@ -505,7 +505,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str
505 505 </property>
506 506 <property name="styleSheet">
507 507 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); }
508   -QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
  508 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/config_ov.png); }</string>
509 509 </property>
510 510 <property name="text">
511 511 <string/>
... ... @@ -528,7 +528,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s
528 528 </property>
529 529 <property name="styleSheet">
530 530 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); }
531   -QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
  531 +QPushButton:pressed, QPushButton:focus { border-image: url(:/images/bottom_bar/help_ov.png); }</string>
532 532 </property>
533 533 <property name="text">
534 534 <string/>
... ... @@ -545,11 +545,11 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str
545 545 </rect>
546 546 </property>
547 547 <property name="focusPolicy">
548   - <enum>Qt::NoFocus</enum>
  548 + <enum>Qt::StrongFocus</enum>
549 549 </property>
550 550 <property name="styleSheet">
551 551 <string notr="true">QPushButton { background-image: url(:/images/wash/button_1.png); }
552   -QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }</string>
  552 +QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_1_ov.png); }</string>
553 553 </property>
554 554 <property name="text">
555 555 <string>세제 없이 헹굼</string>
... ... @@ -568,11 +568,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }&lt;/
568 568 </rect>
569 569 </property>
570 570 <property name="focusPolicy">
571   - <enum>Qt::NoFocus</enum>
  571 + <enum>Qt::StrongFocus</enum>
572 572 </property>
573 573 <property name="styleSheet">
574 574 <string notr="true">QPushButton { background-image: url(:/images/wash/button_2.png); }
575   -QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }</string>
  575 +QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_2_ov.png); }</string>
576 576 </property>
577 577 <property name="text">
578 578 <string>간이 세척</string>
... ... @@ -591,11 +591,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }&lt;/
591 591 </rect>
592 592 </property>
593 593 <property name="focusPolicy">
594   - <enum>Qt::NoFocus</enum>
  594 + <enum>Qt::StrongFocus</enum>
595 595 </property>
596 596 <property name="styleSheet">
597 597 <string notr="true">QPushButton { background-image: url(:/images/wash/button_3.png); }
598   -QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }</string>
  598 +QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_3_ov.png); }</string>
599 599 </property>
600 600 <property name="text">
601 601 <string>표준 세척</string>
... ... @@ -614,11 +614,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }&lt;/
614 614 </rect>
615 615 </property>
616 616 <property name="focusPolicy">
617   - <enum>Qt::NoFocus</enum>
  617 + <enum>Qt::StrongFocus</enum>
618 618 </property>
619 619 <property name="styleSheet">
620 620 <string notr="true">QPushButton { background-image: url(:/images/wash/button_4.png); }
621   -QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }</string>
  621 +QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_4_ov.png); }</string>
622 622 </property>
623 623 <property name="text">
624 624 <string>강 세척</string>
... ... @@ -637,11 +637,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }&lt;/
637 637 </rect>
638 638 </property>
639 639 <property name="focusPolicy">
640   - <enum>Qt::NoFocus</enum>
  640 + <enum>Qt::StrongFocus</enum>
641 641 </property>
642 642 <property name="styleSheet">
643 643 <string notr="true">QPushButton { background-image: url(:/images/wash/button_5.png); }
644   -QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }</string>
  644 +QPushButton::pressed, QPushButton:focus { background-image: url(:/images/wash/button_5_ov.png); }</string>
645 645 </property>
646 646 <property name="text">
647 647 <string>고속 세척</string>
... ... @@ -721,6 +721,9 @@ QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }&lt;/
721 721 <height>140</height>
722 722 </rect>
723 723 </property>
  724 + <property name="focusPolicy">
  725 + <enum>Qt::NoFocus</enum>
  726 + </property>
724 727 <property name="styleSheet">
725 728 <string notr="true">QPushButton { image: url(:/images/slider_icon/management.png); }
726 729 QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }</string>
... ... @@ -870,6 +873,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }&lt;/str
870 873 <height>33</height>
871 874 </rect>
872 875 </property>
  876 + <property name="focusPolicy">
  877 + <enum>Qt::NoFocus</enum>
  878 + </property>
873 879 <property name="maximum">
874 880 <number>5</number>
875 881 </property>
... ... @@ -960,6 +966,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }&lt;/str
960 966 <height>140</height>
961 967 </rect>
962 968 </property>
  969 + <property name="focusPolicy">
  970 + <enum>Qt::NoFocus</enum>
  971 + </property>
963 972 <property name="styleSheet">
964 973 <string notr="true">QPushButton { image: url(:/images/slider_icon/clean.png); }
965 974 QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }</string>
... ... @@ -1109,6 +1118,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }&lt;/string&gt;
1109 1118 <height>33</height>
1110 1119 </rect>
1111 1120 </property>
  1121 + <property name="focusPolicy">
  1122 + <enum>Qt::NoFocus</enum>
  1123 + </property>
1112 1124 <property name="maximum">
1113 1125 <number>5</number>
1114 1126 </property>
... ... @@ -1180,6 +1192,16 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }&lt;/string&gt;
1180 1192 <container>1</container>
1181 1193 </customwidget>
1182 1194 </customwidgets>
  1195 + <tabstops>
  1196 + <tabstop>washButton_1</tabstop>
  1197 + <tabstop>washButton_2</tabstop>
  1198 + <tabstop>washButton_3</tabstop>
  1199 + <tabstop>washButton_4</tabstop>
  1200 + <tabstop>washButton_5</tabstop>
  1201 + <tabstop>backButton</tabstop>
  1202 + <tabstop>configButton</tabstop>
  1203 + <tabstop>helpButton</tabstop>
  1204 + </tabstops>
1183 1205 <resources>
1184 1206 <include location="resources.qrc"/>
1185 1207 </resources>
... ...