First attempt to implement RC6 Protocol
[pierogi] / mainwindow.cpp
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3 #include "pirkeysetwidgetitem.h"
4
5 //#include "pirexception.h"
6
7 #include <QtCore/QCoreApplication>
8 #include <QMutex>
9 #include <QtGui/QMessageBox>
10 #include <QSettings>
11 //#include <QDesktopServices>
12 //#include <QUrl>
13
14 //#include <iostream>
15
16 //#define DEBUGGING
17
18 // Some ugly globals used for thread communications:
19
20 // A global to show that a command is being processed:
21 bool commandInFlight = false;
22 QMutex commandIFMutex;
23
24 // The stopRepeatingFlag boolean is the method used to tell running commands
25 // in the worker thread to stop:
26 bool stopRepeatingFlag = false;
27 QMutex stopRepeatingMutex;
28
29 extern PIRMakeMgr makeManager;
30
31
32 MainWindow::MainWindow(QWidget *parent)
33   : QMainWindow(parent),
34     ui(new Ui::MainWindow),
35     selectKeysetForm(0),
36     documentationForm(0),
37     aboutForm(0),
38     currentKeyset(0)
39 {
40   ui->setupUi(this);
41
42   // Make this a Maemo 5 stacked widget:
43   setAttribute(Qt::WA_Maemo5StackedWindow);
44
45   // Collect the keysets:
46   myKeysets = new PIRKeysetManager(this);
47
48   // Set up the keyset selection window:
49   selectKeysetForm = new PIRSelectKeysetForm(this);
50
51   myKeysets->populateGuiWidget(selectKeysetForm);
52
53   // Remember any favorites the user has already set:
54   populateFavorites();
55
56   QSettings settings("pietrzak.org", "Pierogi");
57   if (settings.contains("currentKeyset"))
58   {
59     currentKeyset = settings.value("currentKeyset").toInt();
60   }
61
62   enableButtons();
63
64   connect(
65     ui->favoriteKeysetsWidget,
66     SIGNAL(itemActivated(QListWidgetItem *)),
67     this,
68     SLOT(keysetSelectionChanged(QListWidgetItem *)),
69     Qt::QueuedConnection);
70
71   // Make sure the two selection lists don't show different selections:
72   QListWidget *klw = selectKeysetForm->getKeysetListWidget();
73   connect(
74     ui->favoriteKeysetsWidget,
75     SIGNAL(itemActivated(QListWidgetItem *)),
76     klw,
77     SLOT(clearSelection()),
78     Qt::QueuedConnection);
79
80   connect(
81     klw,
82     SIGNAL(itemActivated(QListWidgetItem *)),
83     ui->favoriteKeysetsWidget,
84     SLOT(clearSelection()),
85     Qt::QueuedConnection);
86
87 #ifndef DEBUGGING
88   // The PIRModprobe object should take care of setting up and shutting down
89   // the lirc_rx51 kernel module, if necessary:
90  
91   if (modprobeObj.loadRX51Module() != 0)
92   {
93     // Couldn't load module, quit:
94     QMessageBox errBox;
95     errBox.setText("Couldn't load lirc_rx51 kernel module!");
96     errBox.setIcon(QMessageBox::Warning);
97     errBox.exec();
98 //    throw; // Need a clean way to exit here!!!
99   }
100 #endif
101 }
102
103
104 MainWindow::~MainWindow()
105 {
106   delete myKeysets;
107   if (selectKeysetForm) delete selectKeysetForm;
108   if (documentationForm) delete documentationForm;
109   if (aboutForm) delete aboutForm;
110   delete ui;
111 }
112
113
114 void MainWindow::setOrientation(ScreenOrientation orientation)
115 {
116 #if defined(Q_OS_SYMBIAN)
117     // If the version of Qt on the device is < 4.7.2, that attribute won't work
118     if (orientation != ScreenOrientationAuto) {
119         const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
120         if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
121             qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
122             return;
123         }
124     }
125 #endif // Q_OS_SYMBIAN
126
127     Qt::WidgetAttribute attribute;
128     switch (orientation) {
129 #if QT_VERSION < 0x040702
130     // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
131     case ScreenOrientationLockPortrait:
132         attribute = static_cast<Qt::WidgetAttribute>(128);
133         break;
134     case ScreenOrientationLockLandscape:
135         attribute = static_cast<Qt::WidgetAttribute>(129);
136         break;
137     default:
138     case ScreenOrientationAuto:
139         attribute = static_cast<Qt::WidgetAttribute>(130);
140         break;
141 #else // QT_VERSION < 0x040702
142     case ScreenOrientationLockPortrait:
143         attribute = Qt::WA_LockPortraitOrientation;
144         break;
145     case ScreenOrientationLockLandscape:
146         attribute = Qt::WA_LockLandscapeOrientation;
147         break;
148     default:
149     case ScreenOrientationAuto:
150         attribute = Qt::WA_AutoOrientation;
151         break;
152 #endif // QT_VERSION < 0x040702
153     };
154     setAttribute(attribute, true);
155 }
156
157 void MainWindow::showExpanded()
158 {
159 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_SIMULATOR)
160     showFullScreen();
161 #elif defined(Q_WS_MAEMO_5)
162     showMaximized();
163 #else
164     show();
165 #endif
166 }
167
168
169 void MainWindow::enableButtons()
170 {
171   // This is going to be a little painful...
172   // Main keys
173   emit powerEnabled(myKeysets->hasKey(currentKeyset, Power_Key));
174   emit volumeUpEnabled(myKeysets->hasKey(currentKeyset, VolumeUp_Key));
175   emit volumeDownEnabled(myKeysets->hasKey(currentKeyset, VolumeDown_Key));
176   emit channelUpEnabled(myKeysets->hasKey(currentKeyset, ChannelUp_Key));
177   emit channelDownEnabled(myKeysets->hasKey(currentKeyset, ChannelDown_Key));
178
179   // Utility keys:
180   emit redEnabled(myKeysets->hasKey(currentKeyset, Red_Key));
181   emit greenEnabled(myKeysets->hasKey(currentKeyset, Green_Key));
182   emit yellowEnabled(myKeysets->hasKey(currentKeyset, Yellow_Key));
183   emit blueEnabled(myKeysets->hasKey(currentKeyset, Blue_Key));
184   emit aspectRatioEnabled(myKeysets->hasKey(currentKeyset, AspectRatio_Key));
185   emit surroundEnabled(myKeysets->hasKey(currentKeyset, Surround_Key));
186   emit languageEnabled(myKeysets->hasKey(currentKeyset, Language_Key));
187   emit favoritesEnabled(myKeysets->hasKey(currentKeyset, Favorites_Key));
188   emit captionsEnabled(myKeysets->hasKey(currentKeyset, Captions_Key));
189   emit sleepEnabled(myKeysets->hasKey(currentKeyset, Sleep_Key));
190   emit inputEnabled(myKeysets->hasKey(currentKeyset, Input_Key));
191   emit muteEnabled(myKeysets->hasKey(currentKeyset, Mute_Key));
192
193   // Keypad keys
194   emit zeroEnabled(myKeysets->hasKey(currentKeyset, Zero_Key));
195   emit oneEnabled(myKeysets->hasKey(currentKeyset, One_Key));
196   emit twoEnabled(myKeysets->hasKey(currentKeyset, Two_Key));
197   emit threeEnabled(myKeysets->hasKey(currentKeyset, Three_Key));
198   emit fourEnabled(myKeysets->hasKey(currentKeyset, Four_Key));
199   emit fiveEnabled(myKeysets->hasKey(currentKeyset, Five_Key));
200   emit sixEnabled(myKeysets->hasKey(currentKeyset, Six_Key));
201   emit sevenEnabled(myKeysets->hasKey(currentKeyset, Seven_Key));
202   emit eightEnabled(myKeysets->hasKey(currentKeyset, Eight_Key));
203   emit nineEnabled(myKeysets->hasKey(currentKeyset, Nine_Key));
204   emit enterEnabled(myKeysets->hasKey(currentKeyset, Enter_Key));
205   emit clearEnabled(myKeysets->hasKey(currentKeyset, Clear_Key));
206   emit dashEnabled(myKeysets->hasKey(currentKeyset, Dash_Key));
207   emit plusOneHundredEnabled(myKeysets->hasKey(currentKeyset, PlusOneHundred_Key));
208   emit doubleDigitEnabled(myKeysets->hasKey(currentKeyset, DoubleDigit_Key));
209   emit prevChannelEnabled(myKeysets->hasKey(currentKeyset, PrevChannel_Key));
210
211   // Menu keys:
212   emit menuEnabled(myKeysets->hasKey(currentKeyset, Menu_Key));
213   emit upEnabled(myKeysets->hasKey(currentKeyset, Up_Key));
214   emit downEnabled(myKeysets->hasKey(currentKeyset, Down_Key));
215   emit leftEnabled(myKeysets->hasKey(currentKeyset, Left_Key));
216   emit rightEnabled(myKeysets->hasKey(currentKeyset, Right_Key));
217   emit selectEnabled(myKeysets->hasKey(currentKeyset, Select_Key));
218   emit exitEnabled(myKeysets->hasKey(currentKeyset, Exit_Key));
219   emit infoEnabled(myKeysets->hasKey(currentKeyset, Info_Key));
220   emit guideEnabled(myKeysets->hasKey(currentKeyset, Guide_Key));
221
222   // Media keys:
223   emit playEnabled(myKeysets->hasKey(currentKeyset, Play_Key));
224   emit pauseEnabled(myKeysets->hasKey(currentKeyset, Pause_Key));
225   emit stopEnabled(myKeysets->hasKey(currentKeyset, Stop_Key));
226   emit fastForwardEnabled(myKeysets->hasKey(currentKeyset, FastForward_Key));
227   emit reverseEnabled(myKeysets->hasKey(currentKeyset, Rewind_Key));
228   emit nextEnabled(myKeysets->hasKey(currentKeyset, Next_Key));
229   emit previousEnabled(myKeysets->hasKey(currentKeyset, Previous_Key));
230   emit stepForwardEnabled(myKeysets->hasKey(currentKeyset, StepForward_Key));
231   emit stepBackEnabled(myKeysets->hasKey(currentKeyset, StepBack_Key));
232   emit advanceEnabled(myKeysets->hasKey(currentKeyset, Advance_Key));
233   emit replayEnabled(myKeysets->hasKey(currentKeyset, Replay_Key));
234   emit ejectEnabled(myKeysets->hasKey(currentKeyset, Eject_Key));
235
236   // Other keys:
237   emit pipEnabled(myKeysets->hasKey(currentKeyset, PIP_Key));
238   emit pipSwapEnabled(myKeysets->hasKey(currentKeyset, PIPSwap_Key));
239   emit pipMoveEnabled(myKeysets->hasKey(currentKeyset, PIPMove_Key));
240   emit pipSourceEnabled(myKeysets->hasKey(currentKeyset, PIPSource_Key));
241   emit scanEnabled(myKeysets->hasKey(currentKeyset, Scan_Key));
242   emit programEnabled(myKeysets->hasKey(currentKeyset, Program_Key));
243   emit pictureModeEnabled(myKeysets->hasKey(currentKeyset, PictureMode_Key));
244   emit soundModeEnabled(myKeysets->hasKey(currentKeyset, SoundMode_Key));
245   emit discTitleEnabled(myKeysets->hasKey(currentKeyset, DiscTitle_Key));
246   emit discMenuEnabled(myKeysets->hasKey(currentKeyset, DiscMenu_Key));
247   emit discSelectEnabled(myKeysets->hasKey(currentKeyset, DiscSelect_Key));
248   emit recordEnabled(myKeysets->hasKey(currentKeyset, Record_Key));
249   emit trackingMinusEnabled(myKeysets->hasKey(currentKeyset, TrackingMinus_Key));
250   emit trackingPlusEnabled(myKeysets->hasKey(currentKeyset, TrackingPlus_Key));
251   emit autoTrackingEnabled(myKeysets->hasKey(currentKeyset, AutoTracking_Key));
252   emit vhsSpeedEnabled(myKeysets->hasKey(currentKeyset, VHSSpeed_Key));
253
254   emit keysetMakeChanged(
255     makeManager.getMakeString(myKeysets->getMake(currentKeyset)));
256
257   emit keysetNameChanged(myKeysets->getDisplayName(currentKeyset));
258 }
259
260
261 void MainWindow::receivedExternalWarning(
262   const char *warning)
263 {
264   QMessageBox errBox;
265   errBox.setText(warning);
266   errBox.setIcon(QMessageBox::Warning);
267   errBox.exec();
268 }
269
270
271 // Main tab buttons:
272
273 void MainWindow::on_powerButton_pressed()
274 {
275   startRepeating(currentKeyset, Power_Key);
276 }
277
278 void MainWindow::on_powerButton_released()
279 {
280   stopRepeating();
281 }
282
283 void MainWindow::on_mainChannelUpButton_pressed()
284 {
285   startRepeating(currentKeyset, ChannelUp_Key);
286 }
287
288 void MainWindow::on_mainChannelUpButton_released()
289 {
290   stopRepeating();
291 }
292
293 void MainWindow::on_mainChannelDownButton_pressed()
294 {
295   startRepeating(currentKeyset, ChannelDown_Key);
296 }
297
298 void MainWindow::on_mainChannelDownButton_released()
299 {
300   stopRepeating();
301 }
302
303 void MainWindow::on_mainVolumeUp_pressed()
304 {
305   startRepeating(currentKeyset, VolumeUp_Key);
306 }
307
308 void MainWindow::on_mainVolumeUp_released()
309 {
310   stopRepeating();
311 }
312
313 void MainWindow::on_mainVolumeDownButton_pressed()
314 {
315   startRepeating(currentKeyset, VolumeDown_Key);
316 }
317
318 void MainWindow::on_mainVolumeDownButton_released()
319 {
320   stopRepeating();
321 }
322
323
324 // Utility tab buttons:
325
326 void MainWindow::on_redButton_pressed()
327 {
328   startRepeating(currentKeyset, Red_Key);
329 }
330
331 void MainWindow::on_redButton_released()
332 {
333   stopRepeating();
334 }
335
336 void MainWindow::on_greenButton_pressed()
337 {
338   startRepeating(currentKeyset, Green_Key);
339 }
340
341 void MainWindow::on_greenButton_released()
342 {
343   stopRepeating();
344 }
345
346 void MainWindow::on_yellowButton_pressed()
347 {
348   startRepeating(currentKeyset, Yellow_Key);
349 }
350
351 void MainWindow::on_yellowButton_released()
352 {
353   stopRepeating();
354 }
355
356 void MainWindow::on_blueButton_pressed()
357 {
358   startRepeating(currentKeyset, Blue_Key);
359 }
360
361 void MainWindow::on_blueButton_released()
362 {
363   stopRepeating();
364 }
365
366 void MainWindow::on_aspectRatioButton_pressed()
367 {
368   startRepeating(currentKeyset, AspectRatio_Key);
369 }
370
371 void MainWindow::on_aspectRatioButton_released()
372 {
373   stopRepeating();
374 }
375
376 void MainWindow::on_surroundButton_pressed()
377 {
378   startRepeating(currentKeyset, Surround_Key);
379 }
380
381 void MainWindow::on_surroundButton_released()
382 {
383   stopRepeating();
384 }
385
386 void MainWindow::on_languageButton_pressed()
387 {
388   startRepeating(currentKeyset, Language_Key);
389 }
390
391 void MainWindow::on_languageButton_released()
392 {
393   stopRepeating();
394 }
395
396 void MainWindow::on_favoritesButton_pressed()
397 {
398   startRepeating(currentKeyset, Favorites_Key);
399 }
400
401 void MainWindow::on_favoritesButton_released()
402 {
403   stopRepeating();
404 }
405
406 void MainWindow::on_captionButton_pressed()
407 {
408   startRepeating(currentKeyset, Captions_Key);
409 }
410
411 void MainWindow::on_captionButton_released()
412 {
413   stopRepeating();
414 }
415
416 void MainWindow::on_inputButton_pressed()
417 {
418   startRepeating(currentKeyset, Input_Key);
419 }
420
421 void MainWindow::on_inputButton_released()
422 {
423   stopRepeating();
424 }
425
426 void MainWindow::on_sleepButton_pressed()
427 {
428   startRepeating(currentKeyset, Sleep_Key);
429 }
430
431 void MainWindow::on_sleepButton_released()
432 {
433   stopRepeating();
434 }
435
436 void MainWindow::on_muteButton_pressed()
437 {
438   startRepeating(currentKeyset, Mute_Key);
439 }
440
441 void MainWindow::on_muteButton_released()
442 {
443   stopRepeating();
444 }
445
446
447 // Keypad tab buttons:
448
449 void MainWindow::on_oneButton_pressed()
450 {
451   startRepeating(currentKeyset, One_Key);
452 }
453
454 void MainWindow::on_oneButton_released()
455 {
456   stopRepeating();
457 }
458
459 void MainWindow::on_twoButton_pressed()
460 {
461   startRepeating(currentKeyset, Two_Key);
462 }
463
464 void MainWindow::on_twoButton_released()
465 {
466   stopRepeating();
467 }
468
469 void MainWindow::on_threeButton_pressed()
470 {
471   startRepeating(currentKeyset, Three_Key);
472 }
473
474 void MainWindow::on_threeButton_released()
475 {
476   stopRepeating();
477 }
478
479 void MainWindow::on_fourButton_pressed()
480 {
481   startRepeating(currentKeyset, Four_Key);
482 }
483
484 void MainWindow::on_fourButton_released()
485 {
486   stopRepeating();
487 }
488
489 void MainWindow::on_fiveButton_pressed()
490 {
491   startRepeating(currentKeyset, Five_Key);
492 }
493
494 void MainWindow::on_fiveButton_released()
495 {
496   stopRepeating();
497 }
498
499 void MainWindow::on_sixButton_pressed()
500 {
501   startRepeating(currentKeyset, Six_Key);
502 }
503
504 void MainWindow::on_sixButton_released()
505 {
506   stopRepeating();
507 }
508
509 void MainWindow::on_sevenButton_pressed()
510 {
511   startRepeating(currentKeyset, Seven_Key);
512 }
513
514 void MainWindow::on_sevenButton_released()
515 {
516   stopRepeating();
517 }
518
519 void MainWindow::on_eightButton_pressed()
520 {
521   startRepeating(currentKeyset, Eight_Key);
522 }
523
524 void MainWindow::on_eightButton_released()
525 {
526   stopRepeating();
527 }
528
529 void MainWindow::on_nineButton_pressed()
530 {
531   startRepeating(currentKeyset, Nine_Key);
532 }
533
534 void MainWindow::on_nineButton_released()
535 {
536   stopRepeating();
537 }
538
539 void MainWindow::on_zeroButton_pressed()
540 {
541   startRepeating(currentKeyset, Zero_Key);
542 }
543
544 void MainWindow::on_zeroButton_released()
545 {
546   stopRepeating();
547 }
548
549 void MainWindow::on_enterButton_pressed()
550 {
551   startRepeating(currentKeyset, Enter_Key);
552 }
553
554 void MainWindow::on_enterButton_released()
555 {
556   stopRepeating();
557 }
558
559 void MainWindow::on_clearButton_pressed()
560 {
561   startRepeating(currentKeyset, Clear_Key);
562 }
563
564 void MainWindow::on_clearButton_released()
565 {
566   stopRepeating();
567 }
568
569 void MainWindow::on_prevChannelButton_pressed()
570 {
571   startRepeating(currentKeyset, PrevChannel_Key);
572 }
573
574 void MainWindow::on_prevChannelButton_released()
575 {
576   stopRepeating();
577 }
578
579 void MainWindow::on_plusOneHundredButton_pressed()
580 {
581   startRepeating(currentKeyset, PlusOneHundred_Key);
582 }
583
584 void MainWindow::on_plusOneHundredButton_released()
585 {
586   stopRepeating();
587 }
588
589 void MainWindow::on_dashButton_pressed()
590 {
591   startRepeating(currentKeyset, Dash_Key);
592 }
593
594 void MainWindow::on_dashButton_released()
595 {
596   stopRepeating();
597 }
598
599 void MainWindow::on_doubleDigitButton_pressed()
600 {
601   startRepeating(currentKeyset, DoubleDigit_Key);
602 }
603
604 void MainWindow::on_doubleDigitButton_released()
605 {
606   stopRepeating();
607 }
608
609
610 // Menu tab buttons:
611
612 void MainWindow::on_upButton_pressed()
613 {
614   startRepeating(currentKeyset, Up_Key);
615 }
616
617 void MainWindow::on_upButton_released()
618 {
619   stopRepeating();
620 }
621
622 void MainWindow::on_leftButton_pressed()
623 {
624   startRepeating(currentKeyset, Left_Key);
625 }
626
627 void MainWindow::on_leftButton_released()
628 {
629   stopRepeating();
630 }
631
632 void MainWindow::on_rightButton_pressed()
633 {
634   startRepeating(currentKeyset, Right_Key);
635 }
636
637 void MainWindow::on_rightButton_released()
638 {
639   stopRepeating();
640 }
641
642 void MainWindow::on_downButton_pressed()
643 {
644   startRepeating(currentKeyset, Down_Key);
645 }
646
647 void MainWindow::on_downButton_released()
648 {
649   stopRepeating();
650 }
651
652 void MainWindow::on_selectButton_pressed()
653 {
654   startRepeating(currentKeyset, Select_Key);
655 }
656
657 void MainWindow::on_selectButton_released()
658 {
659   stopRepeating();
660 }
661
662 void MainWindow::on_menuButton_pressed()
663 {
664   startRepeating(currentKeyset, Menu_Key);
665 }
666
667 void MainWindow::on_menuButton_released()
668 {
669   stopRepeating();
670 }
671
672 void MainWindow::on_exitButton_pressed()
673 {
674   startRepeating(currentKeyset, Exit_Key);
675 }
676
677 void MainWindow::on_exitButton_released()
678 {
679   stopRepeating();
680 }
681
682
683
684 // Media tab buttons:
685
686 void MainWindow::on_mediaPreviousButton_pressed()
687 {
688   startRepeating(currentKeyset, Previous_Key);
689 }
690
691 void MainWindow::on_mediaPreviousButton_released()
692 {
693   stopRepeating();
694 }
695
696 void MainWindow::on_mediaNextButton_pressed()
697 {
698   startRepeating(currentKeyset, Next_Key);
699 }
700
701 void MainWindow::on_mediaNextButton_released()
702 {
703   stopRepeating();
704 }
705
706 void MainWindow::on_replayButton_pressed()
707 {
708   startRepeating(currentKeyset, Replay_Key);
709 }
710
711 void MainWindow::on_replayButton_released()
712 {
713   stopRepeating();
714 }
715
716 void MainWindow::on_advanceButton_pressed()
717 {
718   startRepeating(currentKeyset, Advance_Key);
719 }
720
721 void MainWindow::on_advanceButton_released()
722 {
723   stopRepeating();
724 }
725
726 void MainWindow::on_stepBackButton_pressed()
727 {
728   startRepeating(currentKeyset, StepBack_Key);
729 }
730
731 void MainWindow::on_stepBackButton_released()
732 {
733   stopRepeating();
734 }
735
736 void MainWindow::on_stepForwardButton_pressed()
737 {
738   startRepeating(currentKeyset, StepForward_Key);
739 }
740
741 void MainWindow::on_stepForwardButton_released()
742 {
743   stopRepeating();
744 }
745
746 void MainWindow::on_reverseButton_pressed()
747 {
748   startRepeating(currentKeyset, Rewind_Key);
749 }
750
751 void MainWindow::on_reverseButton_released()
752 {
753   stopRepeating();
754 }
755
756 void MainWindow::on_fastForwardButton_pressed()
757 {
758   startRepeating(currentKeyset, FastForward_Key);
759 }
760
761 void MainWindow::on_fastForwardButton_released()
762 {
763   stopRepeating();
764 }
765
766 void MainWindow::on_playButton_pressed()
767 {
768   startRepeating(currentKeyset, Play_Key);
769 }
770
771 void MainWindow::on_playButton_released()
772 {
773   stopRepeating();
774 }
775
776 void MainWindow::on_pauseButton_pressed()
777 {
778   startRepeating(currentKeyset, Pause_Key);
779 }
780
781 void MainWindow::on_pauseButton_released()
782 {
783   stopRepeating();
784 }
785
786 void MainWindow::on_stopButton_pressed()
787 {
788   startRepeating(currentKeyset, Stop_Key);
789 }
790
791 void MainWindow::on_stopButton_released()
792 {
793   stopRepeating();
794 }
795
796 void MainWindow::on_ejectButton_pressed()
797 {
798   startRepeating(currentKeyset, Eject_Key);
799 }
800
801 void MainWindow::on_ejectButton_released()
802 {
803   stopRepeating();
804 }
805
806
807 // Misc tab slots:
808
809 void MainWindow::on_pipOnOffButton_pressed()
810 {
811   startRepeating(currentKeyset, PIP_Key);
812 }
813
814 void MainWindow::on_pipOnOffButton_released()
815 {
816   stopRepeating();
817 }
818
819 void MainWindow::on_pipSwapButton_pressed()
820 {
821   startRepeating(currentKeyset, PIPSwap_Key);
822 }
823
824 void MainWindow::on_pipSwapButton_released()
825 {
826   stopRepeating();
827 }
828
829 void MainWindow::on_pipPositionButton_pressed()
830 {
831   startRepeating(currentKeyset, PIPMove_Key);
832 }
833
834 void MainWindow::on_pipPositionButton_released()
835 {
836   stopRepeating();
837 }
838
839 void MainWindow::on_pipSourceButton_pressed()
840 {
841   startRepeating(currentKeyset, PIPSource_Key);
842 }
843
844 void MainWindow::on_pipSourceButton_released()
845 {
846   stopRepeating();
847 }
848
849 void MainWindow::on_scanButton_pressed()
850 {
851   startRepeating(currentKeyset, Scan_Key);
852 }
853
854 void MainWindow::on_scanButton_released()
855 {
856   stopRepeating();
857 }
858
859 void MainWindow::on_programButton_pressed()
860 {
861   startRepeating(currentKeyset, Program_Key);
862 }
863
864 void MainWindow::on_programButton_released()
865 {
866   stopRepeating();
867 }
868
869 void MainWindow::on_pictureModeButton_pressed()
870 {
871   startRepeating(currentKeyset, PictureMode_Key);
872 }
873
874 void MainWindow::on_pictureModeButton_released()
875 {
876   stopRepeating();
877 }
878
879 void MainWindow::on_soundModeButton_pressed()
880 {
881   startRepeating(currentKeyset, SoundMode_Key);
882 }
883
884 void MainWindow::on_soundModeButton_released()
885 {
886   stopRepeating();
887 }
888
889 void MainWindow::on_discTitleButton_pressed()
890 {
891   startRepeating(currentKeyset, DiscTitle_Key);
892 }
893
894 void MainWindow::on_discTitleButton_released()
895 {
896   stopRepeating();
897 }
898
899 void MainWindow::on_discMenuButton_pressed()
900 {
901   startRepeating(currentKeyset, DiscMenu_Key);
902 }
903
904 void MainWindow::on_discMenuButton_released()
905 {
906   stopRepeating();
907 }
908
909 void MainWindow::on_discSelectButton_pressed()
910 {
911   startRepeating(currentKeyset, DiscSelect_Key);
912 }
913
914 void MainWindow::on_discSelectButton_released()
915 {
916   stopRepeating();
917 }
918
919 void MainWindow::on_trackingPlusButton_pressed()
920 {
921   startRepeating(currentKeyset, TrackingPlus_Key);
922 }
923
924 void MainWindow::on_trackingPlusButton_released()
925 {
926   stopRepeating();
927 }
928
929 void MainWindow::on_trackingMinusButton_pressed()
930 {
931   startRepeating(currentKeyset, TrackingMinus_Key);
932 }
933
934 void MainWindow::on_trackingMinusButton_released()
935 {
936   stopRepeating();
937 }
938
939 void MainWindow::on_autoTrackingButton_pressed()
940 {
941   startRepeating(currentKeyset, AutoTracking_Key);
942 }
943
944 void MainWindow::on_autoTrackingButton_released()
945 {
946   stopRepeating();
947 }
948
949 void MainWindow::on_vhsSpeedButton_pressed()
950 {
951   startRepeating(currentKeyset, VHSSpeed_Key);
952 }
953
954 void MainWindow::on_vhsSpeedButton_released()
955 {
956   stopRepeating();
957 }
958
959 void MainWindow::on_recordButton_pressed()
960 {
961   startRepeating(currentKeyset, Record_Key);
962 }
963
964 void MainWindow::on_recordButton_released()
965 {
966   stopRepeating();
967 }
968
969
970 // Menu actions:
971
972 void MainWindow::on_actionSelectKeyset_triggered()
973 {
974   selectKeysetForm->show();
975 }
976
977 void MainWindow::on_actionAbout_triggered()
978 {
979   if (!aboutForm)
980   {
981     aboutForm = new PIRAboutForm(this);
982   }
983
984   aboutForm->show();
985 }
986
987 void MainWindow::on_actionDocumentation_triggered()
988 {
989   if (!documentationForm)
990   {
991     documentationForm = new PIRDocumentationForm(this);
992   }
993
994   documentationForm->show();
995 }
996
997
998 // Other actions:
999
1000 void MainWindow::keysetSelectionChanged(
1001   QListWidgetItem *item)
1002 {
1003   if (!item) return;  // Should probably say something here!
1004
1005   PIRKeysetWidgetItem *kwi = dynamic_cast<PIRKeysetWidgetItem *>(item);
1006
1007   if (!kwi) return; // Also need to say something here
1008   
1009   currentKeyset = kwi->getID();
1010
1011   QSettings settings("pietrzak.org", "Pierogi");
1012   settings.setValue("currentKeyset", currentKeyset);
1013
1014   enableButtons();
1015 }
1016
1017
1018 void MainWindow::finalCleanup()
1019 {
1020   // Perform any necessary cleanup work here.
1021
1022   // Make certain that the thread stops repeating:
1023   stopRepeating();
1024 }
1025
1026
1027 void MainWindow::on_addKeysetButton_clicked()
1028 {
1029   // Is the current keyset already a favorite?
1030   int count = ui->favoriteKeysetsWidget->count();
1031   int index = 0;
1032   PIRKeysetWidgetItem *kwi = NULL;
1033   while (index < count)
1034   {
1035     kwi = dynamic_cast<PIRKeysetWidgetItem *>(
1036       ui->favoriteKeysetsWidget->item(index));
1037
1038     if (kwi && (kwi->getID() == currentKeyset))
1039     {
1040       // Current keyset already in list!  No need to continue.
1041       return;
1042     }
1043     ++index;
1044   }
1045
1046   // Ok, add the current keyset to the favorites:
1047   PIRMakeName make = myKeysets->getMake(currentKeyset);
1048
1049   QString name = makeManager.getMakeString(make);
1050   name.append(" ");
1051   name.append(myKeysets->getDisplayName(currentKeyset));
1052
1053   ui->favoriteKeysetsWidget->addItem(
1054     new PIRKeysetWidgetItem(name, currentKeyset, make));
1055
1056   // And, add the keyset id to the persistent list:
1057   QSettings settings("pietrzak.org", "Pierogi");
1058
1059   int favSettingsSize = settings.beginReadArray("favorites");
1060   settings.endArray();
1061
1062   settings.beginWriteArray("favorites");
1063   settings.setArrayIndex(favSettingsSize);
1064   settings.setValue("keysetID", currentKeyset);
1065   settings.endArray();
1066 }
1067
1068
1069 void MainWindow::on_removeKeysetButton_clicked()
1070 {
1071   // Deleting an item removes it from the list, so just grab the currently
1072   // selected item and delete it:
1073   QListWidgetItem *item = ui->favoriteKeysetsWidget->currentItem();
1074
1075   if (item) delete item;
1076
1077   // Remove this item from the persistent list.  Well, actually, it seems a
1078   // little more convenient to just blow away the existing list of favorites
1079   // and rewrite it, as modifying an existing QSettings array in the middle
1080   // seems a bit hard...
1081   QSettings settings("pietrzak.org", "Pierogi");
1082
1083   settings.remove("favorites");
1084
1085   int count = ui->favoriteKeysetsWidget->count();
1086
1087   // If the count is empty, we can stop right here:
1088   if (count == 0) return;
1089
1090   int index = 0;
1091   PIRKeysetWidgetItem *kwi = NULL;
1092   settings.beginWriteArray("favorites");
1093   while (index < count)
1094   {
1095     kwi = dynamic_cast<PIRKeysetWidgetItem *>(
1096       ui->favoriteKeysetsWidget->item(index));
1097
1098     settings.setArrayIndex(index);
1099     settings.setValue("keysetID", kwi->getID());
1100     ++index;
1101   }
1102   settings.endArray();
1103 }
1104
1105 void MainWindow::populateFavorites()
1106 {
1107   QSettings settings("pietrzak.org", "Pierogi");
1108
1109   int size = settings.beginReadArray("favorites");
1110   int index = 0;
1111   PIRMakeName make;
1112   QString name;
1113   unsigned int id;
1114 //  PIRKeysetWidgetItem *kwi;
1115
1116   while (index < size)
1117   {
1118     settings.setArrayIndex(index);
1119     id = settings.value("keysetID").toInt();
1120
1121     // Sanity check: Does this keyset even exist?
1122     if (myKeysets->keysetExists(id))
1123     {
1124       // Keyset does exist, so continue:
1125       make = myKeysets->getMake(id);
1126       name = makeManager.getMakeString(make);
1127       name.append(" ");
1128       name.append(myKeysets->getDisplayName(id));
1129 //    kwi = new PIRKeysetWidgetItem(name, id, make);
1130 //    myKeysets->populateDeviceTypes(kwi, id);
1131       ui->favoriteKeysetsWidget->addItem(new PIRKeysetWidgetItem(name, id, make));
1132     }
1133
1134     ++index;
1135   }
1136
1137   settings.endArray();
1138 }
1139
1140
1141 void MainWindow::startRepeating(
1142   unsigned int id,
1143   PIRKeyName name)
1144 {
1145   QMutexLocker locker(&commandIFMutex);
1146   if (!commandInFlight)
1147   {
1148     commandInFlight = true;
1149     emit buttonPressed(id, name);
1150   }
1151 }
1152
1153
1154 void MainWindow::stopRepeating()
1155 {
1156   QMutexLocker locker(&stopRepeatingMutex);
1157   stopRepeatingFlag = true;
1158 }