?

Committer:
phungductung
Date:
Tue Jun 04 21:58:08 2019 +0000
Revision:
0:cacfc9e25452
?;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:cacfc9e25452 1 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 2 // FileSelector class
phungductung 0:cacfc9e25452 3 // SD カード内のファイル名の一覧を表示し,ファイルを選択する
phungductung 0:cacfc9e25452 4 //
phungductung 0:cacfc9e25452 5 // 2016/06/30, Copyright (c) 2016 MIKAMI, Naoki
phungductung 0:cacfc9e25452 6 //--------------------------------------------------------------
phungductung 0:cacfc9e25452 7
phungductung 0:cacfc9e25452 8 #include "FileSelectorWav.hpp"
phungductung 0:cacfc9e25452 9
phungductung 0:cacfc9e25452 10 namespace Mikami
phungductung 0:cacfc9e25452 11 {
phungductung 0:cacfc9e25452 12 bool FileSelector::CreateTable()
phungductung 0:cacfc9e25452 13 {
phungductung 0:cacfc9e25452 14 DIR* dp = opendir("/sd");
phungductung 0:cacfc9e25452 15 fileCount_ = 0;
phungductung 0:cacfc9e25452 16 if (dp != NULL)
phungductung 0:cacfc9e25452 17 {
phungductung 0:cacfc9e25452 18 dirent* entry;
phungductung 0:cacfc9e25452 19 for (int n=0; n<256; n++)
phungductung 0:cacfc9e25452 20 {
phungductung 0:cacfc9e25452 21 entry = readdir(dp);
phungductung 0:cacfc9e25452 22 if (entry == NULL) break;
phungductung 0:cacfc9e25452 23
phungductung 0:cacfc9e25452 24 string strName = entry->d_name;
phungductung 0:cacfc9e25452 25 if ( (strName.find(".wav") != string::npos) ||
phungductung 0:cacfc9e25452 26 (strName.find(".WAV") != string::npos) )
phungductung 0:cacfc9e25452 27 {
phungductung 0:cacfc9e25452 28 sdReader_.Open(strName); // ファイルオープン
phungductung 0:cacfc9e25452 29
phungductung 0:cacfc9e25452 30 // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
phungductung 0:cacfc9e25452 31 if (sdReader_.IsWavFile())
phungductung 0:cacfc9e25452 32 fileNames_[fileCount_++] = strName;
phungductung 0:cacfc9e25452 33 sdReader_.Close();
phungductung 0:cacfc9e25452 34 }
phungductung 0:cacfc9e25452 35
phungductung 0:cacfc9e25452 36 if (fileCount_ >= MAX_FILES_) break;
phungductung 0:cacfc9e25452 37 }
phungductung 0:cacfc9e25452 38 closedir(dp);
phungductung 0:cacfc9e25452 39 }
phungductung 0:cacfc9e25452 40 else
phungductung 0:cacfc9e25452 41 return false;
phungductung 0:cacfc9e25452 42
phungductung 0:cacfc9e25452 43 if (fileCount_ == 0) return false;
phungductung 0:cacfc9e25452 44
phungductung 0:cacfc9e25452 45 if (rect_ != NULL) delete rect_;
phungductung 0:cacfc9e25452 46 Array<string> nonString(fileCount_, "");
phungductung 0:cacfc9e25452 47 rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_,
phungductung 0:cacfc9e25452 48 nonString, 0, V_L_-W_H_, 1,
phungductung 0:cacfc9e25452 49 -1, Font12, 0, GuiBase::ENUM_BACK,
phungductung 0:cacfc9e25452 50 BASE_COLOR_, TOUCHED_COLOR_);
phungductung 0:cacfc9e25452 51 for (int n=0; n<fileCount_; n++) rect_->Erase(n);
phungductung 0:cacfc9e25452 52 CreateLabels();
phungductung 0:cacfc9e25452 53 prevFileCount_ = fileCount_;
phungductung 0:cacfc9e25452 54 return true;
phungductung 0:cacfc9e25452 55 }
phungductung 0:cacfc9e25452 56
phungductung 0:cacfc9e25452 57 // ファイルを選択する
phungductung 0:cacfc9e25452 58 bool FileSelector::Select(string &fileName)
phungductung 0:cacfc9e25452 59 {
phungductung 0:cacfc9e25452 60 int n;
phungductung 0:cacfc9e25452 61 if (rect_->GetTouchedNumber(n))
phungductung 0:cacfc9e25452 62 {
phungductung 0:cacfc9e25452 63 fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_);
phungductung 0:cacfc9e25452 64 if ((prev_ >= 0) && (prev_ != n))
phungductung 0:cacfc9e25452 65 fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_));
phungductung 0:cacfc9e25452 66 prev_ = n;
phungductung 0:cacfc9e25452 67 fileName = fileNames_[n];
phungductung 0:cacfc9e25452 68 return true;
phungductung 0:cacfc9e25452 69 }
phungductung 0:cacfc9e25452 70 else
phungductung 0:cacfc9e25452 71 return false;
phungductung 0:cacfc9e25452 72 }
phungductung 0:cacfc9e25452 73
phungductung 0:cacfc9e25452 74 // ファイルの一覧の表示
phungductung 0:cacfc9e25452 75 void FileSelector::DisplayFileList(bool sortEnable)
phungductung 0:cacfc9e25452 76 {
phungductung 0:cacfc9e25452 77 if (sortEnable)
phungductung 0:cacfc9e25452 78 std::sort((string *)fileNames_,
phungductung 0:cacfc9e25452 79 (string *)fileNames_+fileCount_);
phungductung 0:cacfc9e25452 80
phungductung 0:cacfc9e25452 81 Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_);
phungductung 0:cacfc9e25452 82 rect_->DrawAll();
phungductung 0:cacfc9e25452 83 for (int n=0; n<fileCount_; n++)
phungductung 0:cacfc9e25452 84 fileNameLabels_[n]->Draw(GetFileNameNoExt(n));
phungductung 0:cacfc9e25452 85 }
phungductung 0:cacfc9e25452 86
phungductung 0:cacfc9e25452 87 // ファイルの一覧の消去
phungductung 0:cacfc9e25452 88 void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
phungductung 0:cacfc9e25452 89 uint32_t color)
phungductung 0:cacfc9e25452 90 {
phungductung 0:cacfc9e25452 91 lcd_->SetTextColor(color);
phungductung 0:cacfc9e25452 92 lcd_->FillRect(x, y, width, height);
phungductung 0:cacfc9e25452 93 }
phungductung 0:cacfc9e25452 94
phungductung 0:cacfc9e25452 95 // Label を生成
phungductung 0:cacfc9e25452 96 void FileSelector::CreateLabels()
phungductung 0:cacfc9e25452 97 {
phungductung 0:cacfc9e25452 98 fileNameLabels_.SetSize(fileCount_);
phungductung 0:cacfc9e25452 99
phungductung 0:cacfc9e25452 100 for (int n=0; n<fileCount_; n++)
phungductung 0:cacfc9e25452 101 fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
phungductung 0:cacfc9e25452 102 Label::LEFT, Font16,
phungductung 0:cacfc9e25452 103 BASE_COLOR_);
phungductung 0:cacfc9e25452 104 }
phungductung 0:cacfc9e25452 105
phungductung 0:cacfc9e25452 106 // 拡張子を削除した文字列を取得
phungductung 0:cacfc9e25452 107 string FileSelector::GetFileNameNoExt(int n)
phungductung 0:cacfc9e25452 108 {
phungductung 0:cacfc9e25452 109 string name = fileNames_[n];
phungductung 0:cacfc9e25452 110 name.erase(name.find("."));
phungductung 0:cacfc9e25452 111 return name.substr(0, MAX_NAME_LENGTH_);
phungductung 0:cacfc9e25452 112 }
phungductung 0:cacfc9e25452 113
phungductung 0:cacfc9e25452 114 }