OSDN Git Service

ThreadWindow informs update to BoardWindow.
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 30 Jun 2009 16:30:14 +0000 (01:30 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 30 Jun 2009 16:30:14 +0000 (01:30 +0900)
src/bbs_detail_base.cxx
src/bbs_detail_base.hxx
src/board_window.cxx
src/board_window.hxx
src/thread_list_model.cxx
src/thread_list_model.hxx
src/thread_window.cxx
src/thread_window.hxx

index 08c9930..2723f65 100644 (file)
@@ -284,6 +284,18 @@ std::string Base::get_title_from_string(const std::string& dat) const {
   return "";
 }
 
+bool Base::belongs_to(const Base& rhs) const {
+  assert(is_thread() && rhs.is_board());
+
+  return get_bbs_name() == rhs.get_bbs_name() &&
+  host_ == rhs.host_ && board_ == rhs.board_;
+
+}
+
+std::string Base::get_thread_id() const {
+  return thread_;
+}
+
 http::Header Base::get_thread_dat_request_header() const {
   http::Header request_header;
   request_header.set_host(host_);
index 940939d..fec2dbe 100644 (file)
@@ -58,6 +58,8 @@ public:
   virtual http::Header get_board_subject_request_header() const;
   virtual http::Header get_thread_dat_request_header() const;
   virtual std::string get_title_from_string(const std::string& dat) const;
+  virtual bool belongs_to(const Base& rhs) const;
+  virtual std::string get_thread_id() const;
 
   virtual const std::string& get_encoding() const;
 
index c1c6d90..283a806 100644 (file)
@@ -51,6 +51,7 @@
 #include "http_date.hxx"
 #include "misc.hxx"
 #include "board_window_state.hxx"
+#include "thread_idx.hxx"
 
 
 namespace dialektos {
@@ -161,6 +162,17 @@ BoardWindow::BoardWindow(std::auto_ptr<bbs_detail::Base> bbs) :
 BoardWindow::~BoardWindow() {
 }
 
+void BoardWindow::on_informed_from(const bbs_detail::Base& bbs,
+    const ThreadIdx& idx) {
+  if (!bbs.belongs_to(*bbs_)) return;
+
+  ModelColumns cols;
+  model_column::field<model_column::Title>(cols) = idx.title_;
+  model_column::field<model_column::ID>(cols) = bbs.get_thread_id();
+  model_column::field<model_column::LineCount>(cols) = idx.line_count_;
+  tree_model_->update_row(cols);
+}
+
 void BoardWindow::on_row_activated(const Gtk::TreeModel::Path& path,
     Gtk::TreeViewColumn* /*col*/) {
   Gtk::TreeIter iter = tree_model_->get_iter(path);
index 605eb7f..99e2980 100644 (file)
@@ -39,12 +39,15 @@ namespace bbs_detail {
   class Base;
 }
 
+struct ThreadIdx;
+
 
 class BoardWindow: public dialektos::ApplicationFrameWork {
 public:
   static void create(std::auto_ptr<bbs_detail::Base> bbs);
   virtual ~BoardWindow();
   virtual void save_state() const;
+  void on_informed_from(const bbs_detail::Base&, const ThreadIdx&);
 protected:
   BoardWindow(std::auto_ptr<bbs_detail::Base> bbs);
 
index 9d44c5e..26fdb25 100644 (file)
@@ -192,6 +192,31 @@ const ModelColumns& ThreadListModel::get_model_columns(const size_t row_index) c
   return it->second;
 }
 
+void ThreadListModel::update_row(const ModelColumns& record) {
+  const model_column::ID::type& id = model_column::field<model_column::ID>(record);
+
+  StoreType::iterator it = list_.find(id);
+  if (it != list_.end()) {
+    model_column::field<model_column::Title>(it->second) =
+      model_column::field<model_column::Title>(record);
+    model_column::field<model_column::LineCount>(it->second) =
+      model_column::field<model_column::LineCount>(record);
+    OrderType::iterator jt = std::find(order_.begin(), order_.end(), id);
+    if (jt != order_.end()) {
+      const size_t row_index = std::distance(order_.begin(), jt);
+      Gtk::TreePath path;
+      path.append_index(row_index);
+      iterator iter;
+      iter.set_stamp(1);
+      iter.gobj()->user_data = GINT_TO_POINTER(row_index);
+      row_changed(path, iter);
+    }
+  } else {
+    append(record);
+  }
+}
+
+
 GType ThreadListModel::get_column_type_vfunc(const int index) const {
   assert(index >= 0 && index < boost::mpl::size<ModelColumns::type>::value);
 
index d9ca27d..fb968d0 100644 (file)
@@ -90,6 +90,7 @@ public:
   void set_buffer(const boost::unordered_map<model_column::ID::type, ModelColumns>& buffer);
   void get_buffer(boost::unordered_map<model_column::ID::type, ModelColumns>& buffer) const;
   const ModelColumns& get_model_columns(size_t row_index) const;
+  void update_row(const ModelColumns& record);
 protected:
   ThreadListModel();
 
index 878b769..29c69a1 100644 (file)
@@ -24,6 +24,7 @@
 #include <gtkmm/stock.h>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
 #include <iostream>
 #include <fstream>
 #include "bbs_detail_base.hxx"
@@ -32,6 +33,7 @@
 #include "misc.hxx"
 #include "uri_opener.hxx"
 #include "thread_window_state.hxx"
+#include "board_window.hxx"
 
 
 namespace dialektos {
@@ -195,6 +197,7 @@ void ThreadWindow::on_http_get_end(bool success) {
   text_view_->queue_draw();
 
   save_content(response);
+  inform_to_board(idx_);
 }
 
 void ThreadWindow::on_refresh_end(const http::StatusLine& status,
@@ -244,4 +247,13 @@ void ThreadWindow::save_state() const {
   state.to_xml(boost::filesystem::path(bbs_->get_thread_state_path()));
 }
 
+void ThreadWindow::inform_to_board(const ThreadIdx& idx) const {
+  BOOST_FOREACH(ApplicationWindow& window, windows) {
+    if (BoardWindow* board_window = dynamic_cast<BoardWindow*>(&window)) {
+      board_window->on_informed_from(*bbs_, idx);
+    }
+  }
+}
+
+
 } // namespace dialektos
index 1c56c44..7a3ae01 100644 (file)
@@ -60,6 +60,7 @@ private:
   void on_refresh_end(const http::StatusLine&, const http::Header&);
 
   void save_content(const http::Response&);
+  void inform_to_board(const ThreadIdx& idx) const;
 
   boost::scoped_ptr<text_view::TextView> text_view_;
   ScrolledContainer scrolled_;