microSD カードのビットマップ・ファイルのビュアー.画像の最大値 縦:272ピクセル,横:480ピクセル. Bitmap file viewer for microSD card. Maximum size Vertical: 272 pixels, Horizontal: 480.
Dependencies: SDFileSystem_Warning_Fixed F746_GUI
MyFiles/FileSelectorBmp.cpp@1:bb146d5fe9aa, 2018-10-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Oct 23 11:51:47 2018 +0000
- Revision:
- 1:bb146d5fe9aa
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 1:bb146d5fe9aa | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 1:bb146d5fe9aa | 2 | // FileSelector class |
MikamiUitOpen | 1:bb146d5fe9aa | 3 | // SD カード内の *.bmp ファイル名の一覧を表示し,ファイルを選択する |
MikamiUitOpen | 1:bb146d5fe9aa | 4 | // だだし,日本語のファイル名は除く |
MikamiUitOpen | 1:bb146d5fe9aa | 5 | // |
MikamiUitOpen | 1:bb146d5fe9aa | 6 | // 2018/10/23, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 1:bb146d5fe9aa | 7 | //-------------------------------------------------------------- |
MikamiUitOpen | 1:bb146d5fe9aa | 8 | |
MikamiUitOpen | 1:bb146d5fe9aa | 9 | #include "FileSelectorBmp.hpp" |
MikamiUitOpen | 1:bb146d5fe9aa | 10 | |
MikamiUitOpen | 1:bb146d5fe9aa | 11 | namespace Mikami |
MikamiUitOpen | 1:bb146d5fe9aa | 12 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 13 | FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles, |
MikamiUitOpen | 1:bb146d5fe9aa | 14 | int maxNameLength, SD_BitmapReader &reader) |
MikamiUitOpen | 1:bb146d5fe9aa | 15 | : X_(x0), Y_(y0), |
MikamiUitOpen | 1:bb146d5fe9aa | 16 | MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), |
MikamiUitOpen | 1:bb146d5fe9aa | 17 | fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_), |
MikamiUitOpen | 1:bb146d5fe9aa | 18 | next_(50, 235, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24), |
MikamiUitOpen | 1:bb146d5fe9aa | 19 | pageLabel_(210, 250, Label::LEFT, Font16), |
MikamiUitOpen | 1:bb146d5fe9aa | 20 | lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1), |
MikamiUitOpen | 1:bb146d5fe9aa | 21 | nOld_(-1), kOld_(-1) |
MikamiUitOpen | 1:bb146d5fe9aa | 22 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 23 | Array<string> nonString(MAX_LIST_PAGE_, ""); |
MikamiUitOpen | 1:bb146d5fe9aa | 24 | rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_, |
MikamiUitOpen | 1:bb146d5fe9aa | 25 | nonString, 0, V_L_-W_H_, 1, |
MikamiUitOpen | 1:bb146d5fe9aa | 26 | -1, Font12, 0, GuiBase::ENUM_BACK, |
MikamiUitOpen | 1:bb146d5fe9aa | 27 | BASE_COLOR_, TOUCHED_COLOR_); |
MikamiUitOpen | 1:bb146d5fe9aa | 28 | rect_->EraseAll(); |
MikamiUitOpen | 1:bb146d5fe9aa | 29 | next_.EraseAll(); |
MikamiUitOpen | 1:bb146d5fe9aa | 30 | |
MikamiUitOpen | 1:bb146d5fe9aa | 31 | // Label を生成 |
MikamiUitOpen | 1:bb146d5fe9aa | 32 | for (int n=0; n<MAX_LIST_PAGE_; n++) |
MikamiUitOpen | 1:bb146d5fe9aa | 33 | fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "", |
MikamiUitOpen | 1:bb146d5fe9aa | 34 | Label::LEFT, Font16, BASE_COLOR_); |
MikamiUitOpen | 1:bb146d5fe9aa | 35 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 36 | |
MikamiUitOpen | 1:bb146d5fe9aa | 37 | FileSelector::~FileSelector() |
MikamiUitOpen | 1:bb146d5fe9aa | 38 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 39 | delete rect_; |
MikamiUitOpen | 1:bb146d5fe9aa | 40 | for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n]; |
MikamiUitOpen | 1:bb146d5fe9aa | 41 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 42 | |
MikamiUitOpen | 1:bb146d5fe9aa | 43 | // ファイルの一覧表を作る.BMP ファイルが存在しない場合は false を返す |
MikamiUitOpen | 1:bb146d5fe9aa | 44 | bool FileSelector::CreateTable() |
MikamiUitOpen | 1:bb146d5fe9aa | 45 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 46 | DIR* dp = opendir("/sd"); |
MikamiUitOpen | 1:bb146d5fe9aa | 47 | fileCount_ = 0; |
MikamiUitOpen | 1:bb146d5fe9aa | 48 | if (dp != NULL) |
MikamiUitOpen | 1:bb146d5fe9aa | 49 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 50 | dirent* entry; |
MikamiUitOpen | 1:bb146d5fe9aa | 51 | for (int n=0; n<256; n++) |
MikamiUitOpen | 1:bb146d5fe9aa | 52 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 53 | entry = readdir(dp); |
MikamiUitOpen | 1:bb146d5fe9aa | 54 | if (entry == NULL) break; |
MikamiUitOpen | 1:bb146d5fe9aa | 55 | |
MikamiUitOpen | 1:bb146d5fe9aa | 56 | string strName = entry->d_name; |
MikamiUitOpen | 1:bb146d5fe9aa | 57 | if ( (strName.find(".bmp") != string::npos) || |
MikamiUitOpen | 1:bb146d5fe9aa | 58 | (strName.find(".BMP") != string::npos) ) |
MikamiUitOpen | 1:bb146d5fe9aa | 59 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 60 | if (sdReader_.Open(strName)) // ファイルのオープン |
MikamiUitOpen | 1:bb146d5fe9aa | 61 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 62 | // 不適切なファイルは除外 |
MikamiUitOpen | 1:bb146d5fe9aa | 63 | if (sdReader_.IsAllowed()) |
MikamiUitOpen | 1:bb146d5fe9aa | 64 | fileNames_[fileCount_++] = strName; |
MikamiUitOpen | 1:bb146d5fe9aa | 65 | sdReader_.Close(); |
MikamiUitOpen | 1:bb146d5fe9aa | 66 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 67 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 68 | if (fileCount_ >= MAX_FILES_) break; |
MikamiUitOpen | 1:bb146d5fe9aa | 69 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 70 | closedir(dp); |
MikamiUitOpen | 1:bb146d5fe9aa | 71 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 72 | else |
MikamiUitOpen | 1:bb146d5fe9aa | 73 | return false; // SD カードが装着されていない場合 |
MikamiUitOpen | 1:bb146d5fe9aa | 74 | if (fileCount_ == 0) return false; // 該当する BMP ファイルが存在しない場合 |
MikamiUitOpen | 1:bb146d5fe9aa | 75 | |
MikamiUitOpen | 1:bb146d5fe9aa | 76 | div_t m = div(fileCount_, MAX_LIST_PAGE_); |
MikamiUitOpen | 1:bb146d5fe9aa | 77 | maxPage_ = (m.rem == 0) ? m.quot : m.quot+1; |
MikamiUitOpen | 1:bb146d5fe9aa | 78 | return true; // 該当する BMP ファイルが存在する場合 |
MikamiUitOpen | 1:bb146d5fe9aa | 79 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 80 | |
MikamiUitOpen | 1:bb146d5fe9aa | 81 | // ファイルを選択する |
MikamiUitOpen | 1:bb146d5fe9aa | 82 | bool FileSelector::Select(string &fileName) |
MikamiUitOpen | 1:bb146d5fe9aa | 83 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 84 | int m; |
MikamiUitOpen | 1:bb146d5fe9aa | 85 | if (next_.GetTouchedNumber(m)) |
MikamiUitOpen | 1:bb146d5fe9aa | 86 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 87 | if (m==0) page_--; |
MikamiUitOpen | 1:bb146d5fe9aa | 88 | else page_++; |
MikamiUitOpen | 1:bb146d5fe9aa | 89 | DisplayFileList(false); |
MikamiUitOpen | 1:bb146d5fe9aa | 90 | nOld_ = -1; |
MikamiUitOpen | 1:bb146d5fe9aa | 91 | wait_ms(300); |
MikamiUitOpen | 1:bb146d5fe9aa | 92 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 93 | |
MikamiUitOpen | 1:bb146d5fe9aa | 94 | int n; |
MikamiUitOpen | 1:bb146d5fe9aa | 95 | if (rect_->GetTouchedNumber(n)) |
MikamiUitOpen | 1:bb146d5fe9aa | 96 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 97 | int k = (page_ - 1)*MAX_LIST_PAGE_ + n; |
MikamiUitOpen | 1:bb146d5fe9aa | 98 | fileNameLabels_[n]->Draw(GetFileNameNoExt(k), |
MikamiUitOpen | 1:bb146d5fe9aa | 99 | TOUCHED_COLOR_); |
MikamiUitOpen | 1:bb146d5fe9aa | 100 | fileName = fileNames_[k]; |
MikamiUitOpen | 1:bb146d5fe9aa | 101 | // 同じページで以前に選択されているファイル名の色を戻す |
MikamiUitOpen | 1:bb146d5fe9aa | 102 | if (nOld_ != -1) |
MikamiUitOpen | 1:bb146d5fe9aa | 103 | fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_), |
MikamiUitOpen | 1:bb146d5fe9aa | 104 | BASE_COLOR_); |
MikamiUitOpen | 1:bb146d5fe9aa | 105 | if (page_ == maxPage_) // 最後のページで余分な四角形を消去 |
MikamiUitOpen | 1:bb146d5fe9aa | 106 | for (int j=fileCount_ % MAX_LIST_PAGE_ + 1; |
MikamiUitOpen | 1:bb146d5fe9aa | 107 | j < MAX_LIST_PAGE_; j++) rect_->Erase(j); |
MikamiUitOpen | 1:bb146d5fe9aa | 108 | nOld_ = n; |
MikamiUitOpen | 1:bb146d5fe9aa | 109 | kOld_ = k; |
MikamiUitOpen | 1:bb146d5fe9aa | 110 | return true; |
MikamiUitOpen | 1:bb146d5fe9aa | 111 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 112 | else |
MikamiUitOpen | 1:bb146d5fe9aa | 113 | return false; |
MikamiUitOpen | 1:bb146d5fe9aa | 114 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 115 | |
MikamiUitOpen | 1:bb146d5fe9aa | 116 | // ファイルの一覧の表示 |
MikamiUitOpen | 1:bb146d5fe9aa | 117 | void FileSelector::DisplayFileList(bool sortEnable) |
MikamiUitOpen | 1:bb146d5fe9aa | 118 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 119 | if (sortEnable) |
MikamiUitOpen | 1:bb146d5fe9aa | 120 | std::sort((string *)fileNames_, |
MikamiUitOpen | 1:bb146d5fe9aa | 121 | (string *)fileNames_+fileCount_); |
MikamiUitOpen | 1:bb146d5fe9aa | 122 | |
MikamiUitOpen | 1:bb146d5fe9aa | 123 | Erase(0, 0, 480, 272); |
MikamiUitOpen | 1:bb146d5fe9aa | 124 | |
MikamiUitOpen | 1:bb146d5fe9aa | 125 | div_t m = div(fileCount_, MAX_LIST_PAGE_); |
MikamiUitOpen | 1:bb146d5fe9aa | 126 | int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem; |
MikamiUitOpen | 1:bb146d5fe9aa | 127 | for (int n=0; n<count; n++) rect_->Draw(n); |
MikamiUitOpen | 1:bb146d5fe9aa | 128 | for (int n=0; n<count; n++) |
MikamiUitOpen | 1:bb146d5fe9aa | 129 | fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_)); |
MikamiUitOpen | 1:bb146d5fe9aa | 130 | |
MikamiUitOpen | 1:bb146d5fe9aa | 131 | // 前のページ,次のページの選択ボタンなどを表示する |
MikamiUitOpen | 1:bb146d5fe9aa | 132 | next_.InactivateAll(); |
MikamiUitOpen | 1:bb146d5fe9aa | 133 | if (page_ > 1) next_.Activate(0); // "<" 有効 |
MikamiUitOpen | 1:bb146d5fe9aa | 134 | if (page_ < maxPage_) next_.Activate(1); // ">" 有効 |
MikamiUitOpen | 1:bb146d5fe9aa | 135 | char page[6]; |
MikamiUitOpen | 1:bb146d5fe9aa | 136 | sprintf(page, "%d/%d", page_, maxPage_); |
MikamiUitOpen | 1:bb146d5fe9aa | 137 | pageLabel_.Draw(page); |
MikamiUitOpen | 1:bb146d5fe9aa | 138 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 139 | |
MikamiUitOpen | 1:bb146d5fe9aa | 140 | // ファイルの一覧の消去 |
MikamiUitOpen | 1:bb146d5fe9aa | 141 | void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, |
MikamiUitOpen | 1:bb146d5fe9aa | 142 | uint16_t height, uint32_t color) |
MikamiUitOpen | 1:bb146d5fe9aa | 143 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 144 | lcd_.SetTextColor(color); |
MikamiUitOpen | 1:bb146d5fe9aa | 145 | lcd_.FillRect(x, y, width, height); |
MikamiUitOpen | 1:bb146d5fe9aa | 146 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 147 | |
MikamiUitOpen | 1:bb146d5fe9aa | 148 | // 拡張子を削除したファイル名を取得 |
MikamiUitOpen | 1:bb146d5fe9aa | 149 | string FileSelector::GetFileNameNoExt(int n) |
MikamiUitOpen | 1:bb146d5fe9aa | 150 | { |
MikamiUitOpen | 1:bb146d5fe9aa | 151 | string name = fileNames_[n]; |
MikamiUitOpen | 1:bb146d5fe9aa | 152 | int k = name.rfind("."); |
MikamiUitOpen | 1:bb146d5fe9aa | 153 | if (k != string::npos) |
MikamiUitOpen | 1:bb146d5fe9aa | 154 | return name.erase(k); |
MikamiUitOpen | 1:bb146d5fe9aa | 155 | else |
MikamiUitOpen | 1:bb146d5fe9aa | 156 | return name; |
MikamiUitOpen | 1:bb146d5fe9aa | 157 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 158 | } |
MikamiUitOpen | 1:bb146d5fe9aa | 159 |