root/branches/midiAutosense/libs/hydrogen/src/preferences.cpp @ 575

Revision 575, 40.8 KB (checked in by smoors, 5 years ago)

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