1 /*
2 
3 This file is from Nitrogen, an X11 background setter.
4 Copyright (C) 2009  Dave Foster & Javeed Shaikh
5 
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 
20 */
21 
22 #include "NPrefsWindow.h"
23 #include "Config.h"
24 #include "Util.h"
25 #include "gcs-i18n.h"
26 
NPrefsWindow(Gtk::Window & parent,Config * cfg)27 NPrefsWindow::NPrefsWindow(Gtk::Window& parent, Config *cfg) : Gtk::Dialog(_("Preferences"), parent, true, false),
28                                 m_frame_view(_("View Options")),
29                                 m_frame_dirs(_("Directories")),
30                                 m_frame_sort(_("Sort by")),
31                                 m_rb_view_icon(_("_Icon"), true),
32                                 m_rb_view_icon_caps(_("_Icon with captions"), true),
33                                 m_rb_view_list(_("_List"), true),
34                                 m_rb_sort_rtime(_("_Time (descending)"), true),
35                                 m_rb_sort_time(_("_Time (ascending)"), true),
36                                 m_rb_sort_alpha(_("_Name (ascending)"), true),
37                                 m_rb_sort_ralpha(_("_Name (descending)"), true),
38                                 m_cb_recurse(_("Recurse"), true),
39                                 m_btn_adddir(Gtk::Stock::ADD),
40                                 m_btn_deldir(Gtk::Stock::DELETE)
41 {
42     // radio button grouping
43     Gtk::RadioButton::Group group = m_rb_view_icon.get_group();
44     m_rb_view_icon_caps.set_group(group);
45     m_rb_view_list.set_group(group);
46 
47     Gtk::RadioButton::Group sort_group = m_rb_sort_alpha.get_group();
48     m_rb_sort_rtime.set_group(sort_group);
49     m_rb_sort_time.set_group(sort_group);
50     m_rb_sort_ralpha.set_group(sort_group);
51 
52     m_cfg = cfg;
53     DisplayMode mode = m_cfg->get_display_mode();
54 
55     if (mode == ICON) {
56         if (m_cfg->get_icon_captions())
57             m_rb_view_icon_caps.set_active(true);
58         else
59             m_rb_view_icon.set_active(true);
60     }
61     else
62         m_rb_view_list.set_active(true);
63 
64     bool recurse = m_cfg->get_recurse();
65     m_cb_recurse.set_active(recurse);
66 
67     Thumbview::SortMode sort_mode = m_cfg->get_sort_mode();
68     if (sort_mode == Thumbview::SORT_ALPHA)
69         m_rb_sort_alpha.set_active(true);
70     else if (sort_mode == Thumbview::SORT_RALPHA)
71         m_rb_sort_ralpha.set_active(true);
72     else if (sort_mode == Thumbview::SORT_TIME)
73         m_rb_sort_time.set_active(true);
74     else
75         m_rb_sort_rtime.set_active(true);
76 
77     // signal handlers for directory buttons
78     m_btn_adddir.signal_clicked().connect(sigc::mem_fun(this, &NPrefsWindow::sighandle_click_adddir));
79     m_btn_deldir.signal_clicked().connect(sigc::mem_fun(this, &NPrefsWindow::sighandle_click_deldir));
80 
81     // fill dir list from config
82     Gtk::TreeModelColumnRecord tmcr;
83     tmcr.add(m_tmc_dir);
84 
85     m_store_dirs = Gtk::ListStore::create(tmcr);
86     m_list_dirs.set_model(m_store_dirs);
87     m_list_dirs.append_column("Directory", m_tmc_dir);
88     m_list_dirs.set_headers_visible(false);
89 
90     VecStrs vecdirs = m_cfg->get_dirs();
91     for (VecStrs::iterator i = vecdirs.begin(); i != vecdirs.end(); i++)
92     {
93         Gtk::TreeModel::iterator iter = m_store_dirs->append();
94         (*iter)[m_tmc_dir] = *i;
95     }
96 
97     // layout stuff
98     m_align_view.set_padding(0, 0, 12, 0);
99     m_align_view.add(m_vbox_view);
100 
101     m_frame_view.add(m_align_view);
102     m_frame_view.set_shadow_type(Gtk::SHADOW_NONE);
103     m_vbox_view.pack_start(m_rb_view_icon, false, true);
104     m_vbox_view.pack_start(m_rb_view_icon_caps, false, true);
105     m_vbox_view.pack_start(m_rb_view_list, false, true);
106 
107     m_align_sort.set_padding(0, 0, 12, 0);
108     m_align_sort.add(m_vbox_sort);
109     m_frame_sort.add(m_align_sort);
110     m_frame_sort.set_shadow_type(Gtk::SHADOW_NONE);
111     m_vbox_sort.pack_start(m_rb_sort_alpha, false, true);
112     m_vbox_sort.pack_start(m_rb_sort_ralpha, false, true);
113     m_vbox_sort.pack_start(m_rb_sort_time, false, true);
114     m_vbox_sort.pack_start(m_rb_sort_rtime, false, true);
115 
116     m_align_dirs.set_padding(0, 0, 12, 0);
117     m_align_dirs.add(m_vbox_dirs);
118 
119     m_frame_dirs.add(m_align_dirs);
120     m_frame_dirs.set_shadow_type(Gtk::SHADOW_NONE);
121     m_vbox_dirs.pack_start(m_scrolledwin, true, true);
122     m_vbox_dirs.pack_start(m_hbox_dirbtns, false, true);
123 
124     m_scrolledwin.add(m_list_dirs);
125     m_scrolledwin.set_shadow_type(Gtk::SHADOW_IN);
126     m_scrolledwin.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
127 
128     m_hbox_dirbtns.pack_start(m_btn_adddir, false, true);
129     m_hbox_dirbtns.pack_start(m_btn_deldir, false, true);
130     m_hbox_dirbtns.pack_end(m_cb_recurse, false, true);
131 
132     get_vbox()->pack_start(m_frame_view, false, true);
133     get_vbox()->pack_start(m_frame_sort, false, true);
134     get_vbox()->pack_start(m_frame_dirs, true, true);
135 
136     add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
137     add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
138     set_response_sensitive(Gtk::RESPONSE_CANCEL);
139 
140     set_default_size(350, 350);
141 
142     show_all();
143 }
144 
145 /////////////////////////////////////////////////////////////////////////////
146 
on_response(int response_id)147 void NPrefsWindow::on_response(int response_id)
148 {
149     if (response_id == Gtk::RESPONSE_OK)
150     {
151         DisplayMode mode = (m_rb_view_icon.get_active() || m_rb_view_icon_caps.get_active()) ? ICON : LIST;
152         m_cfg->set_display_mode(mode);
153         m_cfg->set_icon_captions(m_rb_view_icon_caps.get_active());
154         m_cfg->set_recurse((m_cb_recurse.get_active()) ? true : false);
155         if (m_rb_sort_alpha.get_active())
156             m_cfg->set_sort_mode(Thumbview::SORT_ALPHA);
157         else if (m_rb_sort_ralpha.get_active())
158             m_cfg->set_sort_mode(Thumbview::SORT_RALPHA);
159         else if (m_rb_sort_time.get_active())
160             m_cfg->set_sort_mode(Thumbview::SORT_TIME);
161         else
162             m_cfg->set_sort_mode(Thumbview::SORT_RTIME);
163 
164         m_cfg->save_cfg();
165     }
166 
167     hide();
168 }
169 
170 /////////////////////////////////////////////////////////////////////////////
171 
sighandle_click_adddir()172 void NPrefsWindow::sighandle_click_adddir()
173 {
174     Gtk::FileChooserDialog dialog("Folder", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
175     dialog.set_transient_for(*this);
176 
177     dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
178     dialog.add_button("Select", Gtk::RESPONSE_OK);
179 
180     int result = dialog.run();
181     if (result == Gtk::RESPONSE_OK)
182     {
183         std::string newdir = dialog.get_filename();
184         if (m_cfg->add_dir(newdir))
185         {
186             Gtk::TreeModel::iterator iter = m_store_dirs->append();
187             (*iter)[m_tmc_dir] = newdir;
188         }
189     }
190 }
191 
192 /////////////////////////////////////////////////////////////////////////////
193 
sighandle_click_deldir()194 void NPrefsWindow::sighandle_click_deldir()
195 {
196     Gtk::TreeIter iter = m_list_dirs.get_selection()->get_selected();
197     if (!iter)
198         return;
199 
200     std::string dir = (*iter)[m_tmc_dir];
201 
202     Glib::ustring msg = Glib::ustring::compose(_("Are you sure you want to delete <b>%1</b>?"), dir);
203 
204     Gtk::MessageDialog dialog(*this, msg, true, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
205 
206     int result = dialog.run();
207     if (result == Gtk::RESPONSE_YES)
208     {
209         if (m_cfg->rm_dir(dir))
210         {
211             m_store_dirs->erase(iter);
212         }
213     }
214 }
215 
216