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