root/branches/new_fx_rack_and_sample_fun/libs/hydrogen/src/preferences.cpp @ 735

Revision 735, 42.0 KB (checked in by wolke, 4 years ago)

merge 727:734 from trunk

Line 
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 *
5 * http://www.hydrogen-music.org
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY, without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#include <stdlib.h>
24#include <hydrogen/Preferences.h>
25
26#include <hydrogen/LocalFileMng.h>
27
28#ifndef WIN32
29#include <pwd.h>
30#include <unistd.h>
31#endif
32#include <sys/types.h>
33#include <sys/stat.h>
34#include <stdlib.h>
35#include <fstream>
36#include <iostream>
37#include <cstdio>
38#include <list>
39#include <hydrogen/midiMap.h>
40
41#include <hydrogen/data_path.h>
42#include "config.h"
43#include "version.h"
44
45#include "xml/tinyxml.h"
46#include <QDir>
47#include <QApplication>
48
49namespace H2Core
50{
51
52Preferences* Preferences::instance = NULL;
53
54
55/// Return an instance of Preferences
56Preferences* Preferences::getInstance()
57{
58        if ( instance == NULL ) {
59                instance = new Preferences();
60        }
61
62        return instance;
63}
64
65
66Preferences::Preferences()
67                : Object( "Preferences" )
68                , demoPath( QString( DataPath::get_data_path() ) + "/demo_songs/" )
69                , m_sLastNews( "" )
70{
71        INFOLOG( "INIT" );
72       
73        //Default jack track-outputs are post fader
74        m_nJackTrackOutputMode = POST_FADER;
75        m_bJackTrackOuts = false;
76        // switch to enable / disable lash, only on h2 startup
77        m_brestartLash = false;
78        m_bsetLash = false;
79
80        //server list
81        std::list<QString> sServerList;
82
83//      //musicCategories
84//      std::list<QString> m_musicCategories;
85
86        char * ladpath = getenv( "LADSPA_PATH" );       // read the Environment variable LADSPA_PATH
87        if ( ladpath ) {
88                INFOLOG( "Found LADSPA_PATH enviroment variable" );
89                QString sLadspaPath = ladpath;
90                int pos;
91                while ( ( pos = sLadspaPath.indexOf( ":" ) ) != -1 ) {
92                        QString sPath = sLadspaPath.left( pos );
93                        m_ladspaPathVect.push_back( sPath );
94                        sLadspaPath = sLadspaPath.mid( pos + 1, sLadspaPath.length() );
95                }
96                m_ladspaPathVect.push_back( sLadspaPath );
97        } else {
98#ifdef Q_OS_MACX
99                m_ladspaPathVect.push_back( qApp->applicationDirPath() + "/../Resources/plugins" );
100                m_ladspaPathVect.push_back( "/Library/Audio/Plug-Ins/LADSPA/" );
101                m_ladspaPathVect.push_back( QDir::homePath().append( "/Library/Audio/Plug-Ins/LADSPA" ));
102#else
103                m_ladspaPathVect.push_back( "/usr/lib/ladspa" );
104                m_ladspaPathVect.push_back( "/usr/local/lib/ladspa" );
105#endif
106
107        }
108
109       
110
111
112        m_pDefaultUIStyle = new UIStyle();
113
114#ifdef Q_OS_MACX
115        m_sPreferencesFilename = QDir::homePath().append( "/Library/Application Support/Hydrogen/hydrogen.conf" );
116        m_sPreferencesDirectory = QDir::homePath().append( "/Library/Application Support/Hydrogen/" );
117        m_sDataDirectory = QDir::homePath().append( "/Library/Application Support/Hydrogen/data/" );
118#else
119        m_sPreferencesFilename = QDir::homePath().append( "/.hydrogen/hydrogen.conf" );
120        m_sPreferencesDirectory = QDir::homePath().append( "/.hydrogen/" );
121        m_sDataDirectory = QDir::homePath().append( "/.hydrogen/data/" );
122#endif
123       
124        __lastsampleDirectory = QDir::homePath(); //audio file browser
125        __playsamplesonclicking = false; // audio file browser
126        __playselectedinstrument = false; // midi keyboard and keyboard play only selected instrument
127        __rightclickedpattereditor = false; //right click into pattern editor add note-off-note or edit note-length
128        __recordsong = false;//  midi keys and keys can record m_playingpattern in songmode
129 
130        loadPreferences( true );        // Global settings
131        loadPreferences( false );       // User settings
132}
133
134
135
136Preferences::~Preferences()
137{
138        savePreferences();
139
140        INFOLOG( "DESTROY" );
141        instance = NULL;
142        delete m_pDefaultUIStyle;
143}
144
145
146
147
148
149
150///
151/// Load the preferences file
152///
153void Preferences::loadPreferences( bool bGlobal )
154{
155        bool recreate = false;  // configuration file must be recreated?
156
157        QString sPreferencesDirectory;
158        QString sPreferencesFilename;
159        QString sDataDirectory;
160        if ( bGlobal ) {
161                sPreferencesDirectory = DataPath::get_data_path();
162                sPreferencesFilename = sPreferencesDirectory + "/hydrogen.default.conf";
163                INFOLOG( "Loading preferences file (GLOBAL) [" + sPreferencesFilename + "]" );
164        } else {
165                sPreferencesFilename = m_sPreferencesFilename;
166                sPreferencesDirectory = m_sPreferencesDirectory;
167                sDataDirectory = QDir::homePath().append( "/.hydrogen/data" );
168                INFOLOG( "Loading preferences file (USER) [" + sPreferencesFilename + "]" );
169
170
171        }
172
173
174
175        // preferences directory exists?
176        QDir prefDir( sPreferencesDirectory );
177        if ( !prefDir.exists() ) {
178                if ( bGlobal ) {
179                        WARNINGLOG( "System configuration directory '" + sPreferencesDirectory + "' not found." );
180                } else {
181                        ERRORLOG( "Configuration directory '" + sPreferencesDirectory + "' not found." );
182                        createPreferencesDirectory();
183                }
184        }
185
186        // data directory exists?
187        QDir dataDir( sDataDirectory );
188        if ( !dataDir.exists() ) {
189                WARNINGLOG( "Data directory not found." );
190                createDataDirectory();
191        }
192
193        // soundLibrary directory exists?
194        QString sDir = sDataDirectory;
195        QString sDrumkitDir;
196        QString sSongDir;
197        QString sPatternDir;
198
199        INFOLOG( "Creating soundLibrary directories in " + sDir );
200       
201        sDrumkitDir = sDir + "/drumkits";
202        sSongDir = sDir + "/songs";
203        sPatternDir = sDir + "/patterns";
204       
205        QDir drumkitDir( sDrumkitDir );
206        QDir songDir( sSongDir );
207        QDir patternDir( sPatternDir );
208       
209        if ( ! drumkitDir.exists() || ! songDir.exists() || ! patternDir.exists() )
210        {
211                createSoundLibraryDirectories();
212        }
213       
214        // pref file exists?
215        std::ifstream input( sPreferencesFilename.toAscii() , std::ios::in | std::ios::binary );
216        if ( input ) {
217                // read preferences file
218                TiXmlDocument doc( sPreferencesFilename.toAscii() );
219                doc.LoadFile();
220
221                TiXmlNode* rootNode;
222                if ( ( rootNode = doc.FirstChild( "hydrogen_preferences" ) ) ) {
223
224                        // version
225                        QString version = LocalFileMng::readXmlString( rootNode, "version", "" );
226                        if ( version == "" ) {
227                                recreate = true;
228                        }
229
230                        //////// GENERAL ///////////
231                        //m_sLadspaPath = LocalFileMng::readXmlString( this, rootNode, "ladspaPath", m_sLadspaPath );
232                        m_bShowDevelWarning = LocalFileMng::readXmlBool( rootNode, "showDevelWarning", m_bShowDevelWarning );
233                        restoreLastSong = LocalFileMng::readXmlBool( rootNode, "restoreLastSong", restoreLastSong );
234                        m_bPatternModePlaysSelected = LocalFileMng::readXmlBool( rootNode, "patternModePlaysSelected", TRUE );
235                        m_bUseLash = LocalFileMng::readXmlBool( rootNode, "useLash", FALSE );
236                       
237                        //restore the right m_bsetlash value
238                        m_bsetLash = m_bUseLash;
239
240                        hearNewNotes = LocalFileMng::readXmlBool( rootNode, "hearNewNotes", hearNewNotes );
241                        recordEvents = LocalFileMng::readXmlBool( rootNode, "recordEvents", recordEvents );
242                        quantizeEvents = LocalFileMng::readXmlBool( rootNode, "quantizeEvents", quantizeEvents );
243
244                        TiXmlNode* pRecentUsedSongsNode = rootNode->FirstChild( "recentUsedSongs" );
245                        if ( pRecentUsedSongsNode ) {
246                                TiXmlNode* pSongNode = 0;
247                                for ( pSongNode = pRecentUsedSongsNode->FirstChild( "song" ); pSongNode; pSongNode = pSongNode->NextSibling( "song" ) ) {
248                                        QString sFilename = pSongNode->FirstChild()->Value();
249                                        m_recentFiles.push_back( sFilename );
250                                }
251                        } else {
252                                WARNINGLOG( "recentUsedSongs node not found" );
253                        }
254
255                        TiXmlNode* pRecentFXNode = rootNode->FirstChild( "recentlyUsedEffects" );
256                        if ( pRecentFXNode ) {
257                                TiXmlNode* pFXNode = 0;
258                                for ( pFXNode = pRecentFXNode->FirstChild( "FX" ); pFXNode; pFXNode = pFXNode->NextSibling( "FX" ) ) {
259                                        QString sFXName = pFXNode->FirstChild()->Value();
260                                        m_recentFX.push_back( sFXName );
261                                }
262                        } else {
263                                WARNINGLOG( "recentlyUsedEffects node not found" );
264                        }
265
266                        sServerList.clear();
267                        TiXmlNode* pServerListNode = rootNode->FirstChild( "serverList" );
268                        if ( pServerListNode ) {
269                                TiXmlNode* pServerNode = 0;
270                                for ( pServerNode = pServerListNode->FirstChild( "server" ); pServerNode; pServerNode = pServerNode->NextSibling( "server" ) ) {
271                                        QString sFilename = pServerNode->FirstChild()->Value();
272                                        sServerList.push_back( sFilename );
273                                }
274                        } else {
275                                WARNINGLOG( "serverList node not found" );
276                        }
277
278                        m_patternCategories.clear();
279                        TiXmlNode* pPatternCategoriesNode = rootNode->FirstChild( "patternCategories" );
280                        if ( pPatternCategoriesNode ) {
281                                TiXmlNode* pCategoriesNode = 0;
282                                for ( pCategoriesNode = pPatternCategoriesNode->FirstChild( "categories" ); pCategoriesNode; pCategoriesNode = pCategoriesNode->NextSibling( "categories" ) ) {
283                                        QString sFilename = pCategoriesNode->FirstChild()->Value();
284                                        m_patternCategories.push_back( sFilename );
285                                }
286                        } else {
287                                WARNINGLOG( "patternCategories node not found" );
288                        }
289
290
291
292                        m_sLastNews = LocalFileMng::readXmlString( rootNode, "lastNews", "-", true );
293
294                        /////////////// AUDIO ENGINE //////////////
295                        TiXmlNode* audioEngineNode;
296                        if ( !( audioEngineNode = rootNode->FirstChild( "audio_engine" ) ) ) {
297                                WARNINGLOG( "audio_engine node not found" );
298                                recreate = true;
299                        } else {
300                                m_sAudioDriver = LocalFileMng::readXmlString( audioEngineNode, "audio_driver", m_sAudioDriver );
301                                m_bUseMetronome = LocalFileMng::readXmlBool( audioEngineNode, "use_metronome", m_bUseMetronome );
302                                m_fMetronomeVolume = LocalFileMng::readXmlFloat( audioEngineNode, "metronome_volume", 0.5f );
303                                m_nMaxNotes = LocalFileMng::readXmlInt( audioEngineNode, "maxNotes", m_nMaxNotes );
304                                m_nBufferSize = LocalFileMng::readXmlInt( audioEngineNode, "buffer_size", m_nBufferSize );
305                                m_nSampleRate = LocalFileMng::readXmlInt( audioEngineNode, "samplerate", m_nSampleRate );
306
307                                //// OSS DRIVER ////
308                                TiXmlNode* ossDriverNode;
309                                if ( !( ossDriverNode = audioEngineNode->FirstChild( "oss_driver" ) ) ) {
310                                        WARNINGLOG( "oss_driver node not found" );
311                                        recreate = true;
312                                } else {
313                                        m_sOSSDevice = LocalFileMng::readXmlString( ossDriverNode, "ossDevice", m_sOSSDevice );
314                                }
315
316                                //// JACK DRIVER ////
317                                TiXmlNode* jackDriverNode;
318                                if ( !( jackDriverNode = audioEngineNode->FirstChild( "jack_driver" ) ) ) {
319                                        WARNINGLOG( "jack_driver node not found" );
320                                        recreate = true;
321                                } else {
322                                        m_sJackPortName1 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_1", m_sJackPortName1 );
323                                        m_sJackPortName2 = LocalFileMng::readXmlString( jackDriverNode, "jack_port_name_2", m_sJackPortName2 );
324                                        QString sMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode", "NO_JACK_TRANSPORT" );
325                                        if ( sMode == "NO_JACK_TRANSPORT" ) {
326                                                m_bJackTransportMode = NO_JACK_TRANSPORT;
327                                        } else if ( sMode == "USE_JACK_TRANSPORT" ) {
328                                                m_bJackTransportMode = USE_JACK_TRANSPORT;
329                                        }
330                                       
331                                        //jack time master
332                                        QString tmMode = LocalFileMng::readXmlString( jackDriverNode, "jack_transport_mode_master", "NO_JACK_TIME_MASTER" );
333                                        if ( tmMode == "NO_JACK_TIME_MASTER" ) {
334                                                m_bJackMasterMode = NO_JACK_TIME_MASTER;
335                                        } else if ( tmMode == "USE_JACK_TIME_MASTER" ) {
336                                                m_bJackMasterMode = USE_JACK_TIME_MASTER;
337                                        }
338                                        //~ jack time master
339
340                                        m_bJackTrackOuts = LocalFileMng::readXmlBool( jackDriverNode, "jack_track_outs", m_bJackTrackOuts );
341                                        m_bJackConnectDefaults = LocalFileMng::readXmlBool( jackDriverNode, "jack_connect_defaults", m_bJackConnectDefaults );
342
343                                        m_nJackTrackOutputMode = LocalFileMng::readXmlInt( jackDriverNode, "jack_track_output_mode", m_nJackTrackOutputMode );
344                                        m_nJackArdourTransportWorkaround = LocalFileMng::readXmlBool( jackDriverNode, "jack_ardour_transport_workaround", m_nJackArdourTransportWorkaround );
345                                }
346
347
348                                /// ALSA AUDIO DRIVER ///
349                                TiXmlNode* alsaAudioDriverNode;
350                                if ( !( alsaAudioDriverNode = audioEngineNode->FirstChild( "alsa_audio_driver" ) ) ) {
351                                        WARNINGLOG( "alsa_audio_driver node not found" );
352                                        recreate = true;
353                                } else {
354                                        m_sAlsaAudioDevice = LocalFileMng::readXmlString( alsaAudioDriverNode, "alsa_audio_device", m_sAlsaAudioDevice );
355                                }
356
357                                /// MIDI DRIVER ///
358                                TiXmlNode* midiDriverNode;
359                                if ( !( midiDriverNode = audioEngineNode->FirstChild( "midi_driver" ) ) ) {
360                                        WARNINGLOG( "midi_driver node not found" );
361                                        recreate = true;
362                                } else {
363                                        m_sMidiDriver = LocalFileMng::readXmlString( midiDriverNode, "driverName", "ALSA" );
364                                        m_sMidiPortName = LocalFileMng::readXmlString( midiDriverNode, "port_name", "None" );
365                                        m_nMidiChannelFilter = LocalFileMng::readXmlInt( midiDriverNode, "channel_filter", -1 );
366                                        m_bMidiNoteOffIgnore = LocalFileMng::readXmlBool( midiDriverNode, "ignore_note_off", true );
367                                }
368
369
370
371                        }
372
373                        /////////////// GUI //////////////
374                        TiXmlNode* guiNode;
375                        if ( !( guiNode = rootNode->FirstChild( "gui" ) ) ) {
376                                WARNINGLOG( "gui node not found" );
377                                recreate = true;
378                        } else {
379                                // QT Style
380                                m_sQTStyle = LocalFileMng::readXmlString( guiNode, "QTStyle", m_sQTStyle, true );
381
382                                // Application font family
383                                applicationFontFamily = LocalFileMng::readXmlString( guiNode, "application_font_family", applicationFontFamily );
384
385                                // Application font pointSize
386                                applicationFontPointSize = LocalFileMng::readXmlInt( guiNode, "application_font_pointsize", applicationFontPointSize );
387
388                                // mixer font family
389                                mixerFontFamily = LocalFileMng::readXmlString( guiNode, "mixer_font_family", mixerFontFamily );
390
391                                // mixer font pointSize
392                                mixerFontPointSize = LocalFileMng::readXmlInt( guiNode, "mixer_font_pointsize", mixerFontPointSize );
393
394                                // Mixer falloff speed
395                                mixerFalloffSpeed = LocalFileMng::readXmlFloat( guiNode, "mixer_falloff_speed", 1.1f );
396
397                                // pattern editor grid resolution
398                                m_nPatternEditorGridResolution = LocalFileMng::readXmlInt( guiNode, "patternEditorGridResolution", m_nPatternEditorGridResolution );
399                                m_bPatternEditorUsingTriplets = LocalFileMng::readXmlBool( guiNode, "patternEditorUsingTriplets", m_bPatternEditorUsingTriplets );
400                                m_bShowInstrumentPeaks = LocalFileMng::readXmlBool( guiNode, "showInstrumentPeaks", m_bShowInstrumentPeaks );
401                                m_bIsFXTabVisible = LocalFileMng::readXmlBool( guiNode, "isFXTabVisible", m_bIsFXTabVisible );
402
403
404                                // pattern editor grid height
405                                m_nPatternEditorGridHeight = LocalFileMng::readXmlInt( guiNode, "patternEditorGridHeight", m_nPatternEditorGridHeight );
406
407                                // pattern editor grid width
408                                m_nPatternEditorGridWidth = LocalFileMng::readXmlInt( guiNode, "patternEditorGridWidth", m_nPatternEditorGridWidth );
409
410                                // mainForm window properties
411                                setMainFormProperties( readWindowProperties( guiNode, "mainForm_properties", mainFormProperties ) );
412                                setMixerProperties( readWindowProperties( guiNode, "mixer_properties", mixerProperties ) );
413                                setPatternEditorProperties( readWindowProperties( guiNode, "patternEditor_properties", patternEditorProperties ) );
414                                setSongEditorProperties( readWindowProperties( guiNode, "songEditor_properties", songEditorProperties ) );
415                                setAudioEngineInfoProperties( readWindowProperties( guiNode, "audioEngineInfo_properties", audioEngineInfoProperties ) );
416
417
418
419                                m_bFollowPlayhead = LocalFileMng::readXmlBool( guiNode, "followPlayhead", true );
420
421
422                                //beatcounter
423                                QString bcMode = LocalFileMng::readXmlString( guiNode, "bc", "BC_OFF" );
424                                        if ( bcMode == "BC_OFF" ) {
425                                                m_bbc = BC_OFF;
426                                        } else if ( bcMode == "BC_ON" ) {
427                                                m_bbc = BC_ON;
428                                        }
429
430
431                                QString setPlay = LocalFileMng::readXmlString( guiNode, "setplay", "SET_PLAY_OFF" );
432                                        if ( setPlay == "SET_PLAY_OFF" ) {
433                                                m_mmcsetplay = SET_PLAY_OFF;
434                                        } else if ( setPlay == "SET_PLAY_ON" ) {
435                                                m_mmcsetplay = SET_PLAY_ON;
436                                        }
437                               
438                                m_countOffset = LocalFileMng::readXmlInt( guiNode, "countoffset", 0 );
439                                m_startOffset = LocalFileMng::readXmlInt( guiNode, "playoffset", 0 );
440                               
441                                //~ beatcounter
442
443                                for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) {
444                                        QString sNodeName = "ladspaFX_properties" + to_string( nFX );
445                                        setLadspaProperties( nFX, readWindowProperties( guiNode, sNodeName, m_ladspaProperties[nFX] ) );
446                                }
447
448                                TiXmlNode *pUIStyle = guiNode->FirstChild( "UI_Style" );
449                                if ( pUIStyle ) {
450                                        readUIStyle( *pUIStyle );
451                                } else {
452                                        WARNINGLOG( "UI_Style node not found" );
453                                        recreate = true;
454                                }
455                        }
456
457                        /////////////// FILES //////////////
458                        TiXmlNode* filesNode;
459                        if ( !( filesNode = rootNode->FirstChild( "files" ) ) ) {
460                                WARNINGLOG( "files node not found" );
461                                recreate = true;
462                        } else {
463                                // last used song
464                                lastSongFilename = LocalFileMng::readXmlString( filesNode, "lastSongFilename", lastSongFilename, true );
465                                m_sDefaultEditor = LocalFileMng::readXmlString( filesNode, "defaulteditor", m_sDefaultEditor, true );
466                        }
467
468                        // FIXME: hack hack hack! Isn't better to create a "release" method in MidiMap class instead of destroying a singleton?
469                        if ( MidiMap::__instance != NULL) {
470                                delete MidiMap::__instance;
471                        }
472                        MidiMap* mM = MidiMap::getInstance();
473                       
474                       
475                        TiXmlNode* pMidiEventMapNode = rootNode->FirstChild( "midiEventMap" );
476                        if ( pMidiEventMapNode ) {
477                                TiXmlNode* pMidiEventNode = 0;
478                               
479                                for ( pMidiEventNode = pMidiEventMapNode->FirstChild( "midiEvent" ); pMidiEventNode; pMidiEventNode = pMidiEventNode->NextSibling( "midiEvent" ) ) {
480                                       
481                                        if( pMidiEventNode->FirstChild()->Value() == QString("mmcEvent")){
482                                                QString event = pMidiEventNode->FirstChild("mmcEvent")->FirstChild()->Value();
483                                                QString s_action = pMidiEventNode->FirstChild("action")->FirstChild()->Value();
484                                                QString s_param = pMidiEventNode->FirstChild("parameter")->FirstChild()->Value();
485                                                Action* pAction = new Action( s_action );
486                                                pAction->setParameter1( s_param );
487                                                mM->registerMMCEvent(event, pAction);
488                                        }
489
490                                        if( pMidiEventNode->FirstChild()->Value() == QString("noteEvent")){
491                                                QString event = pMidiEventNode->FirstChild("noteEvent")->FirstChild()->Value();
492                                                QString s_action = pMidiEventNode->FirstChild("action")->FirstChild()->Value();
493                                                QString s_param = pMidiEventNode->FirstChild("parameter")->FirstChild()->Value();
494                                                QString s_eventParameter = pMidiEventNode->FirstChild("eventParameter")->FirstChild()->Value();
495                                                Action* pAction = new Action( s_action );
496                                                pAction->setParameter1( s_param );
497                                                mM->registerNoteEvent(s_eventParameter.toInt(), pAction);
498                                        }
499
500                                        if( pMidiEventNode->FirstChild()->Value() == QString("ccEvent") ){
501                                                QString event = pMidiEventNode->FirstChild("ccEvent")->FirstChild()->Value();
502                                                QString s_action = pMidiEventNode->FirstChild("action")->FirstChild()->Value();
503                                                QString s_param = pMidiEventNode->FirstChild("parameter")->FirstChild()->Value();
504                                                QString s_eventParameter = pMidiEventNode->FirstChild("eventParameter")->FirstChild()->Value();
505                                                Action * pAction = new Action( s_action );
506                                                pAction->setParameter1( s_param );
507                                                mM->registerCCEvent( s_eventParameter.toInt(), pAction );
508                                        }
509
510                                }
511                        } else {
512                                WARNINGLOG( "midiMap node not found" );
513                        }
514                       
515                       
516
517                } // rootNode
518                else {
519                        WARNINGLOG( "hydrogen_preferences node not found" );
520                        recreate = true;
521                }
522        } else {
523                if ( bGlobal ) {
524                        WARNINGLOG( "System configuration file not found." );
525                } else {
526                        WARNINGLOG( "Configuration file not found." );
527                        recreate = true;
528                }
529        }
530
531
532        // The preferences file should be recreated?
533        if ( recreate == true ) {
534                WARNINGLOG( "Recreating configuration file." );
535                savePreferences();
536        }
537
538}
539
540
541
542///
543/// Save the preferences file
544///
545void Preferences::savePreferences()
546{
547        //string prefDir = QDir::homePath().append("/.hydrogen").toStdString();
548        QString filename = m_sPreferencesFilename;
549
550        INFOLOG( "Saving preferences file: " + filename );
551
552        TiXmlDocument doc( filename.toAscii() );
553
554        TiXmlElement rootNode( "hydrogen_preferences" );
555
556        // hydrogen version
557        LocalFileMng::writeXmlString( &rootNode, "version", QString( get_version().c_str() ) );
558
559        ////// GENERAL ///////
560        LocalFileMng::writeXmlString( &rootNode, "restoreLastSong", restoreLastSong ? "true": "false" );
561       
562        LocalFileMng::writeXmlString( &rootNode, "patternModePlaysSelected", m_bPatternModePlaysSelected ? "true": "false" );
563
564        LocalFileMng::writeXmlString( &rootNode, "useLash", m_bsetLash ? "true": "false" );
565
566        //show development version warning
567        LocalFileMng::writeXmlString( &rootNode, "showDevelWarning", m_bShowDevelWarning ? "true": "false" );
568
569        // hear new notes in the pattern editor
570        LocalFileMng::writeXmlString( &rootNode, "hearNewNotes", hearNewNotes ? "true": "false" );
571
572        // key/midi event prefs
573        LocalFileMng::writeXmlString( &rootNode, "recordEvents", recordEvents ? "true": "false" );
574        LocalFileMng::writeXmlString( &rootNode, "quantizeEvents", quantizeEvents ? "true": "false" );
575
576        // Recent used songs
577        TiXmlElement recentUsedSongsNode( "recentUsedSongs" );
578        {
579                unsigned nSongs = 5;
580                if ( m_recentFiles.size() < 5 ) {
581                        nSongs = m_recentFiles.size();
582                }
583                for ( unsigned i = 0; i < nSongs; i++ ) {
584                        LocalFileMng::writeXmlString( &recentUsedSongsNode, "song", m_recentFiles[ i ] );
585                }
586        }
587        rootNode.InsertEndChild( recentUsedSongsNode );
588       
589        TiXmlElement recentFXNode( "recentlyUsedEffects" );
590        {
591                int nFX = 0;
592                QString FXname;
593                foreach( FXname, m_recentFX ) {
594                        LocalFileMng::writeXmlString( &recentFXNode, "FX", FXname );
595                        if ( ++nFX > 10 ) break;
596                }
597        }
598        rootNode.InsertEndChild( recentFXNode );
599
600
601        std::list<QString>::const_iterator cur_Server;
602
603        TiXmlElement serverListNode( "serverList" );
604        for( cur_Server = sServerList.begin(); cur_Server != sServerList.end(); ++cur_Server ){
605                LocalFileMng::writeXmlString( &serverListNode , QString("server") , QString( *cur_Server ) );
606        }
607        rootNode.InsertEndChild( serverListNode );
608
609
610        std::list<QString>::const_iterator cur_patternCategories;
611
612        TiXmlElement patternCategoriesNode( "patternCategories" );
613        for( cur_patternCategories = m_patternCategories.begin(); cur_patternCategories != m_patternCategories.end(); ++cur_patternCategories ){
614                LocalFileMng::writeXmlString( &patternCategoriesNode , QString("categories") , QString( *cur_patternCategories ) );
615        }
616        rootNode.InsertEndChild( patternCategoriesNode );
617
618
619
620
621        LocalFileMng::writeXmlString( &rootNode, "lastNews", m_sLastNews );
622
623
624        //---- AUDIO ENGINE ----
625        TiXmlElement audioEngineNode( "audio_engine" );
626        {
627                // audio driver
628                LocalFileMng::writeXmlString( &audioEngineNode, "audio_driver", m_sAudioDriver );
629
630                // use metronome
631                LocalFileMng::writeXmlString( &audioEngineNode, "use_metronome", m_bUseMetronome ? "true": "false" );
632                LocalFileMng::writeXmlString( &audioEngineNode, "metronome_volume", to_string( m_fMetronomeVolume ) );
633                LocalFileMng::writeXmlString( &audioEngineNode, "maxNotes", to_string( m_nMaxNotes ) );
634                LocalFileMng::writeXmlString( &audioEngineNode, "buffer_size", to_string( m_nBufferSize ) );
635                LocalFileMng::writeXmlString( &audioEngineNode, "samplerate", to_string( m_nSampleRate ) );
636
637                //// OSS DRIVER ////
638                TiXmlElement ossDriverNode( "oss_driver" );
639                {
640                        LocalFileMng::writeXmlString( &ossDriverNode, "ossDevice", m_sOSSDevice );
641                }
642                audioEngineNode.InsertEndChild( ossDriverNode );
643
644                //// JACK DRIVER ////
645                TiXmlElement jackDriverNode( "jack_driver" );
646                {
647                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_port_name_1", m_sJackPortName1 );  // jack port name 1
648                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_port_name_2", m_sJackPortName2 );  // jack port name 2
649
650                        // jack transport slave
651                        QString sMode;
652                        if ( m_bJackTransportMode == NO_JACK_TRANSPORT ) {
653                                sMode = "NO_JACK_TRANSPORT";
654                        } else if ( m_bJackTransportMode == USE_JACK_TRANSPORT ) {
655                                sMode = "USE_JACK_TRANSPORT";
656                        }
657                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_transport_mode", sMode );
658
659                        //jack time master
660                        QString tmMode;
661                        if ( m_bJackMasterMode == NO_JACK_TIME_MASTER ) {
662                                tmMode = "NO_JACK_TIME_MASTER";
663                        } else if (  m_bJackMasterMode == USE_JACK_TIME_MASTER ) {
664                                tmMode = "NO_JACK_TIME_MASTER";
665                        }
666                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_transport_mode_master", tmMode );
667                        //~ jack time master
668
669                        // jack default connection
670                        QString jackConnectDefaultsString = "false";
671                        if ( m_bJackConnectDefaults ) {
672                                jackConnectDefaultsString = "true";
673                        }
674                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_connect_defaults", jackConnectDefaultsString );
675
676                        //pre-fader or post-fader track outputs ?
677                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_track_output_mode", to_string ( m_nJackTrackOutputMode ));
678
679                        // jack track outs
680                        QString jackTrackOutsString = "false";
681                        if ( m_bJackTrackOuts ) {
682                                jackTrackOutsString = "true";
683                        }
684                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_track_outs", jackTrackOutsString );
685                        QString jackArdourTransportWorkaroundString =
686                            (m_nJackArdourTransportWorkaround) ? "true" : "false";
687                        LocalFileMng::writeXmlString( &jackDriverNode, "jack_ardour_transport_workaround", jackArdourTransportWorkaroundString );
688                }
689                audioEngineNode.InsertEndChild( jackDriverNode );
690
691                //// ALSA AUDIO DRIVER ////
692                TiXmlElement alsaAudioDriverNode( "alsa_audio_driver" );
693                {
694                        LocalFileMng::writeXmlString( &alsaAudioDriverNode, "alsa_audio_device", m_sAlsaAudioDevice );
695                }
696                audioEngineNode.InsertEndChild( alsaAudioDriverNode );
697
698                /// MIDI DRIVER ///
699                TiXmlElement midiDriverNode( "midi_driver" );
700                {
701                        LocalFileMng::writeXmlString( &midiDriverNode, "driverName", m_sMidiDriver );
702                        LocalFileMng::writeXmlString( &midiDriverNode, "port_name", m_sMidiPortName );
703                        LocalFileMng::writeXmlString( &midiDriverNode, "channel_filter", to_string( m_nMidiChannelFilter ) );
704
705                        if ( m_bMidiNoteOffIgnore ) {
706                                LocalFileMng::writeXmlString( &midiDriverNode, "ignore_note_off", "true" );
707                        } else {
708                                LocalFileMng::writeXmlString( &midiDriverNode, "ignore_note_off", "false" );
709                        }
710
711                        if ( m_bMidiDiscardNoteAfterAction ) {
712                                LocalFileMng::writeXmlString( &midiDriverNode, "discard_note_after_action", "true" );
713                        } else {
714                                LocalFileMng::writeXmlString( &midiDriverNode, "discard_note_after_action", "false" );
715                        }
716                }
717                audioEngineNode.InsertEndChild( midiDriverNode );
718
719
720
721        }
722        rootNode.InsertEndChild( audioEngineNode );
723
724        //---- GUI ----
725        TiXmlElement guiNode( "gui" );
726        {
727                LocalFileMng::writeXmlString( &guiNode, "QTStyle", m_sQTStyle );
728                LocalFileMng::writeXmlString( &guiNode, "application_font_family", applicationFontFamily );
729                LocalFileMng::writeXmlString( &guiNode, "application_font_pointsize", to_string( applicationFontPointSize ) );
730                LocalFileMng::writeXmlString( &guiNode, "mixer_font_family", mixerFontFamily );
731                LocalFileMng::writeXmlString( &guiNode, "mixer_font_pointsize", to_string( mixerFontPointSize ) );
732                LocalFileMng::writeXmlString( &guiNode, "mixer_falloff_speed", to_string( mixerFalloffSpeed ) );
733                LocalFileMng::writeXmlString( &guiNode, "patternEditorGridResolution", to_string( m_nPatternEditorGridResolution ) );
734                LocalFileMng::writeXmlString( &guiNode, "patternEditorGridHeight", to_string( m_nPatternEditorGridHeight ) );
735                LocalFileMng::writeXmlString( &guiNode, "patternEditorGridWidth", to_string( m_nPatternEditorGridWidth ) );
736                LocalFileMng::writeXmlBool( &guiNode, "patternEditorUsingTriplets", m_bPatternEditorUsingTriplets );
737                LocalFileMng::writeXmlBool( &guiNode, "showInstrumentPeaks", m_bShowInstrumentPeaks );
738                LocalFileMng::writeXmlBool( &guiNode, "isFXTabVisible", m_bIsFXTabVisible );
739
740
741                // MainForm window properties
742                writeWindowProperties( guiNode, "mainForm_properties", mainFormProperties );
743                writeWindowProperties( guiNode, "mixer_properties", mixerProperties );
744                writeWindowProperties( guiNode, "patternEditor_properties", patternEditorProperties );
745                writeWindowProperties( guiNode, "songEditor_properties", songEditorProperties );
746                writeWindowProperties( guiNode, "drumkitManager_properties", drumkitManagerProperties );
747                writeWindowProperties( guiNode, "audioEngineInfo_properties", audioEngineInfoProperties );
748                for ( unsigned nFX = 0; nFX < MAX_FX; nFX++ ) {
749                        QString sNode = "ladspaFX_properties" + to_string( nFX );
750                        writeWindowProperties( guiNode, sNode, m_ladspaProperties[nFX] );
751                }
752
753                LocalFileMng::writeXmlBool( &guiNode, "followPlayhead", m_bFollowPlayhead );
754
755
756                //beatcounter
757                QString bcMode;
758                        if ( m_bbc == BC_OFF ) {
759                                bcMode = "BC_OFF";
760                        } else if ( m_bbc  == BC_ON ) {
761                                bcMode = "BC_ON";
762                        }
763                        LocalFileMng::writeXmlString( &guiNode, "bc", bcMode );
764
765
766               
767                QString setPlay;
768                        if ( m_mmcsetplay == SET_PLAY_OFF ) {
769                                setPlay = "SET_PLAY_OFF";
770                        } else if ( m_mmcsetplay == SET_PLAY_ON ) {
771                                setPlay = "SET_PLAY_ON";
772                        }
773                        LocalFileMng::writeXmlString( &guiNode, "setplay", setPlay );
774
775                LocalFileMng::writeXmlString( &guiNode, "countoffset", to_string(m_countOffset) );
776                LocalFileMng::writeXmlString( &guiNode, "playoffset", to_string(m_startOffset) );
777                //~ beatcounter
778
779                // User interface style
780                writeUIStyle( guiNode );
781        }
782        rootNode.InsertEndChild( guiNode );
783
784        //---- FILES ----
785        TiXmlElement filesNode( "files" );
786        {
787                // last used song
788                LocalFileMng::writeXmlString( &filesNode, "lastSongFilename", lastSongFilename );
789                LocalFileMng::writeXmlString( &filesNode, "defaulteditor", m_sDefaultEditor );
790        }
791        rootNode.InsertEndChild( filesNode );
792
793        MidiMap * mM = MidiMap::getInstance();
794        std::map< QString, Action* > mmcMap = mM->getMMCMap();
795
796        //---- MidiMap ----
797        TiXmlElement midiEventMapNode( "midiEventMap" );
798        {
799                std::map< QString, Action* >::iterator dIter( mmcMap.begin() );
800                for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ){
801                       
802                        QString event = dIter->first;
803                        Action * pAction = dIter->second;
804
805                        if ( pAction->getType() != "NOTHING" ){
806                                TiXmlElement midiEventNode( "midiEvent" );
807
808                                LocalFileMng::writeXmlString( &midiEventNode, "mmcEvent" , event );
809                                LocalFileMng::writeXmlString( &midiEventNode, "action" , pAction->getType());
810                                LocalFileMng::writeXmlString( &midiEventNode, "parameter" , pAction->getParameter1() );
811
812                                midiEventMapNode.InsertEndChild(midiEventNode);
813                        }
814                }
815               
816                for( int note=0; note < 128; note++ ){
817                        Action * pAction = mM->getNoteAction( note );
818                        if( pAction != NULL && pAction->getType() != "NOTHING") {
819                                TiXmlElement midiEventNode( "midiEvent" );
820                               
821                                LocalFileMng::writeXmlString( &midiEventNode, "noteEvent" , QString("NOTE") );
822                                LocalFileMng::writeXmlString( &midiEventNode, "eventParameter" , QString::number( note ) );
823                                LocalFileMng::writeXmlString( &midiEventNode, "action" , pAction->getType() );
824                                LocalFileMng::writeXmlString( &midiEventNode, "parameter" , pAction->getParameter1() );
825       
826
827                                midiEventMapNode.InsertEndChild(midiEventNode);
828                        }
829                }
830
831                for( int parameter=0; parameter < 128; parameter++ ){
832                        Action * pAction = mM->getCCAction( parameter );
833                        if( pAction != NULL && pAction->getType() != "NOTHING")
834                        {
835                                TiXmlElement midiEventNode( "midiEvent" );
836                               
837                                LocalFileMng::writeXmlString( &midiEventNode, "ccEvent" , QString("CC") );
838                                LocalFileMng::writeXmlString( &midiEventNode, "eventParameter" , QString::number( parameter ) );
839                               
840
841                                LocalFileMng::writeXmlString( &midiEventNode, "action" , pAction->getType() );
842
843                                LocalFileMng::writeXmlString( &midiEventNode, "parameter" , pAction->getParameter1() );
844
845                                midiEventMapNode.InsertEndChild(midiEventNode);
846                        }
847                }
848        }
849       
850        rootNode.InsertEndChild( midiEventMapNode );
851
852        doc.InsertEndChild( rootNode );
853        doc.SaveFile();
854}
855
856
857
858///
859/// Create preferences directory
860///
861void Preferences::createPreferencesDirectory()
862{
863        QString prefDir = m_sPreferencesDirectory;
864        INFOLOG( "Creating preference file directory in " + prefDir );
865
866        QDir dir;
867        dir.mkdir( prefDir );
868}
869
870
871
872///
873/// Create data directory
874///
875void Preferences::createDataDirectory()
876{
877        QString sDir = m_sDataDirectory;
878        INFOLOG( "Creating data directory in " + sDir );
879
880        QDir dir;
881        dir.mkdir( sDir );
882//      mkdir(dir.c_str(),S_IRWXU);
883}
884
885void Preferences::createSoundLibraryDirectories()
886{
887        QString sDir = m_sDataDirectory;
888        QString sDrumkitDir;
889        QString sSongDir;
890        QString sPatternDir;
891        QString sPlaylistDir;
892
893        INFOLOG( "Creating soundLibrary directories in " + sDir );
894       
895        sDrumkitDir = sDir + "/drumkits";
896        sSongDir = sDir + "/songs";
897        sPatternDir = sDir + "/patterns";
898        sPlaylistDir = sDir + "/playlists";
899
900        QDir dir;
901        dir.mkdir( sDrumkitDir );
902        dir.mkdir( sSongDir );
903        dir.mkdir( sPatternDir );
904        dir.mkdir( sPlaylistDir );
905}
906
907
908void Preferences::setMostRecentFX( QString FX_name )
909{
910        int pos = m_recentFX.indexOf( FX_name );
911       
912        if ( pos != -1 )
913                m_recentFX.removeAt( pos );
914       
915        m_recentFX.push_front( FX_name );
916}
917
918void Preferences::setRecentFiles( std::vector<QString> recentFiles )
919{
920        // find single filenames. (skip duplicates)
921        std::vector<QString> temp;
922        for ( unsigned i = 0; i < recentFiles.size(); i++ ) {
923                QString sFilename = recentFiles[ i ];
924
925                bool bExists = false;
926                for ( unsigned j = 0; j < temp.size(); j++ ) {
927                        if ( sFilename == temp[ j ] ) {
928                                bExists = true;
929                                break;
930                        }
931                }
932                if ( !bExists ) {
933                        temp.push_back( sFilename );
934                }
935        }
936
937        m_recentFiles = temp;
938}
939
940
941
942/// Read the xml nodes related to window properties
943WindowProperties Preferences::readWindowProperties( TiXmlNode *parent, const QString& windowName, WindowProperties defaultProp )
944{
945        WindowProperties prop = defaultProp;
946
947        TiXmlNode* windowPropNode;
948        if ( !( windowPropNode = parent->FirstChild( windowName.toAscii() ) ) ) {
949                WARNINGLOG( "Error reading configuration file: " + windowName + " node not found" );
950        } else {
951                prop.visible = LocalFileMng::readXmlBool( windowPropNode, "visible", true );
952                prop.x = LocalFileMng::readXmlInt( windowPropNode, "x", prop.x );
953                prop.y = LocalFileMng::readXmlInt( windowPropNode, "y", prop.y );
954                prop.width = LocalFileMng::readXmlInt( windowPropNode, "width", prop.width );
955                prop.height = LocalFileMng::readXmlInt( windowPropNode, "height", prop.height );
956        }
957
958        return prop;
959}
960
961
962
963/// Write the xml nodes related to window properties
964void Preferences::writeWindowProperties( TiXmlNode& parent, const QString& windowName, const WindowProperties& prop )
965{
966        TiXmlElement windowPropNode( windowName.toAscii() );
967        if ( prop.visible ) {
968                LocalFileMng::writeXmlString( &windowPropNode, "visible", "true" );
969        } else {
970                LocalFileMng::writeXmlString( &windowPropNode, "visible", "false" );
971        }
972
973        LocalFileMng::writeXmlString( &windowPropNode, "x", to_string( prop.x ) );
974        LocalFileMng::writeXmlString( &windowPropNode, "y", to_string( prop.y ) );
975        LocalFileMng::writeXmlString( &windowPropNode, "width", to_string( prop.width ) );
976        LocalFileMng::writeXmlString( &windowPropNode, "height", to_string( prop.height ) );
977        parent.InsertEndChild( windowPropNode );
978}
979
980
981
982void Preferences::writeUIStyle( TiXmlNode& parent )
983{
984        TiXmlElement node( "UI_Style" );
985
986        // SONG EDITOR
987        TiXmlElement songEditorNode( "songEditor" );
988        LocalFileMng::writeXmlString( &songEditorNode, "backgroundColor", m_pDefaultUIStyle->m_songEditor_backgroundColor.toStringFmt() );
989        LocalFileMng::writeXmlString( &songEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_songEditor_alternateRowColor.toStringFmt() );
990        LocalFileMng::writeXmlString( &songEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_songEditor_selectedRowColor.toStringFmt() );
991        LocalFileMng::writeXmlString( &songEditorNode, "lineColor", m_pDefaultUIStyle->m_songEditor_lineColor.toStringFmt() );
992        LocalFileMng::writeXmlString( &songEditorNode, "textColor", m_pDefaultUIStyle->m_songEditor_textColor.toStringFmt() );
993        LocalFileMng::writeXmlString( &songEditorNode, "pattern1Color", m_pDefaultUIStyle->m_songEditor_pattern1Color.toStringFmt() );
994        node.InsertEndChild( songEditorNode );
995
996        // PATTERN EDITOR
997        TiXmlElement patternEditorNode( "patternEditor" );
998        LocalFileMng::writeXmlString( &patternEditorNode, "backgroundColor", m_pDefaultUIStyle->m_patternEditor_backgroundColor.toStringFmt() );
999        LocalFileMng::writeXmlString( &patternEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_patternEditor_alternateRowColor.toStringFmt() );
1000        LocalFileMng::writeXmlString( &patternEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_patternEditor_selectedRowColor.toStringFmt() );
1001        LocalFileMng::writeXmlString( &patternEditorNode, "textColor", m_pDefaultUIStyle->m_patternEditor_textColor.toStringFmt() );
1002        LocalFileMng::writeXmlString( &patternEditorNode, "noteColor", m_pDefaultUIStyle->m_patternEditor_noteColor.toStringFmt() );
1003
1004        if (m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() == "-1,-1,-1" ){
1005                m_pDefaultUIStyle->m_patternEditor_noteoffColor = H2RGBColor( "100, 100, 200" );
1006        }
1007        LocalFileMng::writeXmlString( &patternEditorNode, "noteoffColor", m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() );
1008
1009        LocalFileMng::writeXmlString( &patternEditorNode, "lineColor", m_pDefaultUIStyle->m_patternEditor_lineColor.toStringFmt() );
1010        LocalFileMng::writeXmlString( &patternEditorNode, "line1Color", m_pDefaultUIStyle->m_patternEditor_line1Color.toStringFmt() );
1011        LocalFileMng::writeXmlString( &patternEditorNode, "line2Color", m_pDefaultUIStyle->m_patternEditor_line2Color.toStringFmt() );
1012        LocalFileMng::writeXmlString( &patternEditorNode, "line3Color", m_pDefaultUIStyle->m_patternEditor_line3Color.toStringFmt() );
1013        LocalFileMng::writeXmlString( &patternEditorNode, "line4Color", m_pDefaultUIStyle->m_patternEditor_line4Color.toStringFmt() );
1014        LocalFileMng::writeXmlString( &patternEditorNode, "line5Color", m_pDefaultUIStyle->m_patternEditor_line5Color.toStringFmt() );
1015        node.InsertEndChild( patternEditorNode );
1016
1017        parent.InsertEndChild( node );
1018}
1019
1020
1021
1022void Preferences::readUIStyle( TiXmlNode& parent )
1023{
1024        // SONG EDITOR
1025        TiXmlNode* pSongEditorNode = parent.FirstChild( "songEditor" );
1026        if ( pSongEditorNode ) {
1027                m_pDefaultUIStyle->m_songEditor_backgroundColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "backgroundColor", m_pDefaultUIStyle->m_songEditor_backgroundColor.toStringFmt() ) );
1028                m_pDefaultUIStyle->m_songEditor_alternateRowColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_songEditor_alternateRowColor.toStringFmt() ) );
1029                m_pDefaultUIStyle->m_songEditor_selectedRowColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_songEditor_selectedRowColor.toStringFmt() ) );
1030                m_pDefaultUIStyle->m_songEditor_lineColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "lineColor", m_pDefaultUIStyle->m_songEditor_lineColor.toStringFmt() ) );
1031                m_pDefaultUIStyle->m_songEditor_textColor = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "textColor", m_pDefaultUIStyle->m_songEditor_textColor.toStringFmt() ) );
1032                m_pDefaultUIStyle->m_songEditor_pattern1Color = H2RGBColor( LocalFileMng::readXmlString( pSongEditorNode, "pattern1Color", m_pDefaultUIStyle->m_songEditor_pattern1Color.toStringFmt() ) );
1033        } else {
1034                WARNINGLOG( "songEditor node not found" );
1035        }
1036
1037        // PATTERN EDITOR
1038        TiXmlNode* pPatternEditorNode = parent.FirstChild( "patternEditor" );
1039        if ( pPatternEditorNode ) {
1040                m_pDefaultUIStyle->m_patternEditor_backgroundColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "backgroundColor", m_pDefaultUIStyle->m_patternEditor_backgroundColor.toStringFmt() ) );
1041                m_pDefaultUIStyle->m_patternEditor_alternateRowColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "alternateRowColor", m_pDefaultUIStyle->m_patternEditor_alternateRowColor.toStringFmt() ) );
1042                m_pDefaultUIStyle->m_patternEditor_selectedRowColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "selectedRowColor", m_pDefaultUIStyle->m_patternEditor_selectedRowColor.toStringFmt() ) );
1043                m_pDefaultUIStyle->m_patternEditor_textColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "textColor", m_pDefaultUIStyle->m_patternEditor_textColor.toStringFmt() ) );
1044                m_pDefaultUIStyle->m_patternEditor_noteColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "noteColor", m_pDefaultUIStyle->m_patternEditor_noteColor.toStringFmt() ) );
1045                m_pDefaultUIStyle->m_patternEditor_noteoffColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "noteoffColor", m_pDefaultUIStyle->m_patternEditor_noteoffColor.toStringFmt() ) );
1046                m_pDefaultUIStyle->m_patternEditor_lineColor = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "lineColor", m_pDefaultUIStyle->m_patternEditor_lineColor.toStringFmt() ) );
1047                m_pDefaultUIStyle->m_patternEditor_line1Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line1Color", m_pDefaultUIStyle->m_patternEditor_line1Color.toStringFmt() ) );
1048                m_pDefaultUIStyle->m_patternEditor_line2Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line2Color", m_pDefaultUIStyle->m_patternEditor_line2Color.toStringFmt() ) );
1049                m_pDefaultUIStyle->m_patternEditor_line3Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line3Color", m_pDefaultUIStyle->m_patternEditor_line3Color.toStringFmt() ) );
1050                m_pDefaultUIStyle->m_patternEditor_line4Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line4Color", m_pDefaultUIStyle->m_patternEditor_line4Color.toStringFmt() ) );
1051                m_pDefaultUIStyle->m_patternEditor_line5Color = H2RGBColor( LocalFileMng::readXmlString( pPatternEditorNode, "line5Color", m_pDefaultUIStyle->m_patternEditor_line5Color.toStringFmt() ) );
1052        } else {
1053                WARNINGLOG( "patternEditor node not found" );
1054        }
1055}
1056
1057
1058// -----------------------
1059
1060
1061
1062
1063WindowProperties::WindowProperties()
1064                : Object( "WindowProperties" )
1065{
1066//      infoLog( "INIT" );
1067        x = 0;
1068        y = 0;
1069        width = 0;
1070        height = 0;
1071        visible = true;
1072}
1073
1074
1075
1076WindowProperties::~WindowProperties()
1077{
1078//      infoLog( "DESTROY" );
1079}
1080
1081
1082
1083
1084// :::::::::::::::::::::::::::::::
1085
1086
1087
1088UIStyle::UIStyle()
1089                : Object( "UIStyle" )
1090{
1091//      infoLog( "INIT" );
1092}
1093
1094
1095
1096// ::::::::::::::::::::::::::::::::::::::
1097
1098
1099
1100H2RGBColor::H2RGBColor( int r, int g, int b )
1101                : Object( "H2RGBColor" )
1102                , m_red( r )
1103                , m_green( g )
1104                , m_blue( b )
1105{
1106//      infoLog( "INIT" );
1107}
1108
1109
1110
1111H2RGBColor::~H2RGBColor()
1112{
1113//      infoLog( "DESTROY" );
1114}
1115
1116
1117
1118H2RGBColor::H2RGBColor( const QString& sColor )
1119                : Object( "H2RGBColor" )
1120{
1121//      infoLog( "INIT " + sColor );
1122        QString temp = sColor;
1123
1124        QStringList list = temp.split(",");
1125        m_red = list[0].toInt();
1126        m_green = list[1].toInt();
1127        m_blue = list[2].toInt();
1128
1129/*
1130        int nPos = temp.indexOf( ',' );
1131        QString sRed = temp.substr( 0, nPos );
1132        temp.erase( 0, nPos + 1 );
1133
1134        nPos = temp.find( ',' );
1135        QString sGreen = temp.substr( 0, nPos );
1136        temp.erase( 0, nPos + 1 );
1137
1138        nPos = temp.find( ',' );
1139        QString sBlue = temp.substr( 0, nPos );
1140
1141        m_red = atoi( sRed.c_str() );
1142        m_green = atoi( sGreen.c_str() );
1143        m_blue = atoi( sBlue.c_str() );
1144*/
1145}
1146
1147
1148
1149QString H2RGBColor::toStringFmt()
1150{
1151        char tmp[255];
1152        sprintf( tmp, "%d,%d,%d", m_red, m_green, m_blue );
1153
1154        //string sRes = to_string( m_red ) + "," + to_string( m_green ) + "," + to_string( m_blue );
1155//      return sRes;
1156
1157        return QString( tmp );
1158}
1159
1160};
Note: See TracBrowser for help on using the browser.