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