2
* TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2012
3
* <manutm007@gmail.com>
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
static GtkWidget *dialog, *sc_win;
25
static int f_index; /* starting at 0 (row starts at 1) */
26
static char url[FILE_NAME_MAXLEN + 1];
28
enum {COLUMN_INT, COLUMN_STRING_TITLE, COLUMN_STRING_URL, N_COLUMNS};
30
static gint esc_key_pressed(GtkWidget *dialog2, GdkEventKey *event)
32
if (event->keyval == GDK_Escape) {
33
gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CLOSE);
39
static gint enter_key_pressed(GtkWidget *dialog2, GdkEventKey *event)
41
if (event->keyval == GDK_Return) {
42
gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_OK);
48
static void force_quit_dialog(GtkWidget *dialog2)
50
gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CLOSE);
53
/* tree selection callback - get url */
54
static gint tree_selection_changed(GtkTreeSelection *selection)
56
GtkTreeModel *tree_model;
60
if (gtk_tree_selection_get_selected(selection, &tree_model, &iter)) {
61
gtk_tree_model_get(tree_model, &iter,
63
COLUMN_STRING_URL, &str_url,
65
str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN);
68
gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_NONE);
72
/* catch double-click on tree view */
73
static gint double_click_on_tree_view(GtkTreeView *tree_view, GtkTreePath *tree_path)
75
GtkTreeModel *tree_model;
79
tree_model = gtk_tree_view_get_model(tree_view);
80
if (gtk_tree_model_get_iter(tree_model, &iter, tree_path)) {
81
gtk_tree_model_get(tree_model, &iter,
83
COLUMN_STRING_URL, &str_url,
85
str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN);
88
gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
92
/* clear the list before filling it */
93
static void fill_list_store_from_flnode(GtkListStore *list_store)
99
gtk_list_store_clear(list_store);
101
for (flist2 = f_list_first(flist); IS_FLIST(flist2); flist2 = flist2->next) {
102
gtk_list_store_append(list_store, &iter);
103
gtk_list_store_set(list_store, &iter,
105
COLUMN_STRING_TITLE, flist2->title,
106
COLUMN_STRING_URL, flist2->url,
112
/* actually ***selected feed*** picker */
113
void quick_feed_picker(int up_or_down)
115
GtkTreeView *tree_view;
116
GtkListStore *list_store;
117
GtkCellRenderer *renderer1, *renderer2;
118
GtkTreeViewColumn *column1, *column2;
119
GtkTreeSelection *selection;
122
up_or_down = up_or_down; /* unused so far */
124
dialog = gtk_dialog_new_with_buttons(
125
"Selected Feed Picker", GTK_WINDOW(get_ticker_env()->win),
126
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
129
set_tickr_icon_to_dialog(GTK_WINDOW(dialog));
130
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
131
gtk_container_set_border_width(GTK_CONTAINER(dialog), 0);
132
gtk_widget_set_size_request(dialog, 450, 200);
134
sc_win = gtk_scrolled_window_new(NULL, NULL);
135
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_AUTOMATIC,
136
GTK_POLICY_AUTOMATIC);
137
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), sc_win);
139
list_store = gtk_list_store_new(N_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING);
140
if (IS_FLIST(get_feed_selection())) {
141
flist = f_list_first(get_feed_selection());
142
fill_list_store_from_flnode(list_store);
144
warning(FALSE, 2, "No feed selection available\n",
145
"(You have set 'Mouse wheel scrolling apply to: Feed' and\n"
146
"either there is no feed list or no feed has been selected)");
147
gtk_widget_destroy(dialog);
151
tree_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)));
152
renderer1 = gtk_cell_renderer_text_new();
153
column1 = gtk_tree_view_column_new_with_attributes("Selected Feed Title", renderer1,
154
"text", COLUMN_STRING_TITLE, NULL);
155
gtk_tree_view_append_column(tree_view, column1);
156
renderer2 = gtk_cell_renderer_text_new();
157
column2 = gtk_tree_view_column_new_with_attributes("Selected Feed URL", renderer2,
158
"text", COLUMN_STRING_URL, NULL);
159
gtk_tree_view_append_column(tree_view, column2);
160
gtk_container_add(GTK_CONTAINER(sc_win), GTK_WIDGET(tree_view));
162
selection = gtk_tree_view_get_selection(tree_view);
163
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
165
g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(esc_key_pressed), NULL);
166
g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(enter_key_pressed), NULL);
167
g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(force_quit_dialog), NULL);
168
g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(tree_selection_changed), NULL);
169
g_signal_connect(G_OBJECT(tree_view), "row_activated", G_CALLBACK(double_click_on_tree_view), NULL);
171
gtk_widget_show_all(dialog);
172
if (IS_FLIST(flist) && (get_resource()->id)[0] != '\0')
173
if ((f_index = f_list_search(flist, (get_resource()->id))) > -1)
174
highlight_and_go_to_row(tree_view, selection, f_index + 1);
175
while ((response = gtk_dialog_run(GTK_DIALOG(dialog))) != GTK_RESPONSE_CANCEL &&\
176
response != GTK_RESPONSE_CLOSE) {
177
if (response == GTK_RESPONSE_OK) {
178
if ((f_index = f_list_search(flist, url)) > -1) {
179
set_feed_selection(f_list_nth(flist, f_index + 1));
180
get_ticker_env()->reload_rq = TRUE;
185
gtk_widget_destroy(dialog);