百人一首かるた自動読み上げソフト
修訂 | 12f3ed27131e15a73619f9d527f91cb6806fda0a (tree) |
---|---|
時間 | 2011-12-26 16:52:02 |
作者 | arakaki <alucky4416@user...> |
Commiter | arakaki |
ADD: Add OptionDialog(SelectMusicFiles), Change .pro(replace abs path to 5040PWD)
@@ -10,10 +10,16 @@ PlaySequenceThread::PlaySequenceThread(WId winId) | ||
10 | 10 | { |
11 | 11 | // Init my task |
12 | 12 | stopped = false; |
13 | -// fnamefmt = "inaba_%03d_%1d.ogg"; | |
14 | -// fnamefmt = "yamajun_%03d_%1d.ogg"; | |
15 | - fnamefmt = "yamajun_%03d_%1d.ogg"; | |
16 | - MusicFileDirPath = QCoreApplication::applicationDirPath() + QDir::separator() + tr("Music"); | |
13 | + | |
14 | + // const setting | |
15 | + SelectVoice = 0; | |
16 | + MusicFolderName1 = tr("Music"); | |
17 | + MusicFolderName2 = tr("Music2"); | |
18 | + fnamefmt1 = "yamajun_%03d_%1d.ogg"; | |
19 | + fnamefmt2 = "inaba_%03d_%1d.ogg"; | |
20 | + | |
21 | + fnamefmt = fnamefmt1; // set default | |
22 | + MusicFileDirPath = QCoreApplication::applicationDirPath() + QDir::separator() + MusicFolderName1; // set default | |
17 | 23 | Wait1_sec = 1; |
18 | 24 | Wait2_sec = 3; |
19 | 25 | PlayNumList = NULL; |
@@ -95,10 +101,11 @@ void PlaySequenceThread::SetMusicDir(const QString &dirpath) | ||
95 | 101 | MusicFileDirPath = dirpath; |
96 | 102 | } |
97 | 103 | |
98 | -void PlaySequenceThread::SetPlaySetting(int Wait1Time_sec, int Wait2Time_sec) | |
104 | +void PlaySequenceThread::SetPlaySetting(int slctvoice, int Wait1Time_sec, int Wait2Time_sec) | |
99 | 105 | { |
100 | 106 | if (state != IDLE) return; |
101 | 107 | |
108 | + SelectVoice = slctvoice; | |
102 | 109 | Wait1_sec = Wait1Time_sec; |
103 | 110 | Wait2_sec = Wait2Time_sec; |
104 | 111 | } |
@@ -138,6 +145,17 @@ QString PlaySequenceThread::GetMusicFilePath(int FudaN, int KamiShimo) | ||
138 | 145 | { |
139 | 146 | QString filepath; |
140 | 147 | QString dmy; |
148 | +// MusicFolderName1 = tr("Music"); | |
149 | +// MusicFolderName2 = tr("Music2"); | |
150 | +// fnamefmt1 = "yamajun_%03d_%1d.ogg"; | |
151 | +// fnamefmt2 = "yamajun_%03d_%1d.ogg"; | |
152 | + if (0 == SelectVoice) { | |
153 | + fnamefmt = fnamefmt1; | |
154 | + MusicFileDirPath = QCoreApplication::applicationDirPath() + QDir::separator() + MusicFolderName1; | |
155 | + } else { | |
156 | + fnamefmt = fnamefmt2; | |
157 | + MusicFileDirPath = QCoreApplication::applicationDirPath() + QDir::separator() + MusicFolderName2; | |
158 | + } | |
141 | 159 | filepath = MusicFileDirPath + QDir::separator() + dmy.sprintf(fnamefmt.toLocal8Bit(), FudaN, KamiShimo); |
142 | 160 | return filepath; |
143 | 161 | } |
@@ -20,7 +20,7 @@ public: | ||
20 | 20 | |
21 | 21 | void SetPlayNumList(QList<int> *); |
22 | 22 | void SetMusicDir(const QString &dirpath); |
23 | - void SetPlaySetting(int Wait1Time_sec, int Wait2Time_sec); | |
23 | + void SetPlaySetting(int slctvoice, int Wait1Time_sec, int Wait2Time_sec); | |
24 | 24 | int GetPlayStatus(); |
25 | 25 | int GetPlayFudaNum(); |
26 | 26 | void Start(); |
@@ -67,9 +67,13 @@ private: | ||
67 | 67 | |
68 | 68 | QQueue<int> *EvtQue; // EventQue |
69 | 69 | |
70 | + int SelectVoice; // SelectVoice, 0 or 1 | |
71 | + QString MusicFolderName1; // "Music" | |
72 | + QString MusicFolderName2; // "Music2" | |
73 | + QString fnamefmt1; // filename format, "yamajun_%03d_%1d.ogg" | |
74 | + QString fnamefmt2; // filename format, "inaba_%03d_%1d.ogg" | |
70 | 75 | QString MusicFileDirPath; |
71 | - // QString fnamefmt = "yamajun_%03d_%1d.ogg"; | |
72 | - QString fnamefmt; // filename format, "yamajun_%03d_%1d.ogg" | |
76 | + QString fnamefmt; // filename format | |
73 | 77 | int ListIndex; |
74 | 78 | int PlayListCount; |
75 | 79 | QList<int> *PlayNumList; |
@@ -14,20 +14,25 @@ SOURCES += main.cpp \ | ||
14 | 14 | mainwindow.cpp \ |
15 | 15 | PlayMusicThread.cpp \ |
16 | 16 | PlaySequenceThread.cpp \ |
17 | - fudaselectdlg.cpp | |
17 | + fudaselectdlg.cpp \ | |
18 | + optiondialog.cpp | |
18 | 19 | |
19 | 20 | HEADERS += mainwindow.h \ |
20 | 21 | PlayMusicThread.h \ |
21 | 22 | PlaySequenceThread.h \ |
22 | 23 | fudaselectdlg.h \ |
23 | - textrsc.h | |
24 | + textrsc.h \ | |
25 | + optiondialog.h | |
24 | 26 | |
25 | 27 | FORMS += mainwindow.ui \ |
26 | - fudaselectdlg.ui | |
28 | + fudaselectdlg.ui \ | |
29 | + optiondialog.ui | |
27 | 30 | |
28 | -win32:INCLUDEPATH += d:/SugarSync/QtWork/QtKarutaEishow/libbass/ | |
31 | +#win32:INCLUDEPATH += d:/SugarSync/QtWork/QtKarutaEishow/libbass/ | |
32 | +win32:INCLUDEPATH += $$PWD/libbass/ | |
29 | 33 | |
30 | -win32:LIBS += d:/SugarSync/QtWork/QtKarutaEishow/libbass/libbass.dll.a | |
34 | +#win32:LIBS += d:/SugarSync/QtWork/QtKarutaEishow/libbass/libbass.dll.a | |
35 | +win32:LIBS += $$PWD/libbass/libbass.dll.a | |
31 | 36 | unix:LIBS += -lbass |
32 | 37 | |
33 | 38 | RESOURCES += \ |
@@ -2,6 +2,9 @@ | ||
2 | 2 | <ui version="4.0"> |
3 | 3 | <class>FudaSelectDlg</class> |
4 | 4 | <widget class="QDialog" name="FudaSelectDlg"> |
5 | + <property name="windowModality"> | |
6 | + <enum>Qt::ApplicationModal</enum> | |
7 | + </property> | |
5 | 8 | <property name="geometry"> |
6 | 9 | <rect> |
7 | 10 | <x>0</x> |
@@ -11,7 +14,7 @@ | ||
11 | 14 | </rect> |
12 | 15 | </property> |
13 | 16 | <property name="windowTitle"> |
14 | - <string>札選択</string> | |
17 | + <string>Fuda</string> | |
15 | 18 | </property> |
16 | 19 | <widget class="QDialogButtonBox" name="buttonBox"> |
17 | 20 | <property name="geometry"> |
@@ -4,6 +4,7 @@ | ||
4 | 4 | #include "mainwindow.h" |
5 | 5 | #include "ui_mainwindow.h" |
6 | 6 | #include "fudaselectdlg.h" |
7 | +#include "optiondialog.h" | |
7 | 8 | |
8 | 9 | #include "textrsc.h" // kamiku text resource |
9 | 10 |
@@ -40,7 +41,7 @@ MainWindow::MainWindow(QWidget *parent) : | ||
40 | 41 | QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // source codec is UTF-8 |
41 | 42 | |
42 | 43 | QCoreApplication::setApplicationName("QtKarutaEishow"); |
43 | - QCoreApplication::setApplicationVersion("1.0 beta7"); | |
44 | + QCoreApplication::setApplicationVersion("1.0 beta8"); | |
44 | 45 | this->setWindowTitle(QCoreApplication::applicationName()); |
45 | 46 | IniFilePath = QCoreApplication::applicationDirPath() + QDir::separator() + QCoreApplication::applicationName() + ".ini"; |
46 | 47 |
@@ -54,21 +55,32 @@ MainWindow::MainWindow(QWidget *parent) : | ||
54 | 55 | |
55 | 56 | // Load Setting |
56 | 57 | LoadSaveSetting(IniFilePath, false); |
57 | - | |
58 | - // Initialize PlayFudaList | |
59 | - PlayFudaList = new QList<int>(); | |
60 | - PlayFudaList->clear(); | |
61 | - | |
62 | - flag_playseqstate = false; | |
63 | - flag_pause = false; | |
64 | - | |
65 | 58 | // Play setting |
59 | + EnableOptMusic = true; | |
60 | + if(SelectVoice != 0) { | |
61 | + // Check MusicFiles, != 0 is Optional Musicfiles is "Music2", "inaba_%03d_%d.ogg" | |
62 | + QString CheckFilepath = QCoreApplication::applicationDirPath() + QDir::separator() + tr("Music2") + QDir::separator() + tr("inaba_000_2.ogg"); | |
63 | + QFileInfo CheckFile(CheckFilepath); | |
64 | +// if (QDir::exists(CheckFilepath)) { | |
65 | + if (CheckFile.exists()) { | |
66 | + ; | |
67 | + } else { // file Not Exist | |
68 | + EnableOptMusic = false; | |
69 | + SelectVoice = 0; | |
70 | + } | |
71 | + } | |
66 | 72 | // chk_joka = true; |
67 | 73 | // Wait1Time = 10; |
68 | 74 | // Wait2Time = 3; |
69 | 75 | ui->checkBox->setChecked(chk_joka); |
70 | 76 | ui->spinBox_1->setValue(Wait1Time); |
71 | 77 | ui->spinBox_2->setValue(Wait2Time); |
78 | + | |
79 | + // Initialize PlayFudaList | |
80 | + PlayFudaList = new QList<int>(); | |
81 | + PlayFudaList->clear(); | |
82 | + flag_playseqstate = false; | |
83 | + flag_pause = false; | |
72 | 84 | PlayCounter = 0; |
73 | 85 | PlayListCount = 0; |
74 | 86 | // statusBar |
@@ -170,7 +182,7 @@ void MainWindow::on_Btn_Start_clicked() | ||
170 | 182 | PlayFudaList->insert(0, 0); // fudaN=0 insert to top |
171 | 183 | } |
172 | 184 | // Set Play Setting |
173 | - PlaySeqTh->SetPlaySetting(Wait1Time, Wait2Time); | |
185 | + PlaySeqTh->SetPlaySetting(SelectVoice, Wait1Time, Wait2Time); | |
174 | 186 | // Set Play Music Folder |
175 | 187 | ; |
176 | 188 | // Set Play list |
@@ -241,7 +253,7 @@ void MainWindow::Music2Starteded(int fudaNum) | ||
241 | 253 | // SLOT |
242 | 254 | void MainWindow::Music2Ended() |
243 | 255 | { |
244 | - ui->statusBar->clearMessage(); | |
256 | +// ui->statusBar->clearMessage(); | |
245 | 257 | |
246 | 258 | // qDebug() << "Music2Ended"; |
247 | 259 | } |
@@ -286,6 +298,29 @@ void MainWindow::on_actionFuda_triggered() | ||
286 | 298 | on_Btn_FudaSelect_clicked(); |
287 | 299 | } |
288 | 300 | |
301 | + | |
302 | +void MainWindow::on_actionOption_triggered() | |
303 | +{ | |
304 | + if (flag_playseqstate) return; // disable when Playing | |
305 | + | |
306 | + OptionDialog *dlg = new OptionDialog(this, SelectVoice, EnableOptMusic); | |
307 | + | |
308 | +// dlg->Set_Opt_voice_select(SelectVoice); | |
309 | + | |
310 | + int i = dlg->exec(); | |
311 | + if (i == QDialog::Accepted) { | |
312 | + // qDebug() << "Ok"; | |
313 | + SelectVoice = dlg->Get_Opt_voice_select(); | |
314 | + qDebug() << QString("Select %1").arg(SelectVoice); | |
315 | + } else if (i == QDialog::Rejected) { | |
316 | +// qDebug() << "Cancel"; | |
317 | + } else { | |
318 | +// qDebug() << "Unkown"; | |
319 | + } | |
320 | + | |
321 | + delete dlg; | |
322 | +} | |
323 | + | |
289 | 324 | QString FudaList_ToCSVString(QList<int> *list) |
290 | 325 | { |
291 | 326 | QString csvstr; |
@@ -310,13 +345,15 @@ void MainWindow::LoadSaveSetting(QString filepath, bool store = false) | ||
310 | 345 | settings.setValue("SETTING/chk_joka", chk_joka); |
311 | 346 | settings.setValue("SETTING/Wait1Time", Wait1Time); |
312 | 347 | settings.setValue("SETTING/Wait2Time", Wait2Time); |
348 | + settings.setValue("SETTING/SelectVoice", SelectVoice); | |
313 | 349 | settings.setValue("SETTING/FudaList", FudaListStr); |
314 | 350 | |
315 | 351 | } else { |
316 | 352 | // Load |
317 | - chk_joka = settings.value("SETTING/chk_joka", true).toBool(); | |
318 | - Wait1Time = settings.value("SETTING/Wait1Time", 10).toInt(); | |
319 | - Wait2Time = settings.value("SETTING/Wait2Time", 3).toInt(); | |
353 | + chk_joka = settings.value("SETTING/chk_joka", true).toBool(); | |
354 | + Wait1Time = settings.value("SETTING/Wait1Time", 10).toInt(); | |
355 | + Wait2Time = settings.value("SETTING/Wait2Time", 3).toInt(); | |
356 | + SelectVoice = settings.value("SETTING/SelectVoice", 0).toInt(); | |
320 | 357 | |
321 | 358 | QString FudaListStr(settings.value("SETTING/FudaList", QString("")).toString()); |
322 | 359 | // qDebug() << "FudaListStr is " << FudaListStr; |
@@ -45,6 +45,8 @@ private slots: | ||
45 | 45 | void Music2Ended(); |
46 | 46 | void SequenceEnded(int status); // status 0 is success, !0 is Fail |
47 | 47 | |
48 | + void on_actionOption_triggered(); | |
49 | + | |
48 | 50 | private: |
49 | 51 | Ui::MainWindow *ui; |
50 | 52 |
@@ -61,6 +63,8 @@ private: | ||
61 | 63 | bool chk_joka; // joka yomiage |
62 | 64 | int Wait1Time; // Interval kami-shimo |
63 | 65 | int Wait2Time; // Interval next |
66 | + int SelectVoice; // select MusicFiles 0 = "Music" or 1 = "Music2" | |
67 | + bool EnableOptMusic; // OptDialog, Enable Select Music2 | |
64 | 68 | |
65 | 69 | int PlayCounter; |
66 | 70 | int PlayListCount; |
@@ -344,6 +344,7 @@ | ||
344 | 344 | <property name="title"> |
345 | 345 | <string>Edit</string> |
346 | 346 | </property> |
347 | + <addaction name="actionOption"/> | |
347 | 348 | <addaction name="actionFuda"/> |
348 | 349 | </widget> |
349 | 350 | <addaction name="menuFile"/> |
@@ -382,6 +383,11 @@ | ||
382 | 383 | <string>Fuda</string> |
383 | 384 | </property> |
384 | 385 | </action> |
386 | + <action name="actionOption"> | |
387 | + <property name="text"> | |
388 | + <string>Option</string> | |
389 | + </property> | |
390 | + </action> | |
385 | 391 | </widget> |
386 | 392 | <layoutdefault spacing="6" margin="11"/> |
387 | 393 | <resources> |
@@ -0,0 +1,59 @@ | ||
1 | +#include "optiondialog.h" | |
2 | +#include "ui_optiondialog.h" | |
3 | + | |
4 | +//void OptionDialog::Set_Opt_voice_select(int select) | |
5 | +//{ | |
6 | +// opt_voice_select = select; | |
7 | +//} | |
8 | + | |
9 | +int OptionDialog::Get_Opt_voice_select() | |
10 | +{ | |
11 | + return opt_voice_select; | |
12 | +} | |
13 | + | |
14 | +OptionDialog::OptionDialog(QWidget *parent, int select, bool enableOptMusic) : | |
15 | + QDialog(parent), | |
16 | + ui(new Ui::OptionDialog) | |
17 | +{ | |
18 | + ui->setupUi(this); | |
19 | + | |
20 | + if (enableOptMusic) { | |
21 | + ui->radioButton_2->setEnabled(true); | |
22 | + } else { | |
23 | + ui->radioButton_2->setEnabled(false); | |
24 | + } | |
25 | + | |
26 | + opt_voice_select = select; | |
27 | + if (opt_voice_select == 0) { | |
28 | + ui->radioButton_1->setChecked(true); | |
29 | + ui->radioButton_2->setChecked(false); | |
30 | + } else { | |
31 | + ui->radioButton_1->setChecked(false); | |
32 | + ui->radioButton_2->setChecked(true); | |
33 | + } | |
34 | +} | |
35 | + | |
36 | +OptionDialog::~OptionDialog() | |
37 | +{ | |
38 | + delete ui; | |
39 | +} | |
40 | + | |
41 | +void OptionDialog::on_buttonBox_accepted() | |
42 | +{ | |
43 | + if (ui->radioButton_1->isChecked()) { | |
44 | + opt_voice_select = 0; | |
45 | + } else { | |
46 | + opt_voice_select = 1; | |
47 | + } | |
48 | +} | |
49 | + | |
50 | +void OptionDialog::on_buttonBox_rejected() | |
51 | +{ | |
52 | + ; | |
53 | +} | |
54 | + | |
55 | +void OptionDialog::on_Btn_TestPlay_clicked() | |
56 | +{ | |
57 | + // select Voice Test Playing | |
58 | + ; | |
59 | +} |
@@ -0,0 +1,33 @@ | ||
1 | +#ifndef OPTIONDIALOG_H | |
2 | +#define OPTIONDIALOG_H | |
3 | + | |
4 | +#include <QDialog> | |
5 | + | |
6 | +namespace Ui { | |
7 | + class OptionDialog; | |
8 | +} | |
9 | + | |
10 | +class OptionDialog : public QDialog | |
11 | +{ | |
12 | + Q_OBJECT | |
13 | + | |
14 | +public: | |
15 | + explicit OptionDialog(QWidget *parent = 0, int select = 0, bool enableOptMusic = false); | |
16 | + ~OptionDialog(); | |
17 | + | |
18 | +// void Set_Opt_voice_select(int select); | |
19 | + int Get_Opt_voice_select(); | |
20 | + | |
21 | +private slots: | |
22 | + void on_buttonBox_accepted(); | |
23 | + void on_buttonBox_rejected(); | |
24 | + | |
25 | + void on_Btn_TestPlay_clicked(); | |
26 | + | |
27 | +private: | |
28 | + Ui::OptionDialog *ui; | |
29 | + | |
30 | + int opt_voice_select; // select Music Files Group, 0 or 1 | |
31 | +}; | |
32 | + | |
33 | +#endif // OPTIONDIALOG_H |
@@ -0,0 +1,151 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<ui version="4.0"> | |
3 | + <class>OptionDialog</class> | |
4 | + <widget class="QDialog" name="OptionDialog"> | |
5 | + <property name="windowModality"> | |
6 | + <enum>Qt::ApplicationModal</enum> | |
7 | + </property> | |
8 | + <property name="geometry"> | |
9 | + <rect> | |
10 | + <x>0</x> | |
11 | + <y>0</y> | |
12 | + <width>353</width> | |
13 | + <height>178</height> | |
14 | + </rect> | |
15 | + </property> | |
16 | + <property name="minimumSize"> | |
17 | + <size> | |
18 | + <width>353</width> | |
19 | + <height>178</height> | |
20 | + </size> | |
21 | + </property> | |
22 | + <property name="maximumSize"> | |
23 | + <size> | |
24 | + <width>353</width> | |
25 | + <height>178</height> | |
26 | + </size> | |
27 | + </property> | |
28 | + <property name="windowTitle"> | |
29 | + <string>Option</string> | |
30 | + </property> | |
31 | + <widget class="QDialogButtonBox" name="buttonBox"> | |
32 | + <property name="geometry"> | |
33 | + <rect> | |
34 | + <x>160</x> | |
35 | + <y>130</y> | |
36 | + <width>161</width> | |
37 | + <height>32</height> | |
38 | + </rect> | |
39 | + </property> | |
40 | + <property name="orientation"> | |
41 | + <enum>Qt::Horizontal</enum> | |
42 | + </property> | |
43 | + <property name="standardButtons"> | |
44 | + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | |
45 | + </property> | |
46 | + </widget> | |
47 | + <widget class="QRadioButton" name="radioButton_1"> | |
48 | + <property name="geometry"> | |
49 | + <rect> | |
50 | + <x>60</x> | |
51 | + <y>60</y> | |
52 | + <width>111</width> | |
53 | + <height>20</height> | |
54 | + </rect> | |
55 | + </property> | |
56 | + <property name="text"> | |
57 | + <string>音声1 (女性)</string> | |
58 | + </property> | |
59 | + <attribute name="buttonGroup"> | |
60 | + <string>buttonGroup_voice</string> | |
61 | + </attribute> | |
62 | + </widget> | |
63 | + <widget class="QRadioButton" name="radioButton_2"> | |
64 | + <property name="geometry"> | |
65 | + <rect> | |
66 | + <x>60</x> | |
67 | + <y>90</y> | |
68 | + <width>111</width> | |
69 | + <height>16</height> | |
70 | + </rect> | |
71 | + </property> | |
72 | + <property name="text"> | |
73 | + <string>音声2 (男性)</string> | |
74 | + </property> | |
75 | + <attribute name="buttonGroup"> | |
76 | + <string>buttonGroup_voice</string> | |
77 | + </attribute> | |
78 | + </widget> | |
79 | + <widget class="QLabel" name="label"> | |
80 | + <property name="geometry"> | |
81 | + <rect> | |
82 | + <x>40</x> | |
83 | + <y>20</y> | |
84 | + <width>111</width> | |
85 | + <height>16</height> | |
86 | + </rect> | |
87 | + </property> | |
88 | + <property name="text"> | |
89 | + <string>詠唱する音声の選択</string> | |
90 | + </property> | |
91 | + </widget> | |
92 | + <widget class="QPushButton" name="Btn_TestPlay"> | |
93 | + <property name="enabled"> | |
94 | + <bool>false</bool> | |
95 | + </property> | |
96 | + <property name="geometry"> | |
97 | + <rect> | |
98 | + <x>180</x> | |
99 | + <y>70</y> | |
100 | + <width>75</width> | |
101 | + <height>23</height> | |
102 | + </rect> | |
103 | + </property> | |
104 | + <property name="text"> | |
105 | + <string>Test</string> | |
106 | + </property> | |
107 | + </widget> | |
108 | + </widget> | |
109 | + <resources/> | |
110 | + <connections> | |
111 | + <connection> | |
112 | + <sender>buttonBox</sender> | |
113 | + <signal>accepted()</signal> | |
114 | + <receiver>OptionDialog</receiver> | |
115 | + <slot>accept()</slot> | |
116 | + <hints> | |
117 | + <hint type="sourcelabel"> | |
118 | + <x>248</x> | |
119 | + <y>254</y> | |
120 | + </hint> | |
121 | + <hint type="destinationlabel"> | |
122 | + <x>157</x> | |
123 | + <y>274</y> | |
124 | + </hint> | |
125 | + </hints> | |
126 | + </connection> | |
127 | + <connection> | |
128 | + <sender>buttonBox</sender> | |
129 | + <signal>rejected()</signal> | |
130 | + <receiver>OptionDialog</receiver> | |
131 | + <slot>reject()</slot> | |
132 | + <hints> | |
133 | + <hint type="sourcelabel"> | |
134 | + <x>316</x> | |
135 | + <y>260</y> | |
136 | + </hint> | |
137 | + <hint type="destinationlabel"> | |
138 | + <x>286</x> | |
139 | + <y>274</y> | |
140 | + </hint> | |
141 | + </hints> | |
142 | + </connection> | |
143 | + </connections> | |
144 | + <buttongroups> | |
145 | + <buttongroup name="buttonGroup_voice"> | |
146 | + <property name="exclusive"> | |
147 | + <bool>true</bool> | |
148 | + </property> | |
149 | + </buttongroup> | |
150 | + </buttongroups> | |
151 | +</ui> |