hydrogen 1.2.6
FileBrowser.cpp
Go to the documentation of this file.
1/*
2 * Hydrogen
3 * Copyright(c) 2002-2008 by Alex >Comix< Cominu [comix@users.sourceforge.net]
4 * Copyright(c) 2008-2025 The hydrogen development team [hydrogen-devel@lists.sourceforge.net]
5 *
6 * http://www.hydrogen-music.org
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY, without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see https://www.gnu.org/licenses
20 *
21 */
22
23#include "FileBrowser.h"
24
25#include <QVBoxLayout>
26#include <QDir>
27
28#include "math.h"
29#include "string.h"
30
31#include <core/Hydrogen.h>
32#include <core/Basics/Sample.h>
34using namespace H2Core;
35
36FileBrowser::FileBrowser( QWidget* pParent )
37 : QWidget( pParent )
38{
39 INFOLOG( "[FileBrowser]" );
40
41 m_pDirectoryLabel = new QLabel( nullptr );
42 m_pUpBtn = new QPushButton( "..", nullptr );
43 m_pUpBtn->setMaximumWidth( 30 );
44 connect( m_pUpBtn, SIGNAL( clicked() ), this, SLOT( on_upBtnClicked() ) );
45
46 QWidget *pDirectoryPanel = new QWidget( nullptr );
47 QHBoxLayout *hbox = new QHBoxLayout();
48 hbox->setSpacing( 0 );
49 hbox->setContentsMargins( 0, 0, 0, 0 );
50 hbox->addWidget( m_pDirectoryLabel );
51 hbox->addWidget( m_pUpBtn );
52 pDirectoryPanel->setLayout( hbox );
53
54 QWidget *pInfoPanel = new QWidget( nullptr );
55 m_pFileInfo = new QLabel( nullptr );
56 QPushButton *pPlayBtn = new QPushButton( "Play", nullptr );
57 connect( pPlayBtn, SIGNAL( clicked() ), this, SLOT( on_playBtnClicked() ) );
58 pPlayBtn->setMaximumWidth( 40 );
59 QHBoxLayout *pInfoHBox = new QHBoxLayout();
60 pInfoHBox->addWidget( m_pFileInfo );
61 pInfoHBox->addWidget( pPlayBtn );
62 pInfoPanel->setLayout( pInfoHBox );
63
64 m_pDirList = new QListWidget( nullptr );
65 m_pFileList = new QListWidget( nullptr );
66
67 connect( m_pFileList, SIGNAL( currentItemChanged( QListWidgetItem*, QListWidgetItem*) ), this, SLOT( on_fileList_ItemChanged( QListWidgetItem*, QListWidgetItem* ) ) );
68 connect( m_pFileList, SIGNAL( itemActivated( QListWidgetItem* ) ), this, SLOT( on_fileList_ItemActivated( QListWidgetItem* ) ) );
69 connect( m_pDirList, SIGNAL( itemActivated( QListWidgetItem* ) ), this, SLOT( on_dirList_ItemActivated( QListWidgetItem* ) ) );
70
71 // LAYOUT
72 QVBoxLayout *vbox = new QVBoxLayout();
73 vbox->setSpacing( 0 );
74 vbox->setContentsMargins( 0, 0, 0, 0 );
75
76 vbox->addWidget( pDirectoryPanel );
77 vbox->addWidget( m_pDirList );
78 vbox->addWidget( m_pFileList );
79 vbox->addWidget( pInfoPanel );
80
81 this->setLayout( vbox );
82
83
84 updateFileInfo( "", 0, 0 );
85 loadDirectoryTree( QDir::homePath() );
86
87}
88
89
90
92{
93 INFOLOG( "[~FileBrowser]" );
94}
95
96
97
98void FileBrowser::loadDirectoryTree( const QString& sBasedir )
99{
100 INFOLOG( "[loadDirectoryTree]" );
101 m_pDirList->clear();
102 m_pFileList->clear();
103
104 m_directory.setPath( sBasedir );
105 m_pDirectoryLabel->setText( sBasedir );
106
107 QFileInfoList list = m_directory.entryInfoList();
108 for (int i = 0; i < list.size(); ++i) {
109 QFileInfo fileInfo = list.at(i);
110
111 QListWidgetItem *pItem = new QListWidgetItem();
112 if ( fileInfo.isDir() ) {
113 if ( fileInfo.fileName().startsWith( "." ) ) {
114 delete pItem;
115 continue;
116 }
117
118 pItem->setText( fileInfo.fileName() );
119 m_pDirList->insertItem( 0, pItem);
120 } else {
121 delete pItem;
122 }
123 }
124 m_pDirList->sortItems( Qt::AscendingOrder );
125
126
127 for (int i = 0; i < list.size(); ++i) {
128 QFileInfo fileInfo = list.at(i);
129
130 QListWidgetItem *pItem = new QListWidgetItem();
131 if ( !fileInfo.isDir() ) {
132 bool bOk = false;
133 if ( fileInfo.fileName().endsWith( ".wav", Qt::CaseInsensitive ) ) {
134 bOk = true;
135 }
136 else if ( fileInfo.fileName().endsWith( ".flac", Qt::CaseInsensitive ) ) {
137 bOk = true;
138 }
139 else if ( fileInfo.fileName().endsWith( ".au", Qt::CaseInsensitive ) ) {
140 bOk = true;
141 }
142 else if ( fileInfo.fileName().endsWith( ".aiff", Qt::CaseInsensitive ) ) {
143 bOk = true;
144 }
145
146 if ( bOk ) {
147 pItem->setText( fileInfo.fileName() );
148 m_pFileList->insertItem( 0, pItem);
149 } else {
150 delete pItem;
151 }
152 } else {
153 delete pItem;
154 }
155 }
156 m_pFileList->sortItems( Qt::AscendingOrder );
157
158}
159
160
161
162void FileBrowser::updateFileInfo( QString sFilename, unsigned nSampleRate, unsigned nBytes )
163{
164
165 char sFileSizeUnit[6];
166 char sFileSize[32];
167
168 if( nBytes >= 1073741824 ){
169
170 sprintf( sFileSize, "%#.3f", (float)nBytes / 1073741824.0 );
171 strcpy( sFileSizeUnit, "GByte" );
172
173 } else if( nBytes >= 1048576 ){
174
175 sprintf( sFileSize, "%#.2f", (float)nBytes / 1048576.0 );
176 strcpy( sFileSizeUnit, "MByte" );
177
178 } else if(nBytes >= 1024) {
179
180 sprintf( sFileSize, "%#.1f", (float)nBytes / 1024.0 );
181 strcpy( sFileSizeUnit, "KByte" );
182
183 } else {
184
185 sprintf( sFileSize, "%#.0f", (double)nBytes );
186 strcpy( sFileSizeUnit, "Byte" );
187
188 }
189
190 m_pFileInfo->setText( QString( tr( "%1<br>%2 KHz<br>%3 %4" ) )
191 .arg( sFilename )
192 .arg( nSampleRate )
193 .arg( sFileSize )
194 .arg( sFileSizeUnit )
195 );
196
197}
198
199
200
201void FileBrowser::on_fileList_ItemChanged( QListWidgetItem * current, QListWidgetItem * previous )
202{
203 UNUSED( previous );
204 INFOLOG( "[on_fileList_ItemChanged]" );
205 if ( current ) {
206 QString sFileName = current->text();
207 QFileInfoList list = m_directory.entryInfoList();
208 for (int i = 0; i < list.size(); ++i) {
209 QFileInfo fileInfo = list.at(i);
210 if ( fileInfo.fileName() == current->text() ) {
211 updateFileInfo( sFileName, 0, fileInfo.size() );
212 }
213 }
214 }
215}
216
217
218
219void FileBrowser::on_fileList_ItemActivated( QListWidgetItem* item )
220{
221 if ( !item ) {
222 return;
223 }
224
225 QFileInfoList list = m_directory.entryInfoList();
226 for (int i = 0; i < list.size(); ++i) {
227 QFileInfo fileInfo = list.at(i);
228 if ( fileInfo.fileName() == item->text() ) {
229 INFOLOG( "[on_fileList_ItemActivated] " + fileInfo.absoluteFilePath() );
230 if ( !fileInfo.isDir() ) {
231
232 // FIXME: evitare di caricare il sample, visualizzare solo le info del file
233 auto pNewSample = Sample::load( fileInfo.absoluteFilePath() );
234 if ( pNewSample != nullptr ) {
235 updateFileInfo( fileInfo.absoluteFilePath(), pNewSample->get_sample_rate(), pNewSample->get_size() );
237 }
238 }
239 }
240 }
241}
242
243
244
245void FileBrowser::on_dirList_ItemActivated( QListWidgetItem* pItem )
246{
247 INFOLOG( "[on_dirList_ItemActivated]" );
248
249 if ( !pItem ) {
250 return;
251 }
252
253 QFileInfoList list = m_directory.entryInfoList();
254 for (int i = 0; i < list.size(); ++i) {
255 QFileInfo fileInfo = list.at(i);
256 if ( fileInfo.fileName() == pItem->text() ) {
257 if ( fileInfo.isDir() ) {
258 // change directory
259 loadDirectoryTree( fileInfo.absoluteFilePath() );
260 return;
261 }
262 }
263 }
264
265}
266
267
268
270{
271 INFOLOG( "[on_upBtnClicked]" );
272 m_directory.cdUp();
273 loadDirectoryTree( m_directory.absolutePath() );
274}
275
276
278{
279 INFOLOG( "[on_playBtnClicked]" );
280}
#define INFOLOG(x)
Definition Object.h:240
QLabel * m_pDirectoryLabel
Definition FileBrowser.h:50
void on_fileList_ItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
QListWidget * m_pFileList
Definition FileBrowser.h:54
void on_fileList_ItemActivated(QListWidgetItem *)
void on_playBtnClicked()
QPushButton * m_pUpBtn
Definition FileBrowser.h:51
QLabel * m_pFileInfo
Definition FileBrowser.h:52
void on_dirList_ItemActivated(QListWidgetItem *)
void loadDirectoryTree(const QString &basedir)
QListWidget * m_pDirList
Definition FileBrowser.h:53
void on_upBtnClicked()
QDir m_directory
Definition FileBrowser.h:55
FileBrowser(QWidget *pParent)
void updateFileInfo(QString sFilename, unsigned nSampleRate, unsigned nBytes)
Sampler * getSampler() const
static Hydrogen * get_instance()
Returns the current Hydrogen instance __instance.
Definition Hydrogen.h:84
AudioEngine * getAudioEngine() const
Definition Hydrogen.h:663
static std::shared_ptr< Sample > load(const QString &filepath, const License &license=License())
Definition Sample.cpp:136
void preview_sample(std::shared_ptr< Sample > pSample, int length)
Preview, uses only the first layer.
Definition Sampler.cpp:1362
#define UNUSED(v)
Definition Globals.h:42