~ubuntu-branches/debian/experimental/tickr/experimental

« back to all changes in this revision

Viewing changes to src/tickr/tickr_quickfeedpicker.c

  • Committer: Package Import Robot
  • Author(s): Emmanuel Thomas-Maurin
  • Date: 2012-03-07 00:48:53 UTC
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: package-import@ubuntu.com-20120307004853-jsyb2z1pgaaeusq9
Tags: upstream-0.6.0
ImportĀ upstreamĀ versionĀ 0.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *      TICKR - GTK-based Feed Reader - Copyright (C) Emmanuel Thomas-Maurin 2009-2012
 
3
 *      <manutm007@gmail.com>
 
4
 *
 
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.
 
9
 *
 
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.
 
14
 *
 
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/>.
 
17
 */
 
18
 
 
19
#include "tickr.h"
 
20
 
 
21
#if USE_GUI
 
22
 
 
23
static GtkWidget        *dialog, *sc_win;
 
24
static FList            *flist;
 
25
static int              f_index;        /* starting at 0 (row starts at 1) */
 
26
static char             url[FILE_NAME_MAXLEN + 1];
 
27
 
 
28
enum {COLUMN_INT, COLUMN_STRING_TITLE, COLUMN_STRING_URL, N_COLUMNS};
 
29
 
 
30
static gint esc_key_pressed(GtkWidget *dialog2, GdkEventKey *event)
 
31
{
 
32
        if (event->keyval == GDK_Escape) {
 
33
                gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CLOSE);
 
34
                return TRUE;
 
35
        } else
 
36
                return FALSE;
 
37
}
 
38
 
 
39
static gint enter_key_pressed(GtkWidget *dialog2, GdkEventKey *event)
 
40
{
 
41
        if (event->keyval == GDK_Return) {
 
42
                gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_OK);
 
43
                return TRUE;
 
44
        } else
 
45
                return FALSE;
 
46
}
 
47
 
 
48
static void force_quit_dialog(GtkWidget *dialog2)
 
49
{
 
50
        gtk_dialog_response(GTK_DIALOG(dialog2), GTK_RESPONSE_CLOSE);
 
51
}
 
52
 
 
53
/* tree selection callback - get url */
 
54
static gint tree_selection_changed(GtkTreeSelection *selection)
 
55
{
 
56
        GtkTreeModel    *tree_model;
 
57
        GtkTreeIter     iter;
 
58
        gchar           *str_url;
 
59
 
 
60
        if (gtk_tree_selection_get_selected(selection, &tree_model, &iter)) {
 
61
                gtk_tree_model_get(tree_model, &iter,
 
62
                        COLUMN_INT, &f_index,
 
63
                        COLUMN_STRING_URL, &str_url,
 
64
                        -1);
 
65
                str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN);
 
66
                g_free(str_url);
 
67
        }
 
68
        gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_NONE);
 
69
        return TRUE;
 
70
}
 
71
 
 
72
/* catch double-click on tree view */
 
73
static gint double_click_on_tree_view(GtkTreeView *tree_view, GtkTreePath *tree_path)
 
74
{
 
75
        GtkTreeModel    *tree_model;
 
76
        GtkTreeIter     iter;
 
77
        gchar           *str_url;
 
78
 
 
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,
 
82
                        COLUMN_INT, &f_index,
 
83
                        COLUMN_STRING_URL, &str_url,
 
84
                        -1);
 
85
                str_n_cpy(url, (const char *)str_url, FILE_NAME_MAXLEN);
 
86
                g_free(str_url);
 
87
        }
 
88
        gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
 
89
        return TRUE;
 
90
}
 
91
 
 
92
/* clear the list before filling it */
 
93
static void fill_list_store_from_flnode(GtkListStore *list_store)
 
94
{
 
95
        FList           *flist2;
 
96
        GtkTreeIter     iter;
 
97
        int             i = 0;
 
98
 
 
99
        gtk_list_store_clear(list_store);
 
100
        if (IS_FLIST(flist))
 
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,
 
104
                                COLUMN_INT, i,
 
105
                                COLUMN_STRING_TITLE, flist2->title,
 
106
                                COLUMN_STRING_URL, flist2->url,
 
107
                                -1);
 
108
                        i++;
 
109
                }
 
110
}
 
111
 
 
112
/* actually ***selected feed*** picker */
 
113
void quick_feed_picker(int up_or_down)
 
114
{
 
115
        GtkTreeView             *tree_view;
 
116
        GtkListStore            *list_store;
 
117
        GtkCellRenderer         *renderer1, *renderer2;
 
118
        GtkTreeViewColumn       *column1, *column2;
 
119
        GtkTreeSelection        *selection;
 
120
        gint                    response;
 
121
 
 
122
        up_or_down = up_or_down;        /* unused so far */
 
123
 
 
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,
 
127
                        NULL);
 
128
 
 
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);
 
133
 
 
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);
 
138
 
 
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);
 
143
        } else {
 
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);
 
148
                return;
 
149
        }
 
150
 
 
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));
 
161
 
 
162
        selection = gtk_tree_view_get_selection(tree_view);
 
163
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
 
164
 
 
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);
 
170
 
 
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;
 
181
                        }
 
182
                        break;
 
183
                }
 
184
        }
 
185
        gtk_widget_destroy(dialog);
 
186
}
 
187
#endif