diff --git a/radio/src/gui/colorlcd/file_browser.cpp b/radio/src/gui/colorlcd/file_browser.cpp index 570a5c4f1..6594c365f 100644 --- a/radio/src/gui/colorlcd/file_browser.cpp +++ b/radio/src/gui/colorlcd/file_browser.cpp @@ -108,7 +108,6 @@ FileBrowser::FileBrowser(Window* parent, const rect_t& rect, const char* dir) : lv_obj_add_event_cb(lvobj, fb_event, LV_EVENT_ALL, nullptr); setColumnCount(1); - setColumnWidth(0, rect.w); f_chdir(dir); @@ -119,6 +118,7 @@ FileBrowser::FileBrowser(Window* parent, const rect_t& rect, const char* dir) : } void FileBrowser::setFileAction(FileAction fct) { fileAction = std::move(fct); } +void FileBrowser::setFileSelected(FileAction fct) { fileSelected = std::move(fct); } void FileBrowser::refresh() { @@ -147,6 +147,18 @@ void FileBrowser::refresh() select(0, 0); } +void FileBrowser::adjustWidth() +{ + lv_obj_update_layout(lvobj); + setColumnWidth(0, lv_obj_get_width(lvobj)); +} + +void FileBrowser::onSelected(uint16_t row, uint16_t col) +{ + bool is_dir = lv_table_has_cell_ctrl(lvobj, row, col, CELL_CTRL_DIR); + onSelected(lv_table_get_cell_value(lvobj, row, col), is_dir); +} + void FileBrowser::onPress(uint16_t row, uint16_t col) { bool is_dir = lv_table_has_cell_ctrl(lvobj, row, col, CELL_CTRL_DIR); @@ -189,6 +201,14 @@ void FileBrowser::onDrawEnd(uint16_t row, uint16_t col, lv_obj_draw_part_dsc_t* lv_draw_label(dsc->draw_ctx, dsc->label_dsc, &coords, sym, nullptr); } +void FileBrowser::onSelected(const char* name, bool is_dir) +{ + if (is_dir) return; + const char* path = getCurrentPath(); + const char* fullpath = getFullPath(name); + if (fileSelected) fileSelected(path, name, fullpath); +} + void FileBrowser::onPress(const char* name, bool is_dir) { const char* path = getCurrentPath(); diff --git a/radio/src/gui/colorlcd/file_browser.h b/radio/src/gui/colorlcd/file_browser.h index 1a9b7c0ba..3ec976586 100644 --- a/radio/src/gui/colorlcd/file_browser.h +++ b/radio/src/gui/colorlcd/file_browser.h @@ -30,17 +30,24 @@ class FileBrowser : public TableField typedef std::function FileAction; FileBrowser(Window* parent, const rect_t& rect, const char* dir); + void setFileAction(FileAction fct); + void setFileSelected(FileAction fct); void refresh(); + void adjustWidth(); + protected: + void onSelected(const char* name, bool is_dir); void onPress(const char* name, bool is_dir); // TableField methods + void onSelected(uint16_t row, uint16_t col) override; void onPress(uint16_t row, uint16_t col) override; void onDrawBegin(uint16_t row, uint16_t col, lv_obj_draw_part_dsc_t* dsc) override; void onDrawEnd(uint16_t row, uint16_t col, lv_obj_draw_part_dsc_t* dsc) override; private: FileAction fileAction; + FileAction fileSelected; }; diff --git a/radio/src/gui/colorlcd/file_preview.cpp b/radio/src/gui/colorlcd/file_preview.cpp index 627239252..69f58bddf 100644 --- a/radio/src/gui/colorlcd/file_preview.cpp +++ b/radio/src/gui/colorlcd/file_preview.cpp @@ -61,14 +61,18 @@ coord_t FilePreview::getBitmapHeight() const void FilePreview::paint(BitmapBuffer *dc) { + if (!bitmap) return; + + coord_t w = lv_obj_get_content_width(lvobj); + coord_t h = lv_obj_get_content_height(lvobj); + + coord_t bm_w = min(w, bitmap->width()); + coord_t bm_h = min(h, bitmap->height()); + + coord_t border_w = lv_obj_get_style_border_width(lvobj, 0); + coord_t x = border_w + lv_obj_get_style_pad_left(lvobj, 0); + coord_t y = border_w + lv_obj_get_style_pad_top(lvobj, 0); + dc->setFormat(BMP_RGB565); - coord_t y = /*_drawCentered ? parent->getScrollPositionY() + 2 :*/ 2; - coord_t h = _drawCentered ? MENU_BODY_HEIGHT - 4 : rect.h; - if (bitmap != nullptr) { - coord_t bitmapHeight = min(h, bitmap->height()); - coord_t bitmapWidth = min(width(), bitmap->width()); - dc->drawScaledBitmap(bitmap, (width() - bitmapWidth) / 2, - _drawCentered ? y + (h - bitmapHeight) / 2 : 0, - bitmapWidth, bitmapHeight); - } + dc->drawScaledBitmap(bitmap, x + (w - bm_w) / 2, y + (h - bm_h) / 2, bm_w, bm_h); } diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index ae87a5d3c..8f303036d 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -102,10 +102,6 @@ class FileNameEditWindow : public Page RadioSdManagerPage::RadioSdManagerPage() : PageTab(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, ICON_RADIO_SD_MANAGER) { - // setOnSetVisibleHandler([]() { - // TRACE("f_chdir(ROOT_PATH)"); - // f_chdir(ROOT_PATH); - // }); } template @@ -147,28 +143,49 @@ class FlashDialog: public FullScreenDialog Progress progress; }; +#if LCD_W > LCD_H // landscape +static const lv_coord_t col_dsc[] = {LV_GRID_FR(3), LV_GRID_FR(2), LV_GRID_TEMPLATE_LAST}; +static const lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; +#else // portrait +static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; +static const lv_coord_t row_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; +#endif + void RadioSdManagerPage::build(FormWindow * window) { - rect_t r = window->getRect(); -#if LCD_W > LCD_H - r.w = r.w * 0.6; -#endif - browser = new FileBrowser(window, r, ROOT_PATH); + FlexGridLayout grid(col_dsc, row_dsc, 0); + FormGroup* form = new FormGroup(window, rect_t{}); + form->setWidth(window->width()); + form->setHeight(window->height()); + grid.apply(form); + + browser = new FileBrowser(form, rect_t{}, ROOT_PATH); + grid.add(browser); + grid.nextCell(); + + auto obj = browser->getLvObj(); + lv_obj_set_style_grid_cell_x_align(obj, LV_GRID_ALIGN_STRETCH, 0); + lv_obj_set_style_grid_cell_y_align(obj, LV_GRID_ALIGN_STRETCH, 0); + + // Adjust file browser width + browser->adjustWidth(); + + preview = new FilePreview(form, rect_t{}); + grid.add(preview); + grid.nextCell(); + + obj = preview->getLvObj(); + lv_obj_set_style_pad_all(obj, lv_dpx(8), 0); + lv_obj_set_style_grid_cell_x_align(obj, LV_GRID_ALIGN_STRETCH, 0); + lv_obj_set_style_grid_cell_y_align(obj, LV_GRID_ALIGN_STRETCH, 0); + browser->setFileAction([=](const char* path, const char* name, const char* fullpath) { fileAction(path, name, fullpath); }); + browser->setFileSelected([=](const char* path, const char* name, const char* fullpath) { + preview->setFile(fullpath); + }); browser->refresh(); - -// button->setFocusHandler([=](bool active) { -// if (active) { -// preview->setFile(getFullPath(name)); -// } -// }); -// grid.nextLine(); -// } -// } - -// preview->setHeight(max(window->height(), grid.getWindowHeight())); } void RadioSdManagerPage::fileAction(const char* path, const char* name, diff --git a/radio/src/gui/colorlcd/radio_sdmanager.h b/radio/src/gui/colorlcd/radio_sdmanager.h index c529a9538..6ca288cc3 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.h +++ b/radio/src/gui/colorlcd/radio_sdmanager.h @@ -24,10 +24,12 @@ enum MultiModuleType : short; class FileBrowser; +class FilePreview; class RadioSdManagerPage : public PageTab { FileBrowser* browser = nullptr; + FilePreview* preview = nullptr; public: RadioSdManagerPage(); diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 9daecc616..1dd1f6d62 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 9daecc616427ab7e6c2eb2f970bd422679b0b7a8 +Subproject commit 1dd1f6d6234156bf07677518b8de5fd6747c6fe5