Add Scores Window for gtk141

This commit is contained in:
daleclack 2022-10-20 23:38:44 +08:00
parent 8e751b2b7d
commit b32b98b1db
6 changed files with 74 additions and 7 deletions

View File

@ -1,30 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<!-- Created with Cambalache 0.11.2 --> <!-- Created with Cambalache 0.11.2 -->
<interface> <interface>
<requires lib="gtk+" version="3.24"/> <requires lib="gtk+" version="3.24"/>
<object class="GtkWindow" id="scores_win"> <object class="GtkWindow" id="scores_win">
<property name="can-focus">False</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="can-focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkTreeView" id="scores_view"> <object class="GtkTreeView" id="scores_view">
<property name="height-request">300</property>
<property name="valign">start</property>
<property name="width-request">400</property> <property name="width-request">400</property>
<property name="height-request">300</property>
<property name="can-focus">False</property>
<property name="valign">start</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkBox" id="btn_box"> <object class="GtkBox" id="btn_box">
<property name="height-request">3</property> <property name="height-request">3</property>
<property name="can-focus">False</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="can-focus">False</property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
<property name="label"> </property> <property name="label"> </property>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">False</property> <property name="fill">False</property>
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
@ -32,13 +41,18 @@
<child> <child>
<object class="GtkButton" id="btnclose"> <object class="GtkButton" id="btnclose">
<property name="label">Close</property> <property name="label">Close</property>
<property name="can-focus">False</property>
<property name="receives-default">False</property>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
</child> </child>
</object> </object>
<packing> <packing>
<property name="expand">False</property>
<property name="fill">False</property> <property name="fill">False</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>

View File

@ -1,5 +1,4 @@
#include "InputBox.hh" #include "InputBox.hh"
#include <fstream>
InputBox::InputBox(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &ref_Glade) InputBox::InputBox(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &ref_Glade)
: Gtk::Dialog(cobject), : Gtk::Dialog(cobject),
@ -34,7 +33,7 @@ void InputBox::on_response(int response_id)
// If show scores checkbutton is checked, show scores window // If show scores checkbutton is checked, show scores window
if(check_scores->get_active()){ if(check_scores->get_active()){
scores_win1->show_all(); scores_win1->show_with_vectors(names, times);
} }
} }
hide(); hide();

View File

@ -1,7 +1,6 @@
#pragma once #pragma once
#include <gtkmm.h> #include <gtkmm.h>
#include <vector>
#include "jsonfile.hh" #include "jsonfile.hh"
#include "ScoresWin.hh" #include "ScoresWin.hh"

View File

@ -6,7 +6,42 @@ ScoresWin::ScoresWin(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &
{ {
// Get Widgets // Get Widgets
ref_builder->get_widget("btnclose", btnclose); ref_builder->get_widget("btnclose", btnclose);
ref_builder->get_widget("scores_view", tree_view);
btnclose->signal_clicked().connect(sigc::mem_fun(*this, &ScoresWin::hide)); btnclose->signal_clicked().connect(sigc::mem_fun(*this, &ScoresWin::hide));
// Create the list store
store = Gtk::ListStore::create(column1);
tree_view->set_model(store);
tree_view->append_column("name", column1.player_name);
tree_view->append_column("time", column1.win_time);
}
void ScoresWin::show_with_vectors(std::vector<std::string> &name_vec, std::vector<int> &time_vec){
// Clear the store
store->clear();
// Append data to the store
for(int i = 0; i < name_vec.size(); i++){
auto row = *(store->append());
row[column1.player_name] = name_vec[i];
row[column1.win_time] = time_vec[i];
}
store->set_sort_func(column1.win_time, sigc::mem_fun(*this, &ScoresWin::sort_func));
show_all();
}
int ScoresWin::sort_func(const Gtk::TreeModel::iterator &iter1, const Gtk::TreeModel::iterator &iter2){
auto row1 = *iter1;
auto row2 = *iter2;
if(row1[column1.win_time] < row2[column1.win_time]){
return -1;
}
if(row1[column1.win_time] == row2[column1.win_time]){
return 0;
}else{
return 1;
}
} }
ScoresWin *ScoresWin::create() ScoresWin *ScoresWin::create()

View File

@ -7,11 +7,29 @@ class ScoresWin : public Gtk::Window{
public: public:
static ScoresWin *create(); static ScoresWin *create();
ScoresWin(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &ref_Glade); ScoresWin(BaseObjectType *cobject, const Glib::RefPtr<Gtk::Builder> &ref_Glade);
void show_with_vectors(std::vector<std::string> &name_vec, std::vector<int> &time_vec);
private: private:
Glib::RefPtr<Gtk::Builder> ref_builder; Glib::RefPtr<Gtk::Builder> ref_builder;
// Child widgets // Child widgets
Gtk::Button *btnclose; Gtk::Button *btnclose;
Gtk::TreeView *tree_view; Gtk::TreeView *tree_view;
// TreeView data
class ModelColumns : public Gtk::TreeModelColumnRecord{
public:
ModelColumns(){
add(player_name);
add(win_time);
}
Gtk::TreeModelColumn<std::string> player_name;
Gtk::TreeModelColumn<int> win_time;
};
ModelColumns column1;
Glib::RefPtr<Gtk::ListStore> store;
// Sort function
int sort_func(const Gtk::TreeModel::iterator &iter1, const Gtk::TreeModel::iterator &iter2);
}; };

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "../json_nlohmann/json.hpp" #include "../json_nlohmann/json.hpp"
#include <fstream>
#include <vector>
using json = nlohmann::json; using json = nlohmann::json;