⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ns_profile.cpp

📁 需要clanlib 库 这个改进版的 在linux 很好玩 但是一定要有clanlib
💻 CPP
字号:
// NS_Profile.cpp: implementation of the NS_Profile class.////////////////////////////////////////////////////////////////////////#include "NS_Profile.h"#include <ClanLib/signals.h>#include <ClanLib/display.h>#include <ClanLib/core.h>#include "NS_MessageBox.h"#include <algorithm>#include <functional>#include <vector>using namespace std;//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////NS_Profile::NS_Profile(CL_Component * parent)    : CL_Window(parent, parent->get_style_manager()),    success(false){    CL_ListBox * lst_players = new CL_ListBox(CL_Rect(15, 35, 350, 255), get_client_area());    CL_Button * btn_add = new CL_Button(CL_Point(15, 260), "New Player", get_client_area());    CL_Button * btn_del = new CL_Button(CL_Point(160, 260), "Delete", get_client_area());    CL_Button * btn_ok = new CL_Button(CL_Point(325, 260), "OK", get_client_area());    // Calc dialog position    set_position(CL_Rect(100, 100, 477, 400));    set_title("Player list");     // Add players to list    lst_players->set_multi_selection(false);    // if we have players, then show them in dialog    FILE *player_info = fopen("player_info.dat", "r");    int n;    fscanf(player_info, "%d\n", &n);    vector <string> player_name;    for (int i = 0; i < n; i++) {        char s[100];        fgets(s, 100, player_info);        player_name.push_back(s);    }    fclose(player_info);    for (int i = 0; i < player_name.size(); i++)        lst_players->insert_item(player_name[i]);    lst_players->set_current_item(0);    lst_players->sort();            lst_players->set_tab_id(1);    btn_ok->find_preferred_size();    btn_del->find_preferred_size();    btn_add->find_preferred_size();    // Connect signals    slots.connect(btn_ok->sig_clicked(), this, &NS_Profile::on_ok);    slots.connect(btn_add->sig_clicked(), this, &NS_Profile::on_new_player);    slots.connect(btn_del->sig_clicked(), this, &NS_Profile::on_delete_player);    // Add components to component list    components["btn_ok"]     = btn_ok;    components["players"]    = lst_players;    components["btn_add"]    = btn_add;    components["btn_del"]    = btn_del;}bool NS_Profile::open(CL_Component * parent){    NS_Profile dlg(parent);    dlg.run();    return dlg.is_success();}bool NS_Profile::is_success() const{    return success;}void NS_Profile::on_ok(){    //save info to a file    CL_ListBox * lst_players = dynamic_cast<CL_ListBox*>(components["players"]);    vector <CL_ListItem * > players = lst_players->get_items();    FILE *player_info = fopen("player_info.dat", "w");    fprintf(player_info, "%d\n", players.size());    for (int i = 0; i < players.size(); i++) {        string s = players[i]->str;        if (s[s.size() - 1] == '\n')            fprintf(player_info, "%s", s.c_str());        else            fprintf(player_info, "%s\n", s.c_str());    }    fclose(player_info);    quit();}NS_Profile::~NS_Profile(){	std::map<std::string, CL_Component * >::iterator it(components.begin());	for(; it != components.end(); ++it)		delete it->second;}// New Playernamespace {class NS_New_Player : public CL_Window{public:    NS_New_Player(CL_Component * parent, std::string const & player_name = "");    ~NS_New_Player();public:    void on_ok();    void on_cancel();    static bool open(CL_Component * parent, std::string & player_name);    std::string const & get_player_name() const;    void set_focus_on_input();    bool is_success() const;    void on_key_down(CL_InputEvent const & key);private:    std::map<std::string, CL_Component * > components;    CL_SlotContainer slots;    std::string old_player_name;    bool success;};NS_New_Player::NS_New_Player(CL_Component * parent,        std::string const & player_name):    CL_Window(parent, parent->get_style_manager()),    old_player_name(player_name),    success(false){    CL_Button * btn_cancel = new CL_Button(CL_Point(220, 75), "Cancel", get_client_area());    CL_Button * btn_ok = new CL_Button(CL_Point(180, 75), "OK", get_client_area());    CL_InputBox * input_name = new CL_InputBox(CL_Rect(15, 40, 270, 65), get_client_area());    // Calc dialog position    set_position(CL_Rect(200, 150, 500, 265));    set_title("Enter player name");    // Connect signals    slots.connect(btn_ok->sig_clicked(), this, &NS_New_Player::on_ok);    slots.connect(btn_cancel->sig_clicked(), this, &NS_New_Player::on_cancel);    slots.connect(CL_Keyboard::sig_key_down(), this, &NS_New_Player::on_key_down);    // Add components to component list    components["btn_ok"]     = btn_ok;    components["btn_cancel"] = btn_cancel;    components["input_name"] = input_name;	input_name->set_focus();}NS_New_Player::~NS_New_Player(){	std::map<std::string, CL_Component * >::iterator it(components.begin());	for(; it != components.end(); ++it)		delete it->second;}void NS_New_Player::on_key_down(CL_InputEvent const & key){    if (key.id == CL_KEY_ESCAPE)        on_cancel();    else        if (key.id == CL_KEY_RETURN)            on_ok();}std::string const & NS_New_Player::get_player_name() const{    return old_player_name;}bool NS_New_Player::is_success() const{    return success;}void NS_New_Player::set_focus_on_input(){    components["input_name"]->set_focus();}bool NS_New_Player::open(CL_Component * parent,                         std::string & player_name){    NS_New_Player dlg(parent, player_name);    dlg.set_focus_on_input();    dlg.run();    player_name = dlg.get_player_name();    return dlg.is_success();}struct CharRemover : std::unary_function<char, bool>{    CharRemover(std::string const & wildcard)        : wildcard(wildcard)    {    }    bool operator()(char ch)    {        return wildcard.find(ch) == std::string::npos;    }    std::string const & wildcard;};void NS_New_Player::on_ok(){    // Select new default user    // then quit    CL_InputBox * input_name = dynamic_cast<CL_InputBox*>(components["input_name"]);    if (input_name)    {        std::string str = input_name->get_text();        /*        size_t pos = str.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890(),_");        if (pos != std::string::npos)            str.erase(str.begin(), str.begin() + pos);        pos = str.find_last_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890(),_");        if (pos != std::string::npos)            str.erase(str.begin() + pos + 1, str.end());        str.erase(std::remove_if(str.begin(), str.end(),            CharRemover("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890(),_ ")),            str.end());        */        if (!str.empty())            success = true;        old_player_name = str;    }    quit();}void NS_New_Player::on_cancel(){    // Select new default user    // then quit    quit();}} // end New Player namespacevoid NS_Profile::on_new_player(){    CL_ListBox * lst_players = dynamic_cast<CL_ListBox*>(components["players"]);    if (lst_players)    {        std::string old_player_name;        if (NS_New_Player::open(get_gui_manager(), old_player_name))        // add player here        {            if (!old_player_name.empty())			{				lst_players->insert_item(old_player_name);				lst_players->set_current_item(lst_players->get_count() - 1);				lst_players->sort();			}        }    }}void NS_Profile::on_delete_player(){    CL_ListBox * lst_players = dynamic_cast<CL_ListBox*>(components["players"]);    if (lst_players)    {        if (lst_players->get_count() > 0)		{			if (lst_players->get_current_item() != -1)            {                int result = NS_MessageBox::info(get_gui_manager(), "Deleting Player",                    "Are you sure to delete " + lst_players->get_current_text() + "?",                    "OK", "Cancel", "");                if (result == 1)                {                    // delete player					lst_players->remove_item(lst_players->get_current_item());                    if (lst_players->get_count())                    {                        lst_players->set_current_item(0);                    }                    else                    {                        lst_players->set_current_item(-1);                    }                }            }		}		else		{			NS_MessageBox::info(this, "Deleting Player",				"You should add some players first",				"OK", "", "");		}    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -