Line data Source code
1 : /* File: gui_sketch_result_list.inl; Copyright and License: see below */
2 :
3 : #include "u8/u8_log.h"
4 :
5 0 : static inline void gui_sketch_result_list_load_data( gui_sketch_result_list_t *this_,
6 : const pos_scroll_page_t *requested_page,
7 : uint32_t result_buffer_start,
8 : const data_search_result_list_t *result_list,
9 : bool result_buffer_more_after,
10 : data_database_reader_t *db_reader )
11 : {
12 0 : assert( requested_page != NULL );
13 0 : assert( result_list != NULL );
14 0 : assert( db_reader != NULL );
15 :
16 : /* reset page */
17 0 : pos_search_result_page_reinit( &((*this_).page), result_buffer_start );
18 0 : (*this_).requested_page = *requested_page;
19 :
20 : /* fill page */
21 0 : u8_error_t err = U8_ERROR_NONE;
22 0 : const uint_fast32_t length = data_search_result_list_get_length( result_list );
23 0 : for ( uint_fast32_t index = 0; index < length; index ++ )
24 : {
25 0 : data_search_result_t const *const src_res = data_search_result_list_get_const( result_list, index );
26 0 : err |= pos_search_result_page_add_search_result( &((*this_).page), src_res );
27 : }
28 0 : if ( err != U8_ERROR_NONE )
29 : {
30 0 : U8_LOG_ERROR( "Not all search results taken over by gui_sketch_result_list_t widget." );
31 : }
32 :
33 : /* store if there is more list-entries after this page */
34 0 : pos_search_result_page_set_buffer_more_after( &((*this_).page), result_buffer_more_after );
35 0 : }
36 :
37 0 : static inline void gui_sketch_result_list_invalidate_data( gui_sketch_result_list_t *this_ )
38 : {
39 : /* reset page */
40 0 : pos_search_result_page_reinit( &((*this_).page), 0 /* buffer_start */ );
41 0 : }
42 :
43 0 : static inline pos_scroll_page_t gui_sketch_result_list_get_prev_page( gui_sketch_result_list_t *this_ )
44 : {
45 0 : const int_fast32_t start = pos_search_result_page_get_page_start( &((*this_).page) );
46 0 : return pos_scroll_page_new( u8_i32_max2( 0, start - 1 ), true /*backwards*/ );
47 : }
48 :
49 0 : static inline pos_scroll_page_t gui_sketch_result_list_get_next_page( gui_sketch_result_list_t *this_ )
50 : {
51 0 : const int_fast32_t start = pos_search_result_page_get_page_start( &((*this_).page) );
52 0 : const uint_fast32_t length = pos_search_result_page_get_page_length( &((*this_).page) );
53 0 : return pos_scroll_page_new( start + length, false /*backwards*/ );
54 : }
55 :
56 : static inline shape_int_rectangle_t gui_sketch_result_list_get_bounds( gui_sketch_result_list_t *this_ )
57 : {
58 : return (*this_).bounds;
59 : }
60 :
61 0 : static inline void gui_sketch_result_list_set_bounds( gui_sketch_result_list_t *this_, shape_int_rectangle_t bounds )
62 : {
63 0 : (*this_).bounds = bounds;
64 0 : }
65 :
66 0 : static inline bool gui_sketch_result_list_is_visible( gui_sketch_result_list_t *this_ )
67 : {
68 0 : return (*this_).visible;
69 : }
70 :
71 0 : static inline void gui_sketch_result_list_set_visible( gui_sketch_result_list_t *this_, bool visible )
72 : {
73 0 : (*this_).visible = visible;
74 0 : }
75 :
76 0 : static inline void gui_sketch_result_list_get_visible_diagrams( const gui_sketch_result_list_t *this_,
77 : data_small_set_t *out_diagram_id_list )
78 : {
79 0 : data_small_set_reinit( out_diagram_id_list );
80 0 : const uint_fast32_t page_start = pos_search_result_page_get_page_start( &((*this_).page) );
81 0 : const uint_fast32_t page_length = pos_search_result_page_get_page_length( &((*this_).page) );
82 0 : assert( page_length <= POS_SEARCH_RESULT_PAGE_MAX_PAGE_SIZE );
83 0 : for ( uint_fast32_t idx = 0; idx < page_length; idx ++ )
84 : {
85 0 : const pos_search_result_t *const pos_element = pos_search_result_page_get_search_result_layout_const( &((*this_).page), page_start + idx );
86 0 : const data_search_result_t *const data_element = pos_search_result_get_data_const( pos_element );
87 0 : const data_id_t element_diag_id = data_search_result_get_diagram_id( data_element );
88 0 : const u8_error_t set_full = data_small_set_add_obj( out_diagram_id_list, element_diag_id );
89 0 : if ( U8_ERROR_NONE != set_full )
90 : {
91 0 : U8_LOG_ANOMALY("A search result contains more elements than data_small_set_t can contain.");
92 : }
93 : }
94 0 : }
95 :
96 0 : static inline void gui_sketch_result_list_get_button_at_pos( const gui_sketch_result_list_t *this_,
97 : int32_t x,
98 : int32_t y,
99 : gui_sketch_action_t *out_action_id )
100 : {
101 0 : assert ( NULL != out_action_id );
102 :
103 : const shape_int_rectangle_t *const prev_box
104 0 : = pos_search_result_page_get_button_prev_box_const( &((*this_).page) );
105 : const shape_int_rectangle_t *const next_box
106 0 : = pos_search_result_page_get_button_next_box_const( &((*this_).page) );
107 :
108 0 : if ( shape_int_rectangle_contains( prev_box, x, y ) && pos_search_result_page_has_prev_page( &((*this_).page) ) )
109 : {
110 0 : *out_action_id = GUI_SKETCH_ACTION_PREVIOUS_PAGE;
111 : }
112 0 : else if ( shape_int_rectangle_contains( next_box, x, y ) && pos_search_result_page_has_next_page( &((*this_).page) ) )
113 : {
114 0 : *out_action_id = GUI_SKETCH_ACTION_NEXT_PAGE;
115 : }
116 : else
117 : {
118 0 : *out_action_id = GUI_SKETCH_ACTION_NONE;
119 : }
120 0 : }
121 :
122 0 : static inline void gui_sketch_result_list_get_object_id_at_pos( const gui_sketch_result_list_t *this_,
123 : int32_t x,
124 : int32_t y,
125 : data_id_t* out_selected_id,
126 : data_id_t* out_diagram_id )
127 : {
128 0 : assert( out_selected_id != NULL );
129 0 : assert( out_diagram_id != NULL );
130 :
131 : /* default in case no object found */
132 0 : data_id_init_void( out_selected_id );
133 0 : data_id_init_void( out_diagram_id );
134 :
135 : /* search object */
136 0 : if ( shape_int_rectangle_contains( &((*this_).bounds), x, y ) )
137 : {
138 0 : const uint_fast32_t page_start = pos_search_result_page_get_page_start( &((*this_).page) );
139 0 : const uint_fast32_t page_length = pos_search_result_page_get_page_length( &((*this_).page) );
140 0 : assert( page_length <= POS_SEARCH_RESULT_PAGE_MAX_PAGE_SIZE );
141 0 : for ( uint_fast32_t idx = 0; idx < page_length; idx ++ )
142 : {
143 0 : const pos_search_result_t *const element = pos_search_result_page_get_search_result_layout_const( &((*this_).page), page_start + idx );
144 0 : const shape_int_rectangle_t *icon_box = pos_search_result_get_icon_box_const( element );
145 0 : const shape_int_rectangle_t *label_box = pos_search_result_get_label_box_const( element );
146 :
147 0 : if ( shape_int_rectangle_contains( icon_box, x, y ) || shape_int_rectangle_contains( label_box, x, y ) )
148 : {
149 0 : const data_search_result_t *const at_pos = pos_search_result_get_data_const( element );
150 0 : data_id_copy( out_selected_id, data_search_result_get_match_id_const( at_pos ) );
151 0 : data_id_copy( out_diagram_id, data_search_result_get_diagram_id_const( at_pos ) );
152 0 : break;
153 : }
154 : }
155 : }
156 0 : }
157 :
158 0 : static inline u8_error_t gui_sketch_result_list_get_result_envelope( gui_sketch_result_list_t *this_,
159 : const data_id_t* search_obj_id,
160 : const data_id_t* search_diag_id,
161 : shape_int_rectangle_t* out_result_envelope_box )
162 : {
163 0 : assert( search_obj_id != NULL );
164 0 : assert( search_diag_id != NULL );
165 0 : assert( out_result_envelope_box != NULL );
166 0 : u8_error_t err = U8_ERROR_NOT_FOUND;
167 :
168 : /* search object */
169 0 : const uint_fast32_t page_start = pos_search_result_page_get_page_start( &((*this_).page) );
170 0 : const uint_fast32_t page_length = pos_search_result_page_get_page_length( &((*this_).page) );
171 0 : assert( page_length <= POS_SEARCH_RESULT_PAGE_MAX_PAGE_SIZE );
172 0 : for ( uint_fast32_t idx = 0; ( idx < page_length )&&( err != U8_ERROR_NONE ); idx ++ )
173 : {
174 0 : const pos_search_result_t *const element = pos_search_result_page_get_search_result_layout_const( &((*this_).page), page_start + idx );
175 0 : const data_id_t element_id = pos_search_result_get_data_id( element );
176 0 : const data_id_t diagram_id = pos_search_result_get_diagram_id( element );
177 :
178 0 : if ( data_id_equals( &element_id, search_obj_id ) && data_id_equals( &diagram_id, search_diag_id ) )
179 : {
180 0 : const shape_int_rectangle_t *icon_box = pos_search_result_get_icon_box_const( element );
181 0 : const shape_int_rectangle_t *label_box = pos_search_result_get_label_box_const( element );
182 0 : shape_int_rectangle_init_by_bounds( out_result_envelope_box, icon_box, label_box );
183 0 : err = U8_ERROR_NONE;
184 : }
185 : }
186 :
187 0 : return err;
188 : }
189 :
190 :
191 : /*
192 : Copyright 2018-2025 Andreas Warnke
193 :
194 : Licensed under the Apache License, Version 2.0 (the "License");
195 : you may not use this file except in compliance with the License.
196 : You may obtain a copy of the License at
197 :
198 : http://www.apache.org/licenses/LICENSE-2.0
199 :
200 : Unless required by applicable law or agreed to in writing, software
201 : distributed under the License is distributed on an "AS IS" BASIS,
202 : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
203 : See the License for the specific language governing permissions and
204 : limitations under the License.
205 : */
|