TizenRefApp-8272 [Gallery] Optimize big size images download process in 71/121971/5
authorIgor Nazarov <i.nazarov@samsung.com>
Wed, 29 Mar 2017 15:04:46 +0000 (18:04 +0300)
committerIgor Nazarov <i.nazarov@samsung.com>
Wed, 29 Mar 2017 16:33:26 +0000 (19:33 +0300)
ImageGrid

- Added "swallow.overlay" part into "gallery_image" button style;
- Added overlay image support into ImageGrid;
- Fixed bug with multiple thumbnail clicks.

Change-Id: I0fac0175c87f0d662ed2015f36ee72a9a4808060

edc/button.edc
edc/image-grid.edc
inc/presentation/ImageGrid.h
src/presentation/ImageGrid.cpp
src/presentation/ThumbnailPage.cpp

index 62f62a8e9ac9446ecef7fd85303e791c7a47f4c6..9d3f15c0c216f70b6293edbac20d7fd2d6d12415 100644 (file)
@@ -133,7 +133,14 @@ group{ "elm/button/base/transparent";
 group{ "elm/button/base/gallery_image";
    inherit: "elm/button/base/transparent";
    parts {
+      swallow { "swallow.bg";
+         before: "elm.swallow.content";
+         scale;
+         desc { "default";
+         }
+      }
       rect { "event";
+         norepeat;
          desc { "default";
             color: GALLERY_COLOR_IMG_EF_NORMAL;
          }
index d96dc2144ad90ece8454b3677e15b1422265264e..f8e368be371cf7ccc5e37558943393b73a17cccc 100644 (file)
@@ -21,7 +21,7 @@ images {
 group { "elm/layout/gallery_image_grid/hcomb_3x3_even";
    parts {
       spacer { "spacer_t";
-         scale: 1;
+         scale;
          desc { "default";
             align: 0.5 0.0;
             fixed: 0 1;
@@ -31,7 +31,7 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_even";
          }
       }
       spacer { "spacer_b";
-         scale: 1;
+         scale;
          desc { "default";
             align: 0.5 1.0;
             fixed: 0 1;
@@ -41,7 +41,8 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_even";
          }
       }
       image { "image_mask_0";
-         scale: 1;
+         scale;
+         precise;
          desc { "default";
             image.normal: "gallery_thumbnail_circle_04.png";
             align: 0.5 0.5;
@@ -67,7 +68,7 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_even";
 group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
    parts {
       spacer { "spacer_t";
-         scale: 1;
+         scale;
          desc { "default";
             align: 0.5 0.0;
             fixed: 0 1;
@@ -77,7 +78,7 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
          }
       }
       spacer { "spacer_b";
-         scale: 1;
+         scale;
          desc { "default";
             align: 0.5 1.0;
             fixed: 0 1;
@@ -87,7 +88,7 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
          }
       }
       spacer { "spacer_m";
-         scale: 1;
+         scale;
          desc { "default";
             fixed: 0 1;
             min: 0 86;
@@ -99,7 +100,8 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
          }
       }
       image { "image_mask_0";
-         scale: 1;
+         scale;
+         precise;
          desc { "default";
             image.normal: "gallery_thumbnail_circle_04.png";
             align: 0.5 1.0;
@@ -113,7 +115,8 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
          }
       }
       image { "image_mask_1";
-         scale: 1;
+         scale;
+         precise;
          desc { "default";
             image.normal: "gallery_thumbnail_circle_04.png";
             align: 0.5 0.0;
@@ -147,7 +150,8 @@ group { "elm/layout/gallery_image_grid/hcomb_3x3_odd";
 group { "elm/layout/gallery_image_grid/linear";
    parts {
       image { "image_mask_0";
-         scale: 1;
+         scale;
+         precise;
          desc { "default";
             image.normal: "gallery_circle_basic.png";
             fixed: 0 1;
index 1e0ebfc9268b52b7f971166083badaebe0b44673..fd1f3c79419c65d66dc5c4079303cea3651eb854 100644 (file)
@@ -43,8 +43,15 @@ namespace gallery {
                        IImageGridListener *m_listener;
                };
 
+               enum {
+                       UF_LOSE_IMAGE = 1,
+                       UF_LOSE_BG = 2
+               };
+
                struct ItemParams {
+                       int flags;
                        std::string imagePath;
+                       std::string bgImagePath;
                };
 
                class Unrealizer : ucl::NonCopyable {
index 71eac40d43095bfa63c04a6ae0acd9b1026dc862..25b247b488a36670b6b2c063594d20785e8cf931 100644 (file)
@@ -29,10 +29,12 @@ namespace gallery { namespace { namespace impl {
 
        using namespace ucl;
 
+       // Related to ImageGrid //
        const TString SLOT_PART_FMT {"swallow.cell_%d"};
 
+       // Related to Button //
        constexpr ElmStyle ITEM_BTN_STYLE {"gallery_image"};
-
+       constexpr EdjePart PART_BTN_BG {"swallow.bg"};
        constexpr SmartEvent BTN_CLICKED {"clicked"};
 }}}
 
@@ -189,14 +191,19 @@ namespace gallery {
                                RefCountAware(&rc),
                                m_imageGrid(imageGrid),
                                m_btn(elm_button_add(parent)),
-                               m_image(evas_object_image_filled_add(m_btn.getEvas())),
+                               m_image(elm_image_add(m_btn)),
                                m_realizeIndex(-1),
+                               m_imageLoadSize(0),
                                m_wasUpdated(false)
                        {
                                m_btn.setFocusAlowed(false);
                                m_btn.setStyle(impl::ITEM_BTN_STYLE);
-                               m_btn.setContent(m_image);
                                show(m_btn);
+
+                               elm_image_preload_disabled_set(m_image, EINA_FALSE);
+                               elm_image_aspect_fixed_set(m_image, EINA_TRUE);
+                               elm_image_fill_outside_set(m_image, EINA_TRUE);
+                               m_btn.setContent(m_image);
                                show(m_image);
 
                                m_btn.addEventHandler(impl::BTN_CLICKED, WEAK_DELEGATE(
@@ -210,7 +217,8 @@ namespace gallery {
 
                        void setImageLoadSize(const int value)
                        {
-                               evas_object_image_load_size_set(m_image, value, value);
+                               m_imageLoadSize = value;
+                               elm_image_prescale_set(m_image, m_imageLoadSize);
                        }
 
                        bool isRealized() const
@@ -259,26 +267,60 @@ namespace gallery {
                                        return false;
                                }
 
+                               updateImage(params);
+                               updateBgImage(params);
+
+                               makeWhite(m_btn);
+
                                m_wasUpdated = true;
 
+                               return true;
+                       }
+
+               private:
+                       void updateImage(const ItemParams &params)
+                       {
                                if (isEmpty(params.imagePath)) {
-                                       makeTransparent(m_btn);
-                                       return true;
+                                       if (!m_wasUpdated || (params.flags & UF_LOSE_IMAGE)) {
+                                               makeTransparent(m_image);
+                                       }
+                                       return;
                                }
 
-                               evas_object_image_file_set(m_image,
-                                               params.imagePath.c_str(), NULL);
+                               elm_image_file_set(m_image, params.imagePath.c_str(), NULL);
 
-                               int w, h;
-                               evas_object_image_size_get(m_image, &w, &h);
-                               m_image.setARHint(WidgetARHint::NEITHER, w, h);
+                               makeWhite(m_image);
+                       }
 
-                               makeWhite(m_btn);
+                       void updateBgImage(const ItemParams &params)
+                       {
+                               if (isEmpty(params.bgImagePath)) {
+                                       if (m_bgImage && (!m_wasUpdated ||
+                                                       (params.flags & UF_LOSE_BG))) {
+                                               makeTransparent(*m_bgImage);
+                                       }
+                                       return;
+                               }
 
-                               return true;
+                               if (!m_bgImage) {
+                                       m_bgImage = makeShared<Widget>(
+                                                       evas_object_image_filled_add(m_btn.getEvas()));
+                                       evas_object_image_load_size_set(*m_bgImage,
+                                                       m_imageLoadSize, m_imageLoadSize);
+                                       m_btn.setContent(impl::PART_BTN_BG, *m_bgImage);
+                                       show(*m_bgImage);
+                               }
+
+                               evas_object_image_file_set(*m_bgImage,
+                                               params.bgImagePath.c_str(), NULL);
+
+                               int w, h;
+                               evas_object_image_size_get(*m_bgImage, &w, &h);
+                               m_bgImage->setARHint(WidgetARHint::NEITHER, w, h);
+
+                               makeWhite(*m_bgImage);
                        }
 
-               private:
                        void onClicked(Widget &wifget, void *eventInfo)
                        {
                                if (isRealized()) {
@@ -289,8 +331,10 @@ namespace gallery {
                private:
                        const ImageGrid &m_imageGrid;
                        StyledWidget m_btn;
-                       Widget m_image;
+                       StyledWidget m_image;
+                       WidgetSRef m_bgImage;
                        int m_realizeIndex;
+                       int m_imageLoadSize;
                        bool m_wasUpdated;
                };
 
@@ -686,8 +730,7 @@ namespace gallery {
 
        int ImageGrid::calcOptimalSlotCount()
        {
-               return ((((m_scrollerSize - 1) + (m_slotSize - 1)) /
-                               m_slotSize + 1) * 2);
+               return (((m_scrollerSize * 3 + m_slotSize / 2) / m_slotSize) * 2);
        }
 
        bool ImageGrid::updateMaxSlotCount()
@@ -816,8 +859,7 @@ namespace gallery {
 
        void ImageGrid::updateScrollBias()
        {
-               m_scrollBias = (((m_optimalSlotCount / 2 - 1) * m_slotSize -
-                               m_scrollerSize) / 2 + m_padSize1);
+               m_scrollBias = ((m_slotCount / 2 - 1) / 2 * m_slotSize + m_padSize1);
        }
 
        void ImageGrid::updateRectMins()
index ab8b657d96caba5013fa27defa0f17545029b3ab..8db0a2e5903086e94b55d6bf100ac161a4f801b4 100644 (file)
@@ -102,7 +102,11 @@ namespace gallery {
                void onThumbnail(const Result result, const std::string &path)
                {
                        FAIL_RETURN_VOID(result, "Failed to get thumbnail!");
-                       m_parent.m_imageGrid->updateItem(m_index, {path});
+
+                       ImageGrid::ItemParams params = {};
+                       params.imagePath = path;
+
+                       m_parent.m_imageGrid->updateItem(m_index, params);
                }
 
        private: