#include "Common/Model/Thumbnail.h"
#include "Model/DataItem.h"
-#include <list>
#include <ctime>
+#include <data_control_types.h>
+#include <list>
#define MAX_IMAGE_COUNT 10
};
Memo();
+ virtual ~Memo();
+ Memo(const Memo &that) = default;
+ Memo &operator=(const Memo &that) = default;
/**
* @brief Compare memos for equality.
*/
bool isEmpty() const;
- protected:
-
- /**
- * @see DataItem::onUpdate().
- */
- virtual int onUpdate(void *data) override;
-
private:
bool compareSounds(const SoundRecordList &list) const;
bool compareImages(const ImageList &list) const;
int generateImageIndex();
void addSoundToRemove(SoundRecord sound);
void addImageToRemove(Image image);
-
void setThumbnail(Thumbnail thumbnail);
+ virtual int onUpdate(void *data) override;
+ virtual void onStandalone(bool isStandalone) override;
+ void onDataChanged(int id, data_control_data_change_type_e type);
+
time_t m_Time;
std::string m_Title;
std::string m_Content;
* limitations under the License.
*/
-#include <algorithm>
#include "Common/Model/Memo.h"
+
+#include "Common/Model/MemoConsumer.h"
#include "Common/Model/TextTool.h"
#include "Utils/Logger.h"
using namespace Common::Model;
+using namespace std::placeholders;
Memo::Memo()
: m_Time(0)
{
}
+Memo::~Memo()
+{
+ MemoConsumer::getInstance().onDataItemChanged() -= this;
+}
+
bool Memo::operator==(const Memo &other) const
{
return (getId() == other.getId() && m_Time == other.m_Time && m_Color == other.m_Color
&& (m_SoundRecords.empty() || !m_SoundRecords.front().isExist()));
}
+bool Memo::compareImages(const ImageList &list) const
+{
+ if (list.size() != m_Images.size()) {
+ return false;
+ }
+
+ auto left = list.begin();
+ auto right = m_Images.begin();
+ for (; left != list.end(); ++left, ++right) {
+ if (left != right) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool Memo::compareSounds(const SoundRecordList &list) const
+{
+ return ((m_SoundRecords.empty() && list.empty())
+ || (!m_SoundRecords.empty() && !list.empty() &&
+ m_SoundRecords.front().getPath() == list.front().getPath()));
+}
+
+int Memo::generateImageIndex()
+{
+ for (int i = 0; i < MAX_IMAGE_COUNT; i++) {
+ if (!getImage(i)) {
+ return i;
+ }
+ }
+ return DEFAULT_IMAGE_INDEX;
+}
+
+void Memo::addSoundToRemove(SoundRecord sound)
+{
+ m_SoundRecordsToRemove.push_back(std::move(sound));
+}
+
+void Memo::addImageToRemove(Image image)
+{
+ m_ImagesToRemove.push_back(std::move(image));
+}
+
+void Memo::setThumbnail(Thumbnail thumbnail)
+{
+ m_Thumbnail = std::move(thumbnail);
+}
+
int Memo::onUpdate(void *data)
{
auto memo = (Memo *)data;
return changes;
}
-bool Memo::compareImages(const ImageList &list) const
+void Memo::onStandalone(bool isStandalone)
{
- if (list.size() != m_Images.size()) {
- return false;
- }
-
- auto left = list.begin();
- auto right = m_Images.begin();
- for (; left != list.end(); ++left, ++right) {
- if (left != right) {
- return false;
- }
+ if (isStandalone) {
+ MemoConsumer::getInstance().onDataItemChanged() += { std::bind(&Memo::onDataChanged, this, _1, _2), this };
+ } else {
+ MemoConsumer::getInstance().onDataItemChanged() -= this;
}
-
- return true;
}
-bool Memo::compareSounds(const SoundRecordList &list) const
+void Memo::onDataChanged(int id, data_control_data_change_type_e type)
{
- return ((m_SoundRecords.empty() && list.empty())
- || (!m_SoundRecords.empty() && !list.empty() &&
- m_SoundRecords.front().getPath() == list.front().getPath()));
-}
-
-int Memo::generateImageIndex()
-{
- for (int i = 0; i < MAX_IMAGE_COUNT; i++) {
- if (!getImage(i)) {
- return i;
- }
+ if (id != getId()) {
+ return;
}
- return DEFAULT_IMAGE_INDEX;
-}
-void Memo::addSoundToRemove(SoundRecord sound)
-{
- m_SoundRecordsToRemove.push_back(std::move(sound));
-}
-
-void Memo::addImageToRemove(Image image)
-{
- m_ImagesToRemove.push_back(std::move(image));
-}
-
-void Memo::setThumbnail(Thumbnail thumbnail)
-{
- m_Thumbnail = std::move(thumbnail);
+ if (type == DATA_CONTROL_DATA_CHANGE_SQL_UPDATE) {
+ MemoConsumer::getInstance().getDataItem(getId(), [this](MemoConsumer::DataList dataList) {
+ update(dataList.front());
+ delete dataList.front();
+ });
+ } else if (type == DATA_CONTROL_DATA_CHANGE_SQL_DELETE) {
+ setChanged(::Model::ChangeDelete);
+ }
}
void subscribeToSystemSettings();
void unsubscribeFromSystemSettings();
+ void onMemoUpdated();
+ void onMemoDeleted();
const char *getDateTimeFormat();
virtual void onFavIconChanged() {};
virtual void onResult(bool isSuccess, int id);
+ void fillLayout();
+ void resetContent();
+ void resetPageTitle();
InputBox *getInputBox() const;
TitleField *getTitleField() const;
RecordField *getRecordField() const;
void onFavChanged(Evas_Object *check, void *eventInfo);
void onContentChanged(bool isEmpty);
void onRecordFieldDelete();
- void onMemoChanged();
+ void onChanged();
void onMaxImagesReached();
bool isSupportedResolution(const std::string &path) const;
+ Evas_Object *m_Layout;
+ Evas_Object *m_CancelButton;
Evas_Object *m_DoneButton;
InputBox *m_InputBox;
Evas_Object *m_Bg;
void DetailsView::onCreated()
{
+ getMemo().setStandalone(true);
+ getMemo().onUpdated() += { std::bind(&DetailsView::onMemoUpdated, this), this };
+ getMemo().onDeleted() += { std::bind(&DetailsView::onMemoDeleted, this), this };
+
updateView();
}
popup->addButton("IDS_MEMO_BUTTON_DELETE_ABB4", [this] {
MemoConsumer::getInstance().deleteDataItem(getMemo().getId());
notification_status_message_post(_("IDS_MEMO_POP_DELETED"));
- getPage()->close();
return true;
});
popup->show();
if (getRecordField()) {
getRecordField()->setEditable(false);
}
+ resetPageTitle();
subscribeToSystemSettings();
elm_object_signal_emit(getEvasObject(), SIGNAL_DATETIME_SHOW, "*");
elm_layout_text_set(getEvasObject(), PART_DATETIME,
system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR);
}
+void DetailsView::onMemoUpdated()
+{
+ resetContent();
+
+ if (m_Mode == ModeInput) {
+ m_Mode = ModeDetails;
+ }
+ updateView();
+}
+
+void DetailsView::onMemoDeleted()
+{
+ getPage()->close();
+}
+
const char *DetailsView::getDateTimeFormat()
{
bool is24Hours = false;
}
InputView::InputView(Memo memo)
- : m_DoneButton(nullptr)
- , m_InputBox(nullptr)
- , m_Bg(nullptr)
- , m_TitleField(nullptr)
- , m_RecordField(nullptr)
- , m_InitialMemo(memo)
- , m_Memo(std::move(memo))
+ : m_Layout(nullptr), m_CancelButton(nullptr), m_DoneButton(nullptr)
+ , m_InputBox(nullptr), m_Bg(nullptr), m_TitleField(nullptr)
+ , m_RecordField(nullptr), m_InitialMemo(memo), m_Memo(std::move(memo))
{
}
Evas_Object *InputView::onCreate(Evas_Object *parent)
{
- Evas_Object *layout = createLayout(parent, LAYOUT_INPUT);
+ m_Layout = createLayout(parent, LAYOUT_INPUT);
+ fillLayout();
- elm_layout_content_set(layout, PART_BG, createBg(layout));
- elm_layout_content_set(layout, PART_TITLE, createTitle(layout));
- elm_layout_content_set(layout, PART_FAV_BTN, createFavIcon(layout));
- elm_layout_content_set(layout, PART_CONTENT, createContent(layout));
- if (m_Memo.getSoundRecord()) {
- elm_layout_content_set(layout, PART_RECORD, createRecordField(layout, RecordField::ModePlayer));
- }
-
- elm_object_focus_custom_chain_set(layout, eina_list_append(nullptr, m_Bg));
-
- return layout;
+ return m_Layout;
}
void InputView::onCreated()
void InputView::onPageAttached(Ui::NavigatorPage *page)
{
- page->addTitleButton(Ui::ButtonLeft, "IDS_MEMO_ACBUTTON_CANCEL_ABB2",
+ m_CancelButton = page->addTitleButton(Ui::ButtonLeft, "IDS_MEMO_ACBUTTON_CANCEL_ABB2",
makeCallback(&InputView::onCancelPressed), this);
m_DoneButton = page->addTitleButton(Ui::ButtonRight, "IDS_MEMO_ACBUTTON_DONE_ABB2",
}
}
+void InputView::fillLayout()
+{
+ elm_layout_content_set(m_Layout, PART_BG, createBg(m_Layout));
+ elm_object_focus_custom_chain_set(m_Layout, eina_list_append(nullptr, m_Bg));
+
+ elm_layout_content_set(m_Layout, PART_TITLE, createTitle(m_Layout));
+ elm_layout_content_set(m_Layout, PART_FAV_BTN, createFavIcon(m_Layout));
+ elm_layout_content_set(m_Layout, PART_CONTENT, createContent(m_Layout));
+ elm_layout_content_set(m_Layout, PART_RECORD, createRecordField(m_Layout, RecordField::ModePlayer));
+}
+
+void InputView::resetContent()
+{
+ m_InitialMemo = m_Memo;
+ fillLayout();
+}
+
+void InputView::resetPageTitle()
+{
+ if (!getPage()) {
+ return;
+ }
+
+ if (m_CancelButton) {
+ evas_object_del(m_CancelButton);
+ m_CancelButton = nullptr;
+ }
+
+ if (m_DoneButton) {
+ evas_object_del(m_DoneButton);
+ m_DoneButton = nullptr;
+ }
+
+ getPage()->setTitle(nullptr);
+}
+
InputBox *InputView::getInputBox() const
{
return m_InputBox;
Evas_Object *InputView::createRecordField(Evas_Object *parent, RecordField::Mode mode)
{
- m_RecordField = new RecordField(m_Memo.getSoundRecord()->getPath(), mode);
- m_RecordField->create(parent);
- m_RecordField->setRecordingStartCallback(std::bind(&InputView::onMemoChanged, this));
- m_RecordField->setDeleteCallback(std::bind(&InputView::onRecordFieldDelete, this));
- onRotationChanged(getRotation());
+ if (m_Memo.getSoundRecord()) {
+ m_RecordField = new RecordField(m_Memo.getSoundRecord()->getPath(), mode);
+ m_RecordField->create(parent);
+ m_RecordField->setRecordingStartCallback(std::bind(&InputView::onChanged, this));
+ m_RecordField->setDeleteCallback(std::bind(&InputView::onRecordFieldDelete, this));
+ onRotationChanged(getRotation());
+ return m_RecordField->getEvasObject();
+ }
- return m_RecordField->getEvasObject();
+ return nullptr;
}
void InputView::onDonePressed(Evas_Object *button, void *eventInfo)
void InputView::onTitleChanged(Evas_Object *entry, void *eventInfo)
{
m_Memo.setTitle(elm_entry_entry_get(entry));
- onMemoChanged();
+ onChanged();
}
void InputView::onFavChanged(Evas_Object *check, void *eventInfo)
{
if (isEmpty != m_Memo.getContent().empty()) {
m_Memo.setContent(m_InputBox->getContent());
- onMemoChanged();
+ onChanged();
}
}
{
m_Memo.removeSoundRecord();
m_RecordField = nullptr;
- onMemoChanged();
+ onChanged();
}
-void InputView::onMemoChanged()
+void InputView::onChanged()
{
elm_object_disabled_set(m_DoneButton, m_Memo.isEmpty());
}