microSD カードのビットマップ・ファイルのビュアー.画像の最大値 縦:272ピクセル,横:480ピクセル. Bitmap file viewer for microSD card. Maximum size Vertical: 272 pixels, Horizontal: 480.
Dependencies: SDFileSystem_Warning_Fixed F746_GUI
Diff: FileSelectorBmp.cpp
- Revision:
- 1:bb146d5fe9aa
- Parent:
- 0:f62ffd3644bf
--- a/FileSelectorBmp.cpp Sun Oct 21 11:29:47 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -//-------------------------------------------------------------- -// FileSelector class -// SD カード内の *.bmp ファイル名の一覧を表示し,ファイルを選択する -// -// 2018/10/18, Copyright (c) 2018 MIKAMI, Naoki -//-------------------------------------------------------------- - -#include "FileSelectorBmp.hpp" - -namespace Mikami -{ - FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles, - int maxNameLength, SD_BitmapReader &reader) - : X_(x0), Y_(y0), - MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), - fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_), - next_(50, 235, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24), - pageLabel_(210, 250, Label::LEFT, Font16), - lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1), - nOld_(-1), kOld_(-1) - { - Array<string> nonString(MAX_LIST_PAGE_, ""); - rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_, - nonString, 0, V_L_-W_H_, 1, - -1, Font12, 0, GuiBase::ENUM_BACK, - BASE_COLOR_, TOUCHED_COLOR_); - rect_->EraseAll(); - next_.EraseAll(); - - // Label を生成 - for (int n=0; n<MAX_LIST_PAGE_; n++) - fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "", - Label::LEFT, Font16, BASE_COLOR_); - } - - FileSelector::~FileSelector() - { - delete rect_; - for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n]; - } - - // ファイルの一覧表を作る.BMP ファイルが存在しない場合は false を返す - bool FileSelector::CreateTable() - { - DIR* dp = opendir("/sd"); - fileCount_ = 0; - if (dp != NULL) - { - dirent* entry; - for (int n=0; n<256; n++) - { - entry = readdir(dp); - if (entry == NULL) break; - - string strName = entry->d_name; - if ( (strName.find(".bmp") != string::npos) || - (strName.find(".BMP") != string::npos) ) - { - sdReader_.Open(strName); // ファイルオープン - - // 不適切なファイルは除外 - if (sdReader_.IsAllowed()) - fileNames_[fileCount_++] = strName; - sdReader_.Close(); - } - if (fileCount_ >= MAX_FILES_) break; - } - closedir(dp); - } - else - return false; // SD カードが装着されていない場合 - if (fileCount_ == 0) return false; // 該当する BMP ファイルが存在しない場合 - - div_t m = div(fileCount_, MAX_LIST_PAGE_); - maxPage_ = (m.rem == 0) ? m.quot : m.quot+1; - return true; // 該当する BMP ファイルが存在する場合 - } - - // ファイルを選択する - bool FileSelector::Select(string &fileName) - { - int m; - if (next_.GetTouchedNumber(m)) - { - if (m==0) page_--; - else page_++; - DisplayFileList(false); - nOld_ = -1; - wait_ms(300); - } - - int n; - if (rect_->GetTouchedNumber(n)) - { - int k = (page_ - 1)*MAX_LIST_PAGE_ + n; - fileNameLabels_[n]->Draw(GetFileNameNoExt(k), - TOUCHED_COLOR_); - fileName = fileNames_[k]; - // 同じページで以前に選択されているファイル名の色を戻す - if (nOld_ != -1) - fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_), - BASE_COLOR_); - if (page_ == maxPage_) // 最後のページで余分な四角形を消去 - for (int j=fileCount_ % MAX_LIST_PAGE_ + 1; - j < MAX_LIST_PAGE_; j++) rect_->Erase(j); - nOld_ = n; - kOld_ = k; - return true; - } - else - return false; - } - - // ファイルの一覧の表示 - void FileSelector::DisplayFileList(bool sortEnable) - { - if (sortEnable) - std::sort((string *)fileNames_, - (string *)fileNames_+fileCount_); - - Erase(0, 0, 480, 272); - - div_t m = div(fileCount_, MAX_LIST_PAGE_); - int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem; - for (int n=0; n<count; n++) rect_->Draw(n); - for (int n=0; n<count; n++) - fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_)); - - // 前のページ,次のページの選択ボタンなどを表示する - next_.InactivateAll(); - if (page_ > 1) next_.Activate(0); // "<" 有効 - if (page_ < maxPage_) next_.Activate(1); // ">" 有効 - char page[6]; - sprintf(page, "%d/%d", page_, maxPage_); - pageLabel_.Draw(page); - } - - // ファイルの一覧の消去 - void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, - uint16_t height, uint32_t color) - { - lcd_.SetTextColor(color); - lcd_.FillRect(x, y, width, height); - } - - // 拡張子を削除したファイル名を取得 - string FileSelector::GetFileNameNoExt(int n) - { - string name = fileNames_[n]; - int k = name.rfind("."); - if (k != string::npos) - return name.erase(k); - else - return name; - } -}