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