@@ -43,8 +43,7 @@ struct _ExmBrowsePage
4343 GtkStringList * suggestions ;
4444 GListModel * search_results_model ;
4545
46- int current_page ;
47- int max_pages ;
46+ gchar * next_page ;
4847
4948 GCancellable * cancellable ;
5049
@@ -54,6 +53,7 @@ struct _ExmBrowsePage
5453 GtkSearchEntry * search_entry ;
5554 GtkListBox * search_results ;
5655 GtkStack * search_stack ;
56+ GtkButton * order_btn ;
5757 GtkDropDown * search_dropdown ;
5858 GtkListBox * more_results_list ;
5959 AdwButtonRow * more_results_btn ;
@@ -144,7 +144,7 @@ static void
144144update_load_more_btn (ExmBrowsePage * self )
145145{
146146 // Hide button if we are the last page
147- gtk_widget_set_visible (GTK_WIDGET (self -> more_results_list ), self -> current_page != self -> max_pages );
147+ gtk_widget_set_visible (GTK_WIDGET (self -> more_results_list ), self -> next_page != NULL );
148148
149149 // Make it clickable
150150 gtk_widget_set_sensitive (GTK_WIDGET (self -> more_results_btn ), TRUE);
@@ -179,7 +179,7 @@ on_first_page_result (GObject *source,
179179 GError * error = NULL ;
180180 GListModel * to_append ;
181181
182- to_append = exm_search_provider_query_finish (EXM_SEARCH_PROVIDER (source ), res , & self -> max_pages , & error );
182+ to_append = exm_search_provider_query_finish (EXM_SEARCH_PROVIDER (source ), res , & self -> next_page , & error );
183183
184184 if (error )
185185 {
@@ -214,7 +214,7 @@ on_next_page_result (GObject *source,
214214 int n_items ;
215215 int i ;
216216
217- to_append = exm_search_provider_query_finish (EXM_SEARCH_PROVIDER (source ), res , & self -> max_pages , & error );
217+ to_append = exm_search_provider_query_finish (EXM_SEARCH_PROVIDER (source ), res , & self -> next_page , & error );
218218
219219 if (G_IS_LIST_MODEL (to_append ))
220220 {
@@ -260,19 +260,15 @@ static void
260260on_load_more_results (AdwButtonRow * row G_GNUC_UNUSED ,
261261 ExmBrowsePage * self )
262262{
263- const char * query ;
264- ExmSearchSort sort ;
265263 gtk_widget_set_sensitive (GTK_WIDGET (self -> more_results_btn ), FALSE);
266264
267265 // If we have a current operation, cancel it
268266 g_cancellable_cancel (self -> cancellable );
269267 self -> cancellable = g_cancellable_new ();
270268
271- query = gtk_editable_get_text (GTK_EDITABLE (self -> search_entry ));
272- sort = (ExmSearchSort ) gtk_drop_down_get_selected (self -> search_dropdown );
273- exm_search_provider_query_async (self -> search , query , ++ self -> current_page , sort , self -> cancellable ,
274- (GAsyncReadyCallback ) on_next_page_result ,
275- self );
269+ exm_search_provider_query_next_async (self -> search , self -> next_page , self -> cancellable ,
270+ (GAsyncReadyCallback ) on_next_page_result ,
271+ self );
276272}
277273
278274static void
@@ -282,7 +278,6 @@ search (ExmBrowsePage *self,
282278{
283279 // Show Loading Indicator
284280 gtk_stack_set_visible_child_name (self -> search_stack , "page_spinner" );
285- self -> current_page = 1 ;
286281
287282 if (self -> search_results_model )
288283 g_clear_object (& self -> search_results_model );
@@ -291,7 +286,7 @@ search (ExmBrowsePage *self,
291286 g_cancellable_cancel (self -> cancellable );
292287 self -> cancellable = g_cancellable_new ();
293288
294- exm_search_provider_query_async (self -> search , query , 1 , sort , self -> cancellable ,
289+ exm_search_provider_query_async (self -> search , query , sort , self -> cancellable ,
295290 (GAsyncReadyCallback ) on_first_page_result ,
296291 self );
297292}
@@ -317,9 +312,48 @@ on_search_changed (ExmBrowsePage *self)
317312
318313 const char * query = gtk_editable_get_text (GTK_EDITABLE (self -> search_entry ));
319314 ExmSearchSort sort = (ExmSearchSort ) gtk_drop_down_get_selected (self -> search_dropdown );
315+ const char * icon_name = gtk_button_get_icon_name (self -> order_btn );
316+ if (g_strcmp0 (icon_name , "view-sort-ascending-symbolic" ) == 0 )
317+ {
318+ switch (sort )
319+ {
320+ case EXM_SEARCH_SORT_CREATED_DES :
321+ sort = EXM_SEARCH_SORT_CREATED_ASC ;
322+ break ;
323+ case EXM_SEARCH_SORT_DOWNLOADS_DES :
324+ sort = EXM_SEARCH_SORT_DOWNLOADS_ASC ;
325+ break ;
326+ case EXM_SEARCH_SORT_UPDATED_DES :
327+ sort = EXM_SEARCH_SORT_UPDATED_ASC ;
328+ break ;
329+ case EXM_SEARCH_SORT_POPULARITY_DES :
330+ default :
331+ sort = EXM_SEARCH_SORT_POPULARITY_ASC ;
332+ }
333+ }
320334 search (self , query , sort );
321335}
322336
337+ static void
338+ on_order_button_clicked (GtkButton * button ,
339+ ExmBrowsePage * self )
340+ {
341+ const char * icon_name = gtk_button_get_icon_name (button );
342+
343+ if (g_strcmp0 (icon_name , "view-sort-descending-symbolic" ) == 0 )
344+ {
345+ gtk_button_set_icon_name (button , "view-sort-ascending-symbolic" );
346+ gtk_widget_set_tooltip_text (GTK_WIDGET (button ), _ ("Ascending Order" ));
347+ }
348+ else
349+ {
350+ gtk_button_set_icon_name (button , "view-sort-descending-symbolic" );
351+ gtk_widget_set_tooltip_text (GTK_WIDGET (button ), _ ("Descending Order" ));
352+ }
353+
354+ on_search_changed (self );
355+ }
356+
323357static void
324358on_search_entry_realize (GtkSearchEntry * search_entry ,
325359 ExmBrowsePage * self )
@@ -337,14 +371,13 @@ on_search_entry_realize (GtkSearchEntry *search_entry,
337371 gtk_search_entry_set_placeholder_text (search_entry , suggestion );
338372
339373 // Fire off a default search
340- search (self , "" , EXM_SEARCH_SORT_RELEVANCE );
374+ search (self , "" , EXM_SEARCH_SORT_POPULARITY_DES );
341375}
342376
343377static void
344378on_bind_manager (ExmBrowsePage * self )
345379{
346380 GListModel * ext_model ;
347- gchar * shell_version ;
348381
349382 g_object_get (self -> manager ,
350383 "extensions" , & ext_model ,
@@ -355,13 +388,6 @@ on_bind_manager (ExmBrowsePage *self)
355388 G_CALLBACK (refresh_search ),
356389 self );
357390
358- g_object_get (self -> manager ,
359- "shell-version" ,
360- & shell_version ,
361- NULL );
362-
363- g_object_set (self -> search , "shell-version" , shell_version , NULL );
364-
365391 refresh_search (self );
366392}
367393
@@ -425,12 +451,14 @@ exm_browse_page_class_init (ExmBrowsePageClass *klass)
425451 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , search_entry );
426452 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , search_results );
427453 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , search_stack );
454+ gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , order_btn );
428455 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , search_dropdown );
429456 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , more_results_list );
430457 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , more_results_btn );
431458 gtk_widget_class_bind_template_child (widget_class , ExmBrowsePage , error_label );
432459
433460 gtk_widget_class_bind_template_callback (widget_class , on_search_entry_realize );
461+ gtk_widget_class_bind_template_callback (widget_class , on_order_button_clicked );
434462 gtk_widget_class_bind_template_callback (widget_class , on_search_changed );
435463 gtk_widget_class_bind_template_callback (widget_class , on_load_more_results );
436464 gtk_widget_class_bind_template_callback (widget_class , on_bind_manager );
@@ -441,25 +469,10 @@ exm_browse_page_class_init (ExmBrowsePageClass *klass)
441469static void
442470exm_browse_page_init (ExmBrowsePage * self )
443471{
444- GSettings * settings ;
445472 gtk_widget_init_template (GTK_WIDGET (self ));
446473
447474 self -> search = exm_search_provider_new ();
448475
449- settings = g_settings_new (APP_ID );
450-
451- g_settings_bind (settings , "show-unsupported" ,
452- self -> search , "show-unsupported" ,
453- G_SETTINGS_BIND_GET );
454-
455- g_object_unref (settings );
456-
457- // Rerun search when show unsupported is toggled
458- g_signal_connect_swapped (self -> search ,
459- "notify::show-unsupported" ,
460- G_CALLBACK (on_search_changed ),
461- self );
462-
463476 load_suggestions (self );
464477
465478 gtk_search_entry_set_key_capture_widget (self -> search_entry , GTK_WIDGET (self ));
0 commit comments