Improve search functionality

master
Zwarf 2022-03-25 18:52:18 +01:00
rodzic 5939858559
commit 2e73766a22
2 zmienionych plików z 88 dodań i 35 usunięć

Wyświetl plik

@ -32,6 +32,11 @@
*/
#define INPUT_CHANGED_TIMEOUT_LENGTH 300
/*
* The amount of search results to be shown
*/
#define NUM_SEARCH_RESULTS 15
struct _PicplannerWindow
{
@ -40,7 +45,7 @@ struct _PicplannerWindow
/* Template widgets */
GtkHeaderBar *header_bar;
GtkWidget *box_main;
GtkWidget *stack;
GtkWidget *stack; /* Stack containing overview, sun, moon and milky way page */
GtkWidget *search_bar; /* Search bar for the location */
GtkWidget *search_entry; /* The search entry inside the search bar */
GtkWidget *search_button; /* The search button in the header bar so show the search bar */
@ -48,24 +53,23 @@ struct _PicplannerWindow
GtkWidget *sun_box; /* The sun page */
GtkWidget *moon_box; /* The moon page */
GtkWidget *milky_way_box; /* The milky way page */
GtkWidget *north_entry;
GtkWidget *east_entry;
GtkWidget *search_result_box;
GtkWidget *search_results_scroll;
GtkWidget *search_result_row[10];
GtkWidget *search_result_label[10];
GWeatherLocation *search_result_location[10];
GtkWidget *north_entry; /* SpinButton for North coordinates */
GtkWidget *east_entry; /* SpinButton for East coordinates */
/* Search functionality */
GtkWidget *search_result_box; /* ListBox containing search results */
GtkWidget *search_results_scroll; /* ScrollView containing search_result_box */
GtkWidget *search_result_row[NUM_SEARCH_RESULTS];
GtkWidget *search_result_label[NUM_SEARCH_RESULTS];
GWeatherLocation *search_result_location[NUM_SEARCH_RESULTS];
/* Regulating amount of inputs per time */
gint input_count;
guint input_timeout_id;
gboolean input_new;
GSettings *settings; /* All settings of PicPlanner */
/* Variables to limit the amount of user searches on can make per second */
gboolean search_new;
gint search_count;
guint search_timeout_id;
/* All settings of PicPlanner */
GSettings *settings;
};
G_DEFINE_TYPE (PicplannerWindow, picplanner_window, ADW_TYPE_APPLICATION_WINDOW)
@ -80,14 +84,23 @@ search_location_chosen (GtkWidget *self,
PicplannerWindow *window = user_data;
const char *title;
int i;
for (i=0; i<10; i++)
for (i=0; i<NUM_SEARCH_RESULTS; i++)
{
if (row == window->search_result_row[i])
break;
}
title = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (window->search_result_row[i]));
g_print ("Chosen: %s\n", title);
double latitude;
double longitude;
double *p_latitude = &latitude;
double *p_longitude = &longitude;
gweather_location_get_coords (GWEATHER_LOCATION (window->search_result_location[i]), p_latitude, p_longitude);
g_print ("N: %f, E:%f\n", latitude, longitude);
gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (window->search_bar), FALSE);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (window->north_entry), latitude);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (window->east_entry), longitude);
}
static gboolean
@ -102,20 +115,40 @@ find_loc_children (GWeatherLocation *location,
if (gweather_location_get_level (child) == GWEATHER_LOCATION_CITY)
{
const char *city = gweather_location_get_name (child);
char *city_norm = g_utf8_normalize (city, strlen (city), G_NORMALIZE_ALL_COMPOSE);
char *city_string = g_utf8_casefold (city_norm, strlen (city_norm));
g_free (city_norm);
if (strstr (city_string, search_str))
const char *region = gweather_location_get_name (gweather_location_get_parent (child));
const char *country = gweather_location_get_country_name (child);
char *location_string_merge;
if (gweather_location_get_level (gweather_location_get_parent (child))
== GWEATHER_LOCATION_COUNTRY)
{
location_string_merge = g_strdup_printf ("%s, %s", city, country);
}
else
{
location_string_merge = g_strdup_printf ("%s, %s, %s",
city,
region,
country);
}
char *location_norm = g_utf8_normalize (location_string_merge,
strlen (location_string_merge),
G_NORMALIZE_ALL_COMPOSE);
char *location_string = g_utf8_casefold (location_norm, strlen (location_norm));
g_free (location_string_merge);
g_free (location_norm);
if (strstr (location_string, search_str))
{
locations[*iteration] = g_object_ref(child);
(*iteration)++;
if (*iteration>=10)
if (*iteration>=NUM_SEARCH_RESULTS)
{
g_free (city_string);
g_free (location_string);
return TRUE;
}
}
g_free (city_string);
g_free (location_string);
}
else
{
@ -141,7 +174,7 @@ search_location (GtkWidget *self,
world = gweather_location_get_world ();
for (int i=0; i<10; i++)
for (int i=0; i<NUM_SEARCH_RESULTS; i++)
{
if (GWEATHER_IS_LOCATION (window->search_result_location[i]))
g_object_unref (window->search_result_location[i]);
@ -159,14 +192,14 @@ search_location (GtkWidget *self,
double *p_longitude = &longitude;
double *p_latitude = &latitude;
char *char_coordinates;
char *char_subtitle;
gtk_widget_set_visible (window->stack, FALSE);
gtk_widget_set_visible (window->search_result_box, TRUE);
gtk_widget_set_visible (window->search_results_scroll, TRUE);
find_loc_children (world, search_string, window->search_result_location, iteration);
for (int i=0; i<10; i++)
for (int i=0; i<NUM_SEARCH_RESULTS; i++)
{
if (GTK_IS_WIDGET (window->search_result_row[i]))
{
@ -185,8 +218,19 @@ search_location (GtkWidget *self,
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (window->search_result_row[i]),
gweather_location_get_name (window->search_result_location[i]));
if (gweather_location_get_level (
gweather_location_get_parent (window->search_result_location[i])) == GWEATHER_LOCATION_COUNTRY ||
gweather_location_get_level (window->search_result_location[i]) == GWEATHER_LOCATION_COUNTRY)
char_subtitle = g_strdup_printf ("%s",
gweather_location_get_country_name (window->search_result_location[i]));
else
char_subtitle = g_strdup_printf ("%s, %s",
gweather_location_get_name (gweather_location_get_parent (window->search_result_location[i])),
gweather_location_get_country_name (window->search_result_location[i]));
adw_action_row_set_subtitle (ADW_ACTION_ROW (window->search_result_row[i]),
gweather_location_get_country_name (window->search_result_location[i]));
char_subtitle);
window->search_result_label[i] = gtk_label_new (char_coordinates);
@ -209,7 +253,6 @@ search_location (GtkWidget *self,
else
{
gtk_widget_set_visible (window->stack, TRUE);
gtk_widget_set_visible (window->search_result_box, FALSE);
gtk_widget_set_visible (window->search_results_scroll, FALSE);
}

Wyświetl plik

@ -89,7 +89,7 @@
<object class="GtkSearchEntry" id="search_entry">
<property name="visible">true</property>
<property name="can-focus">true</property>
<property name="placeholder-text">Search...</property>
<property name="placeholder-text">Search... City, Region, Country</property>
<signal name="search-changed" handler="search_location"/>
</object>
</child>
@ -139,18 +139,28 @@
<property name="valign">fill</property>
<child>
<object class="GtkListBox" id="search_result_box">
<property name="visible">false</property>
<object class="AdwBin">
<property name="hexpand">true</property>
<property name="halign">fill</property>
<property name="vexpand">true</property>
<property name="valign">fill</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="valign">start</property>
<property name="margin-start">15</property>
<property name="margin-end">15</property>
<property name="margin-top">15</property>
<property name="margin-bottom">15</property>
<child>
<object class="GtkListBox" id="search_result_box">
<property name="hexpand">true</property>
<property name="halign">fill</property>
<property name="vexpand">true</property>
<property name="valign">fill</property>
</object>
</child>
</object>
</child>
</object>
</child>