[pan2: 7/8] done



commit c7ee1e5e9aba3dc0c8ea2460b6d685d4b8e46c51
Author: Heinrich Müller <henmull src gnome org>
Date:   Fri Jun 7 13:59:39 2013 +0200

    done

 pan/gui/Makefile.am    |    2 +
 pan/gui/actions.cc     |    4 +-
 pan/gui/gui.cc         |   42 ++++++++++++---
 pan/gui/gui.h          |    5 ++-
 pan/gui/pan-ui.h       |    3 +-
 pan/gui/search-pane.cc |  138 ++++++++++++++++++++++++------------------------
 pan/gui/search-pane.h  |    7 +--
 pan/gui/task-pane.cc   |   24 --------
 8 files changed, 117 insertions(+), 108 deletions(-)
---
diff --git a/pan/gui/Makefile.am b/pan/gui/Makefile.am
index 72f0fd8..99bfaba 100644
--- a/pan/gui/Makefile.am
+++ b/pan/gui/Makefile.am
@@ -16,6 +16,7 @@ libpangui_a_SOURCES = \
  group-prefs.cc \
  group-prefs-dialog.cc \
  header-pane.cc \
+ search-pane.cc \
  hig.cc \
  log-ui.cc \
  pan-file-entry.cc \
@@ -56,6 +57,7 @@ noinst_HEADERS = \
  gtk-compat.h \
  gui.h \
  header-pane.h \
+ search-pane.h \
  hig.h \
  license.h \
  log-ui.h \
diff --git a/pan/gui/actions.cc b/pan/gui/actions.cc
index b0bcf1e..9c1acbd 100644
--- a/pan/gui/actions.cc
+++ b/pan/gui/actions.cc
@@ -188,7 +188,7 @@ namespace pan
   void do_about_pan                    (GtkAction*) { pan_ui->do_about_pan(); }
 
   void do_work_online         (GtkToggleAction * a) { pan_ui->do_work_online         
(gtk_toggle_action_get_active(a)); }
-  void do_tabbed_layout       (GtkToggleAction * a) { pan_ui->do_tabbed_layout       
(gtk_toggle_action_get_active(a)); }
+  void do_layout              (GtkToggleAction * a) { pan_ui->do_layout              
(gtk_toggle_action_get_active(a)); }
   void do_show_group_pane     (GtkToggleAction * a) { pan_ui->do_show_group_pane     
(gtk_toggle_action_get_active(a)); }
   void do_show_header_pane    (GtkToggleAction * a) { pan_ui->do_show_header_pane    
(gtk_toggle_action_get_active(a)); }
   void do_show_body_pane      (GtkToggleAction * a) { pan_ui->do_show_body_pane      
(gtk_toggle_action_get_active(a)); }
@@ -732,7 +732,7 @@ namespace pan
 
 
     { "work-online", "ICON_ONLINE", N_("_Work Online"), "L", NULL, G_CALLBACK(do_work_online), true },
-    { "tabbed-layout", GTK_STOCK_JUMP_TO, N_("_Tabbed Layout"), "Z", NULL, G_CALLBACK(do_tabbed_layout), 
false },
+    { "tabbed-layout", GTK_STOCK_JUMP_TO, N_("_Tabbed Layout"), "Z", NULL, G_CALLBACK(do_layout), false },
     { "show-group-pane", NULL, N_("Show Group _Pane"), "<control>1", NULL, G_CALLBACK(do_show_group_pane), 
true },
     { "show-header-pane", NULL, N_("Show Hea_der Pane"), "<control>2", NULL, 
G_CALLBACK(do_show_header_pane), true },
     { "show-body-pane", NULL, N_("Show Bod_y Pane"), "<control>3", NULL, G_CALLBACK(do_show_body_pane), true 
},
diff --git a/pan/gui/gui.cc b/pan/gui/gui.cc
index 9c87c0a..37f45ad 100644
--- a/pan/gui/gui.cc
+++ b/pan/gui/gui.cc
@@ -48,6 +48,7 @@ extern "C" {
 #include "group-pane.h"
 #include "group-prefs-dialog.h"
 #include "header-pane.h"
+#include "search-pane.h"
 #include "hig.h"
 #include "license.h"
 #include "log-ui.h"
@@ -224,6 +225,7 @@ GUI :: GUI (Data& data, Queue& queue, Prefs& prefs, GroupPrefs& group_prefs, Dow
   _menu_vbox (gtk_box_new (GTK_ORIENTATION_VERTICAL, 0)),
   _group_pane (0),
   _header_pane (0),
+  _search_pane (0),
   _body_pane (0),
   _ui_manager (gtk_ui_manager_new ()),
   _info_image (gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU)),
@@ -249,6 +251,8 @@ GUI :: GUI (Data& data, Queue& queue, Prefs& prefs, GroupPrefs& group_prefs, Dow
 
   _group_pane = new GroupPane (*this, data, _prefs, _group_prefs);
   _header_pane = new HeaderPane (*this, data, _queue, _cache, _prefs, _group_prefs, *this, *this);
+  _search_pane = new SearchPane (data, _queue, *this, *this);
+  //_search_pane->refresh();
   _body_pane = new BodyPane (data, _cache, _prefs, _group_prefs, _queue, _header_pane);
 
   std::string path = "/ui/main-window-toolbar";
@@ -275,7 +279,7 @@ GUI :: GUI (Data& data, Queue& queue, Prefs& prefs, GroupPrefs& group_prefs, Dow
 
   // workarea
   _workarea_bin = gtk_event_box_new ();
-  do_tabbed_layout (is_action_active ("tabbed-layout"));
+  do_layout (is_action_active ("tabbed-layout"));
   gtk_box_pack_start (GTK_BOX(_root), _workarea_bin, TRUE, TRUE, 0);
   gtk_widget_show (_workarea_bin);
 
@@ -356,6 +360,7 @@ GUI :: GUI (Data& data, Queue& queue, Prefs& prefs, GroupPrefs& group_prefs, Dow
   g_object_ref_sink (G_OBJECT(_error_image));
   g_object_ref (_group_pane->root());
   g_object_ref (_header_pane->root());
+  g_object_ref (_search_pane->root());
   g_object_ref (_body_pane->root());
 
   do_work_online (is_action_active ("work-online"));
@@ -442,11 +447,13 @@ GUI :: ~GUI ()
   std::set<GtkWidget*> unref;
   unref.insert (_body_pane->root());
   unref.insert (_header_pane->root());
+  unref.insert (_search_pane->root());
   unref.insert (_group_pane->root());
   unref.insert (_error_image);
   unref.insert (_info_image);
 
   delete _header_pane;
+  delete _search_pane;
   delete _group_pane;
   delete _body_pane;
 
@@ -855,6 +862,18 @@ void GUI :: do_import_tasks ()
     _queue.add_tasks (tasks, Queue::BOTTOM);
 }
 
+void GUI :: do_import_tasks_from_nzb_stream (const char* stream)
+{
+  // if we're importing files, build the tasks...
+  Queue::tasks_t tasks;
+  const std::string path (prompt_user_for_save_path (get_window(_root), _prefs));
+  if (!path.empty())
+    NZB :: tasks_from_nzb_string(stream, path, _cache, _encode_cache, _data, _data, _data, tasks);
+
+  if (!tasks.empty())
+    _queue.add_tasks (tasks, Queue::BOTTOM);
+}
+
 namespace
 {
   void task_pane_destroyed_cb (GtkWidget *, gpointer p)
@@ -1769,7 +1788,8 @@ GUI :: notebook_page_switched_cb (GtkNotebook *, GtkNotebookPage *, gint page_nu
   g_idle_add (grab_focus_idle, w);
 }
 
-void GUI :: do_tabbed_layout (bool tabbed)
+//TODO
+void GUI :: do_layout (bool tabbed)
 {
   if (hpane) {
     _prefs.set_int ("main-window-hpane-position", gtk_paned_get_position(GTK_PANED(hpane)));
@@ -1784,10 +1804,12 @@ void GUI :: do_tabbed_layout (bool tabbed)
 
   GtkWidget * group_w (_group_pane->root());
   GtkWidget * header_w (_header_pane->root());
+  GtkWidget * search_w (_search_pane->root());
   GtkWidget * body_w (_body_pane->root());
 
   remove_from_parent (group_w);
   remove_from_parent (header_w);
+  remove_from_parent (search_w);
   remove_from_parent (body_w);
 
   // remove workarea's current child
@@ -1798,12 +1820,18 @@ void GUI :: do_tabbed_layout (bool tabbed)
   }
 
   GtkWidget * w (0);
+
+  GtkWidget* notebook = gtk_notebook_new ();
+  GtkNotebook * n (GTK_NOTEBOOK (notebook));
+  gtk_notebook_append_page (n, header_w, gtk_label_new_with_mnemonic (_("_1. Header Pane")));
+  gtk_notebook_append_page (n, search_w, gtk_label_new_with_mnemonic (_("_2. Search Pane")));
+
   if (tabbed)
   {
     w = gtk_notebook_new ();
     GtkNotebook * n (GTK_NOTEBOOK (w));
     gtk_notebook_append_page (n, group_w, gtk_label_new_with_mnemonic (_("_1. Group Pane")));
-    gtk_notebook_append_page (n, header_w, gtk_label_new_with_mnemonic (_("_2. Header Pane")));
+    gtk_notebook_append_page (n, notebook, gtk_label_new_with_mnemonic (_("_2. Header Pane")));
     gtk_notebook_append_page (n, body_w, gtk_label_new_with_mnemonic (_("_3. Body Pane")));
     g_signal_connect (n, "switch-page", G_CALLBACK(notebook_page_switched_cb), this);
   }
@@ -1814,9 +1842,9 @@ void GUI :: do_tabbed_layout (bool tabbed)
     const std::string orient (_prefs.get_string ("pane-orient", "groups,headers,body"));
 
     StringView tok, v(orient);
-    v.pop_token(tok,','); if (*tok.str=='g') p[0]=group_w; else if (*tok.str=='h') p[0]=header_w; else 
p[0]=body_w;
-    v.pop_token(tok,','); if (*tok.str=='g') p[1]=group_w; else if (*tok.str=='h') p[1]=header_w; else 
p[1]=body_w;
-    v.pop_token(tok,','); if (*tok.str=='g') p[2]=group_w; else if (*tok.str=='h') p[2]=header_w; else 
p[2]=body_w;
+    v.pop_token(tok,','); if (*tok.str=='g') p[0]=group_w; else if (*tok.str=='h') p[0]=notebook; else 
p[0]=body_w;
+    v.pop_token(tok,','); if (*tok.str=='g') p[1]=group_w; else if (*tok.str=='h') p[1]=notebook; else 
p[1]=body_w;
+    v.pop_token(tok,','); if (*tok.str=='g') p[2]=group_w; else if (*tok.str=='h') p[2]=notebook; else 
p[2]=body_w;
 
     if (layout == "stacked-top") {
       w = pack_widgets (_prefs, p[0], p[1], HORIZONTAL, 1);
@@ -2359,7 +2387,7 @@ void
 GUI :: on_prefs_string_changed (const StringView& key, const StringView& value)
 {
   if (key == "pane-layout" || key == "pane-orient")
-    GUI :: do_tabbed_layout (_prefs.get_flag ("tabbed-layout", false));
+    GUI :: do_layout (_prefs.get_flag ("tabbed-layout", false));
 
   if (key == "default-save-attachments-path")
     prev_path.assign (value.str, value.len);
diff --git a/pan/gui/gui.h b/pan/gui/gui.h
index e67fd07..2961339 100644
--- a/pan/gui/gui.h
+++ b/pan/gui/gui.h
@@ -43,6 +43,7 @@ namespace pan
   class GroupPane;
   class HeaderPane;
   class BodyPane;
+  class SearchPane;
   class ProgressView;
 
   /**
@@ -107,6 +108,7 @@ namespace pan
       virtual void do_print ();
       virtual void do_quit ();
       virtual void do_import_tasks ();
+      virtual void do_import_tasks_from_nzb_stream (const char*);
       virtual void do_cancel_latest_task ();
       virtual void do_show_task_window ();
       virtual void do_show_dl_meter_prefs();
@@ -173,7 +175,7 @@ namespace pan
       virtual void do_tip_jar ();
       virtual void do_about_pan ();
       virtual void do_work_online (bool);
-      virtual void do_tabbed_layout (bool);
+      virtual void do_layout (bool);
       virtual void do_show_toolbar (bool);
       virtual void do_show_group_pane (bool);
       virtual void do_show_header_pane (bool);
@@ -253,6 +255,7 @@ namespace pan
       GtkWidget * _toolbar;
       GroupPane * _group_pane;
       HeaderPane * _header_pane;
+      SearchPane * _search_pane;
       BodyPane * _body_pane;
       GtkUIManager * _ui_manager;
 
diff --git a/pan/gui/pan-ui.h b/pan/gui/pan-ui.h
index 765c45e..6c43c81 100644
--- a/pan/gui/pan-ui.h
+++ b/pan/gui/pan-ui.h
@@ -36,6 +36,7 @@ namespace pan
     virtual void do_save_articles_to_nzb () = 0;
     virtual void do_print () = 0;
     virtual void do_import_tasks () = 0;
+    virtual void do_import_tasks_from_nzb_stream (const char*) = 0;
     virtual void do_cancel_latest_task () = 0;
     virtual void do_select_all_articles () = 0;
     virtual void do_unselect_all_articles () = 0;
@@ -115,7 +116,7 @@ namespace pan
     virtual void do_unsubscribe_selected_groups () = 0;
 
     virtual void do_work_online (bool) = 0;
-    virtual void do_tabbed_layout (bool) = 0;
+    virtual void do_layout (bool) = 0;
 
     virtual void do_show_group_pane (bool) = 0;
     virtual void do_show_header_pane (bool) = 0;
diff --git a/pan/gui/search-pane.cc b/pan/gui/search-pane.cc
index cd42647..b412c22 100644
--- a/pan/gui/search-pane.cc
+++ b/pan/gui/search-pane.cc
@@ -51,7 +51,6 @@ FeedItem :: FeedItem (const char* feed_title, const char* descr, const char* ite
 
 namespace
 {
-  GrssFeedChannel *feed(0);
 
   std::string escaped (const std::string& s)
   {
@@ -64,7 +63,7 @@ namespace
   namespace
   {
 
-    std::string sort_order ("age");
+    std::string sort_order ("agedesc");
     int page (0);
 
     void order_mode_changed_cb (GtkComboBox * c, gpointer user_data)
@@ -122,8 +121,51 @@ namespace
     }
   }
 
-  void init_feed(const std::string& query, std::vector<FeedItem*>& fillme)
+  enum
   {
+    S_COL_NAME,
+    S_COL_DATE,
+    S_NUM_COLS
+  };
+
+  static void
+  feed_downloaded (GObject *source, GAsyncResult *res, gpointer user_data)
+  {
+#ifdef HAVE_RSS
+    SearchPane* pane (static_cast<SearchPane*>(user_data));
+    GtkWidget* view (pane->view());
+    GtkListStore* store (pane->store());
+
+    GList* list = grss_feed_channel_fetch_all_finish (GRSS_FEED_CHANNEL (source), res, 0);
+    GList *iter;
+    std::vector<FeedItem*> items;
+
+    GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
+    GtkTreeIter t_iter;
+
+    g_object_ref(model);
+    gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL);
+    gtk_list_store_clear(store);
+
+    for (iter = list; iter; iter = g_list_next (iter))
+    {
+        GrssFeedItem* item = (GrssFeedItem*)iter->data;
+        FeedItem* fitem = new FeedItem(grss_feed_item_get_title(item),
+            grss_feed_item_get_description(item),
+            grss_feed_item_get_source(item),
+            grss_feed_item_get_publish_time(item));
+        gtk_list_store_prepend(store, &t_iter);
+        gtk_list_store_set (store, &t_iter, S_COL_NAME, fitem, S_COL_DATE, fitem->date.c_str(), -1);
+    }
+
+    gtk_tree_view_set_model (GTK_TREE_VIEW(view), model);
+    gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(view), 0, 0);
+#endif
+  }
+
+  void init_feed(const std::string& query, SearchPane* pane)
+  {
+#ifdef HAVE_RSS
     std::stringstream str;
     str << "http://www.nzbindex.nl/rss/?q=";;
     str << escaped(query)<<"&max=600&age=550&hidespam=1&nzblink=1";
@@ -136,18 +178,9 @@ namespace
     cookie = soup_cookie_new ("lang", "2", "www.nzbindex.nl", "/", -1);
     grss_feed_channel_add_cookie (feed, cookie);
 
-    GList* list = grss_feed_channel_fetch_all (feed, 0);
-    GList *iter;
-    for (iter = list; iter; iter = g_list_next (iter))
-    {
-        GrssFeedItem* item = (GrssFeedItem*)iter->data;
-        FeedItem* fitem = new FeedItem(grss_feed_item_get_title(item),
-            grss_feed_item_get_description(item),
-            grss_feed_item_get_source(item),
-            grss_feed_item_get_publish_time(item));
-        fillme.push_back(fitem);
-    }
+    grss_feed_channel_fetch_all_async(feed, feed_downloaded, pane);
   }
+#endif
 }
 
 SearchPane :: ~SearchPane ()
@@ -177,29 +210,6 @@ void SearchPane :: refresh_clicked_cb (GtkButton*, SearchPane* pane)
   pane->refresh();
 }
 
-void SearchPane :: page_clicked_cb (GtkButton* b, SearchPane* pane)
-{
-  gchar* val = (gchar*)g_object_get_data(G_OBJECT(b), "direction");
-  if (!strcmp(val, "next"))
-      ++page;
-  if (!strcmp(val, "prev"))
-  {
-      --page;
-      if (page<0) page = 0;
-  }
-  pane->refresh();
-}
-
-namespace
-{
-  enum
-  {
-    S_COL_NAME,
-    S_COL_DATE,
-    S_NUM_COLS
-  };
-}
-
 void
 SearchPane :: get_selected_downloads_foreach (GtkTreeModel * model,
                                             GtkTreePath  * ,
@@ -267,7 +277,8 @@ namespace
                     gpointer            userdata)
   {
 
-    //TODO strip a href tags!
+    /* TODO: this is ugly, perhaps use a clever regex here (?) */
+
     FeedItem* text (0);
     gtk_tree_model_get (model, iter, S_COL_NAME, &text, -1);
     std::string str(text->desc);
@@ -281,7 +292,24 @@ namespace
     replaceAll(str, "</font>", "</span>");
     replaceAll(str, "<div xmlns=\"http://www.w3.org/1999/xhtml\";>", "");
     std::stringstream stream;
-    stream << text->title << "\n" << str;
+
+    // strip out <a href></a> tags
+    size_t pos1 = str.find("<a href");
+    size_t pos2 = str.find("</a>");
+    std::string first;
+    std::string second;
+    if (pos1 != std::string::npos)
+    {
+      first = str.substr(0, pos1);
+      second = str.substr(pos2 + 4, str.size() - pos2 + 4);
+    }
+    else
+      first = str;
+
+    stream << text->title << "\n" << first << second;
+
+    std::cerr<<"\n\n"<<stream.str()<<"\n==================================\n";
+
     g_object_set (renderer, "markup", stream.str().c_str(), NULL);
   }
 
@@ -647,14 +675,6 @@ SearchPane :: SearchPane(Data                & data,
   w = add_button(buttons, _("Refresh"), G_CALLBACK(refresh_clicked_cb), this);
   gtk_widget_set_tooltip_text(w, _("Refresh current results"));
 
-  //TODO dbg!
-  /*
-  w = add_button(buttons, _("Next Page"), G_CALLBACK(page_clicked_cb), this);
-  g_object_set_data_full (G_OBJECT(w), "direction", g_strdup("next"), g_free);
-  w = add_button(buttons, _("Prev Page"), G_CALLBACK(page_clicked_cb), this);
-  g_object_set_data_full (G_OBJECT(w), "direction", g_strdup("prev"), g_free);
-  */
-
   GtkWidget * hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, PAD);
   gtk_box_pack_start(GTK_BOX(hbox), buttons, false, false, PAD);
 
@@ -700,29 +720,9 @@ SearchPane::refresh()
 {
   if (!search_text.empty())
   {
-
-    foreach (download_v, items, it)
-      delete *it;
+    foreach (download_v, items, it) delete *it;
     items.clear();
-    init_feed(search_text, items);
-
-    if (items.size()!=0)
-    {
-      GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(_view));
-      g_object_ref(model);
-      gtk_tree_view_set_model(GTK_TREE_VIEW(_view), NULL);
-      gtk_list_store_clear(_store);
-      GtkTreeIter iter;
-      foreach (download_v, items, it)
-      {
-        gtk_list_store_append(_store, &iter);
-        gtk_list_store_set (_store, &iter, S_COL_NAME, *it, S_COL_DATE, (*it)->date.c_str(), -1);
-      }
-      gtk_tree_view_set_model (GTK_TREE_VIEW(_view), model);
-    }
-
-    gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(_view), 0, 0);
+    init_feed(search_text, this);
   }
 }
 
-
diff --git a/pan/gui/search-pane.h b/pan/gui/search-pane.h
index 72df916..4995491 100644
--- a/pan/gui/search-pane.h
+++ b/pan/gui/search-pane.h
@@ -62,21 +62,20 @@ namespace pan
        ~SearchPane ();
        void refresh();
 
+       GtkWidget* view () { return _view; }
+       GtkListStore* store () { return _store; }
+
     public:
        GtkWidget* root () { return _root; }
        void add_actions(GtkWidget*);
        static void download_clicked_cb (GtkButton*, SearchPane*);
        static void refresh_clicked_cb (GtkButton*, SearchPane*);
-       static void page_clicked_cb (GtkButton*, SearchPane*);
 
        static void do_popup_menu (GtkWidget*, GdkEventButton *event, gpointer pane_g);
        static gboolean on_button_pressed (GtkWidget * treeview, GdkEventButton *event, gpointer userdata);
        static void get_selected_downloads_foreach (GtkTreeModel*, GtkTreePath*, GtkTreeIter*, gpointer);
-
        FeedItem* get_selection();
-
        GtkWidget* create_filter_entry ();
-
        void filter (const std::string& text, int mode);
   };
 
diff --git a/pan/gui/task-pane.cc b/pan/gui/task-pane.cc
index c8ab299..1674734 100644
--- a/pan/gui/task-pane.cc
+++ b/pan/gui/task-pane.cc
@@ -36,8 +36,6 @@ extern "C" {
 #include "task-pane.h"
 #include "taskpane.ui.h"
 
-#include <libgrss.h>
-
 enum
 {
   COL_TASK_POINTER,
@@ -45,25 +43,6 @@ enum
   NUM_COLS
 };
 
-namespace
-{
-  GrssFeedChannel *feed(0);
-
-  void init_feed()
-  {
-    feed = grss_feed_channel_new();
-    grss_feed_channel_set_update_interval (feed, 3);
-    GList* list = grss_feed_channel_fetch_all (feed, 0);
-
-    GList *iter;
-    for (iter = list; iter; iter = g_list_next (iter))
-    {
-        std::cerr<<"list entry "<<iter->data<<"\n";
-    }
-
-  }
-}
-
 /**
 ***  Internal Utility
 **/
@@ -1037,9 +1016,6 @@ TaskPane :: TaskPane (Queue& queue, Prefs& prefs): _queue(queue), _prefs(prefs)
 {
   _root = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
-  //DBG!!
-  init_feed();
-
   GtkWidget * w;
 
   GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]