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 #include "confirmpopup.h" 1 #include "confirmpopup.h"
2 #include "ui_confirmpopup.h" 2 #include "ui_confirmpopup.h"
3 3
  4 +#include <QKeyEvent>
  5 +
4 #include "soundplayer.h" 6 #include "soundplayer.h"
5 7
6 ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) : 8 ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
@@ -12,6 +14,8 @@ ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) : @@ -12,6 +14,8 @@ ConfirmPopup::ConfirmPopup(QWidget *parent, QString text) :
12 14
13 foreach (QPushButton *button, findChildren<QPushButton *>()) 15 foreach (QPushButton *button, findChildren<QPushButton *>())
14 connect(button, &QPushButton::pressed, SoundPlayer::playClick); 16 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
  17 +
  18 + setFocus();
15 } 19 }
16 20
17 ConfirmPopup::~ConfirmPopup() 21 ConfirmPopup::~ConfirmPopup()
@@ -19,6 +23,41 @@ ConfirmPopup::~ConfirmPopup() @@ -19,6 +23,41 @@ ConfirmPopup::~ConfirmPopup()
19 delete ui; 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 void ConfirmPopup::on_okButton_clicked() 61 void ConfirmPopup::on_okButton_clicked()
23 { 62 {
24 deleteLater(); 63 deleteLater();
@@ -30,3 +69,28 @@ void ConfirmPopup::on_cancelButton_clicked() @@ -30,3 +69,28 @@ void ConfirmPopup::on_cancelButton_clicked()
30 deleteLater(); 69 deleteLater();
31 emit rejected(); 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,6 +19,10 @@ public:
19 explicit ConfirmPopup(QWidget *parent, QString text); 19 explicit ConfirmPopup(QWidget *parent, QString text);
20 ~ConfirmPopup(); 20 ~ConfirmPopup();
21 21
  22 +protected:
  23 + void keyPressEvent(QKeyEvent *event);
  24 + void keyReleaseEvent(QKeyEvent *event);
  25 +
22 private slots: 26 private slots:
23 void on_okButton_clicked(); 27 void on_okButton_clicked();
24 28
@@ -26,6 +30,12 @@ private slots: @@ -26,6 +30,12 @@ private slots:
26 30
27 private: 31 private:
28 Ui::ConfirmPopup *ui; 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 #endif // CONFIRMPOPUP_H 41 #endif // CONFIRMPOPUP_H
app/gui/oven_control/cooldownpopup.cpp
1 #include "cooldownpopup.h" 1 #include "cooldownpopup.h"
2 #include "ui_cooldownpopup.h" 2 #include "ui_cooldownpopup.h"
3 3
  4 +#include <QKeyEvent>
  5 +
4 #include "soundplayer.h" 6 #include "soundplayer.h"
5 #include "stringer.h" 7 #include "stringer.h"
6 8
@@ -57,6 +59,14 @@ CooldownPopup::CooldownPopup(QWidget *parent, Oven *oven) : @@ -57,6 +59,14 @@ CooldownPopup::CooldownPopup(QWidget *parent, Oven *oven) :
57 59
58 foreach (QPushButton *button, findChildren<QPushButton *>()) 60 foreach (QPushButton *button, findChildren<QPushButton *>())
59 connect(button, &QPushButton::pressed, SoundPlayer::playClick); 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 CooldownPopup::~CooldownPopup() 72 CooldownPopup::~CooldownPopup()
@@ -64,6 +74,41 @@ CooldownPopup::~CooldownPopup() @@ -64,6 +74,41 @@ CooldownPopup::~CooldownPopup()
64 delete ui; 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 void CooldownPopup::start() 112 void CooldownPopup::start()
68 { 113 {
69 started = true; 114 started = true;
@@ -95,10 +140,8 @@ void CooldownPopup::updateView() @@ -95,10 +140,8 @@ void CooldownPopup::updateView()
95 int temp; 140 int temp;
96 if (showingCurrentTemp) 141 if (showingCurrentTemp)
97 temp = oven->currentTemp(); 142 temp = oven->currentTemp();
98 - else if (ui->tempSlider->isSliderDown())  
99 - temp = ui->tempSlider->sliderPosition();  
100 else 143 else
101 - temp = ui->tempSlider->value(); 144 + temp = ui->tempSlider->sliderPosition();
102 145
103 ui->tempCurrentLabel->setText(Stringer::temperature(temp, Stringer::fontSize14)); 146 ui->tempCurrentLabel->setText(Stringer::temperature(temp, Stringer::fontSize14));
104 147
@@ -129,11 +172,7 @@ void CooldownPopup::updateView() @@ -129,11 +172,7 @@ void CooldownPopup::updateView()
129 if (lastDisplayedHumidification != oven->humidification()) 172 if (lastDisplayedHumidification != oven->humidification())
130 { 173 {
131 lastDisplayedHumidification = oven->humidification(); 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 if (started && !oven->door()) 178 if (started && !oven->door())
@@ -227,3 +266,50 @@ void CooldownPopup::on_humidificationButton_clicked() @@ -227,3 +266,50 @@ void CooldownPopup::on_humidificationButton_clicked()
227 else 266 else
228 oven->startHumidification(); 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,6 +18,10 @@ public:
18 explicit CooldownPopup(QWidget *parent = 0, Oven *oven = 0); 18 explicit CooldownPopup(QWidget *parent = 0, Oven *oven = 0);
19 ~CooldownPopup(); 19 ~CooldownPopup();
20 20
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
21 private slots: 25 private slots:
22 void start(); 26 void start();
23 void stop(); 27 void stop();
@@ -39,6 +43,10 @@ private slots: @@ -39,6 +43,10 @@ private slots:
39 43
40 void on_humidificationButton_clicked(); 44 void on_humidificationButton_clicked();
41 45
  46 + void on_tempButton_clicked();
  47 +
  48 + void focusTempButton();
  49 +
42 private: 50 private:
43 Ui::CooldownPopup *ui; 51 Ui::CooldownPopup *ui;
44 Oven *oven; 52 Oven *oven;
@@ -56,6 +64,13 @@ private: @@ -56,6 +64,13 @@ private:
56 64
57 int lastDisplayedFanLevel; 65 int lastDisplayedFanLevel;
58 bool lastDisplayedHumidification; 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 #endif // COOLDOWNPOPUP_H 76 #endif // COOLDOWNPOPUP_H
app/gui/oven_control/cooldownpopup.ui
@@ -14,6 +14,7 @@ @@ -14,6 +14,7 @@
14 <string notr="true">#closeButton { border: none; } 14 <string notr="true">#closeButton { border: none; }
15 #closeButton_2 { border: none; } 15 #closeButton_2 { border: none; }
16 #background { background-image: url(:/images/background/popup/373.png); } 16 #background { background-image: url(:/images/background/popup/373.png); }
  17 +#background:focus { border: 4px solid gray; }
17 18
18 QPushButton { 19 QPushButton {
19 background-position: center; 20 background-position: center;
@@ -85,6 +86,9 @@ height: 33px; @@ -85,6 +86,9 @@ height: 33px;
85 <height>373</height> 86 <height>373</height>
86 </rect> 87 </rect>
87 </property> 88 </property>
  89 + <property name="focusPolicy">
  90 + <enum>Qt::TabFocus</enum>
  91 + </property>
88 <widget class="QPushButton" name="tempButton"> 92 <widget class="QPushButton" name="tempButton">
89 <property name="geometry"> 93 <property name="geometry">
90 <rect> 94 <rect>
@@ -96,7 +100,7 @@ height: 33px; @@ -96,7 +100,7 @@ height: 33px;
96 </property> 100 </property>
97 <property name="styleSheet"> 101 <property name="styleSheet">
98 <string notr="true">QPushButton { image: url(:/images/slider_icon/cooldown.png); } 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 </property> 104 </property>
101 <property name="text"> 105 <property name="text">
102 <string notr="true"/> 106 <string notr="true"/>
@@ -116,7 +120,7 @@ QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }&lt;/stri @@ -116,7 +120,7 @@ QPushButton::pressed { image: url(:/images/slider_icon/cooldown_ov.png); }&lt;/stri
116 </property> 120 </property>
117 <property name="styleSheet"> 121 <property name="styleSheet">
118 <string notr="true">QPushButton { background-image: url(:/images/cooldown/run.png); } 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 </property> 124 </property>
121 <property name="text"> 125 <property name="text">
122 <string/> 126 <string/>
@@ -149,11 +153,15 @@ QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }&lt;/st @@ -149,11 +153,15 @@ QPushButton:pressed { background-image: url(:/images/cooldown/run_ov.png); }&lt;/st
149 </property> 153 </property>
150 <property name="styleSheet"> 154 <property name="styleSheet">
151 <string notr="true">QPushButton { background-image: url(:/images/cooldown/side_nozzle.png); } 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 </property> 158 </property>
154 <property name="text"> 159 <property name="text">
155 <string/> 160 <string/>
156 </property> 161 </property>
  162 + <property name="checkable">
  163 + <bool>true</bool>
  164 + </property>
157 </widget> 165 </widget>
158 <widget class="QLabel" name="tempMaxLabel"> 166 <widget class="QLabel" name="tempMaxLabel">
159 <property name="enabled"> 167 <property name="enabled">
app/gui/oven_control/coretempsettingpopup.cpp
1 #include "coretempsettingpopup.h" 1 #include "coretempsettingpopup.h"
2 #include "ui_coretempsettingpopup.h" 2 #include "ui_coretempsettingpopup.h"
3 3
  4 +#include <QKeyEvent>
  5 +
4 #include "config.h" 6 #include "config.h"
5 #include "soundplayer.h" 7 #include "soundplayer.h"
6 #include "stringer.h" 8 #include "stringer.h"
@@ -77,6 +79,14 @@ CoreTempSettingPopup::CoreTempSettingPopup(QWidget *parent) : @@ -77,6 +79,14 @@ CoreTempSettingPopup::CoreTempSettingPopup(QWidget *parent) :
77 connect(button, &QPushButton::pressed, SoundPlayer::playClick); 79 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
78 80
79 updateView(); 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 CoreTempSettingPopup::~CoreTempSettingPopup() 92 CoreTempSettingPopup::~CoreTempSettingPopup()
@@ -84,6 +94,90 @@ CoreTempSettingPopup::~CoreTempSettingPopup() @@ -84,6 +94,90 @@ CoreTempSettingPopup::~CoreTempSettingPopup()
84 delete ui; 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 void CoreTempSettingPopup::updateView() 181 void CoreTempSettingPopup::updateView()
88 { 182 {
89 int coreTemp = ui->coreTempSlider->sliderPosition(); 183 int coreTemp = ui->coreTempSlider->sliderPosition();
@@ -117,3 +211,9 @@ void CoreTempSettingPopup::on_applyButton_clicked() @@ -117,3 +211,9 @@ void CoreTempSettingPopup::on_applyButton_clicked()
117 oven->setInterTempEnabled(true); 211 oven->setInterTempEnabled(true);
118 close(); 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,6 +2,7 @@
2 #define CORETEMPSETTINGPOPUP_H 2 #define CORETEMPSETTINGPOPUP_H
3 3
4 #include <QWidget> 4 #include <QWidget>
  5 +#include <QTimer>
5 6
6 #include "oven.h" 7 #include "oven.h"
7 8
@@ -17,14 +18,28 @@ public: @@ -17,14 +18,28 @@ public:
17 explicit CoreTempSettingPopup(QWidget *parent = 0); 18 explicit CoreTempSettingPopup(QWidget *parent = 0);
18 ~CoreTempSettingPopup(); 19 ~CoreTempSettingPopup();
19 20
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
20 private: 25 private:
21 Ui::CoreTempSettingPopup *ui; 26 Ui::CoreTempSettingPopup *ui;
22 Oven *oven; 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 private slots: 37 private slots:
25 void updateView(); 38 void updateView();
26 void on_cancelButton_clicked(); 39 void on_cancelButton_clicked();
27 void on_applyButton_clicked(); 40 void on_applyButton_clicked();
  41 + void on_coreTempButton_clicked();
  42 + void focusCoreTempButton();
28 }; 43 };
29 44
30 #endif // CORETEMPSETTINGPOPUP_H 45 #endif // CORETEMPSETTINGPOPUP_H
app/gui/oven_control/coretempsettingpopup.ui
@@ -13,9 +13,15 @@ @@ -13,9 +13,15 @@
13 <property name="styleSheet"> 13 <property name="styleSheet">
14 <string notr="true">#background { 14 <string notr="true">#background {
15 background-image: url(:/images/background/manual_core.png); 15 background-image: url(:/images/background/manual_core.png);
  16 +background-origin: border;
16 margin-top: -720px; 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 QPushButton[style=&quot;icon&quot;] { 25 QPushButton[style=&quot;icon&quot;] {
20 background-image: url(:/images/slider_icon/background.png); 26 background-image: url(:/images/slider_icon/background.png);
21 background-repeat: no-repeat; 27 background-repeat: no-repeat;
@@ -61,6 +67,9 @@ height: 33px; @@ -61,6 +67,9 @@ height: 33px;
61 <height>730</height> 67 <height>730</height>
62 </rect> 68 </rect>
63 </property> 69 </property>
  70 + <property name="focusPolicy">
  71 + <enum>Qt::TabFocus</enum>
  72 + </property>
64 </widget> 73 </widget>
65 <widget class="QLabel" name="label_2"> 74 <widget class="QLabel" name="label_2">
66 <property name="geometry"> 75 <property name="geometry">
@@ -150,7 +159,7 @@ height: 33px; @@ -150,7 +159,7 @@ height: 33px;
150 </property> 159 </property>
151 <property name="styleSheet"> 160 <property name="styleSheet">
152 <string notr="true">QPushButton { background-image: url(:/images/manual_button/ok.png); } 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 </property> 163 </property>
155 <property name="text"> 164 <property name="text">
156 <string>확인/적용하기</string> 165 <string>확인/적용하기</string>
@@ -437,7 +446,8 @@ QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); } @@ -437,7 +446,8 @@ QPushButton:pressed { background-image: url(:/images/manual_button/ok_ov.png); }
437 </property> 446 </property>
438 <property name="styleSheet"> 447 <property name="styleSheet">
439 <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp_enabled.png); } 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 </property> 451 </property>
442 <property name="style" stdset="0"> 452 <property name="style" stdset="0">
443 <string>icon</string> 453 <string>icon</string>
@@ -657,7 +667,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri @@ -657,7 +667,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri
657 </property> 667 </property>
658 <property name="styleSheet"> 668 <property name="styleSheet">
659 <string notr="true">QPushButton { background-image: url(:/images/manual_button/back.png); } 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 </property> 671 </property>
662 <property name="text"> 672 <property name="text">
663 <string>이전으로</string> 673 <string>이전으로</string>
@@ -1004,6 +1014,9 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png); @@ -1004,6 +1014,9 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
1004 <height>140</height> 1014 <height>140</height>
1005 </rect> 1015 </rect>
1006 </property> 1016 </property>
  1017 + <property name="focusPolicy">
  1018 + <enum>Qt::ClickFocus</enum>
  1019 + </property>
1007 </widget> 1020 </widget>
1008 </widget> 1021 </widget>
1009 <customwidgets> 1022 <customwidgets>
@@ -1014,6 +1027,12 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png); @@ -1014,6 +1027,12 @@ QPushButton:pressed { background-image: url(:/images/manual_button/back_ov.png);
1014 <container>1</container> 1027 <container>1</container>
1015 </customwidget> 1028 </customwidget>
1016 </customwidgets> 1029 </customwidgets>
  1030 + <tabstops>
  1031 + <tabstop>background</tabstop>
  1032 + <tabstop>coreTempButton</tabstop>
  1033 + <tabstop>cancelButton</tabstop>
  1034 + <tabstop>applyButton</tabstop>
  1035 + </tabstops>
1017 <resources> 1036 <resources>
1018 <include location="resources.qrc"/> 1037 <include location="resources.qrc"/>
1019 </resources> 1038 </resources>
app/gui/oven_control/manualcookwindow.cpp
@@ -125,6 +125,27 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) : @@ -125,6 +125,27 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
125 showCurrentTempTimer.setInterval(1000); 125 showCurrentTempTimer.setInterval(1000);
126 connect(&showCurrentTempTimer, SIGNAL(timeout()), SLOT(showCurrentTemp())); 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 connect(oven, SIGNAL(changed(Oven*)), this, SLOT(onOvenUpdated(Oven*))); 149 connect(oven, SIGNAL(changed(Oven*)), this, SLOT(onOvenUpdated(Oven*)));
129 oven->setDefault(mode); 150 oven->setDefault(mode);
130 151
@@ -135,6 +156,8 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) : @@ -135,6 +156,8 @@ ManualCookWindow::ManualCookWindow(QWidget *parent, Define::Mode mode) :
135 connect(button, &QPushButton::pressed, SoundPlayer::playClick); 156 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
136 157
137 QTimer::singleShot(0, this, SLOT(setupAnimation())); 158 QTimer::singleShot(0, this, SLOT(setupAnimation()));
  159 +
  160 + setFocus();
138 } 161 }
139 162
140 ManualCookWindow::ManualCookWindow(QWidget *parent, ManualCookSetting setting) 163 ManualCookWindow::ManualCookWindow(QWidget *parent, ManualCookSetting setting)
@@ -159,6 +182,55 @@ ManualCookWindow::~ManualCookWindow() @@ -159,6 +182,55 @@ ManualCookWindow::~ManualCookWindow()
159 delete ui; 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 void ManualCookWindow::setupAnimation() 234 void ManualCookWindow::setupAnimation()
163 { 235 {
164 ui->openDoorAnimation->load(":/images/animation/door_big_09.png"); 236 ui->openDoorAnimation->load(":/images/animation/door_big_09.png");
@@ -178,16 +250,28 @@ void ManualCookWindow::updateView() @@ -178,16 +250,28 @@ void ManualCookWindow::updateView()
178 switch (oven->mode()) 250 switch (oven->mode())
179 { 251 {
180 case Define::DryMode: 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 if (!ui->dryheatButton->isChecked()) 257 if (!ui->dryheatButton->isChecked())
182 ui->dryheatButton->setChecked(true); 258 ui->dryheatButton->setChecked(true);
183 break; 259 break;
184 case Define::SteamMode: 260 case Define::SteamMode:
185 if (!ui->steamButton->isChecked()) 261 if (!ui->steamButton->isChecked())
186 ui->steamButton->setChecked(true); 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 break; 267 break;
188 case Define::CombiMode: 268 case Define::CombiMode:
  269 + if (ui->steamButton->isChecked())
  270 + ui->steamButton->setChecked(false);
189 if (!ui->combiButton->isChecked()) 271 if (!ui->combiButton->isChecked())
190 ui->combiButton->setChecked(true); 272 ui->combiButton->setChecked(true);
  273 + if (ui->dryheatButton->isChecked())
  274 + ui->dryheatButton->setChecked(false);
191 break; 275 break;
192 default: 276 default:
193 break; 277 break;
@@ -196,7 +280,7 @@ void ManualCookWindow::updateView() @@ -196,7 +280,7 @@ void ManualCookWindow::updateView()
196 int humidity; 280 int humidity;
197 if (showCurrentHumidity_) 281 if (showCurrentHumidity_)
198 humidity = oven->currentHumidity(); 282 humidity = oven->currentHumidity();
199 - else if (ui->humiditySlider->isSliderDown()) 283 + else if (ui->humiditySlider->isSliderDown() || focusWidget() == ui->humiditySlider)
200 humidity = ui->humiditySlider->sliderPosition(); 284 humidity = ui->humiditySlider->sliderPosition();
201 else 285 else
202 humidity = oven->humidity(); 286 humidity = oven->humidity();
@@ -217,7 +301,7 @@ void ManualCookWindow::updateView() @@ -217,7 +301,7 @@ void ManualCookWindow::updateView()
217 int temp; 301 int temp;
218 if (showCurrentTemp_) 302 if (showCurrentTemp_)
219 temp = oven->currentTemp(); 303 temp = oven->currentTemp();
220 - else if (ui->tempSlider->isSliderDown()) 304 + else if (ui->tempSlider->isSliderDown() || focusWidget() == ui->tempSlider)
221 temp = ui->tempSlider->sliderPosition(); 305 temp = ui->tempSlider->sliderPosition();
222 else 306 else
223 temp = oven->temp(); 307 temp = oven->temp();
@@ -235,25 +319,21 @@ void ManualCookWindow::updateView() @@ -235,25 +319,21 @@ void ManualCookWindow::updateView()
235 ui->tempSlider->setValue(temp); 319 ui->tempSlider->setValue(temp);
236 ui->tempSlider->blockSignals(old); 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 else 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 bool old = ui->timeSlider->blockSignals(true); 330 bool old = ui->timeSlider->blockSignals(true);
249 ui->timeSlider->setSliderPosition(timeToSlider(msecs / 1000)); 331 ui->timeSlider->setSliderPosition(timeToSlider(msecs / 1000));
250 ui->timeSlider->blockSignals(old); 332 ui->timeSlider->blockSignals(old);
251 -  
252 - ui->timeLabel->setText(Stringer::remainingTime(msecs, Stringer::fontSize14));  
253 } 333 }
254 334
255 int interTemp; 335 int interTemp;
256 - if (ui->interTempSlider->isSliderDown()) 336 + if (ui->interTempSlider->isSliderDown() || focusWidget() == ui->interTempSlider)
257 interTemp = ui->interTempSlider->sliderPosition(); 337 interTemp = ui->interTempSlider->sliderPosition();
258 else 338 else
259 interTemp = oven->interTemp(); 339 interTemp = oven->interTemp();
@@ -264,23 +344,7 @@ void ManualCookWindow::updateView() @@ -264,23 +344,7 @@ void ManualCookWindow::updateView()
264 if (interTempEnabled != lastViewInterTempEnabled) 344 if (interTempEnabled != lastViewInterTempEnabled)
265 { 345 {
266 lastViewInterTempEnabled = oven->interTempEnabled(); 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 lastViewInterTemp = interTemp; 350 lastViewInterTemp = interTemp;
@@ -312,32 +376,70 @@ QPushButton:pressed {\ @@ -312,32 +376,70 @@ QPushButton:pressed {\
312 "border-image: url(:/images/manual_button/run.png)"); 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 else 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 else 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 int fan = oven->fan(); 443 int fan = oven->fan();
342 if (fan != lastViewFan) 444 if (fan != lastViewFan)
343 { 445 {
@@ -376,20 +478,6 @@ QPushButton:pressed {\ @@ -376,20 +478,6 @@ QPushButton:pressed {\
376 ui->upperStack->setCurrentIndex(1); 478 ui->upperStack->setCurrentIndex(1);
377 else 479 else
378 ui->upperStack->setCurrentIndex(0); 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 void ManualCookWindow::showCurrentHumidity() 483 void ManualCookWindow::showCurrentHumidity()
@@ -588,6 +676,159 @@ void ManualCookWindow::onMonitor3Timeout() @@ -588,6 +676,159 @@ void ManualCookWindow::onMonitor3Timeout()
588 close(); 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 void ManualCookWindow::on_steamButton_clicked() 832 void ManualCookWindow::on_steamButton_clicked()
592 { 833 {
593 setOvenDefault(Define::SteamMode); 834 setOvenDefault(Define::SteamMode);
@@ -629,6 +870,27 @@ void ManualCookWindow::on_tempButton_released() @@ -629,6 +870,27 @@ void ManualCookWindow::on_tempButton_released()
629 hideCurrentTemp(); 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 void ManualCookWindow::on_interTempButton_clicked() 894 void ManualCookWindow::on_interTempButton_clicked()
633 { 895 {
634 if (oven->interTempEnabled()) 896 if (oven->interTempEnabled())
@@ -637,6 +899,9 @@ void ManualCookWindow::on_interTempButton_clicked() @@ -637,6 +899,9 @@ void ManualCookWindow::on_interTempButton_clicked()
637 { 899 {
638 CoreTempSettingPopup *p = new CoreTempSettingPopup(this); 900 CoreTempSettingPopup *p = new CoreTempSettingPopup(this);
639 p->show(); 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,6 +929,9 @@ void ManualCookWindow::on_preheatButton_clicked()
664 PreheatPopup *p = new PreheatPopup(this, oven); 929 PreheatPopup *p = new PreheatPopup(this, oven);
665 p->setWindowModality(Qt::WindowModal); 930 p->setWindowModality(Qt::WindowModal);
666 p->showFullScreen(); 931 p->showFullScreen();
  932 +
  933 + focused = ui->preheatButton;
  934 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
667 } 935 }
668 936
669 void ManualCookWindow::on_damperButton_clicked() 937 void ManualCookWindow::on_damperButton_clicked()
@@ -713,6 +981,9 @@ void ManualCookWindow::on_cooldownButton_clicked() @@ -713,6 +981,9 @@ void ManualCookWindow::on_cooldownButton_clicked()
713 CooldownPopup *p = new CooldownPopup(this, oven); 981 CooldownPopup *p = new CooldownPopup(this, oven);
714 p->setWindowModality(Qt::WindowModal); 982 p->setWindowModality(Qt::WindowModal);
715 p->showFullScreen(); 983 p->showFullScreen();
  984 +
  985 + focused = ui->cooldownButton;
  986 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
716 } 987 }
717 988
718 void ManualCookWindow::on_reserveButton_clicked() 989 void ManualCookWindow::on_reserveButton_clicked()
@@ -725,6 +996,9 @@ void ManualCookWindow::on_reserveButton_clicked() @@ -725,6 +996,9 @@ void ManualCookWindow::on_reserveButton_clicked()
725 connect(p, SIGNAL(timeout()), SLOT(start())); 996 connect(p, SIGNAL(timeout()), SLOT(start()));
726 connect(p, SIGNAL(canceled()), &startCookingTimer, SLOT(start())); 997 connect(p, SIGNAL(canceled()), &startCookingTimer, SLOT(start()));
727 p->showFullScreen(); 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,6 +1010,8 @@ void ManualCookWindow::on_favoriteButton_clicked()
736 ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?")); 1010 ConfirmPopup *p = new ConfirmPopup(this, tr("즐겨찾기 항목에 추가하시겠습니까?"));
737 p->showFullScreen(); 1011 p->showFullScreen();
738 1012
  1013 + focused = ui->favoriteButton;
  1014 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
739 connect(p, SIGNAL(accepted()), SLOT(addFavorite())); 1015 connect(p, SIGNAL(accepted()), SLOT(addFavorite()));
740 1016
741 if (startCookingTimer.isActive()) 1017 if (startCookingTimer.isActive())
@@ -745,14 +1021,11 @@ void ManualCookWindow::on_favoriteButton_clicked() @@ -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 void ManualCookWindow::on_goFrontStackButton_clicked() 1024 void ManualCookWindow::on_goFrontStackButton_clicked()
754 { 1025 {
755 - ui->buttonStack->setCurrentIndex(0); 1026 + showFrontButtons = !showFrontButtons;
  1027 +
  1028 + updateView();
756 } 1029 }
757 1030
758 void ManualCookWindow::on_backButton_clicked() 1031 void ManualCookWindow::on_backButton_clicked()
@@ -769,6 +1042,9 @@ void ManualCookWindow::on_configButton_clicked() @@ -769,6 +1042,9 @@ void ManualCookWindow::on_configButton_clicked()
769 p->showFullScreen(); 1042 p->showFullScreen();
770 1043
771 connect(p, SIGNAL(accepted()), SLOT(jumpConfig())); 1044 connect(p, SIGNAL(accepted()), SLOT(jumpConfig()));
  1045 +
  1046 + focused = ui->configButton;
  1047 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
772 } 1048 }
773 else 1049 else
774 { 1050 {
@@ -789,6 +1065,9 @@ void ManualCookWindow::on_favoritesButton_clicked() @@ -789,6 +1065,9 @@ void ManualCookWindow::on_favoritesButton_clicked()
789 p->showFullScreen(); 1065 p->showFullScreen();
790 1066
791 connect(p, SIGNAL(accepted()), SLOT(jumpFavorites())); 1067 connect(p, SIGNAL(accepted()), SLOT(jumpFavorites()));
  1068 +
  1069 + focused = ui->favoritesButton;
  1070 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
792 } 1071 }
793 else 1072 else
794 { 1073 {
@@ -810,6 +1089,9 @@ void ManualCookWindow::on_washButton_clicked() @@ -810,6 +1089,9 @@ void ManualCookWindow::on_washButton_clicked()
810 p->showFullScreen(); 1089 p->showFullScreen();
811 1090
812 connect(p, SIGNAL(accepted()), SLOT(jumpWash())); 1091 connect(p, SIGNAL(accepted()), SLOT(jumpWash()));
  1092 +
  1093 + focused = ui->washButton;
  1094 + connect(p, SIGNAL(destroyed(QObject*)), SLOT(focusAgain()));
813 } 1095 }
814 else 1096 else
815 { 1097 {
@@ -844,8 +1126,8 @@ int ManualCookWindow::sliderToTime(int value) @@ -844,8 +1126,8 @@ int ManualCookWindow::sliderToTime(int value)
844 int ManualCookWindow::timeToSlider(int secs) 1126 int ManualCookWindow::timeToSlider(int secs)
845 { 1127 {
846 if (secs <= 180 * 60) 1128 if (secs <= 180 * 60)
847 - return secs / 60; 1129 + return qCeil((qreal) secs / 60);
848 if (secs <= 360 * 60) 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,6 +2,7 @@
2 #define MANUALCOOKWINDOW_H 2 #define MANUALCOOKWINDOW_H
3 3
4 #include <QMainWindow> 4 #include <QMainWindow>
  5 +#include <QKeyEvent>
5 6
6 #include "oven.h" 7 #include "oven.h"
7 #include "udphandler.h" 8 #include "udphandler.h"
@@ -20,6 +21,10 @@ public: @@ -20,6 +21,10 @@ public:
20 explicit ManualCookWindow(QWidget *parent, ManualCookSetting setting); 21 explicit ManualCookWindow(QWidget *parent, ManualCookSetting setting);
21 ~ManualCookWindow(); 22 ~ManualCookWindow();
22 23
  24 +protected:
  25 + void keyPressEvent(QKeyEvent *event);
  26 + void keyReleaseEvent(QKeyEvent *event);
  27 +
23 signals: 28 signals:
24 void cookStopRequested(); 29 void cookStopRequested();
25 30
@@ -47,6 +52,16 @@ private slots: @@ -47,6 +52,16 @@ private slots:
47 void onMonitor2Timeout(); 52 void onMonitor2Timeout();
48 void onMonitor3Timeout(); 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 void on_steamButton_clicked(); 65 void on_steamButton_clicked();
51 void on_combiButton_clicked(); 66 void on_combiButton_clicked();
52 void on_dryheatButton_clicked(); 67 void on_dryheatButton_clicked();
@@ -55,6 +70,10 @@ private slots: @@ -55,6 +70,10 @@ private slots:
55 void on_humidityButton_released(); 70 void on_humidityButton_released();
56 void on_tempButton_pressed(); 71 void on_tempButton_pressed();
57 void on_tempButton_released(); 72 void on_tempButton_released();
  73 +
  74 + void on_humidityButton_clicked();
  75 + void on_tempButton_clicked();
  76 + void on_timeButton_clicked();
58 void on_interTempButton_clicked(); 77 void on_interTempButton_clicked();
59 78
60 void on_runStopButton_clicked(); 79 void on_runStopButton_clicked();
@@ -66,7 +85,6 @@ private slots: @@ -66,7 +85,6 @@ private slots:
66 void on_cooldownButton_clicked(); 85 void on_cooldownButton_clicked();
67 void on_reserveButton_clicked(); 86 void on_reserveButton_clicked();
68 void on_favoriteButton_clicked(); 87 void on_favoriteButton_clicked();
69 - void on_goBackStackButton_clicked();  
70 void on_goFrontStackButton_clicked(); 88 void on_goFrontStackButton_clicked();
71 89
72 void on_backButton_clicked(); 90 void on_backButton_clicked();
@@ -77,6 +95,8 @@ private slots: @@ -77,6 +95,8 @@ private slots:
77 95
78 void on_timeSlider_valueChanged(); 96 void on_timeSlider_valueChanged();
79 97
  98 +
  99 +
80 private: 100 private:
81 Ui::ManualCookWindow *ui; 101 Ui::ManualCookWindow *ui;
82 Oven *oven; 102 Oven *oven;
@@ -105,6 +125,8 @@ private: @@ -105,6 +125,8 @@ private:
105 bool lastViewHumidification; 125 bool lastViewHumidification;
106 int lastViewFan; 126 int lastViewFan;
107 127
  128 + bool showFrontButtons = true;
  129 +
108 int monitorLevel; 130 int monitorLevel;
109 QTimer monitor1; 131 QTimer monitor1;
110 QTimer monitor2; 132 QTimer monitor2;
@@ -117,6 +139,14 @@ private: @@ -117,6 +139,14 @@ private:
117 139
118 int sliderToTime(int value); 140 int sliderToTime(int value);
119 int timeToSlider(int secs); 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 #endif // MANUALCOOKWINDOW_H 152 #endif // MANUALCOOKWINDOW_H
app/gui/oven_control/manualcookwindow.ui
@@ -41,6 +41,12 @@ background-position: center; @@ -41,6 +41,12 @@ background-position: center;
41 border: none; 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 QSlider::groove { 50 QSlider::groove {
45 background-image: url(:/images/slider/groove_ticks.png); 51 background-image: url(:/images/slider/groove_ticks.png);
46 background-repeat: no-repeat; 52 background-repeat: no-repeat;
@@ -133,8 +139,8 @@ height: 33px; @@ -133,8 +139,8 @@ height: 33px;
133 </property> 139 </property>
134 <property name="styleSheet"> 140 <property name="styleSheet">
135 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_combi_hide.png); } 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 </property> 144 </property>
139 <property name="text"> 145 <property name="text">
140 <string>콤비</string> 146 <string>콤비</string>
@@ -143,7 +149,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); } @@ -143,7 +149,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
143 <bool>true</bool> 149 <bool>true</bool>
144 </property> 150 </property>
145 <property name="autoExclusive"> 151 <property name="autoExclusive">
146 - <bool>true</bool> 152 + <bool>false</bool>
147 </property> 153 </property>
148 <property name="style" stdset="0"> 154 <property name="style" stdset="0">
149 <string notr="true">mode</string> 155 <string notr="true">mode</string>
@@ -160,8 +166,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); } @@ -160,8 +166,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_combi.png); }
160 </property> 166 </property>
161 <property name="styleSheet"> 167 <property name="styleSheet">
162 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_steam_hide.png); } 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 </property> 171 </property>
166 <property name="text"> 172 <property name="text">
167 <string>스팀</string> 173 <string>스팀</string>
@@ -170,7 +176,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); } @@ -170,7 +176,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
170 <bool>true</bool> 176 <bool>true</bool>
171 </property> 177 </property>
172 <property name="autoExclusive"> 178 <property name="autoExclusive">
173 - <bool>true</bool> 179 + <bool>false</bool>
174 </property> 180 </property>
175 <property name="style" stdset="0"> 181 <property name="style" stdset="0">
176 <string notr="true">mode</string> 182 <string notr="true">mode</string>
@@ -187,8 +193,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); } @@ -187,8 +193,8 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_steam.png); }
187 </property> 193 </property>
188 <property name="styleSheet"> 194 <property name="styleSheet">
189 <string notr="true">QPushButton { background-image: url(:/images/cook_mode/big_dryheat_hide.png); } 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 </property> 198 </property>
193 <property name="text"> 199 <property name="text">
194 <string>건열</string> 200 <string>건열</string>
@@ -197,7 +203,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); @@ -197,7 +203,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
197 <bool>true</bool> 203 <bool>true</bool>
198 </property> 204 </property>
199 <property name="autoExclusive"> 205 <property name="autoExclusive">
200 - <bool>true</bool> 206 + <bool>false</bool>
201 </property> 207 </property>
202 <property name="style" stdset="0"> 208 <property name="style" stdset="0">
203 <string notr="true">mode</string> 209 <string notr="true">mode</string>
@@ -223,7 +229,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png); @@ -223,7 +229,7 @@ QPushButton:checked { background-image: url(:/images/cook_mode/big_dryheat.png);
223 </property> 229 </property>
224 <property name="styleSheet"> 230 <property name="styleSheet">
225 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); } 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 </property> 233 </property>
228 <property name="text"> 234 <property name="text">
229 <string/> 235 <string/>
@@ -240,7 +246,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str @@ -240,7 +246,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str
240 </property> 246 </property>
241 <property name="styleSheet"> 247 <property name="styleSheet">
242 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); } 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 </property> 250 </property>
245 <property name="text"> 251 <property name="text">
246 <string/> 252 <string/>
@@ -257,7 +263,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s @@ -257,7 +263,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s
257 </property> 263 </property>
258 <property name="styleSheet"> 264 <property name="styleSheet">
259 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/favorites_manual.png); } 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 </property> 267 </property>
262 <property name="text"> 268 <property name="text">
263 <string/> 269 <string/>
@@ -274,7 +280,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov. @@ -274,7 +280,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/favorites_manual_ov.
274 </property> 280 </property>
275 <property name="styleSheet"> 281 <property name="styleSheet">
276 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/wash.png); } 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 </property> 284 </property>
279 <property name="text"> 285 <property name="text">
280 <string/> 286 <string/>
@@ -291,7 +297,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }&lt;/str @@ -291,7 +297,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/wash_ov.png); }&lt;/str
291 </property> 297 </property>
292 <property name="styleSheet"> 298 <property name="styleSheet">
293 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); } 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 </property> 301 </property>
296 <property name="text"> 302 <property name="text">
297 <string/> 303 <string/>
@@ -497,7 +503,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str @@ -497,7 +503,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str
497 </property> 503 </property>
498 <property name="styleSheet"> 504 <property name="styleSheet">
499 <string notr="true">QPushButton { image: url(:/images/slider_icon/temp.png); } 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 </property> 507 </property>
502 <property name="style" stdset="0"> 508 <property name="style" stdset="0">
503 <string notr="true">icon</string> 509 <string notr="true">icon</string>
@@ -631,248 +637,6 @@ QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }&lt;/string&gt; @@ -631,248 +637,6 @@ QPushButton:pressed { image: url(:/images/slider_icon/temp_ov.png); }&lt;/string&gt;
631 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> 637 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
632 </property> 638 </property>
633 </widget> 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 <widget class="QLabel" name="steamLabel_4"> 640 <widget class="QLabel" name="steamLabel_4">
877 <property name="enabled"> 641 <property name="enabled">
878 <bool>true</bool> 642 <bool>true</bool>
@@ -946,7 +710,11 @@ QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov. @@ -946,7 +710,11 @@ QPushButton:pressed { background-image: url(:/images/manual_button/favorites_ov.
946 </property> 710 </property>
947 <property name="styleSheet"> 711 <property name="styleSheet">
948 <string notr="true">QPushButton { image: url(:/images/slider_icon/humidity.png); } 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 </property> 718 </property>
951 <property name="style" stdset="0"> 719 <property name="style" stdset="0">
952 <string notr="true">icon</string> 720 <string notr="true">icon</string>
@@ -963,7 +731,11 @@ QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }&lt;/strin @@ -963,7 +731,11 @@ QPushButton:pressed { image: url(:/images/slider_icon/humidity_ov.png); }&lt;/strin
963 </property> 731 </property>
964 <property name="styleSheet"> 732 <property name="styleSheet">
965 <string notr="true">QPushButton { image: url(:/images/slider_icon/core_temp.png); } 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 </property> 739 </property>
968 <property name="style" stdset="0"> 740 <property name="style" stdset="0">
969 <string notr="true">icon</string> 741 <string notr="true">icon</string>
@@ -980,7 +752,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri @@ -980,7 +752,7 @@ QPushButton:pressed { image: url(:/images/slider_icon/core_temp_ov.png); }&lt;/stri
980 </property> 752 </property>
981 <property name="styleSheet"> 753 <property name="styleSheet">
982 <string notr="true">QPushButton { image: url(:/images/slider_icon/time.png); } 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 </property> 756 </property>
985 <property name="style" stdset="0"> 757 <property name="style" stdset="0">
986 <string notr="true">icon</string> 758 <string notr="true">icon</string>
@@ -1132,42 +904,288 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt; @@ -1132,42 +904,288 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt;
1132 <property name="geometry"> 904 <property name="geometry">
1133 <rect> 905 <rect>
1134 <x>185</x> 906 <x>185</x>
1135 - <y>875</y> 907 + <y>915</y>
1136 <width>666</width> 908 <width>666</width>
1137 - <height>140</height> 909 + <height>60</height>
1138 </rect> 910 </rect>
1139 </property> 911 </property>
  912 + <property name="focusPolicy">
  913 + <enum>Qt::ClickFocus</enum>
  914 + </property>
1140 </widget> 915 </widget>
1141 <widget class="Slider" name="humiditySlider" native="true"> 916 <widget class="Slider" name="humiditySlider" native="true">
1142 <property name="geometry"> 917 <property name="geometry">
1143 <rect> 918 <rect>
1144 <x>185</x> 919 <x>185</x>
1145 - <y>725</y> 920 + <y>765</y>
1146 <width>666</width> 921 <width>666</width>
1147 - <height>140</height> 922 + <height>60</height>
1148 </rect> 923 </rect>
1149 </property> 924 </property>
  925 + <property name="focusPolicy">
  926 + <enum>Qt::ClickFocus</enum>
  927 + </property>
1150 </widget> 928 </widget>
1151 <widget class="Slider" name="timeSlider" native="true"> 929 <widget class="Slider" name="timeSlider" native="true">
1152 <property name="geometry"> 930 <property name="geometry">
1153 <rect> 931 <rect>
1154 <x>185</x> 932 <x>185</x>
1155 - <y>1025</y> 933 + <y>1065</y>
1156 <width>666</width> 934 <width>666</width>
1157 - <height>140</height> 935 + <height>60</height>
1158 </rect> 936 </rect>
1159 </property> 937 </property>
  938 + <property name="focusPolicy">
  939 + <enum>Qt::ClickFocus</enum>
  940 + </property>
1160 </widget> 941 </widget>
1161 <widget class="Slider" name="interTempSlider" native="true"> 942 <widget class="Slider" name="interTempSlider" native="true">
1162 <property name="geometry"> 943 <property name="geometry">
1163 <rect> 944 <rect>
1164 <x>185</x> 945 <x>185</x>
1165 - <y>1175</y> 946 + <y>1215</y>
1166 <width>666</width> 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 </rect> 1016 </rect>
1169 </property> 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 </widget> 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 </widget> 1189 </widget>
1172 </widget> 1190 </widget>
1173 <customwidgets> 1191 <customwidgets>
@@ -1194,6 +1212,30 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt; @@ -1194,6 +1212,30 @@ QPushButton:pressed { image: url(:/images/slider_icon/time_ov.png); }&lt;/string&gt;
1194 <container>1</container> 1212 <container>1</container>
1195 </customwidget> 1213 </customwidget>
1196 </customwidgets> 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 <resources> 1239 <resources>
1198 <include location="resources.qrc"/> 1240 <include location="resources.qrc"/>
1199 </resources> 1241 </resources>
app/gui/oven_control/preheatpopup.cpp
1 #include "preheatpopup.h" 1 #include "preheatpopup.h"
2 #include "ui_preheatpopup.h" 2 #include "ui_preheatpopup.h"
3 3
  4 +#include <QKeyEvent>
  5 +
4 #include "stringer.h" 6 #include "stringer.h"
5 7
6 PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) : 8 PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
@@ -28,9 +30,13 @@ PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) : @@ -28,9 +30,13 @@ PreheatPopup::PreheatPopup(QWidget *parent, Oven *oven) :
28 ui->preheatGauge->setMinimum(oven->currentTemp()); 30 ui->preheatGauge->setMinimum(oven->currentTemp());
29 ui->preheatGauge->setValue(oven->currentTemp()); 31 ui->preheatGauge->setValue(oven->currentTemp());
30 32
  33 + ui->infoButton->hide();
  34 +
31 updateView(); 35 updateView();
32 36
33 start(); 37 start();
  38 +
  39 + ui->background->setFocus();
34 } 40 }
35 41
36 PreheatPopup::~PreheatPopup() 42 PreheatPopup::~PreheatPopup()
@@ -38,6 +44,21 @@ PreheatPopup::~PreheatPopup() @@ -38,6 +44,21 @@ PreheatPopup::~PreheatPopup()
38 delete ui; 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 void PreheatPopup::updateView() 62 void PreheatPopup::updateView()
42 { 63 {
43 ui->timeLabel->setText(Stringer::remainingTime(oven->msecs(), Stringer::fontSize14)); 64 ui->timeLabel->setText(Stringer::remainingTime(oven->msecs(), Stringer::fontSize14));
app/gui/oven_control/preheatpopup.h
@@ -18,6 +18,9 @@ public: @@ -18,6 +18,9 @@ public:
18 explicit PreheatPopup(QWidget *parent = 0, Oven *oven = 0); 18 explicit PreheatPopup(QWidget *parent = 0, Oven *oven = 0);
19 ~PreheatPopup(); 19 ~PreheatPopup();
20 20
  21 +protected:
  22 + void keyReleaseEvent(QKeyEvent *event);
  23 +
21 private slots: 24 private slots:
22 void updateView(); 25 void updateView();
23 void start(); 26 void start();
app/gui/oven_control/preheatpopup.ui
@@ -13,7 +13,10 @@ @@ -13,7 +13,10 @@
13 <property name="styleSheet"> 13 <property name="styleSheet">
14 <string notr="true">#closeButton { border: none; } 14 <string notr="true">#closeButton { border: none; }
15 #closeButton_2 { border: none; } 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 </property> 20 </property>
18 <widget class="QPushButton" name="closeButton"> 21 <widget class="QPushButton" name="closeButton">
19 <property name="geometry"> 22 <property name="geometry">
@@ -24,6 +27,9 @@ @@ -24,6 +27,9 @@
24 <height>426</height> 27 <height>426</height>
25 </rect> 28 </rect>
26 </property> 29 </property>
  30 + <property name="focusPolicy">
  31 + <enum>Qt::NoFocus</enum>
  32 + </property>
27 <property name="text"> 33 <property name="text">
28 <string/> 34 <string/>
29 </property> 35 </property>
@@ -37,6 +43,9 @@ @@ -37,6 +43,9 @@
37 <height>696</height> 43 <height>696</height>
38 </rect> 44 </rect>
39 </property> 45 </property>
  46 + <property name="focusPolicy">
  47 + <enum>Qt::TabFocus</enum>
  48 + </property>
40 <widget class="QLabel" name="humidityLabel"> 49 <widget class="QLabel" name="humidityLabel">
41 <property name="geometry"> 50 <property name="geometry">
42 <rect> 51 <rect>
@@ -378,6 +387,9 @@ @@ -378,6 +387,9 @@
378 <height>290</height> 387 <height>290</height>
379 </rect> 388 </rect>
380 </property> 389 </property>
  390 + <property name="focusPolicy">
  391 + <enum>Qt::NoFocus</enum>
  392 + </property>
381 <property name="styleSheet"> 393 <property name="styleSheet">
382 <string notr="true">border: #000000</string> 394 <string notr="true">border: #000000</string>
383 </property> 395 </property>
@@ -659,6 +671,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png); @@ -659,6 +671,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
659 <height>290</height> 671 <height>290</height>
660 </rect> 672 </rect>
661 </property> 673 </property>
  674 + <property name="focusPolicy">
  675 + <enum>Qt::NoFocus</enum>
  676 + </property>
662 <property name="styleSheet"> 677 <property name="styleSheet">
663 <string notr="true">border: #000000</string> 678 <string notr="true">border: #000000</string>
664 </property> 679 </property>
@@ -789,6 +804,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png); @@ -789,6 +804,9 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
789 <height>478</height> 804 <height>478</height>
790 </rect> 805 </rect>
791 </property> 806 </property>
  807 + <property name="focusPolicy">
  808 + <enum>Qt::NoFocus</enum>
  809 + </property>
792 <property name="text"> 810 <property name="text">
793 <string/> 811 <string/>
794 </property> 812 </property>
@@ -814,6 +832,13 @@ border-image: url(:/images/images/auto/btn_01_ov.png); @@ -814,6 +832,13 @@ border-image: url(:/images/images/auto/btn_01_ov.png);
814 <container>1</container> 832 <container>1</container>
815 </customwidget> 833 </customwidget>
816 </customwidgets> 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 <resources> 842 <resources>
818 <include location="resources.qrc"/> 843 <include location="resources.qrc"/>
819 </resources> 844 </resources>
app/gui/oven_control/slider.cpp
@@ -8,6 +8,7 @@ Slider::Slider(QWidget *parent) : QWidget(parent), @@ -8,6 +8,7 @@ Slider::Slider(QWidget *parent) : QWidget(parent),
8 isSliderDown_(false), 8 isSliderDown_(false),
9 sliderPosition_(0), value_(0), minimum_(0), maximum_(1), 9 sliderPosition_(0), value_(0), minimum_(0), maximum_(1),
10 subVisible_(true), 10 subVisible_(true),
  11 + focused(false), isSliderMoved_(false),
11 tickInterval(0), bigTickInterval(0) 12 tickInterval(0), bigTickInterval(0)
12 { 13 {
13 groove.load(":/images/slider/groove.png"); 14 groove.load(":/images/slider/groove.png");
@@ -95,16 +96,76 @@ int Slider::sliderPosition() @@ -95,16 +96,76 @@ int Slider::sliderPosition()
95 96
96 void Slider::setSliderPosition(int value) 97 void Slider::setSliderPosition(int value)
97 { 98 {
  99 + value = qBound(minimum_, value, maximum_);
  100 +
98 if (sliderPosition_ == value) 101 if (sliderPosition_ == value)
99 return; 102 return;
100 103
101 sliderPosition_ = value; 104 sliderPosition_ = value;
  105 + if (focused)
  106 + isSliderMoved_ = true;
102 107
103 emit sliderMoved(value); 108 emit sliderMoved(value);
104 109
105 update(); 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 void Slider::mouseMoveEvent(QMouseEvent *event) 169 void Slider::mouseMoveEvent(QMouseEvent *event)
109 { 170 {
110 if (!isSliderDown_) 171 if (!isSliderDown_)
@@ -124,12 +185,7 @@ void Slider::mouseReleaseEvent(QMouseEvent */*event*/) @@ -124,12 +185,7 @@ void Slider::mouseReleaseEvent(QMouseEvent */*event*/)
124 { 185 {
125 isSliderDown_ = false; 186 isSliderDown_ = false;
126 187
127 - if (sliderPosition_ == value_)  
128 - return;  
129 -  
130 emit sliderReleased(); 188 emit sliderReleased();
131 -  
132 - setValue(sliderPosition_);  
133 } 189 }
134 190
135 void Slider::paintEvent(QPaintEvent */*event*/) 191 void Slider::paintEvent(QPaintEvent */*event*/)
@@ -206,6 +262,7 @@ void Slider::updatePixmapPosition() @@ -206,6 +262,7 @@ void Slider::updatePixmapPosition()
206 262
207 void Slider::setValue(int value) 263 void Slider::setValue(int value)
208 { 264 {
  265 + value = qBound(minimum_, value, maximum_);
209 if (value == value_) 266 if (value == value_)
210 return; 267 return;
211 268
@@ -215,3 +272,13 @@ void Slider::setValue(int value) @@ -215,3 +272,13 @@ void Slider::setValue(int value)
215 272
216 emit valueChanged(value); 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,6 +25,8 @@ class Slider : public QWidget
25 QPoint subPoint; 25 QPoint subPoint;
26 26
27 bool subVisible_; 27 bool subVisible_;
  28 + bool focused;
  29 + bool isSliderMoved_;
28 30
29 public: 31 public:
30 explicit Slider(QWidget *parent = 0); 32 explicit Slider(QWidget *parent = 0);
@@ -44,6 +46,7 @@ public: @@ -44,6 +46,7 @@ public:
44 bool isSliderDown(); 46 bool isSliderDown();
45 int sliderPosition(); 47 int sliderPosition();
46 void setSliderPosition(int value); 48 void setSliderPosition(int value);
  49 + bool isSliderMoved();
47 50
48 QList<int> ticks; 51 QList<int> ticks;
49 QList<int> bigTicks; 52 QList<int> bigTicks;
@@ -52,6 +55,10 @@ public: @@ -52,6 +55,10 @@ public:
52 int bigTickInterval; 55 int bigTickInterval;
53 56
54 protected: 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 virtual void mouseMoveEvent(QMouseEvent *event); 62 virtual void mouseMoveEvent(QMouseEvent *event);
56 virtual void mousePressEvent(QMouseEvent *event); 63 virtual void mousePressEvent(QMouseEvent *event);
57 virtual void mouseReleaseEvent(QMouseEvent *event); 64 virtual void mouseReleaseEvent(QMouseEvent *event);
@@ -71,7 +78,8 @@ signals: @@ -71,7 +78,8 @@ signals:
71 78
72 public slots: 79 public slots:
73 void setValue(int value); 80 void setValue(int value);
74 - 81 + void increase();
  82 + void decrease();
75 }; 83 };
76 84
77 #endif // SLIDER_H 85 #endif // SLIDER_H
app/gui/oven_control/washwindow.cpp
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 #include "ui_washwindow.h" 2 #include "ui_washwindow.h"
3 3
4 #include <QSignalMapper> 4 #include <QSignalMapper>
  5 +#include <QKeyEvent>
5 6
6 #include "soundplayer.h" 7 #include "soundplayer.h"
7 #include "dirtylevel.h" 8 #include "dirtylevel.h"
@@ -53,6 +54,8 @@ WashWindow::WashWindow(QWidget *parent) : @@ -53,6 +54,8 @@ WashWindow::WashWindow(QWidget *parent) :
53 connect(button, &QPushButton::pressed, SoundPlayer::playClick); 54 connect(button, &QPushButton::pressed, SoundPlayer::playClick);
54 55
55 updateGauge(); 56 updateGauge();
  57 +
  58 + setFocus();
56 } 59 }
57 60
58 WashWindow::~WashWindow() 61 WashWindow::~WashWindow()
@@ -60,6 +63,41 @@ WashWindow::~WashWindow() @@ -60,6 +63,41 @@ WashWindow::~WashWindow()
60 delete ui; 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 void WashWindow::start(int type) 101 void WashWindow::start(int type)
64 { 102 {
65 if (selected) 103 if (selected)
@@ -273,3 +311,20 @@ void WashWindow::on_helpButton_clicked() @@ -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,16 +18,20 @@ public:
18 explicit WashWindow(QWidget *parent = 0); 18 explicit WashWindow(QWidget *parent = 0);
19 ~WashWindow(); 19 ~WashWindow();
20 20
  21 +protected:
  22 + void keyPressEvent(QKeyEvent *event);
  23 + void keyReleaseEvent(QKeyEvent *event);
  24 +
21 private slots: 25 private slots:
22 void start(int type); 26 void start(int type);
23 void stop(); 27 void stop();
24 void returnToClock(); 28 void returnToClock();
25 void updateGauge(); 29 void updateGauge();
  30 +
26 void onChanged(); 31 void onChanged();
27 - void on_backButton_clicked();  
28 32
  33 + void on_backButton_clicked();
29 void on_configButton_clicked(); 34 void on_configButton_clicked();
30 -  
31 void on_helpButton_clicked(); 35 void on_helpButton_clicked();
32 36
33 private: 37 private:
@@ -42,6 +46,12 @@ private: @@ -42,6 +46,12 @@ private:
42 int type; 46 int type;
43 47
44 QTimer returnToClockTimer; 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 #endif // WASHWINDOW_H 57 #endif // WASHWINDOW_H
app/gui/oven_control/washwindow.ui
@@ -482,7 +482,7 @@ border: none; @@ -482,7 +482,7 @@ border: none;
482 </property> 482 </property>
483 <property name="styleSheet"> 483 <property name="styleSheet">
484 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/back.png); } 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 </property> 486 </property>
487 <property name="text"> 487 <property name="text">
488 <string/> 488 <string/>
@@ -505,7 +505,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str @@ -505,7 +505,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/back_ov.png); }&lt;/str
505 </property> 505 </property>
506 <property name="styleSheet"> 506 <property name="styleSheet">
507 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/config.png); } 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 </property> 509 </property>
510 <property name="text"> 510 <property name="text">
511 <string/> 511 <string/>
@@ -528,7 +528,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s @@ -528,7 +528,7 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/config_ov.png); }&lt;/s
528 </property> 528 </property>
529 <property name="styleSheet"> 529 <property name="styleSheet">
530 <string notr="true">QPushButton { border-image: url(:/images/bottom_bar/help.png); } 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 </property> 532 </property>
533 <property name="text"> 533 <property name="text">
534 <string/> 534 <string/>
@@ -545,11 +545,11 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str @@ -545,11 +545,11 @@ QPushButton:pressed { border-image: url(:/images/bottom_bar/help_ov.png); }&lt;/str
545 </rect> 545 </rect>
546 </property> 546 </property>
547 <property name="focusPolicy"> 547 <property name="focusPolicy">
548 - <enum>Qt::NoFocus</enum> 548 + <enum>Qt::StrongFocus</enum>
549 </property> 549 </property>
550 <property name="styleSheet"> 550 <property name="styleSheet">
551 <string notr="true">QPushButton { background-image: url(:/images/wash/button_1.png); } 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 </property> 553 </property>
554 <property name="text"> 554 <property name="text">
555 <string>세제 없이 헹굼</string> 555 <string>세제 없이 헹굼</string>
@@ -568,11 +568,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }&lt;/ @@ -568,11 +568,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_1_ov.png); }&lt;/
568 </rect> 568 </rect>
569 </property> 569 </property>
570 <property name="focusPolicy"> 570 <property name="focusPolicy">
571 - <enum>Qt::NoFocus</enum> 571 + <enum>Qt::StrongFocus</enum>
572 </property> 572 </property>
573 <property name="styleSheet"> 573 <property name="styleSheet">
574 <string notr="true">QPushButton { background-image: url(:/images/wash/button_2.png); } 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 </property> 576 </property>
577 <property name="text"> 577 <property name="text">
578 <string>간이 세척</string> 578 <string>간이 세척</string>
@@ -591,11 +591,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }&lt;/ @@ -591,11 +591,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_2_ov.png); }&lt;/
591 </rect> 591 </rect>
592 </property> 592 </property>
593 <property name="focusPolicy"> 593 <property name="focusPolicy">
594 - <enum>Qt::NoFocus</enum> 594 + <enum>Qt::StrongFocus</enum>
595 </property> 595 </property>
596 <property name="styleSheet"> 596 <property name="styleSheet">
597 <string notr="true">QPushButton { background-image: url(:/images/wash/button_3.png); } 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 </property> 599 </property>
600 <property name="text"> 600 <property name="text">
601 <string>표준 세척</string> 601 <string>표준 세척</string>
@@ -614,11 +614,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }&lt;/ @@ -614,11 +614,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_3_ov.png); }&lt;/
614 </rect> 614 </rect>
615 </property> 615 </property>
616 <property name="focusPolicy"> 616 <property name="focusPolicy">
617 - <enum>Qt::NoFocus</enum> 617 + <enum>Qt::StrongFocus</enum>
618 </property> 618 </property>
619 <property name="styleSheet"> 619 <property name="styleSheet">
620 <string notr="true">QPushButton { background-image: url(:/images/wash/button_4.png); } 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 </property> 622 </property>
623 <property name="text"> 623 <property name="text">
624 <string>강 세척</string> 624 <string>강 세척</string>
@@ -637,11 +637,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }&lt;/ @@ -637,11 +637,11 @@ QPushButton::pressed { background-image: url(:/images/wash/button_4_ov.png); }&lt;/
637 </rect> 637 </rect>
638 </property> 638 </property>
639 <property name="focusPolicy"> 639 <property name="focusPolicy">
640 - <enum>Qt::NoFocus</enum> 640 + <enum>Qt::StrongFocus</enum>
641 </property> 641 </property>
642 <property name="styleSheet"> 642 <property name="styleSheet">
643 <string notr="true">QPushButton { background-image: url(:/images/wash/button_5.png); } 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 </property> 645 </property>
646 <property name="text"> 646 <property name="text">
647 <string>고속 세척</string> 647 <string>고속 세척</string>
@@ -721,6 +721,9 @@ QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }&lt;/ @@ -721,6 +721,9 @@ QPushButton::pressed { background-image: url(:/images/wash/button_5_ov.png); }&lt;/
721 <height>140</height> 721 <height>140</height>
722 </rect> 722 </rect>
723 </property> 723 </property>
  724 + <property name="focusPolicy">
  725 + <enum>Qt::NoFocus</enum>
  726 + </property>
724 <property name="styleSheet"> 727 <property name="styleSheet">
725 <string notr="true">QPushButton { image: url(:/images/slider_icon/management.png); } 728 <string notr="true">QPushButton { image: url(:/images/slider_icon/management.png); }
726 QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }</string> 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,6 +873,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }&lt;/str
870 <height>33</height> 873 <height>33</height>
871 </rect> 874 </rect>
872 </property> 875 </property>
  876 + <property name="focusPolicy">
  877 + <enum>Qt::NoFocus</enum>
  878 + </property>
873 <property name="maximum"> 879 <property name="maximum">
874 <number>5</number> 880 <number>5</number>
875 </property> 881 </property>
@@ -960,6 +966,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }&lt;/str @@ -960,6 +966,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/management_ov.png); }&lt;/str
960 <height>140</height> 966 <height>140</height>
961 </rect> 967 </rect>
962 </property> 968 </property>
  969 + <property name="focusPolicy">
  970 + <enum>Qt::NoFocus</enum>
  971 + </property>
963 <property name="styleSheet"> 972 <property name="styleSheet">
964 <string notr="true">QPushButton { image: url(:/images/slider_icon/clean.png); } 973 <string notr="true">QPushButton { image: url(:/images/slider_icon/clean.png); }
965 QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }</string> 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,6 +1118,9 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }&lt;/string&gt;
1109 <height>33</height> 1118 <height>33</height>
1110 </rect> 1119 </rect>
1111 </property> 1120 </property>
  1121 + <property name="focusPolicy">
  1122 + <enum>Qt::NoFocus</enum>
  1123 + </property>
1112 <property name="maximum"> 1124 <property name="maximum">
1113 <number>5</number> 1125 <number>5</number>
1114 </property> 1126 </property>
@@ -1180,6 +1192,16 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }&lt;/string&gt; @@ -1180,6 +1192,16 @@ QPushButton:pressed { image: url(:/images/slider_icon/clean_ov.png); }&lt;/string&gt;
1180 <container>1</container> 1192 <container>1</container>
1181 </customwidget> 1193 </customwidget>
1182 </customwidgets> 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 <resources> 1205 <resources>
1184 <include location="resources.qrc"/> 1206 <include location="resources.qrc"/>
1185 </resources> 1207 </resources>