1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
#ifndef NEWSBOAT_ITEMLISTFORMACTION_H_
#define NEWSBOAT_ITEMLISTFORMACTION_H_
#include <assert.h>
#include "3rd-party/optional.hpp"
#include "fmtstrformatter.h"
#include "history.h"
#include "listformaction.h"
#include "listformatter.h"
#include "regexmanager.h"
#include "view.h"
namespace newsboat {
typedef std::pair<std::shared_ptr<RssItem>, unsigned int> ItemPtrPosPair;
enum class InvalidationMode { NONE, PARTIAL, COMPLETE };
class ItemListFormAction : public ListFormAction {
public:
ItemListFormAction(View*,
std::string formstr,
Cache* cc,
FilterContainer& f,
ConfigContainer* cfg,
RegexManager& r);
~ItemListFormAction() override;
void prepare() override;
void init() override;
void set_feed(std::shared_ptr<RssFeed> fd);
std::string id() const override
{
return "articlelist";
}
std::string title() override;
std::shared_ptr<RssFeed> get_feed()
{
return feed;
}
void set_pos(unsigned int p)
{
pos = p;
}
std::string get_guid();
const std::vector<KeyMapHintEntry>& get_keymap_hint() const override;
bool jump_to_next_unread_item(bool start_with_first);
bool jump_to_previous_unread_item(bool start_with_last);
bool jump_to_next_item(bool start_with_first);
bool jump_to_previous_item(bool start_with_last);
bool jump_to_random_unread_item();
void handle_cmdline(const std::string& cmd) override;
void finished_qna(Operation op) override;
void invalidate_list()
{
invalidation_mode = InvalidationMode::COMPLETE;
}
void restore_selected_position();
protected:
bool process_operation(Operation op,
bool automatic = false,
std::vector<std::string>* args = nullptr) override;
void invalidate(const unsigned int invalidated_pos)
{
if (invalidation_mode == InvalidationMode::COMPLETE) {
return;
}
invalidation_mode = InvalidationMode::PARTIAL;
invalidated_itempos.push_back(invalidated_pos);
}
virtual FmtStrFormatter setup_head_formatter(const std::string& s,
unsigned int unread,
unsigned int total,
const std::string& url);
std::vector<ItemPtrPosPair> visible_items;
int old_itempos;
std::shared_ptr<RssFeed> feed;
Matcher matcher;
bool apply_filter;
private:
void register_format_styles();
void do_update_visible_items();
void draw_items();
bool open_position_in_browser(unsigned int pos,
bool interactive) const;
virtual void set_head(const std::string& s,
unsigned int unread,
unsigned int total,
const std::string& url);
int get_pos(unsigned int idx);
void save_article(const std::string& filename,
std::shared_ptr<RssItem> item);
void handle_save(const std::vector<std::string>& cmd_args);
void save_filterpos();
void qna_end_setfilter();
void qna_end_editflags();
void qna_start_search();
void handle_cmdline_num(unsigned int idx);
std::string gen_flags(std::shared_ptr<RssItem> item);
void prepare_set_filterpos();
std::string item2formatted_line(const ItemPtrPosPair& item,
const unsigned int width,
const std::string& itemlist_format,
const std::string& datetime_format);
void goto_item(const std::string& title);
void handle_op_saveall();
unsigned int pos;
History filterhistory;
std::mutex redraw_mtx;
bool set_filterpos;
unsigned int filterpos;
RegexManager& rxman;
unsigned int old_width;
nonstd::optional<ArticleSortStrategy> old_sort_strategy;
InvalidationMode invalidation_mode;
std::vector<unsigned int> invalidated_itempos;
ListFormatter listfmt;
Cache* rsscache;
FilterContainer& filters;
};
} // namespace newsboat
#endif /* NEWSBOAT_ITEMLISTFORMACTION_H_ */
|