Implement stats search bar

This commit is contained in:
William Pierce 2020-04-20 02:16:45 -07:00
parent 1072ca4653
commit 1b3cee08a8
4 changed files with 166 additions and 1 deletions

View File

@ -175,6 +175,62 @@ Give it some time, eventually it'll finish downloading all the pretty icons!</pr
</packing>
</child>
</object>
<object class="GtkBox" id="fetch_stats_placeholder">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinner">
<property name="width_request">34</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">False</property>
<property name="vexpand">False</property>
<property name="active">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">SamRewritten is currently fetching your stats.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">7</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<object class="GtkBox" id="no_achievements_found_placeholder">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -285,6 +341,61 @@ Did you make a typo?</property>
</packing>
</child>
</object>
<object class="GtkBox" id="no_stats_found_placeholder">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixel_size">34</property>
<property name="icon_name">face-crying</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">No stats found!
Did you make a typo? Or maybe this game has no stats.</property>
<property name="justify">center</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="opacity">0</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<object class="GtkPopoverMenu" id="popovermenu">
<property name="can_focus">False</property>
<child>
@ -431,6 +542,20 @@ Did you make a typo?</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkSearchEntry" id="stat_search_bar">
<property name="can_focus">True</property>
<property name="width_chars">26</property>
<property name="primary_icon_name">edit-find-symbolic</property>
<property name="primary_icon_activatable">False</property>
<property name="primary_icon_sensitive">False</property>
<property name="placeholder_text" translatable="yes">Name of the stat...</property>
<property name="input_hints">GTK_INPUT_HINT_NO_SPELLCHECK | GTK_INPUT_HINT_NONE</property>
</object>
<packing>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkMenuButton">
<property name="visible">True</property>

View File

@ -17,6 +17,7 @@ MainPickerWindow::MainPickerWindow(GtkApplicationWindow* cobject, const Glib::Re
m_builder->get_widget("game_list", m_game_list);
m_builder->get_widget("game_search_bar", m_game_search_bar);
m_builder->get_widget("achievement_search_bar", m_achievement_search_bar);
m_builder->get_widget("stat_search_bar", m_stat_search_bar);
m_builder->get_widget("achievement_list", m_achievement_list);
m_builder->get_widget("stat_list", m_stat_list);
m_builder->get_widget("about_dialog", m_about_dialog);
@ -44,6 +45,8 @@ MainPickerWindow::MainPickerWindow(GtkApplicationWindow* cobject, const Glib::Re
m_game_list->signal_row_activated().connect(sigc::mem_fun(this, &MainPickerWindow::on_game_row_activated));
m_game_search_bar->signal_search_changed().connect(sigc::mem_fun(this, &MainPickerWindow::on_game_search_changed));
m_achievement_search_bar->signal_search_changed().connect(sigc::mem_fun(this, &MainPickerWindow::on_achievement_search_changed));
m_stat_search_bar->signal_search_changed().connect(sigc::mem_fun(this, &MainPickerWindow::on_stat_search_changed));
m_achievement_and_stat_notebook->signal_switch_page().connect(sigc::mem_fun(this, &MainPickerWindow::on_page_switched));
m_refresh_games_button->signal_clicked().connect(sigc::mem_fun(this, &MainPickerWindow::on_refresh_games_button_clicked));
m_refresh_achievements_button->signal_clicked().connect(sigc::mem_fun(this, &MainPickerWindow::on_refresh_achievements_button_clicked));
m_back_button->signal_clicked().connect(sigc::mem_fun(this, &MainPickerWindow::on_back_button_clicked));
@ -114,6 +117,36 @@ MainPickerWindow::on_achievement_search_changed() {
}
// => on_achievement_search_changed
void
MainPickerWindow::on_stat_search_changed() {
const std::string filter_text = m_stat_search_bar->get_text();
m_stat_list->show_all();
if ( filter_text.empty() ) {
return;
}
for ( StatBoxRow* row : m_stat_list_rows ) {
// stats don't have names, so use ids
if ( !strstri(row->get_stat().id, filter_text) ) {
row->hide();
}
}
}
// => on_stat_search_changed
void
MainPickerWindow::on_page_switched(Widget* page, guint page_number) {
// We only have two pages
if (page_number == 0) {
m_achievement_search_bar->set_visible(true);
m_stat_search_bar->set_visible(false);
} else {
m_achievement_search_bar->set_visible(false);
m_stat_search_bar->set_visible(true);
}
}
void
MainPickerWindow::on_game_row_activated(Gtk::ListBoxRow* row) {
AppBoxRow* game_row = static_cast<AppBoxRow*>(row);
@ -391,6 +424,7 @@ void
MainPickerWindow::switch_to_achievement_page() {
m_back_button->set_visible(true);
m_achievement_search_bar->set_visible(true);
m_stat_search_bar->set_visible(false);
m_store_button->set_visible(true);
m_refresh_achievements_button->set_visible(true);
m_unlock_all_achievements_button->set_visible(true);
@ -411,6 +445,7 @@ void
MainPickerWindow::switch_to_games_page() {
m_back_button->set_visible(false);
m_achievement_search_bar->set_visible(false);
m_stat_search_bar->set_visible(false);
m_store_button->set_visible(false);
m_refresh_achievements_button->set_visible(false);
m_unlock_all_achievements_button->set_visible(false);
@ -422,6 +457,7 @@ MainPickerWindow::switch_to_games_page() {
m_main_stack->set_visible_child(*m_game_list_view);
m_achievement_search_bar->set_text("");
m_stat_search_bar->set_text("");
reset_achievement_list();
reset_stat_list();
}

View File

@ -136,6 +136,8 @@ private:
// Gtk Callbacks
void on_game_search_changed();
void on_achievement_search_changed();
void on_stat_search_changed();
void on_page_switched(Widget* page, guint page_number);
void on_game_row_activated(Gtk::ListBoxRow* row);
void on_refresh_games_button_clicked();
void on_refresh_achievements_button_clicked();
@ -169,6 +171,7 @@ private:
Gtk::Stack *m_main_stack;
Gtk::SearchEntry *m_game_search_bar;
Gtk::SearchEntry *m_achievement_search_bar;
Gtk::SearchEntry *m_stat_search_bar;
Gtk::ScrolledWindow *m_game_list_view;
Gtk::Notebook *m_achievement_and_stat_notebook;
Gtk::Box *m_fetch_games_placeholder;

View File

@ -16,12 +16,13 @@ public:
StatBoxRow(const StatValue_t& stat);
virtual ~StatBoxRow();
StatValue_t get_stat() { return m_data; };
private:
/**
* Interpret a change in the text field
*/
void on_new_value_changed(void);
private:
StatValue_t m_data;
Gtk::SpinButton m_new_value_entry;
Gtk::Box m_invalid_conversion_box;