2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "lib/config.h"
23 #include "lib/screen.h"
24 #include "lib/format.h"
25 #include "gtk/gtk_util.h"
26 #include "gtk/alignment.h"
29 using namespace boost;
31 static Alignment* alignment = 0;
32 static Gtk::ComboBoxText* format_combo = 0;
33 static Format const * format = 0;
34 static Gtk::ComboBoxText* screen_combo = 0;
35 static shared_ptr<Screen> screen;
36 static Gtk::Button* add_screen = 0;
37 static Gtk::Entry* screen_name = 0;
38 static Gtk::SpinButton* x_position = 0;
39 static Gtk::SpinButton* y_position = 0;
40 static Gtk::SpinButton* width = 0;
41 static Gtk::Button* calculate_width = 0;
42 static Gtk::SpinButton* height = 0;
43 static Gtk::Button* calculate_height = 0;
44 static Gtk::Button* save = 0;
45 static bool screen_dirty = false;
57 bool const dims = format && screen;
59 x_position->set_sensitive (dims);
60 y_position->set_sensitive (dims);
61 width->set_sensitive (dims);
62 calculate_width->set_sensitive (dims);
63 height->set_sensitive (dims);
64 calculate_height->set_sensitive (dims);
66 screen_name->set_sensitive (screen);
67 save->set_sensitive (screen_dirty);
73 if (!screen || !format) {
78 alignment = new Alignment (screen->position (format), screen->size (format));
79 alignment->set_text_line (0, screen->name ());
80 alignment->set_text_line (1, format->name ());
86 if (!screen || !format) {
90 Position p = screen->position (format);
91 x_position->set_value (p.x);
92 y_position->set_value (p.y);
93 Size s = screen->size (format);
94 width->set_value (s.width);
95 height->set_value (s.height);
97 update_sensitivity ();
103 if (screen_combo->get_active_row_number() < 0) {
107 vector<shared_ptr<Screen> > screens = Config::instance()->screens ();
109 if (screens[screen_combo->get_active_row_number()] == screen) {
113 screen = screens[screen_combo->get_active_row_number()];
118 screen_name->set_text (screen->name ());
120 screen_dirty = false;
121 update_sensitivity ();
127 vector<Format const *> formats = Format::all ();
129 if (formats[format_combo->get_active_row_number()] == format) {
133 format = formats[format_combo->get_active_row_number()];
137 update_sensitivity ();
141 geometry_changed (GeometryPart p)
143 if (p == GEOMETRY_PART_X && screen->position(format).x == x_position->get_value_as_int()) {
147 if (p == GEOMETRY_PART_Y && screen->position(format).y == y_position->get_value_as_int()) {
151 if (p == GEOMETRY_PART_WIDTH && screen->size(format).width == width->get_value_as_int()) {
155 if (p == GEOMETRY_PART_HEIGHT && screen->size(format).height == height->get_value_as_int()) {
159 screen->set_geometry (
161 Position (x_position->get_value_as_int(), y_position->get_value_as_int()),
162 Size (width->get_value_as_int(), height->get_value_as_int())
168 update_sensitivity ();
174 Config::instance()->write ();
175 screen_dirty = false;
176 update_sensitivity ();
180 calculate_width_clicked ()
182 width->set_value (height->get_value_as_int() * format->ratio_as_float ());
186 calculate_height_clicked ()
188 height->set_value (width->get_value_as_int() / format->ratio_as_float ());
192 update_screen_combo ()
194 screen_combo->clear ();
196 vector<shared_ptr<Screen> > screens = Config::instance()->screens ();
197 for (vector<shared_ptr<Screen> >::iterator i = screens.begin(); i != screens.end(); ++i) {
198 screen_combo->append_text ((*i)->name ());
203 screen_name_changed ()
205 screen->set_name (screen_name->get_text ());
207 int const r = screen_combo->get_active_row_number ();
208 update_screen_combo ();
209 screen_combo->set_active (r);
212 update_sensitivity ();
216 add_screen_clicked ()
218 shared_ptr<Screen> s (new Screen ("New Screen"));
219 vector<shared_ptr<Screen> > screens = Config::instance()->screens ();
220 screens.push_back (s);
221 Config::instance()->set_screens (screens);
222 update_screen_combo ();
223 screen_combo->set_active (screens.size() - 1);
227 main (int argc, char* argv[])
231 Gtk::Main kit (argc, argv);
233 Gtk::Dialog dialog ("Align-o-matic");
235 screen_combo = Gtk::manage (new Gtk::ComboBoxText);
236 update_screen_combo ();
237 screen_combo->signal_changed().connect (sigc::ptr_fun (&screen_changed));
239 add_screen = Gtk::manage (new Gtk::Button ("Add"));
240 add_screen->signal_clicked().connect (sigc::ptr_fun (&add_screen_clicked));
242 screen_name = Gtk::manage (new Gtk::Entry ());
243 screen_name->signal_changed().connect (sigc::ptr_fun (&screen_name_changed));
245 format_combo = Gtk::manage (new Gtk::ComboBoxText);
246 vector<Format const *> formats = Format::all ();
247 for (vector<Format const *>::iterator i = formats.begin(); i != formats.end(); ++i) {
248 format_combo->append_text ((*i)->name ());
251 format_combo->signal_changed().connect (sigc::ptr_fun (&format_changed));
253 save = Gtk::manage (new Gtk::Button ("Save"));
254 save->signal_clicked().connect (sigc::ptr_fun (&save_clicked));
256 x_position = Gtk::manage (new Gtk::SpinButton ());
257 x_position->signal_value_changed().connect (sigc::bind (ptr_fun (&geometry_changed), GEOMETRY_PART_X));
258 x_position->set_range (0, 2048);
259 x_position->set_increments (1, 16);
260 y_position = Gtk::manage (new Gtk::SpinButton ());
261 y_position->signal_value_changed().connect (sigc::bind (sigc::ptr_fun (&geometry_changed), GEOMETRY_PART_Y));
262 y_position->set_range (0, 1080);
263 y_position->set_increments (1, 16);
264 width = Gtk::manage (new Gtk::SpinButton ());
265 width->signal_value_changed().connect (sigc::bind (sigc::ptr_fun (&geometry_changed), GEOMETRY_PART_WIDTH));
266 width->set_range (0, 2048);
267 width->set_increments (1, 16);
268 height = Gtk::manage (new Gtk::SpinButton ());
269 height->signal_value_changed().connect (sigc::bind (sigc::ptr_fun (&geometry_changed), GEOMETRY_PART_HEIGHT));
270 height->set_range (0, 1080);
271 height->set_increments (1, 16);
273 calculate_width = Gtk::manage (new Gtk::Button ("Calculate"));
274 calculate_width->signal_clicked().connect (sigc::ptr_fun (&calculate_width_clicked));
275 calculate_height = Gtk::manage (new Gtk::Button ("Calculate"));
276 calculate_height->signal_clicked().connect (sigc::ptr_fun (&calculate_height_clicked));
279 table.set_row_spacings (12);
280 table.set_col_spacings (12);
281 table.set_border_width (12);
284 table.attach (left_aligned_label ("Screen"), 0, 1, n, n + 1);
285 table.attach (*screen_combo, 1, 2, n, n + 1);
286 table.attach (*add_screen, 2, 3, n, n + 1);
288 table.attach (left_aligned_label ("Screen Name"), 0, 1, n, n + 1);
289 table.attach (*screen_name, 1, 2, n, n + 1);
291 table.attach (left_aligned_label ("Format"), 0, 1, n, n + 1);
292 table.attach (*format_combo, 1, 2, n, n + 1);
294 table.attach (left_aligned_label ("x"), 0, 1, n, n + 1);
295 table.attach (*x_position, 1, 2, n, n + 1);
297 table.attach (left_aligned_label ("y"), 0, 1, n, n + 1);
298 table.attach (*y_position, 1, 2, n, n + 1);
300 table.attach (left_aligned_label ("Width"), 0, 1, n, n + 1);
301 table.attach (*width, 1, 2, n, n + 1);
302 table.attach (*calculate_width, 2, 3, n, n + 1);
304 table.attach (left_aligned_label ("Height"), 0, 1, n, n + 1);
305 table.attach (*height, 1, 2, n, n + 1);
306 table.attach (*calculate_height, 2, 3, n, n + 1);
309 dialog.get_vbox()->pack_start (table, false, false);
310 dialog.add_action_widget (*save, 0);
311 update_sensitivity ();
314 Gtk::Main::run (dialog);