Pārlūkot izejas kodu

able to set value on base TaskArgument

logicp 4 gadi atpakaļ
vecāks
revīzija
c3b624db60
3 mainītis faili ar 42 papildinājumiem un 30 dzēšanām
  1. 16 1
      include/task/task.hpp
  2. 23 24
      src/argdialog.cpp
  3. 3 5
      src/instagram_task.cpp

+ 16 - 1
include/task/task.hpp

@@ -42,12 +42,27 @@ class TaskArgument : TaskArgumentBase {
   }
   TaskArgument(TaskArgument&& a) : name(std::move(a.name)), type(std::move(a.type)), value(std::move(a.value)) {}
   virtual QString text() const { return name; }
+  virtual void setValue(T new_value) { value = new_value; }
   QString name;
   ArgumentType type;
   T value;
 };
 
-using TaskArguments = std::vector<std::unique_ptr<TaskArgumentBase>>;
+using TaskIterator = std::vector<std::unique_ptr<TaskArgumentBase>>::iterator;
+
+class TaskArguments {
+ public:
+  TaskIterator getArgumentIterator(QString name) {
+    return std::find_if(values.begin(), values.end(), [name](auto argument) { return argument.text() == name; });
+  }
+  TaskIterator begin() { return values.begin(); }
+  TaskIterator end() { return values.end(); }
+  bool isValidIterator(TaskIterator it) { return it != values.end(); }
+  void setArguments(std::vector<std::unique_ptr<TaskArgumentBase>>&& new_values) { values = new_values; }
+
+ private:
+  std::vector<std::unique_ptr<TaskArgumentBase>> values;
+};
 
 class Task {
  public:

+ 23 - 24
src/argdialog.cpp

@@ -133,31 +133,30 @@ ArgDialog::ArgDialog(QWidget *parent) : QDialog(parent), ui(new Ui::ArgDialog),
 }
 
 void ArgDialog::setTaskArguments() {
-    m_task.args.clear();
-    std::string hashtags{};
-    for (const auto & tag : m_ig_post.hashtags) {
-        hashtags += "#" + tag + " ";
-    }
-    hashtags.pop_back();
-
-    std::string requested_by{};
-    for (const auto & name : m_ig_post.requested_by) {
-        requested_by += "@" + name + "";
-    }
-    if (m_ig_post.requested_by.size() > 1) {
-        requested_by.pop_back();
-    }
+  m_task->clear();
+  std::string hashtags{};
+  for (const auto &tag : m_ig_post.hashtags) {
+    hashtags += "#" + tag + " ";
+  }
+  hashtags.pop_back();
+  std::string requested_by{};
+  for (const auto &name : m_ig_post.requested_by) {
+    requested_by += "@" + name + "";
+  }
+  if (m_ig_post.requested_by.size() > 1) {
+    requested_by.pop_back();
+  }
 
-    m_task->setArgument<std::string>("datetime", m_ig_post.datetime);
-    m_task->setArgument<std::string>("description", m_ig_post.description);
-    m_task->setArgument<std::string>("hashtags", hashtags);
-    m_task->setArgument<std::string>("requested_by", requested_by);
-    m_task->setArgument<std::string>("requested_by_phrase", m_ig_post.requested_by_phrase);
-    m_task->setArgument<std::string>("promote_share", m_ig_post.promote_share);
-    m_task->setArgument<std::string>("link_in_bio", m_ig_post.link_in_bio);
-    m_task->setArgument<std::string>("is_video", std::to_string(m_ig_post.is_video));
-    m_task->setArgument<std::string>("header", m_ig_post.header);
-    m_task->setArgument<std::string>("user", m_ig_post.user);
+  m_task->setArgument<QString>("datetime", m_ig_post.datetime);
+  m_task->setArgument<QString>("description", m_ig_post.description);
+  m_task->setArgument<QString>("hashtags", hashtags);
+  m_task->setArgument<QString>("requested_by", requested_by);
+  m_task->setArgument<QString>("requested_by_phrase", m_ig_post.requested_by_phrase);
+  m_task->setArgument<QString>("promote_share", m_ig_post.promote_share);
+  m_task->setArgument<QString>("link_in_bio", m_ig_post.link_in_bio);
+  m_task->setArgument<QString>("is_video", std::to_string(m_ig_post.is_video));
+  m_task->setArgument<QString>("header", m_ig_post.header);
+  m_task->setArgument<QString>("user", m_ig_post.user);
 }
 
 void ArgDialog::addItem(QString value, QString type) {

+ 3 - 5
src/instagram_task.cpp

@@ -26,11 +26,9 @@ const TaskArguments InstagramTask::getTaskArguments() { return m_arguments; }
 template <typename T>
 void InstagramTask::setArgument(QString name, T value) {
   if constexpr (std::is_same_v<T, QString>) {
-    auto it = std::find_if(m_arguments.begin(), m_arguments.end(),
-                           [name, value](auto argument) { return argument.text() == name; });
-    if (it != m_arguments.end()) {
-      it->value = value;
-    }
+    TaskIterator it =
+        std::find_if(m_arguments.begin(), m_arguments.end(), [name](auto argument) { return argument.text() == name; });
+    it->get()->setValue(value);
   }
 }