grab stable branch
[synfig.git] / synfig-studio / tags / stable / src / gtkmm / adjust_window.cpp
1 /* === S I N F G =========================================================== */
2 /*!     \file adjust_window.cpp
3 **      \brief Adjustment Window Implementation File
4 **
5 **      $Id: adjust_window.cpp,v 1.1.1.1 2005/01/07 03:34:35 darco Exp $
6 **
7 **      \legal
8 **      Copyright (c) 2004 Adrian Bentley
9 **
10 **      This software and associated documentation
11 **      are CONFIDENTIAL and PROPRIETARY property of
12 **      the above-mentioned copyright holder.
13 **
14 **      You may not copy, print, publish, or in any
15 **      other way distribute this software without
16 **      a prior written agreement with
17 **      the copyright holder.
18 **      \endlegal
19 */
20 /* ========================================================================= */
21
22 /* === H E A D E R S ======================================================= */
23
24 #ifdef USING_PCH
25 #       include "pch.h"
26 #else
27 #ifdef HAVE_CONFIG_H
28 #       include <config.h>
29 #endif
30
31 #include "adjust_window.h"
32 #include "app.h"
33
34 #endif
35
36 /* === U S I N G =========================================================== */
37
38 using namespace std;
39 //using namespace etl;
40 //using namespace sinfg;
41
42 using studio::Adjust_Window;
43
44 /* === M A C R O S ========================================================= */
45 const double EPSILON = 1.0e-6;
46
47 /* === G L O B A L S ======================================================= */
48
49 /* === P R O C E D U R E S ================================================= */
50
51 /* === M E T H O D S ======================================================= */
52
53 /* === E N T R Y P O I N T ================================================= */
54
55 Adjust_Window::Adjust_Window(double value, double lower, double upper,
56                                                         double stepinc, double pageinc, double pagesize,
57                                                         Gtk::Adjustment *adj)
58 : Adjustment(value,lower,upper,stepinc,pageinc,pagesize),
59         adj_child(0)
60 {
61         if(adj) set_child_adjustment(adj);
62 }
63
64 Adjust_Window::~Adjust_Window()
65 {
66         //connections should automatically be killed etc.
67 }
68
69 //child interface functions
70 Gtk::Adjustment *Adjust_Window::get_child_adjustment()
71 {
72         return adj_child;
73 }
74
75 const Gtk::Adjustment *Adjust_Window::get_child_adjustment() const
76 {
77         return adj_child;
78 }
79
80 void Adjust_Window::set_child_adjustment(Gtk::Adjustment *child)
81 {
82         childchanged.disconnect();
83         
84         adj_child = child;
85         
86         sinfg::info("Adjust: connecting to child signals");
87         if(child)
88         {
89                 childchanged = child->signal_changed().connect(sigc::mem_fun(*this,&Adjust_Window::update_fromchild));
90                 
91                 update_child();
92         }
93 }
94
95 void Adjust_Window::on_changed()
96 {
97         update_child();
98 }
99
100 void Adjust_Window::on_value_changed()
101 {
102         update_child();
103 }
104
105 //SUB TIME FUNCTIONS
106 double Adjust_Window::get_sub_lower() const
107 {
108         return get_value();
109 }
110
111 double Adjust_Window::get_sub_upper() const
112 {
113         return get_value() + get_page_size();
114 }
115
116 //---- REFRESH FUNCTIONS -----
117 void Adjust_Window::update_child()
118 {
119         if(adj_child)
120         {
121                 bool childchanged = false;
122                 
123                 double v = get_value();
124                 double ve = v + get_page_size();
125                 
126                 //reset child's values if they need to be...
127                 if(abs(v - adj_child->get_lower()) > EPSILON)
128                 {
129                         adj_child->set_lower(v);
130                         childchanged = true;
131                 }
132                 
133                 if(abs(ve - adj_child->get_upper()) > EPSILON)
134                 {
135                         adj_child->set_upper(ve);
136                         childchanged = true;                                                                    
137                 }
138                 
139                 if(childchanged)
140                 {
141                         adj_child->changed();
142                 }
143         }
144 }
145
146 void Adjust_Window::update_fromchild()
147 {
148         if(adj_child)
149         {               
150                 double b = adj_child->get_lower();
151                 double dist = adj_child->get_upper() - b;
152                 
153                 //reset our values if they need to be...
154                 if(abs(get_value() - b) > EPSILON)
155                 {
156                         set_value(b);
157                         value_changed();
158                 }
159                 
160                 if(abs(get_page_size() - dist) > EPSILON)
161                 {
162                         set_page_size(dist);
163                         changed();
164                 }
165         }
166 }