if (m_animator) {
finalizeTransition();
}
+ evas_object_event_callback_del_full(m_box, EVAS_CALLBACK_RESIZE,
+ CALLBACK_A(ImageGrid::onBoxResize), this);
}
const ImageGrid::Info &ImageGrid::getInfo(const Type type)
createCircleScroller();
- createHighlighKeeper();
+ createHighlightKeeper();
+
+ m_scroller->addEventHandler(SmartEvent{"language,changed"},
+ WEAK_DELEGATE(ImageGrid::onLanguageChanged, asWeak(*this)));
m_scroller->addEventHandler(WidgetEvent::RESIZE,
WEAK_DELEGATE(ImageGrid::onScrollerResize, asWeak(*this)));
m_box.addEventHandler(WidgetEvent::MOVE,
WEAK_DELEGATE(ImageGrid::onBoxMove, asWeak(*this)));
+
+ evas_object_event_callback_priority_add(m_box,
+ EVAS_CALLBACK_RESIZE, EO_CALLBACK_PRIORITY_AFTER,
+ CALLBACK_A(ImageGrid::onBoxResize), this);
}
void ImageGrid::createCircleScroller()
}
}
- void ImageGrid::createHighlighKeeper()
+ void ImageGrid::createHighlightKeeper()
{
- m_highlighKeeper = util::createFakeAccessObject(*m_box.getWindow());
- UCL_ASSERT(m_highlighKeeper, "m_highlighKeeper is NULL");
+ m_highlightKeeper = util::createFakeAccessObject(*m_box.getWindow());
+ UCL_ASSERT(m_highlightKeeper, "m_highlightKeeper is NULL");
- m_highlighKeeper->addEventHandler(ATSPI_UNHIGHLIGHTED,
+ m_highlightKeeper->addEventHandler(ATSPI_UNHIGHLIGHTED,
WEAK_DELEGATE(ImageGrid::onKeeperUnhighlighted, asWeak(*this)));
}
m_itemCount = count;
if (updateMaxSlotCount()) {
+ updatePadSizes();
updateSlotCount();
if (updateMaxBeginSlotIndex()) {
updateBeginSlotIndex();
m_animator = ecore_animator_add(
CALLBACK_A(ImageGrid::onAnimationFrame), this);
- evas_object_event_callback_priority_add(m_box,
- EVAS_CALLBACK_RESIZE, EO_CALLBACK_PRIORITY_AFTER,
- CALLBACK_A(ImageGrid::onBoxResize), this);
-
auto &slotlayout = m_slots[m_beginSlotIndex & 1]->getLayout();
slotlayout.addEventHandler(WidgetEvent::CHANGED_SIZE_HINTS,
elm_object_signal_callback_add(slotlayout,
impl::SIGNAL_TRANSITION_FINISHED.name, "",
- CALLBACK_A(ImageGrid::onTransitonFinished), this);
+ CALLBACK_A(ImageGrid::onTransitionFinished), this);
return RES_OK;
}
return !!m_animator;
}
- void ImageGrid::onTransitonFinished(Evas_Object *obj,
+ void ImageGrid::onTransitionFinished(Evas_Object *obj,
const char *emission, const char *source)
{
evalSlotSizes();
m_animator = nullptr;
}
- evas_object_event_callback_del_full(m_box, EVAS_CALLBACK_RESIZE,
- CALLBACK_A(ImageGrid::onBoxResize), this);
-
auto &slotlayout = m_slots[m_beginSlotIndex & 1]->getLayout();
slotlayout.delEventHandler(WidgetEvent::CHANGED_SIZE_HINTS,
elm_object_signal_callback_del(slotlayout,
"gallery,transition,finished", "",
- CALLBACK_A(ImageGrid::onTransitonFinished));
+ CALLBACK_A(ImageGrid::onTransitionFinished));
}
Eina_Bool ImageGrid::onAnimationFrame()
}
}
- void ImageGrid::onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo)
- {
- m_scrollOffset = (m_scrollLockIndex * m_slotSize);
- if (m_info.isHorizontal) {
- elm_scroller_region_show(*m_scroller,
- m_scrollOffset, 0, m_scrollerSize, 1);
- } else {
- elm_scroller_region_show(*m_scroller,
- 0, m_scrollOffset, 1, m_scrollerSize);
- }
- }
-
void ImageGrid::update()
{
Unrealizer(*this);
if (m_animator) {
LOG_RETURN(RES_INVALID_OPERATION, "Transition is in progress.");
}
+ forceBoxSizeCalculate();
return showItem(itemIndex, elm_scroller_region_bring_in);
}
- template <class SHOW_FUNC>
- Result ImageGrid::showItem(const int itemIndex, SHOW_FUNC &&showFunc)
+ template <class SCROLL_FUNC>
+ Result ImageGrid::showItem(const int itemIndex, SCROLL_FUNC &&scrollFunc)
{
return doWithCell(itemIndex,
- [this, &showFunc](const int slotIndex, const int itemOffset)
+ [this, &scrollFunc](const int slotIndex, const int itemOffset)
{
int minVisibleOffset = 0;
int maxVisibleOffset = 0;
const int scrollOffset = ((m_scrollOffset > maxVisibleOffset) ?
maxVisibleOffset : minVisibleOffset);
- if (m_info.isHorizontal) {
- showFunc(*m_scroller, scrollOffset, 0, m_scrollerSize, 1);
- } else {
- showFunc(*m_scroller, 0, scrollOffset, 1, m_scrollerSize);
- }
+ scrollTo(scrollOffset, scrollFunc);
return RES_OK;
});
}
+ template <class SCROLL_FUNC>
+ void ImageGrid::scrollTo(const int offset, SCROLL_FUNC &&scrollFunc)
+ {
+ int scrollOffset = offset;
+
+ if (elm_config_mirrored_get()) {
+ int childSizeX = 0;
+ int childSizeY = 0;
+ elm_scroller_child_size_get(*m_scroller, &childSizeX, &childSizeY);
+
+ scrollOffset = ((m_info.isHorizontal ? childSizeX : childSizeY) -
+ m_scrollerSize - offset);
+ }
+
+ if (m_info.isHorizontal) {
+ scrollFunc(*m_scroller, scrollOffset, 0, m_scrollerSize, 1);
+ } else {
+ scrollFunc(*m_scroller, 0, scrollOffset, 1, m_scrollerSize);
+ }
+ }
+
bool ImageGrid::isItemFullyVisible(int itemIndex)
{
int minVisibleOffset = 0;
if (m_highlightID == itemIndex) {
m_highlightID = (-1 - itemIndex);
if (m_isHighlightLocked) {
- elm_atspi_component_highlight_grab(*m_highlighKeeper);
+ elm_atspi_component_highlight_grab(*m_highlightKeeper);
} else {
m_highlightTimeout.reset();
}
std::max((m_scrollerSize / m_slotSize) * m_slotSize, 1));
m_padSize1 = std::lround(spaceSize / 2.0);
- m_padSize2 = (spaceSize - m_padSize1 +
- m_info.calcExtraPaddingSize(m_slotSize));
+ m_padSize2 = std::max(spaceSize - m_padSize1 +
+ m_info.calcExtraPaddingSize(m_slotSize),
+ (m_scrollerSize - m_padSize1 -
+ m_maxSlotCount / 2 * m_slotSize));
}
void ImageGrid::updateScrollBias()
{
int scrollOffsetX = 0;
int scrollOffsetY = 0;
+
+ int scrollerSizeX = 0;
+ int scrollerSizeY = 0;
elm_scroller_region_get(*m_scroller, &scrollOffsetX, &scrollOffsetY,
- nullptr, nullptr);
+ &scrollerSizeX, &scrollerSizeY);
+
+ if (elm_config_mirrored_get()) {
+ int childSizeX = 0;
+ int childSizeY = 0;
+ elm_scroller_child_size_get(*m_scroller, &childSizeX, &childSizeY);
+
+ scrollOffsetX = (childSizeX - scrollerSizeX - scrollOffsetX);
+ scrollOffsetY = (childSizeY - scrollerSizeY - scrollOffsetY);
+ }
return (m_info.isHorizontal ? scrollOffsetX : scrollOffsetY);
}
--m_eventsLock;
}
+ void ImageGrid::onLanguageChanged(Widget &sender, void *eventInfo)
+ {
+ Unrealizer u(*this);
+ }
+
void ImageGrid::onScrollerResize(Widget &sender, void *eventInfo)
{
handleResize();
{
handleScrolling();
}
+
+ void ImageGrid::onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo)
+ {
+ if (m_animator) {
+ m_scrollOffset = (m_scrollLockIndex * m_slotSize);
+ scrollTo(m_scrollOffset, elm_scroller_region_show);
+ } else {
+ handleScrolling();
+ }
+ }
}
template <class FUNC>
ucl::Result doWithCell(int itemIndex, FUNC &&func) const;
- template <class SHOW_FUNC>
- ucl::Result showItem(int itemIndex, SHOW_FUNC &&showFunc);
+ template <class SCROLL_FUNC>
+ ucl::Result showItem(int itemIndex, SCROLL_FUNC &&scrollFunc);
+ template <class SCROLL_FUNC>
+ void scrollTo(int offset, SCROLL_FUNC &&scrollFunc);
bool isItemFullyVisible(int itemIndex);
bool isItemFullyVisible(int itemIndex,
void finalizeTransition();
Eina_Bool onAnimationFrame();
void onSlotResize(Widget &widget, void *eventInfo);
- void onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo);
- void onTransitonFinished(Evas_Object *obj, const char *emission,
+ void onTransitionFinished(Evas_Object *obj, const char *emission,
const char *source);
// Initialization
void prepare();
void createCircleScroller();
- void createHighlighKeeper();
+ void createHighlightKeeper();
// Actual slots count
bool updateSlotCount();
void handleResize();
// Events
+ void onLanguageChanged(Widget &sender, void *eventInfo);
void onScrollerResize(Widget &sender, void *eventInfo);
void onScrollerMove(Widget &sender, void *eventInfo);
void onBoxMove(Widget &sender, void *eventInfo);
+ void onBoxResize(Evas *e, Evas_Object *obj, void *eventInfo);
private:
const Info &m_info;
bool m_isInSelectMode;
bool m_isRotaryActive;
- ucl::ElmWidgetSRef m_highlighKeeper;
+ ucl::ElmWidgetSRef m_highlightKeeper;
ucl::TimeoutSRef m_highlightTimeout;
int m_highlightID;
bool m_isHighlightLocked;