?
FileSelectorWav.cpp@0:cacfc9e25452, 2019-06-04 (annotated)
- Committer:
- phungductung
- Date:
- Tue Jun 04 21:58:08 2019 +0000
- Revision:
- 0:cacfc9e25452
?;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |