Place keys after symbols have been read, skipping blank keys
This commit is contained in:
		@ -67,3 +67,64 @@ eek_keyboard_new (EekboardContextService *manager,
 | 
				
			|||||||
                                                          initial_width,
 | 
					                                                          initial_width,
 | 
				
			||||||
                                                          initial_height);
 | 
					                                                          initial_height);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const double section_spacing = 7.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct place_data {
 | 
				
			||||||
 | 
					    double desired_width;
 | 
				
			||||||
 | 
					    double current_offset;
 | 
				
			||||||
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					section_placer(EekElement *element, gpointer user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    struct place_data *data = (struct place_data*)user_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekBounds section_bounds = {0};
 | 
				
			||||||
 | 
					    eek_element_get_bounds(element, §ion_bounds);
 | 
				
			||||||
 | 
					    section_bounds.width = data->desired_width;
 | 
				
			||||||
 | 
					    eek_element_set_bounds(element, §ion_bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Sections are rows now. Gather up all the keys and adjust their bounds.
 | 
				
			||||||
 | 
					    eek_section_place_keys(EEK_SECTION(element), EEK_KEYBOARD(data->keyboard));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_element_get_bounds(element, §ion_bounds);
 | 
				
			||||||
 | 
					    section_bounds.y = data->current_offset;
 | 
				
			||||||
 | 
					    eek_element_set_bounds(element, §ion_bounds);
 | 
				
			||||||
 | 
					    data->current_offset += section_bounds.height + section_spacing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					section_counter(EekElement *element, gpointer user_data) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    double *total_height = user_data;
 | 
				
			||||||
 | 
					    EekBounds section_bounds = {0};
 | 
				
			||||||
 | 
					    eek_element_get_bounds(element, §ion_bounds);
 | 
				
			||||||
 | 
					    *total_height += section_bounds.height + section_spacing;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eek_layout_place_sections(EekKeyboard *keyboard)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* Order rows */
 | 
				
			||||||
 | 
					    // This needs to be done after outlines, because outlines define key sizes
 | 
				
			||||||
 | 
					    // TODO: do this only for rows without bounds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // The keyboard width is given by the user via screen size. The height will be given dynamically.
 | 
				
			||||||
 | 
					    // TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later
 | 
				
			||||||
 | 
					    EekBounds keyboard_bounds = {0};
 | 
				
			||||||
 | 
					    eek_element_get_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct place_data placer_data = {
 | 
				
			||||||
 | 
					        .desired_width = keyboard_bounds.width,
 | 
				
			||||||
 | 
					        .current_offset = 0,
 | 
				
			||||||
 | 
					        .keyboard = keyboard,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    eek_container_foreach_child(EEK_CONTAINER(keyboard), section_placer, &placer_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    double total_height = 0;
 | 
				
			||||||
 | 
					    eek_container_foreach_child(EEK_CONTAINER(keyboard), section_counter, &total_height);
 | 
				
			||||||
 | 
					    keyboard_bounds.height = total_height;
 | 
				
			||||||
 | 
					    eek_element_set_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -55,5 +55,7 @@ struct _EekLayoutClass
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GType        eek_layout_get_type  (void) G_GNUC_CONST;
 | 
					GType        eek_layout_get_type  (void) G_GNUC_CONST;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void         eek_layout_place_sections(EekKeyboard *keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_END_DECLS
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEK_LAYOUT_H */
 | 
					#endif  /* EEK_LAYOUT_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -482,8 +482,23 @@ eek_section_create_key (EekSection *section,
 | 
				
			|||||||
                                                       row);
 | 
					                                                       row);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void keysizer(EekElement *element, gpointer user_data) {
 | 
					const double keyspacing = 4.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct keys_info {
 | 
				
			||||||
 | 
					    uint count;
 | 
				
			||||||
 | 
					    double total_width;
 | 
				
			||||||
 | 
					    double biggest_height;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					keysizer(EekElement *element, gpointer user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    EekKey *key = EEK_KEY(element);
 | 
					    EekKey *key = EEK_KEY(element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Skip keys without symbols for the current level. */
 | 
				
			||||||
 | 
					    if (!eek_key_get_symbol(key))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekKeyboard *keyboard = EEK_KEYBOARD(user_data);
 | 
					    EekKeyboard *keyboard = EEK_KEYBOARD(user_data);
 | 
				
			||||||
    uint oref = eek_key_get_oref (key);
 | 
					    uint oref = eek_key_get_oref (key);
 | 
				
			||||||
    EekOutline *outline = eek_keyboard_get_outline (keyboard, oref);
 | 
					    EekOutline *outline = eek_keyboard_get_outline (keyboard, oref);
 | 
				
			||||||
@ -514,13 +529,15 @@ static void keysizer(EekElement *element, gpointer user_data) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct keys_info {
 | 
					static void
 | 
				
			||||||
    uint count;
 | 
					keycounter (EekElement *element, gpointer user_data)
 | 
				
			||||||
    double total_width;
 | 
					{
 | 
				
			||||||
    double biggest_height;
 | 
					    EekKey *key = EEK_KEY(element);
 | 
				
			||||||
};
 | 
					
 | 
				
			||||||
 | 
					    /* Skip keys without symbols for the current level. */
 | 
				
			||||||
 | 
					    if (!eek_key_get_symbol(key))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void keycounter (EekElement *element, gpointer user_data) {
 | 
					 | 
				
			||||||
    struct keys_info *data = user_data;
 | 
					    struct keys_info *data = user_data;
 | 
				
			||||||
    data->count++;
 | 
					    data->count++;
 | 
				
			||||||
    EekBounds key_bounds = {0};
 | 
					    EekBounds key_bounds = {0};
 | 
				
			||||||
@ -531,9 +548,15 @@ static void keycounter (EekElement *element, gpointer user_data) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const double keyspacing = 4.0;
 | 
					static void
 | 
				
			||||||
 | 
					keyplacer(EekElement *element, gpointer user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekKey *key = EEK_KEY(element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Skip keys without symbols for the current level. */
 | 
				
			||||||
 | 
					    if (!eek_key_get_symbol(key))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void keyplacer(EekElement *element, gpointer user_data) {
 | 
					 | 
				
			||||||
    double *current_offset = user_data;
 | 
					    double *current_offset = user_data;
 | 
				
			||||||
    EekBounds key_bounds = {0};
 | 
					    EekBounds key_bounds = {0};
 | 
				
			||||||
    eek_element_get_bounds(element, &key_bounds);
 | 
					    eek_element_get_bounds(element, &key_bounds);
 | 
				
			||||||
@ -543,7 +566,8 @@ static void keyplacer(EekElement *element, gpointer user_data) {
 | 
				
			|||||||
    *current_offset += key_bounds.width + keyspacing;
 | 
					    *current_offset += key_bounds.width + keyspacing;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_section_place_keys(EekSection *section, EekKeyboard *keyboard)
 | 
					void
 | 
				
			||||||
 | 
					eek_section_place_keys(EekSection *section, EekKeyboard *keyboard)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    eek_container_foreach_child(EEK_CONTAINER(section), keysizer, keyboard);
 | 
					    eek_container_foreach_child(EEK_CONTAINER(section), keysizer, keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1136,63 +1136,6 @@ eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc)
 | 
				
			|||||||
    g_slice_free (EekXmlKeyboardDesc, desc);
 | 
					    g_slice_free (EekXmlKeyboardDesc, desc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct place_data {
 | 
					 | 
				
			||||||
    double desired_width;
 | 
					 | 
				
			||||||
    double current_offset;
 | 
					 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const double section_spacing = 7.0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void section_placer(EekElement *element, gpointer user_data) {
 | 
					 | 
				
			||||||
    struct place_data *data = (struct place_data*)user_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekBounds section_bounds = {0};
 | 
					 | 
				
			||||||
    eek_element_get_bounds(element, §ion_bounds);
 | 
					 | 
				
			||||||
    section_bounds.width = data->desired_width;
 | 
					 | 
				
			||||||
    eek_element_set_bounds(element, §ion_bounds);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Sections are rows now. Gather up all the keys and adjust their bounds.
 | 
					 | 
				
			||||||
    eek_section_place_keys(EEK_SECTION(element), EEK_KEYBOARD(data->keyboard));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    eek_element_get_bounds(element, §ion_bounds);
 | 
					 | 
				
			||||||
    section_bounds.y = data->current_offset;
 | 
					 | 
				
			||||||
    eek_element_set_bounds(element, §ion_bounds);
 | 
					 | 
				
			||||||
    data->current_offset += section_bounds.height + section_spacing;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void section_counter(EekElement *element, gpointer user_data) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    double *total_height = user_data;
 | 
					 | 
				
			||||||
    EekBounds section_bounds = {0};
 | 
					 | 
				
			||||||
    eek_element_get_bounds(element, §ion_bounds);
 | 
					 | 
				
			||||||
    *total_height += section_bounds.height + section_spacing;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void place_sections(EekKeyboard *keyboard)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /* Order rows */
 | 
					 | 
				
			||||||
    // This needs to be done after outlines, because outlines define key sizes
 | 
					 | 
				
			||||||
    // TODO: do this only for rows without bounds
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // The keyboard width is given by the user via screen size. The height will be given dynamically.
 | 
					 | 
				
			||||||
    // TODO: calculate max line width beforehand for button centering. Leave keyboard centering to the renderer later
 | 
					 | 
				
			||||||
    EekBounds keyboard_bounds = {0};
 | 
					 | 
				
			||||||
    eek_element_get_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct place_data placer_data = {
 | 
					 | 
				
			||||||
        .desired_width = keyboard_bounds.width,
 | 
					 | 
				
			||||||
        .current_offset = 0,
 | 
					 | 
				
			||||||
        .keyboard = keyboard,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    eek_container_foreach_child(EEK_CONTAINER(keyboard), section_placer, &placer_data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    double total_height = 0;
 | 
					 | 
				
			||||||
    eek_container_foreach_child(EEK_CONTAINER(keyboard), section_counter, &total_height);
 | 
					 | 
				
			||||||
    keyboard_bounds.height = total_height;
 | 
					 | 
				
			||||||
    eek_element_set_bounds(EEK_ELEMENT(keyboard), &keyboard_bounds);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
 | 
					parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1247,8 +1190,6 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    g_hash_table_destroy (oref_hash);
 | 
					    g_hash_table_destroy (oref_hash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    place_sections(keyboard);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    geometry_parse_data_free (data);
 | 
					    geometry_parse_data_free (data);
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1336,6 +1277,9 @@ parse_symbols (const gchar *path, EekKeyboard *keyboard, GError **error)
 | 
				
			|||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    symbols_parse_data_free (data);
 | 
					    symbols_parse_data_free (data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_layout_place_sections(keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user