// Related to ImageGrid //
const TString SLOT_PART_FMT {"swallow.cell_%d"};
+ const TString SIGNAL_SELECT_ITEM_FMT {"gallery,select,%d"};
+ const TString SIGNAL_UNSELECT_ITEM_FMT {"gallery,unselect,%d"};
+
+ constexpr EdjeSignal SIGNAL_FORCE_SELECT_MODE
+ {"gallery,force,select,mode"};
constexpr EdjeSignal SIGNAL_ENABLE_SELECT_MODE
{"gallery,enable,select,mode"};
constexpr EdjeSignal SIGNAL_DISABLE_SELECT_MODE
// Related to Button //
constexpr ElmStyle ITEM_BTN_STYLE {"gallery_image"};
- constexpr EdjePart PART_BTN_BG {"swallow.bg"};
+ constexpr EdjePart BTN_PART_BG {"swallow.bg"};
constexpr SmartEvent BTN_CLICKED {"clicked"};
constexpr EdjeSignal BTN_BLOCK_CLICKS {"gallery,block,clicks"};
constexpr EdjeSignal BTN_UNBLOCK_CLICKS {"gallery,unblock,clicks"};
ImageGrid::Builder::Builder() :
m_type(Type::HCOMB_3X3),
- m_listener(nullptr)
+ m_listener(nullptr),
+ m_selectModeStartup(false)
{
}
return *this;
}
+ ImageGrid::Builder &ImageGrid::Builder::setSelectModeStartup(
+ const bool value)
+ {
+ m_selectModeStartup = value;
+ return *this;
+ }
+
ImageGridSRef ImageGrid::Builder::build(Widget &parent) const
{
Evas_Object *const scrollerEo = elm_scroller_add(parent);
return {};
}
- auto result = makeShared<ImageGrid>(m_type, scrollerEo);
+ auto result = makeShared<ImageGrid>(scrollerEo,
+ m_type, m_selectModeStartup);
result->bindToEo();
result->setListener(m_listener);
m_realizeIndex(-1),
m_imageLoadSize(0),
m_wasUpdated(false),
- m_isClicksBlocked(false)
+ m_isClicksBlocked(false),
+ m_isSelected(false)
{
m_btn.setFocusAlowed(false);
m_btn.setStyle(impl::ITEM_BTN_STYLE);
}
}
+ bool setSelected(const bool selected)
+ {
+ if (selected == m_isSelected) {
+ return false;
+ }
+ if (selected && !m_imageGrid.m_isInSelectMode) {
+ return false;
+ }
+ m_isSelected = selected;
+ return true;
+ }
+
bool update(const ItemParams ¶ms)
{
if (!isRealized()) {
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);
+ m_btn.setContent(impl::BTN_PART_BG, *m_bgImage);
show(*m_bgImage);
}
int m_imageLoadSize;
bool m_wasUpdated;
bool m_isClicksBlocked;
+ bool m_isSelected;
};
public:
m_layout(elm_layout_add(imageGrid.m_box), true),
m_isRealized(false)
{
- if (isValid(m_info.slotThemes[isOdd]) &&
- !m_layout.setTheme(m_info.slotThemes[isOdd])) {
- ELOG("setTheme() failed!");
+ if (isValid(m_info.slotThemes[isOdd])) {
+ if (!m_layout.setTheme(m_info.slotThemes[isOdd])) {
+ ELOG("setTheme() failed!");
+ } else if (imageGrid.m_isInSelectMode) {
+ m_layout.emitSignal(impl::SIGNAL_FORCE_SELECT_MODE);
+ }
}
fill(m_layout);
show(m_layout);
}
}
+ void unselect()
+ {
+ for (UInt i = 0; i < m_items.size(); ++i) {
+ setSelected(i, false);
+ }
+ }
+
bool updateItem(const int itemOffset, const ItemParams ¶ms)
{
+ setSelected(itemOffset, (params.flags & UF_SELECTED));
return m_items[itemOffset]->update(params);
}
return m_items[itemOffset]->isRealized();
}
+ private:
+ void setSelected(const int itemOffset, const bool selected)
+ {
+ if (!m_items[itemOffset]->setSelected(selected)) {
+ return;
+ }
+ const auto aSignal = EdjeSignal(selected ?
+ impl::SIGNAL_SELECT_ITEM_FMT.format(itemOffset) :
+ impl::SIGNAL_UNSELECT_ITEM_FMT.format(itemOffset));
+ m_layout.emitSignal(aSignal);
+ }
+
private:
const Info &m_info;
std::vector<SharedRef<Item>> m_items;
// ImageGrid //
- ImageGrid::ImageGrid(RefCountObjBase *const rc, const Type type,
- Evas_Object *const scroller) :
+ ImageGrid::ImageGrid(RefCountObjBase *const rc, Evas_Object *const scroller,
+ const Type type, const bool selectModeStartup) :
Widget(rc, scroller, true),
m_info(getInfo(type)),
m_eventsLock(0),
m_animator(nullptr),
- m_isInSelectMode(false),
+ m_isInSelectMode(selectModeStartup),
m_isRotaryActive(false)
{
prepare();
evas_object_freeze_events_set(*m_scroller, EINA_TRUE);
eext_rotary_object_event_activated_set(m_circleScroller, EINA_FALSE);
+ for (auto &slot: m_slots) {
+ slot->unselect();
+ }
+
const auto aSignal = (enabled ?
impl::SIGNAL_ENABLE_SELECT_MODE :
impl::SIGNAL_DISABLE_SELECT_MODE);
Result ImageGrid::updateItem(const int itemIndex, const ItemParams ¶ms)
{
+ if (m_animator) {
+ LOG_RETURN(RES_ILLEGAL_STATE, "Transition is in progress.");
+ }
return doWithItem(itemIndex,
[¶ms](Slot &slot, const int itemOffset)
{
if (m_slotSize == 0) {
UCL_ASSERT(!isOdd, "Must be even!");
+ edje_object_message_signal_process(
+ elm_layout_edje_get(slot->getLayout()));
slot->getLayout().calculate();
setSlotSize(slot->getSize());
}