1 /* Sound player
2
3 Copyright (C) 1997 by Woo-jae Jung */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif
8
9 #include <stdlib.h>
10
11 #include "xsplay.h"
12 #include "fileselect.h"
13
14 #include <qregexp.h>
15
FileSelect(QWidget * parent,char * name)16 FileSelect::FileSelect( QWidget *parent,char *name )
17 : QDialog(parent,name,TRUE)
18 {
19 setCaption("Open Files");
20 move(mainwidget_x()+10,mainwidget_y()+10);
21 resize(400,460);
22 setFixedSize(400,460);
23
24 filter_label=new QLabel("Filter:",this);
25 filter_label->setGeometry(10,10,60,20);
26
27 filter_ledit=new QLineEdit(this,"filterEdit");
28 filter_ledit->setGeometry(70,10,width()-70-10,20);
29 filter_ledit->setText(Getcurrentwildcard());
30 connect(filter_ledit,SIGNAL(returnPressed()),SLOT(filterentered()));
31
32 {
33 char *path=Getcurrentpath();
34
35 if(path)dir=new QDir(path);
36 else dir=new QDir;
37 }
38
39 currentdirectory_label=new QLabel(this,"Current directory");
40 currentdirectory_label->setGeometry(10,40,380,20);
41 currentdirectory_label->setAlignment(AlignRight);
42 currentdirectory_label->setText(dir->absPath());
43
44 dir_listbox=new QListBox(this);
45 dir_listbox->setGeometry(10,70,100,300);
46 connect(dir_listbox,SIGNAL(selected(int)),SLOT(dirSelected(int)) );
47
48 mselect=new MSelect(this);
49 mselect->setGeometry(width()-10-250,70,250,300);
50 connect(mselect,SIGNAL(clicked()),SLOT(MSelectclicked()) );
51 connect(mselect,SIGNAL(doubleclicked()),SLOT(SelectOk()));
52
53 ok_button=new QPushButton("Ok",this);
54 ok_button->setGeometry(10,height()-40,50,25 );
55 connect(ok_button,SIGNAL(clicked()),SLOT(SelectOk()));
56
57 all_button=new QPushButton( "All", this );
58 all_button->setGeometry(width()/2-25-5,height()-40, 50,25 );
59 connect(all_button,SIGNAL(clicked()),SLOT(SelectAll()) );
60
61 cancel_button=new QPushButton( "Cancel", this );
62 cancel_button->setGeometry(width()-50-10,height()-40, 50,25 );
63 connect(cancel_button,SIGNAL(clicked()),SLOT(reject()) );
64
65 selectedfilenumber_label=new QLabel(this,"Selected");
66 selectedfilenumber_label->setGeometry(width()-120,height()-40-30,100,20);
67 selectedfilenumber_label->setAlignment(AlignRight);
68
69
70 readdir();
71 }
72
~FileSelect()73 FileSelect::~FileSelect()
74 {
75 Setcurrentwildcard((char *)((const char *)filter_ledit->text()));
76
77 delete filter_label;
78 delete filter_ledit;
79 delete currentdirectory_label;
80
81 delete dir_listbox;
82 delete mselect;
83
84 delete selectedfilenumber_label;
85
86 delete ok_button;
87 delete all_button;
88 delete cancel_button;
89 }
90
SelectOk()91 void FileSelect::SelectOk()
92 {
93 if(mselect->Getselectedfilenumber())
94 {
95 int e=mselect->Gettotalfilenumber()-1;
96 int k,currentmin,nextmin=1;
97
98 music_stop();
99 killlist();
100
101 k=mselect->Getselectedfilenumber();
102 while(k)
103 {
104 currentmin=nextmin;
105 nextmin=0x7FFFFFFF;
106 for(int i=0;i<=e;i++)
107 {
108 int n=mselect->IsSelected(i);
109
110 if(n==currentmin)
111 {
112 addlist((const char *)dir->absPath(),
113 (const char *)mselect->Cellstring(i));
114 k--;
115 }
116 if(n>currentmin)
117 {
118 if(nextmin>n)nextmin=n;
119 }
120 }
121 if(nextmin==0x7FFFFFFF)break; // Avoid halting
122 }
123
124 music_restart();
125 if(splay_shuffleflag)shufflelist();
126 accept();
127 }
128 }
129
SelectAll()130 void FileSelect::SelectAll()
131 {
132 int e=mselect->Gettotalfilenumber();
133
134 for(int i=0;i<e;i++)
135 mselect->Select(i,true);
136 mselect->update();
137 update();
138 }
139
dirSelected(int index)140 void FileSelect::dirSelected(int index)
141 {
142 if (dir->cd(dir_listbox->text(index)) && dir->isReadable())
143 {
144 readdir();
145 currentdirectory_label->setText(dir->absPath());
146 Setcurrentpath((char *)((const char *)dir->absPath()));
147 }
148 /* else {
149 QMessageBox::message( "Sorry", "Cannot open or read directory." );
150 d = tmp;
151 }*/
152 }
153
MSelectclicked()154 void FileSelect::MSelectclicked()
155 {
156 sprintf(selectedfilenumber_string,
157 "Selected : %d/%d",
158 mselect->Getselectedfilenumber(),mselect->Gettotalfilenumber());
159
160 selectedfilenumber_label->setText(selectedfilenumber_string);
161 }
162
filterentered()163 void FileSelect::filterentered()
164 {
165 if(strcmp(filter_ledit->text(),"")==0)
166 filter_ledit->setText("*");
167 // d.setNameFilter( filterEdit->text() );
168 readdir();
169 }
170
readdir()171 void FileSelect::readdir()
172 {
173 const QFileInfoList *filelist=dir->entryInfoList();
174 QFileInfoListIterator l(*filelist);
175 QFileInfo *inf;
176 QRegExp **regexp;
177 char **expression;
178 int regexpnum=1;
179
180 {
181 char buffer[300];
182 const char *str;
183 int p,j,k;
184
185 str=filter_ledit->text();
186 if(str[0]==0)filter_ledit->setText("*");
187 str=filter_ledit->text();
188 for(p=0;str[p];p++)
189 if(str[p]==':')regexpnum++;
190
191 regexp=new (QRegExp *)[regexpnum];
192 expression=new (char *)[regexpnum];
193
194 for(p=j=k=0;;p++)
195 {
196 if(str[p]==':' || str[p]==0)
197 {
198 if(j)
199 {
200 buffer[j]=0;
201 expression[k]=strdup(buffer);
202 regexp[k]=new QRegExp(expression[k],TRUE,TRUE);
203 k++;
204 j=0;
205 }
206 else regexpnum--;
207
208 if(str[p]==0)break;
209 }
210 else buffer[j++]=str[p];
211 }
212 }
213
214 dir_listbox->clear();
215 mselect->Clearfilelist();
216 for(inf=l.current();inf;inf=++l)
217 {
218 if(inf->isDir())
219 dir_listbox->insertItem(inf->fileName().data());
220 else
221 {
222 for(int k=0;k<regexpnum;k++)
223 {
224 if(regexp[k]->match(inf->fileName().data())>=0)
225 mselect->Appendfilelist((inf->fileName().data()));
226 }
227 }
228 }
229
230 for(int p=0;p<regexpnum;p++)
231 {
232 delete regexp[p];
233 free(expression[p]);
234 }
235
236 delete[] regexp;
237 delete[] expression;
238
239 mselect->Donefilelist();
240 mselect->update();
241 MSelectclicked();
242 update();
243 }
244
RunFileSelect(QWidget * widget)245 void RunFileSelect(QWidget *widget)
246 {
247 FileSelect fs(widget,"File Select");
248 fs.exec();
249 }
250