Canorus  0.7
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
/home/iurt/rpm/BUILD/canorus-0.7.R1002/src/ui/mainwin.h
Go to the documentation of this file.
00001 
00008 #ifndef MAINWIN_H_
00009 #define MAINWIN_H_
00010 
00011 #include <QObject>
00012 #include <QFileDialog>
00013 #include <QTime>
00014 #include <QTimer>
00015 #include <QHash>
00016 
00017 #include "ui_mainwin.h"
00018 
00019 #include "core/document.h"
00020 #include "core/muselement.h"
00021 #include "core/note.h"
00022 #include "core/clef.h"
00023 
00024 #include "interface/playback.h"
00025 #include "interface/pyconsoleinterface.h"
00026 
00027 #include "widgets/viewportcontainer.h"
00028 #include "widgets/scoreviewport.h"
00029 #include "widgets/resourceview.h"
00030 
00031 class QKeyEvent;
00032 class QSlider;
00033 class QSpinBox;
00034 class QToolBar;
00035 class QLabel;
00036 class QLineEdit;
00037 class QComboBox;
00038 class QCheckBox;
00039 class QAction;
00040 
00041 class CAHelpBrowser;
00042 class CAMenuToolButton;
00043 class CAUndoToolButton;
00044 class CALCDNumber;
00045 class CASheet;
00046 class CAScoreViewPort;
00047 class CASourceViewPort;
00048 class CAMusElementFactory;
00049 class CAPrintPreviewCtl;
00050 class CAPrintCtl;
00051 class CAPreviewCtl;
00052 class CAPyConsole;
00053 class CATransposeView;
00054 class CAMidiRecorderView;
00055 class CAKeybdInput;
00056 class CAExport;
00057 
00058 class CAMainWin : public QMainWindow, private Ui::uiMainWindow
00059 {
00060         Q_OBJECT
00061 
00062 public:
00063         enum CAMode {
00064                 NoDocumentMode,
00065                 InsertMode,
00066                 SelectMode,
00067                 EditMode,
00068                 ReadOnlyMode
00069         };
00070 
00071         CAMainWin(QMainWindow *oParent = 0);
00072         ~CAMainWin();
00073 
00074         void clearUI();
00075         void rebuildUI(CASheet *sheet, bool repaint=true);
00076         void rebuildUI(bool repaint=true);
00077         inline bool rebuildUILock() { return _rebuildUILock; }
00078         void updateWindowTitle();
00079 
00080         void newDocument();
00081         void addSheet(CASheet *s);
00082         void removeSheet(CASheet *s);
00083         void insertMusElementAt( const QPoint coords, CAScoreViewPort *v );
00084         void restartTimeEditedTime() { _timeEditedTime = 0; };
00085         void deleteSelection( CAScoreViewPort *v, bool deleteSyllable, bool deleteNotes, bool undo );
00086         void copySelection( CAScoreViewPort *v );
00087         void pasteAt( const QPoint coords, CAScoreViewPort *v );
00088 
00089         CADocument *openDocument( const QString& fileName );
00090         CADocument *openDocument( CADocument* doc );
00091         bool saveDocument( QString fileName );
00092 
00093         inline CAMode mode() { return _mode; }
00094         inline QFileDialog *exportDialog() { return uiExportDialog; }
00095         inline QFileDialog *importDialog() { return uiImportDialog; }
00096         inline CAResourceView *resourceView() { return _resourceView; }
00097         inline QAction        *resourceViewAction() { return uiResourceView; }
00098         inline CAMidiRecorderView *midiRecorderView() { return _midiRecorderView; }
00099         inline void setMidiRecorderView( CAMidiRecorderView *v ) { _midiRecorderView = v; }
00100         inline CAViewPort *currentViewPort() { return _currentViewPort; }
00101         inline void removeViewPort(CAViewPort* v) { _viewPortList.removeAll(v); }
00102         inline QList<CAViewPort*> viewPortList() { return _viewPortList; }
00103 
00104         inline CAScoreViewPort *currentScoreViewPort() {
00105                 if (currentViewPort()) return dynamic_cast<CAScoreViewPort*>(currentViewPort());
00106                 else return 0;
00107         }
00108 
00109         inline CASheet *currentSheet() {
00110                 CAScoreViewPort *v = currentScoreViewPort();
00111                 if (v) return v->sheet();
00112                 else return 0;
00113         }
00114 
00115         inline CAStaff *currentStaff() {
00116                 CAContext *context = currentContext();
00117                 if (context && context->contextType()==CAContext::Staff) return static_cast<CAStaff*>(context);
00118                 else return 0;
00119         }
00120 
00121         CAContext *currentContext();
00122         CAVoice   *currentVoice();
00123         inline CAViewPortContainer *currentViewPortContainer() { return _currentViewPortContainer; }
00124         inline CADocument *document() { return _document; }
00125 
00126         inline void setDocument(CADocument *document) { _document = document; _resourceView->setDocument( document ); }
00127 
00128         // Dialogs, Windows
00129         static QFileDialog *uiSaveDialog;
00130         static QFileDialog *uiOpenDialog;
00131         static QFileDialog *uiExportDialog;
00132         static QFileDialog *uiImportDialog;
00133 
00134         // Python Console
00135         CAPyConsole *pyConsole;
00136         CAPyConsoleInterface* pyConsoleIface;
00137 
00138         QDockWidget *helpDock() { return uiHelpDock; }
00139         CAHelpBrowser *helpWidget() { return uiHelpWidget; }
00140 
00141 private slots:
00143         // ToolBar/Menus actions //
00145         void closeEvent(QCloseEvent *event);
00146         // File
00147         void on_uiNewDocument_triggered();
00148         void on_uiOpenDocument_triggered();
00149         bool on_uiSaveDocument_triggered();
00150         bool on_uiSaveDocumentAs_triggered();
00151         void on_uiCloseDocument_triggered();
00152         void on_uiExportDocument_triggered();
00153         void on_uiImportDocument_triggered();
00154         void on_uiExportToPdf_triggered();
00155         void on_uiOpenRecent_aboutToShow();
00156         void onUiOpenRecentDocumentTriggered();
00157 
00158         // Edit
00159         void on_uiUndo_toggled(bool, int);
00160         void on_uiRedo_toggled(bool, int);
00161         void on_uiCopy_triggered();
00162         void on_uiCut_triggered();
00163         void on_uiPaste_triggered();
00164         void on_uiSelectAll_triggered();
00165         void on_uiInvertSelection_triggered();
00166         void on_uiDocumentProperties_triggered();
00167 
00168         // Insert
00169         void on_uiSelectMode_toggled(bool);
00170         void on_uiEditMode_toggled(bool);
00171         void on_uiNewSheet_triggered();
00172         void on_uiNewVoice_triggered();
00173         void on_uiContextType_toggled(bool, int);
00174         void on_uiClefType_toggled(bool, int);
00175         void on_uiInsertKeySig_toggled(bool);
00176         void on_uiTimeSigType_toggled(bool, int);
00177         void on_uiBarlineType_toggled(bool, int);
00178         void on_uiInsertPlayable_toggled(bool);
00179         void on_uiSlurType_toggled(bool, int);
00180         void on_uiMarkType_toggled(bool, int);
00181         void on_uiArticulationType_toggled(bool, int);
00182         void on_uiInsertSyllable_toggled(bool);
00183         void on_uiInsertFM_toggled(bool);
00184 
00185         // View
00186         void on_uiFullscreen_toggled(bool);
00187         void on_uiAnimatedScroll_toggled(bool);
00188         void on_uiLockScrollPlayback_toggled(bool);
00189         void on_uiZoomToSelection_triggered();
00190         void on_uiZoomToFit_triggered();
00191         void on_uiZoomToWidth_triggered();
00192         void on_uiZoomToHeight_triggered();
00193         void on_uiScoreView_triggered();
00194         void on_uiLilyPondSource_triggered();
00195         void on_uiCanorusMLSource_triggered();
00196         void on_uiResourceView_toggled(bool);
00197 
00198         // Sheet
00199         void on_uiRemoveSheet_triggered();
00200         void on_uiSheetName_returnPressed();
00201         void on_uiSheetProperties_triggered();
00202 
00203         // Context
00204         void on_uiContextName_returnPressed();
00205         void on_uiRemoveContext_triggered();
00206         void on_uiStanzaNumber_valueChanged(int);
00207         void on_uiAssociatedVoice_activated(int);
00208         void on_uiContextProperties_triggered();
00209 
00210         // Playback
00211         void on_uiPlayFromSelection_toggled(bool);
00212 
00213         // Playable
00214         void on_uiPlayableLength_toggled(bool, int);
00215         void on_uiTupletType_toggled(bool, int);
00216         void on_uiTupletNumber_valueChanged(int);
00217         void on_uiTupletActualNumber_valueChanged(int);
00218         void on_uiNoteStemDirection_toggled(bool, int);
00219         void on_uiHiddenRest_toggled( bool checked );
00220         void onMidiInEvent( QVector<unsigned char> message );
00221 
00222         // Key Signature
00223         void on_uiKeySig_activated( int );
00224 
00225         // Time Signature
00226         void on_uiTimeSigBeats_valueChanged(int);
00227         void on_uiTimeSigBeat_valueChanged(int);
00228 
00229         // Clef
00230         void on_uiClefOffset_valueChanged(int);
00231 
00232         // Lyrics
00233         void onTextEditKeyPressEvent(QKeyEvent *);
00234 
00235         // Function marks
00236         void on_uiFMFunction_toggled(bool, int);
00237         void on_uiFMChordArea_toggled(bool, int);
00238         void on_uiFMTonicDegree_toggled(bool, int);
00239         void on_uiFMEllipse_toggled(bool);
00240 
00241         // Dynamic marks
00242         void on_uiDynamicText_toggled(bool, int);
00243         void on_uiDynamicVolume_valueChanged(int);
00244         void on_uiDynamicCustomText_returnPressed();
00245 
00246         // Instrument change
00247         void on_uiInstrumentChange_activated( int );
00248 
00249         // Fermata
00250         void on_uiFermataType_toggled( bool, int );
00251 
00252         // Repeat Mark
00253         void on_uiRepeatMarkType_toggled( bool, int );
00254 
00255         // Fingering
00256         void on_uiFinger_toggled( bool checked, int t );
00257         void on_uiFingeringOriginal_toggled( bool checked );
00258 
00259         // Tempo
00260         void on_uiTempoBeat_toggled( bool, int );
00261         void on_uiTempoBpm_returnPressed();
00262 
00263         // Tools
00264         void on_uiSettings_triggered();
00265         void on_uiTranspose_triggered();
00266         void on_uiMidiRecorder_triggered();
00267 
00268         // Voice
00269         void on_uiVoiceNum_valChanged(int);
00270         void on_uiVoiceName_returnPressed();
00271         void on_uiVoiceInstrument_activated(int);
00272         void on_uiRemoveVoice_triggered();
00273         void on_uiVoiceStemDirection_toggled(bool, int);
00274         void on_uiVoiceProperties_triggered();
00275 
00276         // Window
00277         void on_uiSplitHorizontally_triggered();
00278         void on_uiSplitVertically_triggered();
00279         void on_uiUnsplitAll_triggered();
00280         void on_uiCloseCurrentView_triggered();
00281         void on_uiNewViewport_triggered();
00282         void on_uiNewWindow_triggered();
00283 
00284         // Help
00285 public slots:
00286         void on_uiUsersGuide_triggered();
00287 private slots:
00288         void on_uiAboutCanorus_triggered();
00289         void on_uiAboutQt_triggered();
00290 
00292         // Handle other widgets signals //
00294         void keyPressEvent(QKeyEvent *);
00295         void on_uiTabWidget_currentChanged(int);
00296 
00297         void viewPortClicked();
00298 
00299         void scoreViewPortMousePress(QMouseEvent *e, const QPoint coords);
00300         void scoreViewPortMouseMove(QMouseEvent *e, const QPoint coords);
00301         void scoreViewPortMouseRelease(QMouseEvent *e, const QPoint coords);
00302         void scoreViewPortDoubleClick(QMouseEvent *e, const QPoint coords);
00303         void scoreViewPortTripleClick(QMouseEvent *e, const QPoint coords);
00304         void scoreViewPortWheel(QWheelEvent *e, const QPoint coords);
00305         void scoreViewPortKeyPress(QKeyEvent *e);
00306         void sourceViewPortCommit(QString inputString);
00307         void floatViewPortClosed(CAViewPort*);
00308 
00309         void onTimeEditedTimerTimeout();
00310 
00311         void playbackFinished();
00312         void onScoreViewPortSelectionChanged();
00313         void onRepaintTimerTimeout();
00314 
00315 private:
00316         void playImmediately( QList<CAMusElement*> elements );
00317 
00319         // General properties //
00321         CADocument *_document;
00322         CAMode _mode;
00323 
00324         CAPreviewCtl *_poPrintPreviewCtl;
00325         CAPrintCtl   *_poPrintCtl;
00326         CAExport *_poExp; // abstract export instance
00327         CAResourceView *_resourceView;
00328         CATransposeView *_transposeView;
00329         CAMidiRecorderView *_midiRecorderView;
00330 
00331         void setMode(CAMode mode);
00332         inline void setCurrentViewPort( CAViewPort *viewPort ) { _currentViewPort = viewPort; }
00333         inline void setCurrentViewPortContainer( CAViewPortContainer *vpc )
00334                 { _currentViewPortContainer = vpc; }
00335 
00336         CAViewPortContainer *_currentViewPortContainer;
00337         QList<CAViewPortContainer *>_viewPortContainerList;
00338 
00339         QList<CAViewPort *> _viewPortList;
00340         QHash<CAViewPortContainer*, CASheet*> _sheetMap;
00341         CAViewPort *_currentViewPort;
00342         bool _animatedScroll;
00343         bool _lockScrollPlayback;
00344         CAViewPort *_playbackViewPort;
00345         QList<CADrawableMusElement*> _prePlaybackSelection;
00346         QTimer *_repaintTimer;
00347         bool _rebuildUILock;
00348         inline void setRebuildUILock(bool l) { _rebuildUILock = l; }
00349 
00350         CAPlayback *_playback;
00351         QTimer _timeEditedTimer;
00352         unsigned int  _timeEditedTime;
00353         CAMusElementFactory *_musElementFactory;
00354 public:
00355         inline CAMusElementFactory *musElementFactory() { return _musElementFactory; }
00356 private:
00357         inline bool stopPlayback() {
00358                         if(_playback && _playback->isRunning())
00359                                 _playback->stopNow();
00360                 }
00361 
00362         bool handleUnsavedChanges();
00363 
00364         CAKeybdInput *_keybdInput;
00366         // Pure user interface - widgets that weren't created by Qt Designer yet //
00368         void createCustomActions();
00369         void setupCustomUi();
00370         void initViewPort(CAViewPort*);
00371         void updateUndoRedoButtons();
00372         void updateToolBars();
00373         void updateSheetToolBar();
00374         void updateContextToolBar();
00375         void updateVoiceToolBar();
00376         void updateInsertToolBar();
00377         void updatePlayableToolBar();
00378         void updateKeySigToolBar();
00379         void updateTimeSigToolBar();
00380         void updateClefToolBar();
00381         void updateFMToolBar();
00382         void updateDynamicToolBar();
00383         void updateInstrumentToolBar();
00384         void updateTempoToolBar();
00385         void updateFermataToolBar();
00386         void updateRepeatMarkToolBar();
00387         void updateFingeringToolBar();
00388 
00390                 // Toolbar section //
00392                 // Standard toolbar
00393                 //QToolBar      *uiStandardToolBar;
00394                         CAUndoToolButton        *uiUndo;
00395                         CAUndoToolButton        *uiRedo;
00396 
00397                 // Insert toolbar
00398                 QToolBar     *uiInsertToolBar;
00399                         QActionGroup *uiInsertGroup;           // Group for mutual exclusive selection of music elements
00400                         // QAction       *uiSelectMode; // made by Qt Designer
00401                         // QAction       *uiNewSheet; // made by Qt Designer
00402                         CAMenuToolButton *uiContextType;
00403 
00404                         // QAction       *uiInsertPlayable;  // made by Qt Designer
00405                         CAMenuToolButton *uiClefType;
00406                         // QAction       *uiInsertKeySig;  // made by Qt Designer
00407                         CAMenuToolButton *uiTimeSigType;  // made by Qt Designer
00408                         CAMenuToolButton *uiBarlineType;
00409                         CAMenuToolButton *uiMarkType;
00410                         CAMenuToolButton *uiArticulationType;
00411                         // QAction       *uiInsertSyllable;  // made by Qt Designer
00412                         // QAction       *uiInsertFM;  // made by Qt Designer
00413 
00414                 QToolBar *uiSheetToolBar;
00415                         // QAction        *uiNewSheet; // made by Qt Designer
00416                         QLineEdit         *uiSheetName;
00417                         // QAction        *uiRemoveSheet; // made by Qt Designer
00418                         // QAction        *uiSheetProperties; // made by Qt Designer
00419 
00420                 QToolBar *uiContextToolBar;
00421                         // CAContext
00422                         QLineEdit        *uiContextName;
00423                         //QAction          *uiRemoveContext; // made by Qt Designer
00424                         //QAction          *uiContextProperties; // made by Qt Designer
00425                         // CAStaff
00426                         // CALyricsContext
00427                         QSpinBox         *uiStanzaNumber;
00428                         QAction          *uiStanzaNumberAction;
00429                         QComboBox        *uiAssociatedVoice;
00430                         QAction          *uiAssociatedVoiceAction;
00431                         // CAFunctionMarkContext
00432 
00433                 QToolBar *uiVoiceToolBar;
00434                         // QAction       *uiNewVoice;  // made by Qt Designer
00435                         CALCDNumber      *uiVoiceNum;
00436                         QLineEdit        *uiVoiceName;
00437                         QComboBox        *uiVoiceInstrument;
00438                         // QAction       *uiRemoveVoice; // made by Qt Designer
00439                         CAMenuToolButton *uiVoiceStemDirection;
00440                         // QAction       *uiVoiceProperties; // made by Qt Designer
00441 
00442                 QToolBar *uiPlayableToolBar; // note and rest properties are merged for the time being
00443                         // Note properties
00444                         CAMenuToolButton *uiPlayableLength;
00445                         CAMenuToolButton *uiNoteAccs;
00446                         CAMenuToolButton *uiSlurType;
00447 public:         // Because CAKeyboardInput (input with midi keyboard) needs to operate these widgets to
00448                         // provide gui feedback, these, probably even more, should become public.
00449                         // Some clean interface would be appropriate.
00450                         CAMenuToolButton *uiTupletType;
00451                         QSpinBox         *uiTupletNumber;
00452                         QSpinBox         *uiTupletActualNumber;
00453 private:
00454                         QAction          *uiTupletNumberAction;
00455                         QLabel           *uiTupletInsteadOf;
00456                         QAction          *uiTupletInsteadOfAction;
00457                         QAction          *uiTupletActualNumberAction;
00458                         // QAction       *uiNoteAccsVisible; // made by Qt Designer
00459                         CAMenuToolButton *uiNoteStemDirection;
00460                         // Rest properties
00461                         // CAMenuToolButton *uiPlayableLength; // same as note properties
00462                         // QLabel        *uiPlayableDotted; // same as note properties
00463                         // QAction          *uiHiddenRest; // made by Qt Designer
00464 
00465                 QToolBar *uiKeySigToolBar;
00466                         // CAKeySigPSP  *uiKeySigPSP;               /// Key signature perspective. \todo Reimplement it.
00467                         QComboBox *uiKeySig;
00468                         // QComboBox    *uiKeySigGender;
00469 
00470                 QToolBar *uiClefToolBar;
00471                         QSpinBox *uiClefOffset;
00472                         int oldUiClefOffsetValue;
00473 
00474                 QToolBar *uiTimeSigToolBar;
00475                         QSpinBox         *uiTimeSigBeats;
00476                         QLabel           *uiTimeSigSlash;
00477                         QSpinBox         *uiTimeSigBeat;
00478                         // CAMenuToolButton *uiTimeSigStyle; /// \todo Implement it. -Matevz
00479 
00480                 QToolBar *uiFMToolBar;                       // function mark tool bar
00481                         CAMenuToolButton  *uiFMFunction;
00482                         CAMenuToolButton  *uiFMChordArea;
00483                         CAMenuToolButton  *uiFMTonicDegree;
00484                         QComboBox         *uiFMKeySig;
00485                         //QSpinBox        *uiKeySigNumberOfAccs; // defined in uiKeySigToolBar
00486                         //QComboBox       *uiKeySigGender;       // defined in uiKeySigToolBar
00487                         //QAction         *uiFMEllipse;          // made by Qt Designer
00488 
00489                 // Marks tool bars:
00490                 QToolBar *uiDynamicToolBar;
00491                         CAMenuToolButton *uiDynamicText;
00492                         QSpinBox         *uiDynamicVolume;
00493                         QLineEdit        *uiDynamicCustomText;
00494                 QToolBar *uiInstrumentToolBar;
00495                         QComboBox        *uiInstrumentChange;
00496                 QToolBar *uiTempoToolBar;
00497                         CAMenuToolButton *uiTempoBeat;
00498                         QLabel           *uiTempoEquals;
00499                         QLineEdit        *uiTempoBpm;
00500                 QToolBar *uiFermataToolBar;
00501                         CAMenuToolButton *uiFermataType;
00502                 QToolBar *uiRepeatMarkToolBar;
00503                         CAMenuToolButton *uiRepeatMarkType;
00504                 QToolBar *uiFingeringToolBar;
00505                         CAMenuToolButton *uiFinger;
00506                         QCheckBox        *uiFingeringOriginal;
00507 
00508                 // Python console
00509                 QDockWidget *uiPyConsoleDock;
00510 
00511                 // Help widget
00512                 QDockWidget *uiHelpDock;
00513                 CAHelpBrowser   *uiHelpWidget;
00514 };
00515 #endif /* MAINWIN_H_ */