From 20f631bdca5e956eb9c6327789f8c8197d185506 Mon Sep 17 00:00:00 2001 From: Javier Serrano Polo Date: Sat, 12 May 2007 14:56:52 +0000 Subject: [PATCH] global clipboard, groupbox automation, volume vector, several segfaults git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@486 0778d3d1-df1d-0410-868b-ea421aaaa00d --- ChangeLog | 55 ++++++++++++- configure.in | 4 +- data/locale/ca.qm | Bin 109983 -> 109651 bytes data/locale/ca.ts | 8 -- include/clipboard.h | 21 +++-- include/file_browser.h | 38 +++++++-- include/group_box.h | 6 ++ include/main_window.h | 3 + include/mmp.h | 6 ++ include/note.h | 8 +- include/piano_roll.h | 5 +- include/piano_widget.h | 4 +- include/preset_preview_play_handle.h | 2 + include/qt3support.h | 2 - include/surround_area.h | 6 +- src/core/arp_and_chords_tab_widget.cpp | 10 +-- src/core/engine.cpp | 6 +- src/core/envelope_tab_widget.cpp | 6 +- src/core/file_browser.cpp | 58 ++++++++++++- src/core/main_window.cpp | 53 ++++++++++-- src/core/note.cpp | 13 --- src/core/piano_roll.cpp | 103 ++++++++++++++---------- src/core/piano_widget.cpp | 40 ++++----- src/core/preset_preview_play_handle.cpp | 16 ++-- src/core/surround_area.cpp | 59 +++++++------- src/core/track.cpp | 8 +- src/lib/clipboard.cpp | 44 +++++----- src/lib/mmp.cpp | 71 +++++++++++++--- src/tracks/instrument_track.cpp | 2 +- src/tracks/pattern.cpp | 50 ++++-------- src/widgets/group_box.cpp | 18 +++++ 31 files changed, 493 insertions(+), 232 deletions(-) diff --git a/ChangeLog b/ChangeLog index 338ddd874..941196f21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,56 @@ +2007-05-12 Javier Serrano Polo + + * include/clipboard.h: + * include/mmp.h: + * include/note.h: + * include/piano_roll.h: + * src/core/note.cpp: + * src/core/piano_roll.cpp: + * src/lib/clipboard.cpp: + * src/lib/mmp.cpp: + use the global clipboard to copy notes + + * include/group_box.h: + * src/core/arp_and_chords_tab_widget.cpp: + * src/core/envelope_tab_widget.cpp: + * src/lib/mmp.cpp: + * src/widgets/group_box.cpp: + save groupbox automation + + * include/surround_area.h: + * src/core/surround_area.cpp: + * src/core/track.cpp: + * src/lib/mmp.cpp: + calculate volume vector in a more consistent way + + * src/core/track.cpp: + fixed drag track onto another segfault + + * include/piano_widget.h: + * src/core/piano_widget.cpp: + fixed release invalid key segfault + + * src/tracks/instrument_track.cpp: + fixed freeze pattern segfault + + * include/preset_preview_play_handle.h: + * src/core/engine.cpp: + * src/core/preset_preview_play_handle.cpp: + fixed uninitialized preset preview container segfault + + * include/main_window.h: + * src/core/main_window.cpp: + added Qt4 menu implementations + + * include/file_browser.h: + * include/qt3support.h: + * src/core/file_browser.cpp: + fixed Qt4 context menu + + * data/locale/ca.ts: + * src/tracks/pattern.cpp: + hide irrelevant freeze options from context menu + 2007-05-07 Javier Serrano Polo * include/audio_jack.h: @@ -9,7 +62,7 @@ * include/pattern.h: * include/sample_buffer.h: * include/shared_object.h: - * plugins/ladspa_base/ladspa_control.cpp: + * plugins/ladspa_bas:e/ladspa_control.cpp: * plugins/ladspa_base/ladspa_control.h: * plugins/ladspa_effect/ladspa_effect.cpp: * src/audio/audio_jack.cpp: diff --git a/configure.in b/configure.in index c63443353..b482593b6 100644 --- a/configure.in +++ b/configure.in @@ -2,8 +2,8 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.50) -AC_INIT(lmms, 0.2.1-svn20070507, lmms-devel/at/lists/dot/sf/dot/net) -AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070507) +AC_INIT(lmms, 0.2.1-svn20070512, lmms-devel/at/lists/dot/sf/dot/net) +AM_INIT_AUTOMAKE(lmms, 0.2.1-svn20070512) AM_CONFIG_HEADER(config.h) diff --git a/data/locale/ca.qm b/data/locale/ca.qm index f18efe7f2307d6aac86331d4b3b4140f02737d64..9b4f26f3c21aad2cff37d1d8a6a0d4ed45381b8f 100644 GIT binary patch delta 3672 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 S&rhYh-^q#3Y%!4~{PKTmkAGPJ delta 3965 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 PO4lgAysp7)=m-A=Fd4id diff --git a/data/locale/ca.ts b/data/locale/ca.ts index dc700feac..870b8464f 100644 --- a/data/locale/ca.ts +++ b/data/locale/ca.ts @@ -2795,14 +2795,6 @@ use mouse wheel to set volume of a step pica dos cops per a obrir aquest patró al rotlle de piano usa la roda del ratolí per a ajustar el volum d'un pas - - Pattern muted - Patró apagat - - - The track this pattern belongs to or the pattern itself is currently muted therefore freezing makes no sense! Do you still want to continue? - La pista a la que pertany aquest patró o el patró mateix està apagat actualment, per tant congelar no té sentit! Encara vols continuar? - Add steps Afegeix passos diff --git a/include/clipboard.h b/include/clipboard.h index 14296d858..205b44fe9 100644 --- a/include/clipboard.h +++ b/include/clipboard.h @@ -1,7 +1,7 @@ /* * clipboard.h - the clipboard for patterns, notes etc. * - * Copyright (c) 2004-2006 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -48,13 +48,24 @@ class journallingObject; -namespace clipboard +class clipboard { +public: typedef QMap map; - extern map content; - void FASTCALL copy( journallingObject * _object ); - const QDomElement * FASTCALL getContent( const QString & _node_name ); + static void FASTCALL copy( journallingObject * _object ); + static const QDomElement * FASTCALL getContent( + const QString & _node_name ); + + static const char * mimeType( void ) + { + return( "application/x-lmms-clipboard" ); + } + + +private: + static map content; + } ; #endif diff --git a/include/file_browser.h b/include/file_browser.h index 731ecfd3b..578034cd2 100644 --- a/include/file_browser.h +++ b/include/file_browser.h @@ -50,10 +50,16 @@ #include "side_bar_widget.h" +#ifndef QT3 +class QListViewItem; +#else +class Q3ListViewItem; +#endif +class QPixmap; + class fileItem; class listView; class playHandle; -class QPixmap; class trackContainer; @@ -76,13 +82,10 @@ public slots: protected slots: -#ifdef QT4 void contextMenuRequest( Q3ListViewItem * _i, const QPoint & _pos, int _col ); -#else void contextMenuRequest( QListViewItem * _i, const QPoint & _pos, int _col ); -#endif void sendToActiveInstrumentTrack( void ); void openInNewInstrumentTrackSE( void ); void openInNewInstrumentTrackBBE( void ); @@ -132,7 +135,16 @@ private: -class directory : public Q3ListViewItem +class directory : +#ifndef QT3 + public Q3ListViewItem +// trick moc +#if 0 + , +#endif +#else + public QListViewItem +#endif { public: directory( Q3ListView * _parent, const QString & _filename, @@ -186,13 +198,27 @@ private: -class fileItem : public Q3ListViewItem +class fileItem : +#ifndef QT3 + public Q3ListViewItem +// trick moc +#if 0 + , +#endif +#else + public QListViewItem +#endif { public: fileItem( Q3ListView * _parent, const QString & _name, const QString & _path ); +#ifndef QT3 fileItem( Q3ListViewItem * _parent, const QString & _name, const QString & _path ); +#else + fileItem( QListViewItem * _parent, const QString & _name, + const QString & _path ); +#endif inline QString fullName( void ) const { diff --git a/include/group_box.h b/include/group_box.h index 499d5d24c..08767c92d 100644 --- a/include/group_box.h +++ b/include/group_box.h @@ -56,14 +56,20 @@ public: return( m_led->isChecked() ); } + void saveSettings( QDomDocument & _doc, QDomElement & _this, + const QString & _name ); + void loadSettings( const QDomElement & _this, const QString & _name ); + public slots: void setState( bool _on, bool _anim = FALSE ); void animate( void ); + signals: void toggled( bool _state ); + protected: virtual void resizeEvent( QResizeEvent * _re ); virtual void mousePressEvent( QMouseEvent * _me ); diff --git a/include/main_window.h b/include/main_window.h index 89e14a966..6f883e82d 100644 --- a/include/main_window.h +++ b/include/main_window.h @@ -48,6 +48,7 @@ #endif +class QAction; class QDomElement; class QGridLayout; class QSplashScreen; @@ -108,6 +109,7 @@ public slots: QWhatsThis::enterWhatsThisMode(); } void createNewProject( void ); + void createNewProjectFromTemplate( QAction * _idx ); void createNewProjectFromTemplate( int _idx ); void openProject( void ); bool saveProject( void ); @@ -174,6 +176,7 @@ private: private slots: void browseHelp( void ); void fillTemplatesMenu( void ); + void showTool( QAction * _idx ); void showTool( int _idx ); } ; diff --git a/include/mmp.h b/include/mmp.h index 497b442b2..f8e926e0d 100644 --- a/include/mmp.h +++ b/include/mmp.h @@ -39,6 +39,11 @@ #endif +#ifdef HAVE_CONFIG_H +#include +#endif + + #include "types.h" @@ -52,6 +57,7 @@ public: SONG_PROJECT_TEMPLATE, INSTRUMENT_TRACK_SETTINGS, DRAG_N_DROP_DATA, + CLIPBOARD_DATA, JOURNAL_DATA, EFFECT_SETTINGS, VIDEO_PROJECT, // might come later... diff --git a/include/note.h b/include/note.h index 01c9ea6e3..4b7cf1b42 100644 --- a/include/note.h +++ b/include/note.h @@ -161,11 +161,16 @@ public: return( m_panning ); } - inline virtual QString nodeName( void ) const + static QString classNodeName( void ) { return( "note" ); } + inline virtual QString nodeName( void ) const + { + return( classNodeName() ); + } + static midiTime FASTCALL quantized( const midiTime & _m, const int _q_grid ); @@ -175,7 +180,6 @@ public: } void editDetuningPattern( void ); - void detachCurrentDetuning( void ); bool hasDetuningInfo( void ); diff --git a/include/piano_roll.h b/include/piano_roll.h index 510261239..6f7119342 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -105,7 +105,7 @@ protected: virtual bool x11Event( XEvent * _xe ); #endif - int FASTCALL getKey( int _y ); + int FASTCALL getKey( int _y ) const; static inline void drawNoteRect( QPainter & _p, Uint16 _x, Uint16 _y, Sint16 _width, const bool _is_selected, @@ -239,7 +239,6 @@ private: int m_startKey; // first key when drawing int m_lastKey; - noteVector m_notesToCopy; noteVector m_selNotesForMove; @@ -249,6 +248,8 @@ private: timeLine * m_timeLine; bool m_scrollBack; + void copy_to_clipboard( const noteVector & _notes ) const; + void drawDetuningInfo( QPainter & _p, note * _n, Uint16 _x, Uint16 _y ); bool mouseOverNote( void ); note * noteUnderMouse( void ); diff --git a/include/piano_widget.h b/include/piano_widget.h index 0831cc8b8..f54f52eb8 100644 --- a/include/piano_widget.h +++ b/include/piano_widget.h @@ -94,9 +94,9 @@ protected: private: - int FASTCALL getKeyFromMouse( const QPoint & _p ); + int FASTCALL getKeyFromMouse( const QPoint & _p ) const; int FASTCALL getKeyFromKeyboard( int _k ) const; - int FASTCALL getKeyX( int _key_num ); + int FASTCALL getKeyX( int _key_num ) const; static QPixmap * s_whiteKeyPm; static QPixmap * s_blackKeyPm; diff --git a/include/preset_preview_play_handle.h b/include/preset_preview_play_handle.h index 928518eec..24cd7c9e9 100644 --- a/include/preset_preview_play_handle.h +++ b/include/preset_preview_play_handle.h @@ -48,10 +48,12 @@ public: virtual bool isFromTrack( const track * _track ) const; + static void init( void ); static void cleanUp( void ); static constNotePlayHandleVector nphsOfInstrumentTrack( const instrumentTrack * _ct ); + private: static previewTrackContainer * s_previewTC; diff --git a/include/qt3support.h b/include/qt3support.h index 6e10b26c9..07e02d259 100644 --- a/include/qt3support.h +++ b/include/qt3support.h @@ -53,7 +53,6 @@ class QColorGroup; typedef int csize; -#define QListViewItem Q3ListViewItem #define vlist QList #define vstack QStack @@ -82,7 +81,6 @@ inline QString baseName( const QString & _file ) #define QScrollArea QScrollView #define Q3ListView QListView -#define Q3ListViewItem QListViewItem #define Q3ScrollView QScrollView #define QMatrix QWMatrix diff --git a/include/surround_area.h b/include/surround_area.h index 2feafe36a..78361735b 100644 --- a/include/surround_area.h +++ b/include/surround_area.h @@ -59,7 +59,7 @@ public: surroundArea( QWidget * _parent, const QString & _name, track * _track ); virtual ~surroundArea(); - volumeVector getVolumeVector( float _v_scale = 0.0f ) const; + volumeVector getVolumeVector( float _v_scale ) const; inline const QPoint & value( void ) const { return( m_sndSrcPos ); @@ -85,12 +85,8 @@ signals: private: - float FASTCALL getVolume( const QPoint & _speaker_pos, - float _v_scale ) const; - QPoint m_sndSrcPos; - static const QPoint s_defaultSpeakerPositions[SURROUND_CHANNELS]; static QPixmap * s_backgroundArtwork; knob * m_position_x; diff --git a/src/core/arp_and_chords_tab_widget.cpp b/src/core/arp_and_chords_tab_widget.cpp index 4290217f7..04c2bdd44 100644 --- a/src/core/arp_and_chords_tab_widget.cpp +++ b/src/core/arp_and_chords_tab_widget.cpp @@ -648,11 +648,11 @@ void arpAndChordsTabWidget::processNote( notePlayHandle * _n ) void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "chorddisabled", !m_chordsGroupBox->isActive() ); + m_chordsGroupBox->saveSettings( _doc, _this, "chord-enabled" ); m_chordsComboBox->saveSettings( _doc, _this, "chord" ); m_chordRangeKnob->saveSettings( _doc, _this, "chordrange" ); - _this.setAttribute( "arpdisabled", !m_arpGroupBox->isActive() ); + m_arpGroupBox->saveSettings( _doc, _this, "arp-enabled" ); m_arpComboBox->saveSettings( _doc, _this, "arp" ); m_arpRangeKnob->saveSettings( _doc, _this, "arprange" ); m_arpTimeKnob->saveSettings( _doc, _this, "arptime" ); @@ -667,16 +667,16 @@ void arpAndChordsTabWidget::saveSettings( QDomDocument & _doc, void arpAndChordsTabWidget::loadSettings( const QDomElement & _this ) { - m_chordsGroupBox->setState( !_this.attribute - ( "chorddisabled" ).toInt() ); + m_chordsGroupBox->loadSettings( _this, "chord-enabled" ); m_chordsComboBox->loadSettings( _this, "chord" ); m_chordRangeKnob->loadSettings( _this, "chordrange" ); + + m_arpGroupBox->loadSettings( _this, "arp-enabled" ); m_arpComboBox->loadSettings( _this, "arp" ); m_arpRangeKnob->loadSettings( _this, "arprange" ); m_arpTimeKnob->loadSettings( _this, "arptime" ); m_arpGateKnob->loadSettings( _this, "arpgate" ); m_arpDirectionBtnGrp->loadSettings( _this, "arpdir" ); - m_arpGroupBox->setState( !_this.attribute( "arpdisabled" ).toInt() ); // Keep compatibility with version 2.1 file format if( _this.hasAttribute( "arpsyncmode" ) ) diff --git a/src/core/engine.cpp b/src/core/engine.cpp index ffd730a35..fc0bbd997 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -83,6 +83,8 @@ void engine::init( const bool _has_gui ) s_mainWindow->finalize(); + presetPreviewPlayHandle::init(); + s_mixer->startProcessing(); } @@ -110,10 +112,6 @@ void engine::destroy( void ) presetPreviewPlayHandle::cleanUp(); - // now we can clean up all allocated buffer - //bufferAllocator::cleanUp( 0 ); - - delete s_mixer; s_mixer = NULL; //delete configManager::inst(); diff --git a/src/core/envelope_tab_widget.cpp b/src/core/envelope_tab_widget.cpp index b60114519..6776aaf40 100644 --- a/src/core/envelope_tab_widget.cpp +++ b/src/core/envelope_tab_widget.cpp @@ -50,7 +50,6 @@ #include "instrument_track.h" #include "knob.h" #include "note_play_handle.h" -#include "pixmap_button.h" #include "tab_widget.h" @@ -468,7 +467,7 @@ void envelopeTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_filterComboBox->saveSettings( _doc, _this, "ftype" ); m_filterCutKnob->saveSettings( _doc, _this, "fcut" ); m_filterResKnob->saveSettings( _doc, _this, "fres" ); - _this.setAttribute( "fwet", m_filterGroupBox->isActive() ); + m_filterGroupBox->saveSettings( _doc, _this, "fwet" ); for( int i = 0; i < TARGET_COUNT; ++i ) { @@ -486,8 +485,7 @@ void envelopeTabWidget::loadSettings( const QDomElement & _this ) m_filterComboBox->loadSettings( _this, "ftype" ); m_filterCutKnob->loadSettings( _this, "fcut" ); m_filterResKnob->loadSettings( _this, "fres" ); -/* m_filterState->setChecked( _this.attribute( "fwet" ).toInt() );*/ - m_filterGroupBox->setState( _this.attribute( "fwet" ).toInt() ); + m_filterGroupBox->loadSettings( _this, "fwet" ); QDomNode node = _this.firstChild(); while( !node.isNull() ) diff --git a/src/core/file_browser.cpp b/src/core/file_browser.cpp index 5c1b46752..36d0dc3ac 100644 --- a/src/core/file_browser.cpp +++ b/src/core/file_browser.cpp @@ -123,7 +123,11 @@ void fileBrowser::reloadTree( void ) addItems( *it ); } +#ifndef QT3 Q3ListViewItem * item = m_l->firstChild(); +#else + QListViewItem * item = m_l->firstChild(); +#endif bool resort = FALSE; // sort merged directories @@ -136,7 +140,11 @@ void fileBrowser::reloadTree( void ) } else if( resort == TRUE ) { +#ifndef QT3 Q3ListViewItem * i2 = m_l->firstChild(); +#else + QListViewItem * i2 = m_l->firstChild(); +#endif d->moveItem( i2 ); i2->moveItem( d ); directory * d2 = NULL; @@ -191,7 +199,11 @@ void fileBrowser::addItems( const QString & _path ) isDirWithContent( _path + QDir::separator() + cur_file, m_filter ) ) { +#ifdef QT4 + Q3ListViewItem * item = m_l->findItem( cur_file, 0 ); +#else QListViewItem * item = m_l->findItem( cur_file, 0 ); +#endif if( item == NULL ) { (void) new directory( m_l, cur_file, _path, @@ -262,7 +274,6 @@ void fileBrowser::keyPressEvent( QKeyEvent * _ke ) - #ifdef QT4 void fileBrowser::contextMenuRequest( Q3ListViewItem * i, const QPoint &, int ) #else @@ -296,6 +307,17 @@ void fileBrowser::contextMenuRequest( QListViewItem * i, const QPoint &, int ) +#ifdef QT4 +void fileBrowser::contextMenuRequest( QListViewItem * i, const QPoint &, int ) +#else +void fileBrowser::contextMenuRequest( Q3ListViewItem * i, const QPoint &, int ) +#endif +{ +} + + + + void fileBrowser::sendToActiveInstrumentTrack( void ) { if( engine::getMainWindow()->workspace() == NULL ) @@ -517,7 +539,11 @@ void listView::contentsMousePressEvent( QMouseEvent * _me ) } QPoint p( contentsToViewport( _me->pos() ) ); +#ifndef QT3 Q3ListViewItem * i = itemAt( p ); +#else + QListViewItem * i = itemAt( p ); +#endif if ( i ) { if ( p.x() > header()->cellPos( header()->mapToActual( 0 ) ) + @@ -660,7 +686,11 @@ QPixmap * directory::s_folderLockedPixmap = NULL; directory::directory( directory * _parent, const QString & _name, const QString & _path, const QString & _filter ) : +#ifndef QT3 Q3ListViewItem( _parent, _name ), +#else + QListViewItem( _parent, _name ), +#endif m_p( _parent ), m_pix( NULL ), m_directories( _path ), @@ -674,7 +704,11 @@ directory::directory( directory * _parent, const QString & _name, directory::directory( Q3ListView * _parent, const QString & _name, const QString & _path, const QString & _filter ) : +#ifndef QT3 Q3ListViewItem( _parent, _name ), +#else + QListViewItem( _parent, _name ), +#endif m_p( NULL ), m_pix( NULL ), m_directories( _path ), @@ -752,13 +786,21 @@ void directory::setOpen( bool _o ) ( *it ).contains( configManager::inst()->dataDir() ) ) { +#ifndef QT3 + ( new Q3ListViewItem( this, +#else ( new QListViewItem( this, +#endif listView::tr( "--- Factory files ---" ) ) )->setPixmap( 0, embed::getIconPixmap( "factory_files" ) ); } } } +#ifndef QT3 Q3ListViewItem::setOpen( _o ); +#else + QListViewItem::setOpen( _o ); +#endif } @@ -767,7 +809,11 @@ void directory::setOpen( bool _o ) void directory::setup( void ) { setExpandable( TRUE ); +#ifndef QT3 Q3ListViewItem::setup(); +#else + QListViewItem::setup(); +#endif } @@ -863,7 +909,11 @@ QPixmap * fileItem::s_unknownFilePixmap = NULL; fileItem::fileItem( Q3ListView * _parent, const QString & _name, const QString & _path ) : +#ifndef QT3 Q3ListViewItem( _parent, _name ), +#else + QListViewItem( _parent, _name ), +#endif m_pix( NULL ), m_path( _path ) { @@ -875,9 +925,15 @@ fileItem::fileItem( Q3ListView * _parent, const QString & _name, +#ifndef QT3 fileItem::fileItem( Q3ListViewItem * _parent, const QString & _name, const QString & _path ) : Q3ListViewItem( _parent, _name ), +#else +fileItem::fileItem( QListViewItem * _parent, const QString & _name, + const QString & _path ) : + QListViewItem( _parent, _name ), +#endif m_pix( NULL ), m_path( _path ) { diff --git a/src/core/main_window.cpp b/src/core/main_window.cpp index 29f4e725e..7671ec5c9 100644 --- a/src/core/main_window.cpp +++ b/src/core/main_window.cpp @@ -273,8 +273,13 @@ void mainWindow::finalize( void ) m_templatesMenu = new QMenu( project_new ); connect( m_templatesMenu, SIGNAL( aboutToShow( void ) ), this, SLOT( fillTemplatesMenu( void ) ) ); +#ifdef QT4 + connect( m_templatesMenu, SIGNAL( triggered( QAction * ) ), + this, SLOT( createNewProjectFromTemplate( QAction * ) ) ); +#else connect( m_templatesMenu, SIGNAL( activated( int ) ), this, SLOT( createNewProjectFromTemplate( int ) ) ); +#endif project_new->setMenu( m_templatesMenu ); #ifdef QT4 project_new->setPopupMode( toolButton::MenuButtonPopup ); @@ -539,11 +544,13 @@ void mainWindow::finalize( void ) { #ifdef QT4 menuBar()->addMenu( m_tools_menu )->setText( tr( "&Tools" ) ); + connect( m_tools_menu, SIGNAL( triggered( QAction * ) ), + this, SLOT( showTool( QAction * ) ) ); #else menuBar()->insertItem( tr( "&Tools" ), m_tools_menu ); -#endif connect( m_tools_menu, SIGNAL( activated( int ) ), this, SLOT( showTool( int ) ) ); +#endif } @@ -724,23 +731,42 @@ void mainWindow::createNewProject( void ) -void mainWindow::createNewProjectFromTemplate( int _idx ) -{ #ifdef QT4 - // TODO!!! +void mainWindow::createNewProjectFromTemplate( QAction * _idx ) #else +void mainWindow::createNewProjectFromTemplate( int _idx ) +#endif +{ if( m_templatesMenu != NULL && engine::getSongEditor()->mayChangeProject() == TRUE ) { +#ifdef QT4 + QString dir_base = m_templatesMenu->actions().indexOf( _idx ) +#else QString dir_base = m_templatesMenu->indexOf( _idx ) +#endif >= m_custom_templates_count ? configManager::inst()->factoryProjectsDir() : configManager::inst()->userProjectsDir(); engine::getSongEditor()->createNewProjectFromTemplate( dir_base + "templates/" + +#ifdef QT4 + _idx->text() + ".mpt" ); +#else m_templatesMenu->text( _idx ) + ".mpt" ); - } #endif + } +} + + + + +#ifdef QT4 +void mainWindow::createNewProjectFromTemplate( int _idx ) +#else +void mainWindow::createNewProjectFromTemplate( QAction * _idx ) +#endif +{ } @@ -1094,15 +1120,30 @@ void mainWindow::fillTemplatesMenu( void ) +#ifndef QT3 +void mainWindow::showTool( QAction * _idx ) +#else void mainWindow::showTool( int _idx ) +#endif { #ifndef QT3 - #warning TODO: Qt4-implementation + tool * t = m_tools[m_tools_menu->actions().indexOf( _idx )]; #else tool * t = m_tools[m_tools_menu->indexOf( _idx )]; +#endif t->show(); t->setFocus(); +} + + + + +#ifndef QT3 +void mainWindow::showTool( int _idx ) +#else +void mainWindow::showTool( QAction * _idx ) #endif +{ } diff --git a/src/core/note.cpp b/src/core/note.cpp index 2a2c4f430..5ee02d12d 100644 --- a/src/core/note.cpp +++ b/src/core/note.cpp @@ -299,19 +299,6 @@ void note::createDetuning( void ) -void note::detachCurrentDetuning( void ) -{ - QDomDocument doc; - QDomElement parent = doc.createElement( "clone" ); - m_detuning->saveSettings( doc, parent ); - sharedObject::unref( m_detuning ); - createDetuning(); - m_detuning->loadSettings( parent ); -} - - - - bool note::hasDetuningInfo( void ) { automationPattern::timeMap map = diff --git a/src/core/piano_roll.cpp b/src/core/piano_roll.cpp index 62a49caca..7100f858e 100644 --- a/src/core/piano_roll.cpp +++ b/src/core/piano_roll.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -43,10 +44,12 @@ #include #include -#include -#include -#include +#include #include +#include +#include +#include +#include #define addButton insert #define setCheckable setToggleButton @@ -63,6 +66,7 @@ #include "piano_roll.h" #include "automatable_object_templates.h" +#include "clipboard.h" #include "combobox.h" #include "debug.h" #include "detuning_helper.h" @@ -71,6 +75,7 @@ #include "instrument_track.h" #include "main_window.h" #include "midi.h" +#include "mmp.h" #include "pattern.h" #include "piano_widget.h" #include "pixmap_button.h" @@ -2159,7 +2164,7 @@ void pianoRoll::wheelEvent( QWheelEvent * _we ) -int pianoRoll::getKey( int _y ) +int pianoRoll::getKey( int _y ) const { int key_line_y = height() - PR_BOTTOM_MARGIN - m_notesEditHeight - 1; // pressed key on piano @@ -2437,31 +2442,46 @@ void pianoRoll::getSelectedNotes( noteVector & _selected_notes ) -void pianoRoll::copySelectedNotes( void ) +void pianoRoll::copy_to_clipboard( const noteVector & _notes ) const { - for( noteVector::iterator it = m_notesToCopy.begin(); - it != m_notesToCopy.end(); ++it ) + multimediaProject mmp( multimediaProject::CLIPBOARD_DATA ); + QDomElement note_list = mmp.createElement( "note-list" ); + mmp.content().appendChild( note_list ); + + midiTime start_pos( _notes.front()->pos().getTact(), 0 ); + for( noteVector::const_iterator it = _notes.begin(); it != _notes.end(); + ++it ) { - delete *it; + note clip_note( **it ); + clip_note.setPos( clip_note.pos( start_pos ) ); + clip_note.saveState( mmp, note_list ); } - m_notesToCopy.clear(); +#ifdef QT4 + QMimeData * clip_content = new QMimeData; + clip_content->setData( clipboard::mimeType(), mmp.toString().toUtf8() ); + QApplication::clipboard()->setMimeData( clip_content, + QClipboard::Clipboard ); +#else + QStoredDrag * clip_content = new QStoredDrag( clipboard::mimeType() ); + clip_content->setEncodedData( mmp.toString().utf8() ); + QApplication::clipboard()->setData( clip_content, + QClipboard::Clipboard ); +#endif +} + + + +void pianoRoll::copySelectedNotes( void ) +{ noteVector selected_notes; getSelectedNotes( selected_notes ); if( selected_notes.empty() == FALSE ) { - midiTime start_pos( selected_notes.front()->pos().getTact(), - 0 ); - for( noteVector::iterator it = selected_notes.begin(); - it != selected_notes.end(); ++it ) - { - m_notesToCopy.push_back( new note( **it ) ); - m_notesToCopy.back()->setPos( m_notesToCopy.back()->pos( - start_pos ) ); - m_notesToCopy.back()->detachCurrentDetuning(); - } + copy_to_clipboard( selected_notes ); + textFloat::displayMessage( tr( "Notes copied" ), tr( "All selected notes were copied to the " "clipboard." ), @@ -2479,34 +2499,21 @@ void pianoRoll::cutSelectedNotes( void ) return; } - for( noteVector::iterator it = m_notesToCopy.begin(); - it != m_notesToCopy.end(); ++it ) - { - delete *it; - } - - m_notesToCopy.clear(); - noteVector selected_notes; getSelectedNotes( selected_notes ); if( selected_notes.empty() == FALSE ) { + copy_to_clipboard( selected_notes ); + engine::getSongEditor()->setModified(); - midiTime start_pos( selected_notes.front()->pos().getTact(), - 0 ); - - while( selected_notes.empty() == FALSE ) + for( noteVector::iterator it = selected_notes.begin(); + it != selected_notes.end(); ++it ) { - note * new_note = new note( *selected_notes.front() ); - new_note->setPos( new_note->pos( start_pos ) ); - m_notesToCopy.push_back( new_note ); - // note (the memory of it) is also deleted by // pattern::removeNote(...) so we don't have to do that - m_pattern->removeNote( selected_notes.front() ); - selected_notes.erase( selected_notes.begin() ); + m_pattern->removeNote( *it ); } } @@ -2524,14 +2531,26 @@ void pianoRoll::pasteNotes( void ) return; } - if( m_notesToCopy.empty() == FALSE ) +#ifdef QT4 + QString value = QApplication::clipboard() + ->mimeData( QClipboard::Clipboard ) + ->data( clipboard::mimeType() ); +#else + QString value = QApplication::clipboard()->data( QClipboard::Clipboard ) + ->encodedData( clipboard::mimeType() ); +#endif + + if( !value.isEmpty() ) { - for( noteVector::iterator it = m_notesToCopy.begin(); - it != m_notesToCopy.end(); ++it ) + multimediaProject mmp( value, FALSE ); + + QDomNodeList list = mmp.elementsByTagName( + note::classNodeName() ); + for( int i = 0; !list.item( i ).isNull(); ++i ) { - note cur_note( **it ); + note cur_note; + cur_note.restoreState( list.item( i ).toElement() ); cur_note.setPos( cur_note.pos() + m_currentPosition ); - cur_note.detachCurrentDetuning(); m_pattern->addNote( cur_note ); } diff --git a/src/core/piano_widget.cpp b/src/core/piano_widget.cpp index 1e95ac413..3c5d878f9 100644 --- a/src/core/piano_widget.cpp +++ b/src/core/piano_widget.cpp @@ -177,7 +177,7 @@ pianoWidget::~pianoWidget() // gets the key from the given mouse-position -int pianoWidget::getKeyFromMouse( const QPoint & _p ) +int pianoWidget::getKeyFromMouse( const QPoint & _p ) const { int key_num = (int)( (float) _p.x() / (float) PW_WHITE_KEY_WIDTH ); @@ -220,9 +220,7 @@ int pianoWidget::getKeyFromMouse( const QPoint & _p ) } // some range-checking-stuff - key_num = tLimit( key_num, 0, NOTES_PER_OCTAVE * OCTAVES - 1 ); - - return( m_lastKey = key_num ); + return( tLimit( key_num, 0, NOTES_PER_OCTAVE * OCTAVES - 1 ) ); } @@ -301,6 +299,7 @@ void pianoWidget::mousePressEvent( QMouseEvent * _me ) vol * 127 / 100 ), midiTime() ); m_pressedKeys[key_num] = TRUE; + m_lastKey = key_num; } else { @@ -319,14 +318,17 @@ void pianoWidget::mousePressEvent( QMouseEvent * _me ) // handler for mouse-release-event void pianoWidget::mouseReleaseEvent( QMouseEvent * _me ) { - int released_key = getKeyFromMouse( _me->pos() ); + if( m_lastKey != -1 ) + { + m_instrumentTrack->processInEvent( + midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), midiTime() ); + m_pressedKeys[m_lastKey] = FALSE; - m_instrumentTrack->processInEvent( - midiEvent( NOTE_OFF, 0, released_key, 0 ), midiTime() ); - m_pressedKeys[released_key] = FALSE; + // and let the user see that he released a key... :) + update(); - // and let the user see that he released a key... :) - update(); + m_lastKey = -1; + } } @@ -335,8 +337,6 @@ void pianoWidget::mouseReleaseEvent( QMouseEvent * _me ) // handler for mouse-move-event void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) { - // save current last-key-var - int released_key = m_lastKey; int key_num = getKeyFromMouse( _me->pos() ); int y_diff = _me->pos().y() - PIANO_BASE; volume vol = (volume)( (float) y_diff / @@ -359,14 +359,15 @@ void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) // is the calculated key different from current key? (could be the // user just moved the cursor one pixel left but on the same key) - if( key_num != released_key ) + if( key_num != m_lastKey ) { - m_instrumentTrack->processInEvent( - midiEvent( NOTE_OFF, 0, released_key, 0 ), - midiTime() ); - if( released_key >= 0 ) + if( m_lastKey != -1 ) { - m_pressedKeys[released_key] = FALSE; + m_instrumentTrack->processInEvent( + midiEvent( NOTE_OFF, 0, m_lastKey, 0 ), + midiTime() ); + m_pressedKeys[m_lastKey] = FALSE; + m_lastKey = -1; } #ifdef QT4 if( _me->buttons() & Qt::LeftButton ) @@ -380,6 +381,7 @@ void pianoWidget::mouseMoveEvent( QMouseEvent * _me ) midiEvent( NOTE_ON, 0, key_num, vol ), midiTime() ); m_pressedKeys[key_num] = TRUE; + m_lastKey = key_num; } else { @@ -529,7 +531,7 @@ void pianoWidget::focusOutEvent( QFocusEvent * ) -int pianoWidget::getKeyX( int _key_num ) +int pianoWidget::getKeyX( int _key_num ) const { int k = m_startOctave*NOTES_PER_OCTAVE + m_startTone; if( _key_num < k ) diff --git a/src/core/preset_preview_play_handle.cpp b/src/core/preset_preview_play_handle.cpp index b94858863..95e440b2f 100644 --- a/src/core/preset_preview_play_handle.cpp +++ b/src/core/preset_preview_play_handle.cpp @@ -128,11 +128,6 @@ presetPreviewPlayHandle::presetPreviewPlayHandle( playHandle( PresetPreviewHandle ), m_previewNote( NULL ) { - if( !s_previewTC ) - { - s_previewTC = new previewTrackContainer; - } - s_previewTC->lockData(); if( s_previewTC->previewNote() != NULL ) @@ -213,6 +208,17 @@ bool presetPreviewPlayHandle::isFromTrack( const track * _track ) const +void presetPreviewPlayHandle::init( void ) +{ + if( !s_previewTC ) + { + s_previewTC = new previewTrackContainer; + } +} + + + + void presetPreviewPlayHandle::cleanUp( void ) { delete s_previewTC; diff --git a/src/core/surround_area.cpp b/src/core/surround_area.cpp index 26a82a4ab..bdc1e8e43 100644 --- a/src/core/surround_area.cpp +++ b/src/core/surround_area.cpp @@ -60,16 +60,6 @@ -const QPoint surroundArea::s_defaultSpeakerPositions[SURROUND_CHANNELS] = -{ - QPoint( -SURROUND_AREA_SIZE, -SURROUND_AREA_SIZE ), - QPoint( SURROUND_AREA_SIZE, -SURROUND_AREA_SIZE) -#ifndef DISABLE_SURROUND -, - QPoint( -SURROUND_AREA_SIZE, SURROUND_AREA_SIZE ), - QPoint( SURROUND_AREA_SIZE, SURROUND_AREA_SIZE ) -#endif -} ; QPixmap * surroundArea::s_backgroundArtwork = NULL; @@ -131,12 +121,39 @@ surroundArea::~surroundArea() volumeVector surroundArea::getVolumeVector( float _v_scale ) const { - volumeVector v; - for( Uint8 chnl = 0; chnl < SURROUND_CHANNELS; ++chnl ) + volumeVector v = { { _v_scale, _v_scale +#ifndef DISABLE_SURROUND + , _v_scale, _v_scale +#endif + } } ; + + if( m_sndSrcPos.x() >= 0 ) { - v.vol[chnl] = getVolume( s_defaultSpeakerPositions[chnl], - _v_scale ); + v.vol[0] *= 1.0f - m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; +#ifndef DISABLE_SURROUND + v.vol[2] *= 1.0f - m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; +#endif } + else + { + v.vol[1] *= 1.0f + m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; +#ifndef DISABLE_SURROUND + v.vol[3] *= 1.0f + m_sndSrcPos.x() / (float)SURROUND_AREA_SIZE; +#endif + } + + if( m_sndSrcPos.y() >= 0 ) + { + v.vol[0] *= 1.0f - m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; + v.vol[1] *= 1.0f - m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; + } +#ifndef DISABLE_SURROUND + else + { + v.vol[2] *= 1.0f + m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; + v.vol[3] *= 1.0f + m_sndSrcPos.y() / (float)SURROUND_AREA_SIZE; + } +#endif return( v ); } @@ -162,20 +179,6 @@ void surroundArea::setValue( const QPoint & _p ) -FASTCALL float surroundArea::getVolume( const QPoint & _speaker_pos, - float _v_scale ) const -{ - const int x = _speaker_pos.x() - m_sndSrcPos.x(); - const int y = _speaker_pos.y() - m_sndSrcPos.y(); - const float new_vol = 2.0f - sqrt( x*x + y*y ) * - ( 1.0f / SURROUND_AREA_SIZE ); - - return( tLimit( new_vol, 0.0f, 1.0f ) * _v_scale ); -} - - - - void surroundArea::contextMenuEvent( QContextMenuEvent * ) { // for the case, the user clicked right while pressing left mouse- diff --git a/src/core/track.cpp b/src/core/track.cpp index f3f1e733a..d37d3899f 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -1424,7 +1424,9 @@ void trackWidget::dropEvent( QDropEvent * _de ) // value contains our XML-data so simply create a // multimediaProject which does the rest for us... multimediaProject mmp( value, FALSE ); + engine::getMixer()->lock(); m_track->restoreState( mmp.content().firstChild().toElement() ); + engine::getMixer()->unlock(); _de->accept(); } } @@ -1734,11 +1736,7 @@ void track::loadSettings( const QDomElement & _this ) { if( node.isElement() ) { - if( node.nodeName() == nodeName() || -#warning compat-code, remove in 0.3.0 - ( node.nodeName() == "channeltrack" && - nodeName() == "instrumenttrack" ) - ) + if( node.nodeName() == nodeName() ) { loadTrackSpecificSettings( node.toElement() ); } diff --git a/src/lib/clipboard.cpp b/src/lib/clipboard.cpp index 0aa48def0..b404f99d2 100644 --- a/src/lib/clipboard.cpp +++ b/src/lib/clipboard.cpp @@ -3,7 +3,7 @@ /* * clipboard.cpp - the clipboard for patterns, notes etc. * - * Copyright (c) 2004-2005 Tobias Doerffel + * Copyright (c) 2004-2007 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,34 +29,34 @@ #include "journalling_object.h" -namespace clipboard + + +clipboard::map clipboard::content; + + + + +void clipboard::copy( journallingObject * _obj ) { - - map content; + QDomDocument doc; + QDomElement parent = doc.createElement( "clipboard" ); + _obj->saveState( doc, parent ); + content[_obj->nodeName()] = parent.firstChild().toElement(); +} - void copy( journallingObject * _obj ) + + +const QDomElement * clipboard::getContent( const QString & _node_name ) +{ + if( content.find( _node_name ) != content.end() ) { - QDomDocument doc; - QDomElement parent = doc.createElement( "clipboard" ); - _obj->saveState( doc, parent ); - content[_obj->nodeName()] = parent.firstChild().toElement(); + return( &content[_node_name] ); } + return( NULL ); +} - const QDomElement * getContent( const QString & _node_name ) - { - if( content.find( _node_name ) != content.end() ) - { - return( &content[_node_name] ); - } - return( NULL ); - } - -} ; - - - #endif diff --git a/src/lib/mmp.cpp b/src/lib/mmp.cpp index 98371b434..7ccadfa34 100644 --- a/src/lib/mmp.cpp +++ b/src/lib/mmp.cpp @@ -25,7 +25,9 @@ */ -#include "qt3support.h" +#include "mmp.h" + +#include #ifdef QT4 @@ -39,12 +41,7 @@ #endif -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "mmp.h" #include "config_mgr.h" #include "project_version.h" #include "song_editor.h" @@ -56,10 +53,11 @@ multimediaProject::typeDescStruct { multimediaProject::UNKNOWN, "unknown" }, { multimediaProject::SONG_PROJECT, "song" }, { multimediaProject::SONG_PROJECT_TEMPLATE, "songtemplate" }, -#warning compat-code, remove in 0.3.0 +#warning compat-code, use upgrade feature { multimediaProject::INSTRUMENT_TRACK_SETTINGS, "instrumenttracksettings,channelsettings" }, { multimediaProject::DRAG_N_DROP_DATA, "dnddata" }, + { multimediaProject::CLIPBOARD_DATA, "clipboard-data" }, { multimediaProject::JOURNAL_DATA, "journaldata" }, { multimediaProject::EFFECT_SETTINGS, "effectsettings" }, { multimediaProject::VIDEO_PROJECT, "videoproject" }, @@ -177,7 +175,7 @@ multimediaProject::multimediaProject( const QString & _in_file_name, m_head = node.toElement(); } else if( node.nodeName() == typeName( m_type ) || -#warning compat-code, remove in 0.3.0 +#warning compat-code, use upgrade feature node.nodeName() == "channelsettings" ) { m_content = node.toElement(); @@ -363,7 +361,7 @@ QString multimediaProject::typeName( projectTypes _project_type ) if( _project_type >= UNKNOWN && _project_type < PROJ_TYPE_COUNT ) { return( s_types[_project_type].m_name -#warning compat-code, remove in 0.3.0 +#warning compat-code, use upgrade feature .section( ',', 0, 0 ) ); } @@ -519,6 +517,61 @@ void multimediaProject::upgrade( void ) node = node.nextSibling(); } } + + if( version < "0.2.1-svn20070508" ) + { + QDomNodeList list = elementsByTagName( "arpandchords" ); + for( int i = 0; !list.item( i ).isNull(); ++i ) + { + QDomElement el = list.item( i ).toElement(); + if( el.hasAttribute( "chorddisabled" ) ) + { + el.setAttribute( "chord-enabled", + !el.attribute( "chorddisabled" ) + .toInt() ); + el.setAttribute( "arp-enabled", + !el.attribute( "arpdisabled" ) + .toInt() ); + } + } + + list = elementsByTagName( "channeltrack" ); + for( int i = 0; !list.item( i ).isNull(); ++i ) + { + QDomElement el = list.item( i ).toElement(); + el.setTagName( "instrumenttrack" ); + } + + list = elementsByTagName( "instrumenttrack" ); + for( int i = 0; !list.item( i ).isNull(); ++i ) + { + QDomElement el = list.item( i ).toElement(); + if( el.hasAttribute( "vol" ) ) + { + float value = el.attribute( "vol" ).toFloat(); + value = roundf( value * 0.585786438f ); + el.setAttribute( "vol", value ); + } + else + { + QDomNodeList vol_list = el.namedItem( + "automation-pattern" ) + .namedItem( "vol" ).toElement() + .elementsByTagName( "time" ); + for( int j = 0; !vol_list.item( j ).isNull(); + ++j ) + { + QDomElement timeEl = list.item( j ) + .toElement(); + int value = timeEl.attribute( "value" ) + .toInt(); + value = (int)roundf( value * + 0.585786438f ); + timeEl.setAttribute( "value", value ); + } + } + } + } } diff --git a/src/tracks/instrument_track.cpp b/src/tracks/instrument_track.cpp index e000eacc1..fd883c5dc 100644 --- a/src/tracks/instrument_track.cpp +++ b/src/tracks/instrument_track.cpp @@ -960,7 +960,7 @@ bool FASTCALL instrumentTrack::play( const midiTime & _start, trackContentObject * tco = getTCO( _tco_num ); tcos.push_back( tco ); bb_track = bbTrack::findBBTrack( _tco_num ); - if( !( bb_track->automationDisabled( this ) + if( !( ( bb_track && bb_track->automationDisabled( this ) ) || dynamic_cast( tco )->empty() ) ) { sendMidiTime( _start ); diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 3cfd69720..4d41dd5f0 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -527,33 +527,6 @@ void pattern::freeze( void ) QMessageBox::Ok ); return; } - if( m_instrumentTrack->muted() || muted() ) - { - if( QMessageBox:: -#if QT_VERSION >= 0x030200 - question -#else - information -#endif - - ( 0, tr( "Pattern muted" ), - tr( "The track this pattern " - "belongs to or the " - "pattern itself is " - "currently muted " - "therefore " - "freezing makes no " - "sense! Do you still " - "want to continue?" ), - QMessageBox::Yes, - QMessageBox::No | - QMessageBox::Default | - QMessageBox::Escape ) == - QMessageBox::No ) - { - return; - } - } // already frozen? if( m_frozenPattern != NULL ) @@ -683,13 +656,24 @@ void pattern::constructContextMenu( QMenu * _cm ) this, SLOT( changeName() ) ); _cm->addSeparator(); - _cm->addAction( embed::getIconPixmap( "freeze" ), - ( m_frozenPattern != NULL )? tr( "Refreeze" ) : tr( "Freeze" ), + bool freeze_separator = FALSE; + if( !( m_instrumentTrack->muted() || muted() ) ) + { + _cm->addAction( embed::getIconPixmap( "freeze" ), + m_frozenPattern ? tr( "Refreeze" ) : tr( "Freeze" ), this, SLOT( freeze() ) ); - _cm->addAction( embed::getIconPixmap( "unfreeze" ), tr( "Unfreeze" ), - this, SLOT( unfreeze() ) ); - - _cm->addSeparator(); + freeze_separator = TRUE; + } + if( m_frozenPattern ) + { + _cm->addAction( embed::getIconPixmap( "unfreeze" ), + tr( "Unfreeze" ), this, SLOT( unfreeze() ) ); + freeze_separator = TRUE; + } + if( freeze_separator ) + { + _cm->addSeparator(); + } #ifdef QT4 QMenu * add_step_menu = _cm->addMenu( diff --git a/src/widgets/group_box.cpp b/src/widgets/group_box.cpp index a8804d231..06d671258 100644 --- a/src/widgets/group_box.cpp +++ b/src/widgets/group_box.cpp @@ -253,6 +253,24 @@ void groupBox::updatePixmap( void ) + +void groupBox::saveSettings( QDomDocument & _doc, QDomElement & _this, + const QString & _name ) +{ + m_led->saveSettings( _doc, _this, _name ); +} + + + + +void groupBox::loadSettings( const QDomElement & _this, const QString & _name ) +{ + m_led->loadSettings( _this, _name ); +} + + + + #include "group_box.moc"