Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
UppHub
Status & Roadmap
FAQ
Authors & License
Forums
Funding U++
Search on this site











SourceForge.net Logo

SourceForge.net Logo

GitHub Logo

Discord Logo

AddressBook

 

Simple address book application

Description

This example demonstrates usage of dialog templates, TabCtrl and ArrayCtrl.

It is inspired by Qt example at http://doc.qt.io/qt-5/qtwidgets-itemviews-addressbook-example.html. The above link refers to the newer version. However, below example originally refers to Qt 3.0.

Result

 

 

 

AddressBook.cpp

 

// This is an upp conversion of qt example, see

// http://doc.trolltech.com/3.0/addressbook-example.html

 

#include <CtrlLib/CtrlLib.h>

#include <Report/Report.h>

 

using namespace Upp;

 

#define LAYOUTFILE <AddressBook/AddressBook.lay>

#include <CtrlCore/lay.h>

 

class AddressBook : public WithAddressBookLayout<TopWindow> {

    WithModifyLayout<ParentCtrl> modify;

    WithSearchLayout<ParentCtrl> search;

    FileSel fs;

    String  filename;

 

    void SetupSearch();

    void Add();

    void Change();

    void Search();

    void Open();

    void Save();

    void SaveAs();

    void Print();

    void Quit();

 

    typedef AddressBook CLASSNAME;

 

public:

    void Serialize(Stream& s);

 

    AddressBook();

};

 

AddressBook::AddressBook()

{

    CtrlLayout(*this, "Address book");

    CtrlLayout(modify);

    CtrlLayout(search);

    tab.Add(modify, "Modify");

    tab.Add(search, "Search");

    ActiveFocus(search.name);

    search.oname = true;

    search.oname ^= search.osurname ^= search.oaddress ^= search.oemail ^= THISFN(SetupSearch);

    array.AddColumn("Name");

    array.AddColumn("Surname");

    array.AddColumn("Address");

    array.AddColumn("Email");

    modify.add ^= THISFN(Add);

    modify.change ^= THISFN(Change);

    search.search ^= THISFN(Search);

    SetupSearch();

    fs.AllFilesType();

#ifdef PLATFORM_COCOA

    SetMainMenu([=](Bar& bar) {

        bar.Sub("File", [=](Bar& bar) {

            bar.Add("Open..", CtrlImg::open(), THISFN(Open));

            bar.Add("Save", CtrlImg::save(), THISFN(Save));

            bar.Add("Save as..", CtrlImg::save_as(), THISFN(SaveAs));

            bar.Separator();

            bar.Add("Print", CtrlImg::print(), THISFN(Print));

            bar.Separator();

            bar.Add("Quit", THISFN(Quit));

        });

    });

#else

    menu.Set([=](Bar& bar) {

        bar.Sub("File", [=](Bar& bar) {

            bar.Add("Open..", CtrlImg::open(), THISFN(Open));

            bar.Add("Save", CtrlImg::save(), THISFN(Save));

            bar.Add("Save as..", CtrlImg::save_as(), THISFN(SaveAs));

            bar.Separator();

            bar.Add("Print", CtrlImg::print(), THISFN(Print));

            bar.Separator();

            bar.Add("Quit", THISFN(Quit));

        });

    });

#endif

}

 

void AddressBook::SetupSearch()

{

    search.name.Enable(search.oname);

    search.surname.Enable(search.osurname);

    search.address.Enable(search.oaddress);

    search.email.Enable(search.oemail);

}

 

void AddressBook::Add()

{

    array.Add(~modify.name, ~modify.surname, ~modify.address, ~modify.email);

    array.GoEnd();

    modify.name <<= modify.surname <<= modify.address <<= modify.email <<= Null;

    ActiveFocus(modify.name);

}

 

void AddressBook::Change()

{

    if(array.IsCursor()) {

        array.Set(0, ~modify.name);

        array.Set(1, ~modify.surname);

        array.Set(2, ~modify.address);

        array.Set(3, ~modify.email);

    }

}

 

bool Contains(const String& text, const String& substr)

{

    for(const char *s = text; s <= text.End() - substr.GetLength(); s++)

        if(strncmp(s, substr, substr.GetLength()) == 0)

            return true;

    return false;

}

 

void AddressBook::Search()

{

    if(!array.GetCount()) return;

    bool sc = true;

    array.ClearSelection();

    for(int i = 0; i < array.GetCount(); i++) {

        if((!search.oname || Contains(array.Get(i, 0), ~search.name)) &&

           (!search.osurname || Contains(array.Get(i, 1), ~search.surname)) &&

           (!search.oaddress || Contains(array.Get(i, 2), ~search.address)) &&

           (!search.oemail || Contains(array.Get(i, 3), ~search.email))) {

            array.Select(i);

            if(sc) {

                array.SetCursor(i);

                array.CenterCursor();

                sc = false;

            };

        }

    }

}

 

void AddressBook::Open()

{

    if(!fs.ExecuteOpen()) return;

    filename = fs;

    FileIn in(filename);

    if(!in) {

        Exclamation("Unable to open [* " + DeQtf(filename));

        return;

    }

    array.Clear();

    while(!in.IsEof()) {

        Vector<Value> q;

        for(int i = 0; i < 4; i++)

            q.Add(in.GetLine());

        array.Add(q);

    }

}

 

void AddressBook::Save()

{

    if(IsEmpty(filename)) {

        SaveAs();

        return;

    }

    FileOut out(filename);

    if(!out) {

        Exclamation("Unable to open " + filename);

        return;

    }

    for(int i = 0; i < array.GetCount(); i++)

        for(int q = 0; q < 4; q++)

            out.PutLine(String(array.Get(i, q)));

}

 

void AddressBook::SaveAs()

{

    if(!fs.ExecuteSaveAs()) return;

    filename = fs;

    Save();

}

 

void AddressBook::Print()

{

    String qtf;

    qtf = "{{1:1:1:1 Name:: Surname:: Address:: Email";

    for(int i = 0; i < array.GetCount(); i++)

        for(int q = 0; q < 4; q++)

            qtf << ":: " << DeQtf((String)array.Get(i, q));

    Report report;

    report << qtf;

    Perform(report);

}

 

void AddressBook::Quit()

{

    Break();

}

 

void AddressBook::Serialize(Stream& s)

{

    int version = 0;

    s / version;

    s % search.oname % search.osurname % search.oaddress % search.oemail;

    s % fs;

    SetupSearch();

}

 

GUI_APP_MAIN

{

    AddressBook ab;

    LoadFromFile(ab);

    ab.Run();

    StoreToFile(ab);

}

 

 

 

AddressBook.lay

 

LAYOUT(AddressBookLayout, 512, 456)

    ITEM(MenuBar, menu, LeftPosZ(0, 216).TopPosZ(0, 20))

    ITEM(Upp::TabCtrl, tab, LeftPosZ(8, 496).TopPosZ(32, 84))

    ITEM(Upp::ArrayCtrl, array, LeftPosZ(8, 496).TopPosZ(124, 324))

END_LAYOUT

 

LAYOUT(ModifyLayout, 480, 52)

    ITEM(Upp::Label, dv___0, SetLabel(t_("&Name")).LeftPosZ(8, 48).TopPosZ(8, 15))

    ITEM(Upp::EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))

    ITEM(Upp::Label, dv___2, SetLabel(t_("&Surname")).LeftPosZ(108, 48).TopPosZ(8, 15))

    ITEM(Upp::EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))

    ITEM(Upp::Label, dv___4, SetLabel(t_("&Address")).LeftPosZ(208, 48).TopPosZ(8, 15))

    ITEM(Upp::EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))

    ITEM(Upp::Label, dv___6, SetLabel(t_("&Email")).LeftPosZ(308, 48).TopPosZ(8, 15))

    ITEM(Upp::EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))

    ITEM(Upp::Button, add, SetLabel(t_("Ad&d")).LeftPosZ(416, 56).TopPosZ(4, 20))

    ITEM(Upp::Button, change, SetLabel(t_("&Change")).LeftPosZ(416, 56).TopPosZ(28, 20))

END_LAYOUT

 

LAYOUT(SearchLayout, 480, 56)

    ITEM(Upp::Option, oname, SetLabel(t_("&Name")).LeftPosZ(8, 56).TopPosZ(8, 18))

    ITEM(Upp::EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))

    ITEM(Upp::Option, osurname, SetLabel(t_("&Surname")).LeftPosZ(108, 64).TopPosZ(8, 18))

    ITEM(Upp::EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))

    ITEM(Upp::Option, oaddress, SetLabel(t_("&Address")).LeftPosZ(208, 64).TopPosZ(8, 18))

    ITEM(Upp::EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))

    ITEM(Upp::Option, oemail, SetLabel(t_("&Email")).LeftPosZ(308, 52).TopPosZ(8, 18))

    ITEM(Upp::EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))

    ITEM(Upp::Button, search, SetLabel(t_("&Search")).LeftPosZ(416, 56).TopPosZ(28, 20))

END_LAYOUT

 

 

 

 

 

Do you want to contribute?