microSD カードのビットマップ・ファイルのビュアー.画像の最大値 縦:272ピクセル,横:480ピクセル. Bitmap file viewer for microSD card. Maximum size Vertical: 272 pixels, Horizontal: 480.

Dependencies:   SDFileSystem_Warning_Fixed F746_GUI

Committer:
MikamiUitOpen
Date:
Tue Oct 23 11:51:47 2018 +0000
Revision:
1:bb146d5fe9aa
2

Who changed what in which revision?

UserRevisionLine numberNew 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