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