pan-devel
[Top][All Lists]
Advanced

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

[Pan-devel] [RFC:PATCH] implement "match only read articles" filter


From: Cal Peake
Subject: [Pan-devel] [RFC:PATCH] implement "match only read articles" filter
Date: Tue, 8 Jan 2013 08:21:50 -0500 (EST)
User-agent: Alpine 2.00 (LNX 1167 2008-08-23)

Hi,

I've cooked up a patch that adds a filter to only matches read articles. 
The patch works well, with the only potential missing part being that 
"match only read" and "match only unread" are mutually exclusive, so it 
might be nice to have one untoggle the other if appropriate. I haven't 
gotten far enough into the GTK programming docs to add this part, but I 
was hoping to get some feedback on the feature as a whole before I do.

The patch can be found below, as well as attached along with its icon file 
for the toolbar.

Thanks!

-- 
Cal Peake

diff --git a/pan/data-impl/article-filter.cc b/pan/data-impl/article-filter.cc
index 9a25dbb..effdf69 100644
--- a/pan/data-impl/article-filter.cc
+++ b/pan/data-impl/article-filter.cc
@@ -96,6 +96,10 @@ ArticleFilter :: test_article (const Data        & data,
       pass = data.has_from_header (article.author.to_view());
       break;
 
+    case FilterInfo::IS_READ:
+      pass = data.is_read (&article);
+      break;
+
     case FilterInfo::IS_UNREAD:
       pass = !data.is_read (&article);
       break;
diff --git a/pan/gui/actions.cc b/pan/gui/actions.cc
index 0088820..1e44136 100644
--- a/pan/gui/actions.cc
+++ b/pan/gui/actions.cc
@@ -61,6 +61,7 @@ namespace pan
     { icon_filter_only_attachments, "ICON_ONLY_ATTACHMENTS" },
     { icon_filter_only_cached, "ICON_ONLY_CACHED" },
     { icon_filter_only_me, "ICON_ONLY_ME" },
+    { icon_filter_only_read, "ICON_ONLY_READ" },
     { icon_filter_only_unread, "ICON_ONLY_UNREAD" },
     { icon_filter_only_watched, "ICON_ONLY_WATCHED" },
     { icon_get_dialog, "ICON_GET_DIALOG" },
@@ -284,6 +285,7 @@ namespace pan
   void do_match_only_binary_articles (GtkToggleAction * a) { 
pan_ui->do_match_only_binary_articles (gtk_toggle_action_get_active(a)); }
   void do_match_only_my_articles (GtkToggleAction * a) { 
pan_ui->do_match_only_my_articles (gtk_toggle_action_get_active(a)); }
   void do_match_only_unread_articles (GtkToggleAction * a) { 
pan_ui->do_match_only_unread_articles (gtk_toggle_action_get_active(a)); }
+  void do_match_only_read_articles (GtkToggleAction * a) { 
pan_ui->do_match_only_read_articles (gtk_toggle_action_get_active(a)); }
 
     GtkActionEntry entries[] =
     {
@@ -725,6 +727,7 @@ namespace pan
     { "show-toolbar", NULL, N_("Show _Toolbar"), NULL, NULL, 
G_CALLBACK(do_show_toolbar), true },
     { "shorten-group-names", GTK_STOCK_ZOOM_OUT, N_("Abbreviate Group Names"), 
"B", NULL, G_CALLBACK(do_shorten_group_names), false },
 
+    { "match-only-read-articles", "ICON_ONLY_READ", N_("Match Only _Read 
Articles"), NULL, N_("Match Only Read Articles"), 
G_CALLBACK(do_match_only_read_articles), false },
     { "match-only-unread-articles", "ICON_ONLY_UNREAD", N_("Match Only _Unread 
Articles"), NULL, N_("Match Only Unread Articles"), 
G_CALLBACK(do_match_only_unread_articles), false },
     { "match-only-cached-articles", "ICON_ONLY_CACHED", N_("Match Only _Cached 
Articles"), NULL, N_("Match Only Cached Articles"), 
G_CALLBACK(do_match_only_cached_articles), false },
     { "match-only-binary-articles", "ICON_ONLY_ATTACHMENTS", N_("Match Only 
_Complete Articles"), NULL, N_("Match Only Complete Articles"), 
G_CALLBACK(do_match_only_binary_articles), false },
diff --git a/pan/gui/gui.cc b/pan/gui/gui.cc
index 8d4cd61..9c87c0a 100644
--- a/pan/gui/gui.cc
+++ b/pan/gui/gui.cc
@@ -1867,6 +1867,7 @@ void GUI :: do_shorten_group_names (bool b)
   _group_pane->set_name_collapse (b);
 }
 
+void GUI :: do_match_only_read_articles   (bool) { _header_pane->refilter (); }
 void GUI :: do_match_only_unread_articles (bool) { _header_pane->refilter (); }
 void GUI :: do_match_only_cached_articles (bool) { _header_pane->refilter (); }
 void GUI :: do_match_only_binary_articles (bool) { _header_pane->refilter (); }
diff --git a/pan/gui/gui.h b/pan/gui/gui.h
index 1d44935..e67fd07 100644
--- a/pan/gui/gui.h
+++ b/pan/gui/gui.h
@@ -183,6 +183,7 @@ namespace pan
       virtual void do_match_only_binary_articles (bool);
       virtual void do_match_only_my_articles (bool);
       virtual void do_match_only_unread_articles (bool);
+      virtual void do_match_only_read_articles (bool);
       virtual void do_enable_toggle_rules (bool enable);
       virtual void do_match_on_score_state (int);
       virtual void do_show_matches (const Data::ShowType);
diff --git a/pan/gui/header-pane.cc b/pan/gui/header-pane.cc
index 7b571fc..46bf9c4 100644
--- a/pan/gui/header-pane.cc
+++ b/pan/gui/header-pane.cc
@@ -1418,6 +1418,12 @@ HeaderPane :: rebuild_filter (const std::string& text, 
int mode)
     f._aggregates.push_back (entry_filter);
   }
 
+  if (_action_manager.is_action_active("match-only-read-articles")) {
+//std::cerr << LINE_ID << " AND is read" << std::endl;
+    FilterInfo tmp;
+    tmp.set_type_is_read ();
+    f._aggregates.push_back (tmp);
+  }
   if (_action_manager.is_action_active("match-only-unread-articles")) {
 //std::cerr << LINE_ID << " AND is unread" << std::endl;
     FilterInfo tmp;
diff --git a/pan/gui/pan-ui.h b/pan/gui/pan-ui.h
index e9eca00..765c45e 100644
--- a/pan/gui/pan-ui.h
+++ b/pan/gui/pan-ui.h
@@ -123,6 +123,7 @@ namespace pan
     virtual void do_show_toolbar (bool) = 0;
     virtual void do_shorten_group_names (bool) = 0;
 
+    virtual void do_match_only_read_articles (bool) = 0;
     virtual void do_match_only_unread_articles (bool) = 0;
     virtual void do_match_only_cached_articles (bool) = 0;
     virtual void do_match_only_binary_articles (bool) = 0;
diff --git a/pan/gui/pan.ui.h b/pan/gui/pan.ui.h
index a24fd70..57a5efd 100644
--- a/pan/gui/pan.ui.h
+++ b/pan/gui/pan.ui.h
@@ -51,6 +51,7 @@ const char * fallback_ui_file =
 "        <menuitem action='show-matching-subthreads' />\n"
 "        <separator />\n"
 "        <menuitem action='match-only-unread-articles' />\n"
+"        <menuitem action='match-only-read-articles' />\n"
 "        <menuitem action='match-only-cached-articles' />\n"
 "        <menuitem action='match-only-binary-articles' />\n"
 "        <menuitem action='match-only-my-articles' />\n"
@@ -179,6 +180,7 @@ const char * fallback_ui_file =
 "    <placeholder name='header-pane-filter' />\n"
 "    <separator />\n"
 "    <toolitem action='match-only-unread-articles' />\n"
+"    <toolitem action='match-only-read-articles' />\n"
 "    <toolitem action='match-only-cached-articles' />\n"
 "    <toolitem action='match-only-binary-articles' />\n"
 "    <toolitem action='match-only-my-articles' />\n"
diff --git a/pan/gui/pan.ui.ssl.h b/pan/gui/pan.ui.ssl.h
index ce1e573..e90c406 100644
--- a/pan/gui/pan.ui.ssl.h
+++ b/pan/gui/pan.ui.ssl.h
@@ -50,6 +50,7 @@ const char * fallback_ui_file =
 "        <menuitem action='show-matching-subthreads' />\n"
 "        <separator />\n"
 "        <menuitem action='match-only-unread-articles' />\n"
+"        <menuitem action='match-only-read-articles' />\n"
 "        <menuitem action='match-only-cached-articles' />\n"
 "        <menuitem action='match-only-binary-articles' />\n"
 "        <menuitem action='match-only-my-articles' />\n"
@@ -178,6 +179,7 @@ const char * fallback_ui_file =
 "    <placeholder name='header-pane-filter' />\n"
 "    <separator />\n"
 "    <toolitem action='match-only-unread-articles' />\n"
+"    <toolitem action='match-only-read-articles' />\n"
 "    <toolitem action='match-only-cached-articles' />\n"
 "    <toolitem action='match-only-binary-articles' />\n"
 "    <toolitem action='match-only-my-articles' />\n"
diff --git a/pan/icons/Makefile.am b/pan/icons/Makefile.am
index 1209d7e..7804d3c 100644
--- a/pan/icons/Makefile.am
+++ b/pan/icons/Makefile.am
@@ -18,6 +18,7 @@ stock_images = \
        icon_filter_only_attachments.png \
        icon_filter_only_cached.png \
        icon_filter_only_me.png \
+       icon_filter_only_read.png \
        icon_filter_only_unread.png \
        icon_filter_only_watched.png \
        icon_get_dialog.png \
diff --git a/pan/usenet-utils/filter-info.cc b/pan/usenet-utils/filter-info.cc
index f83b939..21e525c 100644
--- a/pan/usenet-utils/filter-info.cc
+++ b/pan/usenet-utils/filter-info.cc
@@ -142,6 +142,11 @@ FilterInfo :: set_type_score_le (unsigned long le)
    set_type_le (SCORE_GE, le);
 }
 void
+FilterInfo :: set_type_is_read ()
+{
+   set_type_is (IS_READ);
+}
+void
 FilterInfo :: set_type_is_unread ()
 {
    set_type_is (IS_UNREAD);
@@ -182,7 +187,7 @@ FilterInfo :: describe () const
   {
     ret = _("the article was posted by you");
   }
-  else if (_type==IS_UNREAD && _negate)
+  else if (_type==IS_READ)
   {
     ret = _("the article has been read");
   }
diff --git a/pan/usenet-utils/filter-info.h b/pan/usenet-utils/filter-info.h
index 408b6ae..32e3967 100644
--- a/pan/usenet-utils/filter-info.h
+++ b/pan/usenet-utils/filter-info.h
@@ -43,6 +43,7 @@ namespace pan
         IS_BINARY,
         IS_CACHED,
         IS_POSTED_BY_ME,
+        IS_READ,
         IS_UNREAD,
         BYTE_COUNT_GE,
         CROSSPOST_COUNT_GE,
@@ -103,6 +104,7 @@ namespace pan
       void set_type_line_count_ge (unsigned long ge);
       void set_type_score_ge (unsigned long ge);
       void set_type_score_le (unsigned long le);
+      void set_type_is_read ();
       void set_type_is_unread ();
       void set_type_posted_by_me ();
       void set_type_text (const Quark& header,const TextMatch::Description&);

Attachment: implement-filter-only-read.diff
Description: patch

Attachment: icon_filter_only_read.png
Description: icon


reply via email to

[Prev in Thread] Current Thread [Next in Thread]