root/branches/jackMidi/gui/src/PlaylistEditor/PlaylistDialog.cpp @ 539

Revision 539, 23.2 KB (checked in by gabriel, 5 years ago)

Merge rev 505:528 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
24#include "PlaylistDialog.h"
25#include "../HydrogenApp.h"
26#include "../InstrumentRack.h"
27#include "SoundLibrary/SoundLibraryPanel.h"
28
29#include <hydrogen/LocalFileMng.h>
30#include <hydrogen/h2_exception.h>
31#include <hydrogen/Preferences.h>
32#include <hydrogen/hydrogen.h>
33#include <hydrogen/playlist.h>
34
35#include "../widgets/Button.h"
36
37#include <QTreeWidget>
38#include <QDomDocument>
39#include <QMessageBox>
40#include <QHeaderView>
41#include <QFileDialog>
42#include <vector>
43#include <cstdlib>
44#include <iostream>
45#include <fstream>
46
47using namespace H2Core;
48using namespace std;
49
50PlaylistDialog::PlaylistDialog ( QWidget* pParent )
51                : QDialog ( pParent )
52                , Object ( "PlayListDialog" )
53{
54
55        setupUi ( this );
56        INFOLOG ( "INIT" );
57        setWindowTitle ( trUtf8 ( "Play List Browser" ) );
58        setFixedSize ( width(), height() );
59        installEventFilter(this);
60
61       
62#ifdef WIN32
63        QStringList headers;
64        headers << trUtf8 ( "Song list" );
65        QTreeWidgetItem* header = new QTreeWidgetItem ( headers );
66        m_pPlaylistTree->setHeaderItem ( header );
67        m_pPlaylistTree->setAlternatingRowColors( true );
68
69        addSongBTN->setEnabled ( true );
70        loadListBTN->setEnabled ( true );
71        removeFromListBTN->setEnabled ( false );
72        removeFromListBTN->setEnabled ( false );
73        saveListBTN->setEnabled ( false );
74        nodePlayBTN->setEnabled ( false );
75        loadScriptBTN->hide();
76        removeScriptBTN->hide();
77        editScriptBTN->hide();
78        newScriptBTN->hide();
79        clearPlBTN->setEnabled ( false );
80
81        QVBoxLayout *sideBarLayout = new QVBoxLayout(sideBarWidget);
82        sideBarLayout->setSpacing(0);
83        sideBarLayout->setMargin(0);
84
85#else   
86        QStringList headers;
87        headers << trUtf8 ( "Song list" ) << trUtf8 ( "Script" ) << trUtf8 ( "exec Script" );
88        QTreeWidgetItem* header = new QTreeWidgetItem ( headers );
89        m_pPlaylistTree->setHeaderItem ( header );
90        m_pPlaylistTree->header()->resizeSection ( 0, 405 );
91        m_pPlaylistTree->header()->resizeSection ( 1, 405 );
92        m_pPlaylistTree->header()->resizeSection ( 2, 15 );
93        m_pPlaylistTree->setAlternatingRowColors( true );
94
95        addSongBTN->setEnabled ( true );
96        loadListBTN->setEnabled ( true );
97        removeFromListBTN->setEnabled ( false );
98        removeFromListBTN->setEnabled ( false );
99        saveListBTN->setEnabled ( false );
100        nodePlayBTN->setEnabled ( false );
101        loadScriptBTN->setEnabled ( false );
102        removeScriptBTN->setEnabled ( false );
103        editScriptBTN->setEnabled ( false );
104        clearPlBTN->setEnabled ( false );
105
106        QVBoxLayout *sideBarLayout = new QVBoxLayout(sideBarWidget);
107        sideBarLayout->setSpacing(0);
108        sideBarLayout->setMargin(0);
109#endif
110
111        // zoom-in btn
112        Button *up_btn = new Button(
113                        NULL,
114                        "/songEditor/btn_up_on.png",
115                        "/songEditor/btn_up_off.png",
116                        "/songEditor/btn_up_over.png",
117                        QSize(18, 13)
118        );
119
120        up_btn->setFontSize(7);
121        up_btn->setToolTip( trUtf8( "sort" ) );
122        connect(up_btn, SIGNAL(clicked(Button*)), this, SLOT(o_upBClicked()) );
123        sideBarLayout->addWidget(up_btn);
124
125        // zoom-in btn
126        Button *down_btn = new Button(
127                        NULL,
128                        "/songEditor/btn_down_on.png",
129                        "/songEditor/btn_down_off.png",
130                        "/songEditor/btn_down_over.png",
131                        QSize(18, 13)
132        );
133
134        down_btn->setFontSize(7);
135        down_btn->setToolTip( trUtf8( "sort" ) );
136        connect(down_btn, SIGNAL(clicked(Button*)), this, SLOT(o_downBClicked()));
137        sideBarLayout->addWidget(down_btn);
138       
139
140//restore the playlist
141        if( Hydrogen::get_instance()->m_PlayList.size() > 0 ){
142                for ( uint i = 0; i < Hydrogen::get_instance()->m_PlayList.size(); ++i ){
143                        QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree );
144                        m_pPlaylistItem->setText ( 0, Hydrogen::get_instance()->m_PlayList[i].m_hFile );
145                        m_pPlaylistItem->setText ( 1, Hydrogen::get_instance()->m_PlayList[i].m_hScript );
146                        if ( Hydrogen::get_instance()->m_PlayList[i].m_hScriptEnabled == "Use Script" ) {
147                                m_pPlaylistItem->setCheckState( 2, Qt::Checked );
148                        }else{
149                                m_pPlaylistItem->setCheckState( 2, Qt::Unchecked );
150                        }
151                }
152                removeFromListBTN->setEnabled ( true );
153                removeFromListBTN->setEnabled ( true );
154                saveListBTN->setEnabled ( true );
155                nodePlayBTN->setEnabled ( true );
156                loadScriptBTN->setEnabled ( true );
157                removeScriptBTN->setEnabled ( true );
158                editScriptBTN->setEnabled ( true );
159                clearPlBTN->setEnabled ( true );
160
161                //restore the selected item             
162                int selected = Playlist::get_instance()->getActiveSongNumber();
163                int Selected = Playlist::get_instance()->getSelectedSongNr();
164                if( selected == -1 && Selected == -1 ) return;
165               
166                int aselected = 0;
167                if( selected == -1 ){
168                        aselected = Selected;
169                }else
170                {
171                        aselected = selected ;
172                }
173                QTreeWidget* m_pPlaylist = m_pPlaylistTree;
174                QTreeWidgetItem* m_pPlaylistItem = m_pPlaylist->topLevelItem ( aselected );
175                m_pPlaylistItem->setBackgroundColor ( 0, QColor( 50, 50, 50) );
176                m_pPlaylistItem->setBackgroundColor ( 1, QColor( 50, 50, 50) );
177                m_pPlaylistItem->setBackgroundColor ( 2, QColor( 50, 50, 50) );
178                }
179
180        timer = new QTimer( this );
181        connect(timer, SIGNAL(timeout() ), this, SLOT( updateActiveSongNumber() ) );
182        timer->start( 1000 );   // update player control at 1 fps
183
184}
185
186
187PlaylistDialog::~PlaylistDialog()
188{
189        INFOLOG ( "DESTROY" );
190}
191
192
193void PlaylistDialog::on_addSongBTN_clicked()
194{
195        static QString songDir = Preferences::getInstance()->getDataDirectory()  + "/songs";;
196
197        QFileDialog *fd = new QFileDialog ( this );
198        fd->setFileMode ( QFileDialog::ExistingFile );
199        fd->setFilter ( "Hydrogen song (*.h2song)" );
200        fd->setDirectory ( songDir );
201
202        fd->setWindowTitle ( trUtf8 ( "Add Song to PlayList" ) );
203
204        QString filename = "";
205        if ( fd->exec() == QDialog::Accepted ){
206                filename = fd->selectedFiles().first();
207                updatePlayListNode ( filename );
208        }
209
210
211}
212
213
214void PlaylistDialog::on_removeFromListBTN_clicked()
215{
216
217        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
218        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
219        int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem );
220        QTreeWidgetItem * m_pItem = m_pPlaylist->topLevelItem ( 1 );
221
222
223        if (m_pPlaylistItem == NULL){
224                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song selected!" ));
225                return;
226        }else
227        {
228                if (m_pItem == 0){
229                        m_pPlaylist->clear();
230                        Hydrogen::get_instance()->m_PlayList.clear();
231                        Playlist::get_instance()->setSelectedSongNr( -1 );
232                        Playlist::get_instance()->setActiveSongNumber( -1 );
233                        editScriptBTN->setEnabled ( false );
234                        nodePlayBTN->setEnabled ( false );
235                        removeFromListBTN->setEnabled ( false );
236                        saveListBTN->setEnabled ( false );
237                        loadScriptBTN->setEnabled ( false );
238                        clearPlBTN->setEnabled ( false );
239                        return;
240                }else
241                {       
242                        ///avoid segfault if the last item will be removed!!
243                        delete m_pPlaylistItem;
244                        updatePlayListVector();
245                        if (  Playlist::get_instance()->getActiveSongNumber() == index ){
246                                Playlist::get_instance()->setActiveSongNumber( -1 );
247                        }else if (  Playlist::get_instance()->getActiveSongNumber() > index  ){
248                                Playlist::get_instance()->setActiveSongNumber(  Playlist::get_instance()->getActiveSongNumber() -1 );
249                        }
250                       
251                }
252        }
253}
254
255
256void PlaylistDialog::on_clearPlBTN_clicked()
257{
258        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
259       
260        m_pPlaylist->clear();
261        Hydrogen::get_instance()->m_PlayList.clear();
262        Playlist::get_instance()->setSelectedSongNr( -1 );
263        Playlist::get_instance()->setActiveSongNumber( -1 );
264        editScriptBTN->setEnabled ( false );
265        nodePlayBTN->setEnabled ( false );
266        removeFromListBTN->setEnabled ( false );
267        saveListBTN->setEnabled ( false );
268        loadScriptBTN->setEnabled ( false );
269        clearPlBTN->setEnabled ( false );
270        return;
271}
272
273
274void PlaylistDialog::updatePlayListNode ( QString file )
275{
276
277        QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree );
278        m_pPlaylistItem->setText ( 0, file );
279        m_pPlaylistItem->setText ( 1, "no Script" );
280        m_pPlaylistItem->setCheckState( 2, Qt::Unchecked );
281
282        updatePlayListVector();
283        loadScriptBTN->setEnabled ( true );
284        nodePlayBTN->setEnabled ( true );
285        removeFromListBTN->setEnabled ( true );
286        saveListBTN->setEnabled ( true );
287        clearPlBTN->setEnabled ( true );
288
289        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
290        m_pPlaylist->setCurrentItem ( m_pPlaylistItem );
291
292}
293
294
295void PlaylistDialog::on_loadListBTN_clicked()
296{
297
298        static QString sDirectory =  Preferences::getInstance()->getDataDirectory()  + "playlists/" ;
299
300        QFileDialog *fd = new QFileDialog ( this );
301        fd->setFileMode ( QFileDialog::ExistingFile );
302        fd->setDirectory ( sDirectory );
303
304        fd->setWindowTitle ( trUtf8 ( "Load Playlist" ) );
305
306        QString filename = "";
307        if ( fd->exec() == QDialog::Accepted ){
308                filename = fd->selectedFiles().first();
309
310                LocalFileMng fileMng;
311                int err = fileMng.loadPlayList( filename.toStdString() );
312                if ( err != 0 ) {
313                        _ERRORLOG( "Error saving the playlist" );
314                }
315
316       
317                if(Hydrogen::get_instance()->m_PlayList.size() > 0){
318
319                        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
320                        m_pPlaylist->clear();
321
322                        for ( uint i = 0; i < Hydrogen::get_instance()->m_PlayList.size(); ++i ){
323                                QTreeWidgetItem* m_pPlaylistItem = new QTreeWidgetItem ( m_pPlaylistTree );
324                                m_pPlaylistItem->setText ( 0, Hydrogen::get_instance()->m_PlayList[i].m_hFile );
325                                m_pPlaylistItem->setText ( 1, Hydrogen::get_instance()->m_PlayList[i].m_hScript );
326                                if ( Hydrogen::get_instance()->m_PlayList[i].m_hScriptEnabled == "Use Script" ) {
327                                        m_pPlaylistItem->setCheckState( 2, Qt::Checked );
328                                }else{
329                                        m_pPlaylistItem->setCheckState( 2, Qt::Unchecked );
330                                }
331                        }
332                        removeFromListBTN->setEnabled ( true );
333                        removeFromListBTN->setEnabled ( true );
334                        saveListBTN->setEnabled ( true );
335                        nodePlayBTN->setEnabled ( true );
336                        loadScriptBTN->setEnabled ( true );
337                        removeScriptBTN->setEnabled ( true );
338                        editScriptBTN->setEnabled ( true );
339                        clearPlBTN->setEnabled ( true );
340       
341
342                        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylist->topLevelItem ( 0 );
343                        m_pPlaylist->setCurrentItem ( m_pPlaylistItem );
344                        Playlist::get_instance()->setSelectedSongNr( 0 );
345                }
346
347        }
348}
349
350
351void PlaylistDialog::on_newScriptBTN_clicked()
352{
353
354        Preferences *pPref = Preferences::getInstance();
355
356        QString sDirectory = ( Preferences::getInstance()->getDataDirectory()  + "scripts/");
357        QFileDialog *fd = new QFileDialog ( this );
358        fd->setFileMode ( QFileDialog::AnyFile );
359        fd->setFilter ( trUtf8 ( "Hydrogen Scripts (*.sh)" ) );
360        fd->setAcceptMode ( QFileDialog::AcceptSave );
361        fd->setWindowTitle ( trUtf8 ( "New Script" ) );
362        fd->setDirectory ( sDirectory );
363
364        QString defaultFilename;
365
366                defaultFilename += ".sh";
367
368
369        fd->selectFile ( defaultFilename );
370
371        QString filename = "";
372        if ( fd->exec() == QDialog::Accepted )
373        {
374                filename = fd->selectedFiles().first();
375        }else
376        {
377                return;
378        }
379       
380        std::string name = filename.toStdString();
381
382        char *file;
383        file = new char[name.length() + 1];
384        strcpy(file, name.c_str());
385
386        ofstream newfile;
387        newfile.open ( file );
388        newfile << "#!/bin/sh\n\n#have phun";
389        newfile.close();
390        delete [] file;
391
392       
393        if( pPref->getDefaultEditor() == ""){
394                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Default Editor Set. Please set your Default Editor\nDo not use a console based Editor\nSorry, but this will not work for the moment." ) );
395
396                static QString lastUsedDir = "/usr/bin/";
397       
398                QFileDialog *fd = new QFileDialog ( this );
399                fd->setFileMode ( QFileDialog::ExistingFile );
400                fd->setDirectory ( lastUsedDir );
401       
402                fd->setWindowTitle ( trUtf8 ( "Set your Default Editor" ) );
403       
404                QString filename = "";
405                if ( fd->exec() == QDialog::Accepted ){
406                        filename = fd->selectedFiles().first();
407       
408                        pPref->setDefaultEditor( filename );
409                }               
410        }
411
412        std::string  openfile = pPref->getDefaultEditor().toStdString() + " " + filename.toStdString() + "&";
413
414        char *ofile;
415        ofile = new char[openfile.length() + 1];
416        strcpy(ofile, openfile.c_str());
417        std::system( ofile );
418        delete [] ofile;
419        return;
420
421       
422}
423
424
425void PlaylistDialog::on_saveListBTN_clicked()
426{
427
428        QString sDirectory =  Preferences::getInstance()->getDataDirectory()  + "playlists/";
429        QFileDialog *fd = new QFileDialog ( this );
430        fd->setFileMode ( QFileDialog::AnyFile );
431        fd->setFilter ( trUtf8 ( "Hydrogen Playlist (*.h2playlist)" ) );
432        fd->setAcceptMode ( QFileDialog::AcceptSave );
433        fd->setWindowTitle ( trUtf8 ( "Save Playlist" ) );
434        fd->setDirectory ( sDirectory );
435
436
437        QString defaultFilename;
438
439                defaultFilename += ".h2playlist";
440
441
442        fd->selectFile ( defaultFilename );
443
444        QString filename = "";
445        if ( fd->exec() == QDialog::Accepted )
446        {
447                filename = fd->selectedFiles().first();
448        }
449
450        LocalFileMng fileMng;
451        int err = fileMng.savePlayList( filename.toStdString() );
452        if ( err != 0 ) {
453                _ERRORLOG( "Error saving the playlist" );
454        }
455}
456
457
458void PlaylistDialog::on_loadScriptBTN_clicked()
459{
460       
461        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
462        if ( m_pPlaylistItem == NULL ){
463                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song in List or no Song selected!" ) );
464                return;
465        }
466
467        static QString lastUsedDir =  Preferences::getInstance()->getDataDirectory()  + "scripts/";
468
469        QFileDialog *fd = new QFileDialog ( this );
470        fd->setFileMode ( QFileDialog::ExistingFile );
471        fd->setDirectory ( lastUsedDir );
472        fd->setFilter ( trUtf8 ( "Hydrogen Playlist (*.sh)" ) );
473        fd->setWindowTitle ( trUtf8 ( "Add Script to selected Song" ) );
474
475        QString filename = "";
476        if ( fd->exec() == QDialog::Accepted ){
477                filename = fd->selectedFiles().first();
478
479                std::string filetest = filename.toStdString();
480                int error = filetest.rfind(" ");
481                if(error >= 0){
482                        QMessageBox::information ( this, "Hydrogen", trUtf8 ( "Script name or path to the script contains whitespaces.\nIMPORTANT\nThe path to the script and the scriptname must without whitespaces.") );
483                        return;
484                }
485
486                m_pPlaylistItem->setText ( 1, filename );
487                editScriptBTN->setEnabled ( true );
488                removeScriptBTN->setEnabled ( true );
489                updatePlayListVector();
490
491        }
492}
493
494
495void PlaylistDialog::on_removeScriptBTN_clicked()
496{
497        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
498
499
500        if (m_pPlaylistItem == NULL){
501                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song selected!" ));
502                return;
503        }else{
504                QString selected = "";
505                selected = m_pPlaylistItem->text ( 1 );
506                if( selected == "no Script"){
507                        QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Script in use!" ));
508                        return;
509                }else
510                {
511                        m_pPlaylistItem->setText ( 1, "no Script" );
512                        m_pPlaylistItem->setCheckState( 2, Qt::Unchecked );
513                        updatePlayListVector();
514                }
515        }
516
517}
518
519
520void PlaylistDialog::on_editScriptBTN_clicked()
521{
522        Preferences *pPref = Preferences::getInstance();
523        if( pPref->getDefaultEditor() == ""){
524                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Default Editor Set. Please set your Default Editor\nDo not use a console based Editor\nSorry, but this will not work for the moment." ) );
525
526                static QString lastUsedDir = "/usr/bin/";
527       
528                QFileDialog *fd = new QFileDialog ( this );
529                fd->setFileMode ( QFileDialog::ExistingFile );
530                fd->setDirectory ( lastUsedDir );
531       
532                fd->setWindowTitle ( trUtf8 ( "Set your Default Editor" ) );
533       
534                QString filename = "";
535                if ( fd->exec() == QDialog::Accepted ){
536                        filename = fd->selectedFiles().first();
537       
538                        pPref->setDefaultEditor( filename );
539                }               
540        }
541
542        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
543
544        if ( m_pPlaylistItem == NULL ){
545                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song selected!" ) );
546                return;
547        }
548        QString selected = "";
549        selected = m_pPlaylistItem->text ( 1 );
550
551        std::string filename = pPref->getDefaultEditor().toStdString() + " " + selected.toStdString() + "&";
552
553        if( selected == "no Script"){
554                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Script selected!" ));
555                return;
556        }
557
558        char *file;
559        file = new char[ filename.length() + 1 ];
560        strcpy( file , filename.c_str() );
561        std::system( file );
562        delete [] file;
563        return;
564}
565
566
567void PlaylistDialog::o_upBClicked()
568{       
569        timer->stop();
570
571        Playlist* pList = Playlist::get_instance();
572
573        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
574        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
575        int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem );
576
577        if (index == 0 ){
578                timer->start( 1000 );
579                return;
580        }
581
582        QTreeWidgetItem* tmpPlaylistItem = m_pPlaylist->takeTopLevelItem ( index );
583
584        m_pPlaylist->insertTopLevelItem ( index -1, tmpPlaylistItem );
585        m_pPlaylist->setCurrentItem ( tmpPlaylistItem );
586
587        if ( pList->getSelectedSongNr() >= 0 )
588                pList->setSelectedSongNr( pList->getSelectedSongNr() -1 );
589
590        if ( pList->getActiveSongNumber() == index ){
591                pList->setActiveSongNumber( pList->getActiveSongNumber() -1 );
592        }else if ( pList->getActiveSongNumber() == index -1 ){
593                pList->setActiveSongNumber( pList->getActiveSongNumber() +1 );
594        }
595
596        updatePlayListVector();
597
598}
599
600
601void PlaylistDialog::o_downBClicked()
602{
603        timer->stop();
604        Playlist* pList = Playlist::get_instance();
605
606        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
607        int length = m_pPlaylist->topLevelItemCount();
608        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
609        int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem );
610
611        if ( index == length - 1){
612                timer->start( 1000 );
613                return;
614        }
615
616
617        QTreeWidgetItem* tmpPlaylistItem = m_pPlaylist->takeTopLevelItem ( index );
618
619        m_pPlaylist->insertTopLevelItem ( index +1, tmpPlaylistItem );
620        m_pPlaylist->setCurrentItem ( tmpPlaylistItem );
621
622        if ( pList->getSelectedSongNr() >= 0 )
623                pList->setSelectedSongNr( pList->getSelectedSongNr() +1 );
624
625        if (pList ->getActiveSongNumber() == index ){
626                pList->setActiveSongNumber( pList->getActiveSongNumber() +1 );
627        }else if ( pList->getActiveSongNumber() == index +1 ){
628                pList->setActiveSongNumber( pList->getActiveSongNumber() -1 );
629        }
630        updatePlayListVector();
631
632}
633
634
635void PlaylistDialog::on_m_pPlaylistTree_itemClicked ( QTreeWidgetItem * item, int column )
636{
637        if ( column == 2 ){
638                QString selected = "";
639                selected = item->text ( 1 );
640
641                if( selected == "no Script"){
642                        QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Script!" ));
643                        item->setCheckState( 2, Qt::Unchecked );
644                        return;
645                }
646                updatePlayListVector();
647        }
648        return;
649}
650
651
652void PlaylistDialog::on_nodePlayBTN_clicked()
653{
654        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
655        if ( m_pPlaylistItem == NULL ){
656                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song selected!" ) );
657                return;
658        }
659        QString selected = "";
660        selected = m_pPlaylistItem->text ( 0 );
661
662       
663        HydrogenApp *pH2App = HydrogenApp::getInstance();
664        Hydrogen *engine = Hydrogen::get_instance();
665       
666
667        if ( engine->getState() == STATE_PLAYING ){
668                engine->sequencer_stop();
669        }
670
671        LocalFileMng mng;
672        Song *pSong = Song::load ( selected );
673        if ( pSong == NULL ){
674                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "Error loading song." ) );
675                return;
676        }
677
678        pH2App->setSong ( pSong );
679        engine->setSelectedPatternNumber ( 0 );
680
681        Hydrogen::get_instance()->sequencer_play();
682}
683
684
685void PlaylistDialog::on_nodeStopBTN_clicked()
686{
687        Hydrogen::get_instance()->sequencer_stop();
688        Hydrogen::get_instance()->setPatternPos ( 0 );
689}
690
691
692void PlaylistDialog::on_m_pPlaylistTree_itemDoubleClicked ()
693{
694
695        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylistTree->currentItem();
696        if ( m_pPlaylistItem == NULL ){
697                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Song selected!" ) );
698                return;
699        }
700        QString selected = "";
701        selected = m_pPlaylistItem->text ( 0 );
702
703        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
704        int index = m_pPlaylist->indexOfTopLevelItem ( m_pPlaylistItem );
705        Playlist::get_instance()->setSelectedSongNr( index );
706        Playlist::get_instance()->setActiveSongNumber( index );
707       
708        HydrogenApp *pH2App = HydrogenApp::getInstance();
709        Hydrogen *engine = Hydrogen::get_instance();
710       
711
712        if ( engine->getState() == STATE_PLAYING ){
713                engine->sequencer_stop();
714        }
715
716        LocalFileMng mng;
717        Song *pSong = Song::load ( selected );
718        if ( pSong == NULL ){
719                QMessageBox::information ( this, "Hydrogen", trUtf8 ( "Error loading song." ) );
720                return;
721        }
722
723        pH2App->setSong ( pSong );
724        engine->setSelectedPatternNumber ( 0 );
725
726
727        pH2App->setStatusBarMessage( trUtf8( "Playlist: Set song No. %1" ).arg( index +1 ), 5000 );
728
729        HydrogenApp::getInstance()->getInstrumentRack()->getSoundLibraryPanel()->update_background_color();
730
731///exec script
732///this is very very simple and only an experiment
733#ifdef WIN32
734        //I know nothing about windows scripts -wolke-
735        return;
736#else
737        QString execscript = "";
738        selected = m_pPlaylistItem->text ( 1 );
739        bool execcheckbox = m_pPlaylistItem->checkState ( 2 );
740        std::string filename = selected.toStdString();
741
742        if( execcheckbox == false){
743                //QMessageBox::information ( this, "Hydrogen", trUtf8 ( "No Script selected!" ));
744                return;
745        }
746
747        if( execscript == "Script not used"){
748                //QMessageBox::information ( this, "Hydrogen", trUtf8 ( "Script not in use!" ));
749                return;
750        }
751
752        char *file;
753        file = new char[ filename.length() + 1 ];
754        strcpy( file , filename.c_str() );
755        std::system( file );
756        delete [] file;
757        return;
758#endif
759
760}
761
762
763void PlaylistDialog::updatePlayListVector()
764{
765        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
766        int length = m_pPlaylist->topLevelItemCount();
767
768        Hydrogen::get_instance()->m_PlayList.clear();
769
770
771
772        for (int i = 0 ;i < length; i++){
773                QTreeWidgetItem * m_pPlaylistItem = m_pPlaylist->topLevelItem ( i );   
774               
775                QString execval = "";
776                bool execcheckbox = m_pPlaylistItem->checkState ( 2 );
777                if ( execcheckbox == true ) {
778                        execval = "Use Script";
779                }else{
780                        execval = "Script not used";
781                }
782                Hydrogen::HPlayListNode playListItem;
783                playListItem.m_hFile = m_pPlaylistItem->text ( 0 );
784                playListItem.m_hScript = m_pPlaylistItem->text ( 1 );
785                playListItem.m_hScriptEnabled = execval;
786
787                Hydrogen::get_instance()->m_PlayList.push_back( playListItem );
788        }
789        timer->start( 1000 );
790}
791
792
793void PlaylistDialog::updateActiveSongNumber()
794{
795        QTreeWidget* m_pPlaylist = m_pPlaylistTree;
796
797        for ( uint i = 0; i < Hydrogen::get_instance()->m_PlayList.size(); ++i ){
798                if ( !m_pPlaylist->topLevelItem( i ) )
799                        break;
800                ( m_pPlaylist->topLevelItem( i ) )->setBackground( 0, QBrush() );
801                ( m_pPlaylist->topLevelItem( i ) )->setBackground( 1, QBrush() );
802                ( m_pPlaylist->topLevelItem( i ) )->setBackground( 2, QBrush() );
803               
804        }
805               
806        int selected = Playlist::get_instance()->getActiveSongNumber();
807        if ( selected == -1 )
808                return;
809       
810        QTreeWidgetItem* m_pPlaylistItem = m_pPlaylist->topLevelItem ( selected );     
811        //m_pPlaylist->setCurrentItem ( m_pPlaylistItem );
812        m_pPlaylistItem->setBackgroundColor ( 0, QColor( 50, 50, 50) );
813        m_pPlaylistItem->setBackgroundColor ( 1, QColor( 50, 50, 50) );
814        m_pPlaylistItem->setBackgroundColor ( 2, QColor( 50, 50, 50) );
815}
816
817
818bool PlaylistDialog::eventFilter ( QObject *o, QEvent *e )
819{
820       
821        UNUSED ( o );
822        if ( e->type() == QEvent::KeyPress )
823        {       
824                QKeyEvent *k = ( QKeyEvent * ) e;
825
826                switch ( k->key() )
827                {
828                        case  Qt::Key_F5 :
829                                if( Hydrogen::get_instance()->m_PlayList.size() == 0)
830                                        break;
831                                Playlist::get_instance()->setPrevSongPlaylist();
832                                return TRUE;
833                                break;
834
835                        case  Qt::Key_F6 :
836                                if( Hydrogen::get_instance()->m_PlayList.size() == 0)
837                                        break;
838                                Playlist::get_instance()->setNextSongPlaylist();
839                                return TRUE;
840                                break;
841                }
842
843        }
844        else
845        {
846                return FALSE; // standard event processing
847        }
848
849return NULL;
850}
851
Note: See TracBrowser for help on using the browser.