Line data Source code
1 : /* File: gui_sketch_card.inl; Copyright and License: see below */
2 :
3 : #include "u8/u8_log.h"
4 : #include "u8/u8_trace.h"
5 : #include "u8/u8_f64.h"
6 : #include <assert.h>
7 :
8 0 : static inline void gui_sketch_card_load_data( gui_sketch_card_t *this_,
9 : data_id_t diagram_id,
10 : data_database_reader_t *db_reader )
11 : {
12 : /* load data to be drawn */
13 : const u8_error_t d_err
14 0 : = data_visible_set_load( &((*this_).painter_input_data), data_id_get_row_id( &diagram_id ), db_reader );
15 0 : if ( d_err != U8_ERROR_NONE )
16 : {
17 0 : U8_TRACE_INFO( "gui_sketch_card_load_data called on invalid database." );
18 : }
19 : const u8_error_t p_err
20 0 : = data_profile_part_load( &((*this_).profile), &((*this_).painter_input_data), db_reader );
21 0 : if ( p_err != U8_ERROR_NONE )
22 : {
23 0 : U8_TRACE_INFO( "data_profile_part_load() returned error." );
24 : }
25 0 : }
26 :
27 : static inline void gui_sketch_card_invalidate_data( gui_sketch_card_t *this_ )
28 : {
29 : data_visible_set_invalidate( &((*this_).painter_input_data) );
30 : data_profile_part_reinit( &((*this_).profile) );
31 :
32 : }
33 :
34 0 : static inline bool gui_sketch_card_is_valid( const gui_sketch_card_t *this_ )
35 : {
36 0 : return data_visible_set_is_valid( &((*this_).painter_input_data) );
37 : }
38 :
39 0 : static inline shape_int_rectangle_t gui_sketch_card_get_bounds( const gui_sketch_card_t *this_ )
40 : {
41 0 : return (*this_).bounds;
42 : }
43 :
44 0 : static inline void gui_sketch_card_set_bounds( gui_sketch_card_t *this_, shape_int_rectangle_t bounds )
45 : {
46 0 : (*this_).bounds = bounds;
47 0 : }
48 :
49 0 : static inline bool gui_sketch_card_is_visible( const gui_sketch_card_t *this_ )
50 : {
51 0 : return (*this_).visible;
52 : }
53 :
54 0 : static inline void gui_sketch_card_set_visible( gui_sketch_card_t *this_, bool visible )
55 : {
56 0 : (*this_).visible = visible;
57 0 : }
58 :
59 0 : static inline const data_diagram_t * gui_sketch_card_get_diagram_const ( const gui_sketch_card_t *this_ )
60 : {
61 0 : return data_visible_set_get_diagram_const( &((*this_).painter_input_data) );
62 : }
63 :
64 0 : static inline data_diagram_t * gui_sketch_card_get_diagram_ptr ( gui_sketch_card_t *this_ )
65 : {
66 0 : return data_visible_set_get_diagram_ptr( &((*this_).painter_input_data) );
67 : }
68 :
69 0 : static inline data_id_t gui_sketch_card_get_diagram_id ( const gui_sketch_card_t *this_ )
70 : {
71 0 : const data_diagram_t *const diag = gui_sketch_card_get_diagram_const( this_ );
72 0 : return (diag==NULL) ? DATA_ID_VOID : data_diagram_get_data_id(diag);
73 : }
74 :
75 0 : static inline layout_order_t gui_sketch_card_get_order_at_pos( const gui_sketch_card_t *this_,
76 : data_id_t obj_id,
77 : int32_t x,
78 : int32_t y )
79 : {
80 : layout_order_t result;
81 : pencil_error_t pen_err;
82 :
83 0 : const double snap_to_grid = gui_sketch_style_get_snap_to_grid( &((*this_).sketch_style) );
84 0 : pen_err = pencil_diagram_maker_get_order_at_pos ( &((*this_).painter),
85 : obj_id,
86 : (double) x,
87 : (double) y,
88 : snap_to_grid,
89 : &result
90 : );
91 :
92 0 : switch ( pen_err )
93 : {
94 0 : case PENCIL_ERROR_NONE:
95 : {
96 : /* success */
97 : }
98 0 : break;
99 0 : case PENCIL_ERROR_OUT_OF_BOUNDS:
100 : {
101 0 : U8_TRACE_INFO( "PENCIL_ERROR_OUT_OF_BOUNDS in gui_sketch_card_get_order_at_pos" );
102 : }
103 0 : break;
104 0 : case PENCIL_ERROR_UNKNOWN_OBJECT:
105 : {
106 0 : U8_LOG_ANOMALY( "PENCIL_ERROR_UNKNOWN_OBJECT in gui_sketch_card_get_order_at_pos" );
107 : }
108 0 : break;
109 : }
110 :
111 0 : return result;
112 : }
113 :
114 0 : static inline int32_t gui_sketch_card_get_feature_order_at_pos ( const gui_sketch_card_t *this_,
115 : const data_feature_t *feature_ptr,
116 : int32_t x,
117 : int32_t y )
118 : {
119 0 : assert ( NULL != feature_ptr );
120 :
121 : layout_order_t result;
122 : pencil_error_t pen_err;
123 :
124 0 : pen_err = pencil_diagram_maker_get_feature_order_at_pos ( &((*this_).painter),
125 : feature_ptr,
126 : (double) x,
127 : (double) y,
128 : &result
129 : );
130 :
131 0 : switch ( pen_err )
132 : {
133 0 : case PENCIL_ERROR_NONE:
134 : {
135 : /* success */
136 : }
137 0 : break;
138 0 : case PENCIL_ERROR_OUT_OF_BOUNDS:
139 : {
140 0 : U8_TRACE_INFO( "PENCIL_ERROR_OUT_OF_BOUNDS in gui_sketch_card_get_feature_order_at_pos" );
141 : }
142 0 : break;
143 0 : case PENCIL_ERROR_UNKNOWN_OBJECT:
144 : {
145 0 : U8_LOG_ANOMALY( "PENCIL_ERROR_UNKNOWN_OBJECT in gui_sketch_card_get_feature_order_at_pos" );
146 : }
147 0 : break;
148 : }
149 :
150 0 : return layout_order_get_first( &result );
151 : }
152 :
153 0 : static inline const geometry_grid_t *gui_sketch_card_get_grid_const ( const gui_sketch_card_t *this_ )
154 : {
155 0 : return pencil_diagram_maker_get_grid_const( &((*this_).painter) );
156 : }
157 :
158 0 : static inline bool gui_sketch_card_needs_layout( const gui_sketch_card_t *this_ )
159 : {
160 0 : return (*this_).dirty_elements_layout;
161 : }
162 :
163 0 : static inline void gui_sketch_card_layout_elements( gui_sketch_card_t *this_, cairo_t *cr )
164 : {
165 0 : pencil_diagram_maker_layout_elements ( &((*this_).painter), NULL, cr );
166 0 : (*this_).dirty_elements_layout = false;
167 0 : }
168 :
169 0 : static inline void gui_sketch_card_do_layout( gui_sketch_card_t *this_, cairo_t *cr )
170 : {
171 0 : if ( gui_sketch_card_is_valid( this_ ) )
172 : {
173 : /* layout loaded classifiers */
174 0 : const int32_t left = shape_int_rectangle_get_left( &((*this_).bounds) );
175 0 : const int32_t top = shape_int_rectangle_get_top( &((*this_).bounds) );
176 0 : const uint32_t width = shape_int_rectangle_get_width( &((*this_).bounds) );
177 0 : const uint32_t height = shape_int_rectangle_get_height( &((*this_).bounds) );
178 :
179 : geometry_rectangle_t destination;
180 0 : geometry_rectangle_init( &destination, left, top, width, height );
181 :
182 0 : pencil_diagram_maker_define_grid ( &((*this_).painter), destination, cr );
183 0 : pencil_diagram_maker_layout_elements ( &((*this_).painter), NULL, cr );
184 0 : (*this_).dirty_elements_layout = false;
185 :
186 0 : geometry_rectangle_destroy( &destination );
187 : }
188 : else
189 : {
190 0 : U8_TRACE_INFO( "gui_sketch_card_do_layout called on invalid card." );
191 : }
192 0 : }
193 :
194 0 : static inline const layout_visible_set_t * gui_sketch_card_get_visible_set( const gui_sketch_card_t *this_ )
195 : {
196 0 : return pencil_diagram_maker_get_layout_data_const( &((*this_).painter) );
197 : }
198 :
199 0 : static inline int32_t gui_sketch_card_get_highest_rel_list_order( const gui_sketch_card_t *this_ )
200 : {
201 0 : int32_t result = 0;
202 :
203 0 : if ( data_visible_set_is_valid( &((*this_).painter_input_data) ) )
204 : {
205 0 : for ( uint32_t rs_idx = 0; rs_idx < data_visible_set_get_relationship_count( &((*this_).painter_input_data) ); rs_idx ++ )
206 : {
207 : const data_relationship_t *relation;
208 0 : relation = data_visible_set_get_relationship_const ( &((*this_).painter_input_data), rs_idx );
209 0 : if ( data_relationship_get_list_order( relation ) > result )
210 : {
211 0 : result = data_relationship_get_list_order( relation );
212 : }
213 : }
214 : }
215 :
216 0 : return result;
217 : }
218 :
219 0 : static inline int32_t gui_sketch_card_get_highest_feat_list_order( const gui_sketch_card_t *this_, data_id_t classifier_id )
220 : {
221 0 : int32_t result = 0;
222 :
223 0 : if ( data_visible_set_is_valid( &((*this_).painter_input_data) ) )
224 : {
225 0 : for ( uint32_t f_idx = 0; f_idx < data_visible_set_get_feature_count( &((*this_).painter_input_data) ); f_idx ++ )
226 : {
227 : const data_feature_t *const feat
228 0 : = data_visible_set_get_feature_const ( &((*this_).painter_input_data), f_idx );
229 0 : assert( feat != NULL );
230 0 : const data_feature_type_t f_type = data_feature_get_main_type( feat );
231 0 : if (( f_type == DATA_FEATURE_TYPE_PROPERTY )||( f_type == DATA_FEATURE_TYPE_OPERATION ))
232 : {
233 0 : if ( data_feature_get_classifier_row_id( feat ) == data_id_get_row_id( &classifier_id ) )
234 : {
235 0 : if ( data_feature_get_list_order( feat ) > result )
236 : {
237 0 : result = data_feature_get_list_order( feat );
238 : }
239 : }
240 : }
241 : }
242 : }
243 :
244 0 : return result;
245 : }
246 :
247 :
248 : /*
249 : Copyright 2016-2025 Andreas Warnke
250 :
251 : Licensed under the Apache License, Version 2.0 (the "License");
252 : you may not use this file except in compliance with the License.
253 : You may obtain a copy of the License at
254 :
255 : http://www.apache.org/licenses/LICENSE-2.0
256 :
257 : Unless required by applicable law or agreed to in writing, software
258 : distributed under the License is distributed on an "AS IS" BASIS,
259 : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
260 : See the License for the specific language governing permissions and
261 : limitations under the License.
262 : */
|