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











SourceForge.net Logo

SVGView

 

Simple SVG viewer (PainterSvg demo)

Description

The example shows how to use SVG files (ang. Scalable Vector Graphics) within U++ framework.

More information about SVG files you can be found on Wikipedia.

Result

 

 

 

 

main.cpp

 

#include <CtrlLib/CtrlLib.h>

#include <Painter/Painter.h>

 

using namespace Upp;

 

struct SvgView : public TopWindow {

    virtual bool Key(dword key, int);

    virtual void Paint(Draw& w);

 

    String                svg;

    FileList              files;

    SplitterFrame         splitter;

    String                dir;

    FrameTop<Button>      dirup;

 

    void Load(const char *filename);

    void Enter();

    void DoDir();

    void DirUp();

 

    typedef SvgView CLASSNAME;

 

    void Serialize(Stream& s);

    void LoadDir(const char *d);

    void LoadDir()                      { LoadDir(dir); }

 

    SvgView();

};

 

void SvgView::Paint(Draw& w)

{

    Size sz = GetSize();

    w.DrawRect(sz, Gray());

    Image img = RenderSVGImage(sz, svg);

    Point p = Rect(sz).CenterPos(img.GetSize());

    w.DrawImage(p.x, p.y, img);

}

 

void SvgView::Load(const char *filename)

{

    svg = LoadFileBOM(filename);

    Refresh();

}

 

void SvgView::LoadDir(const char *d)

{

    files.Clear();

    dir = d;

    Title(dir);

    ::Load(files, dir, "*.*");

    SortByExt(files);

}

 

void SvgView::DirUp()

{

    String n = DirectoryUp(dir);

    LoadDir(dir);

    files.FindSetCursor(n);

}

 

void SvgView::Enter()

{

    if(!files.IsCursor()) {

        Title(dir);

        return;

    }

    const FileList::File& f = files.Get(files.GetCursor());

    if(f.name == "..") {

        Title(dir);

        return;

    }

    String p = AppendFileName(dir, f.name);

    Title(p);

    if(!f.isdir)

        Load(p);

}

 

void SvgView::DoDir()

{

    if(!files.IsCursor())

        return;

    const FileList::File& f = files.Get(files.GetCursor());

    if(!f.isdir)

        return;

    LoadDir(AppendFileName(dir, f.name));

}

 

bool SvgView::Key(dword key, int)

{

    if(key == K_ENTER) {

        DoDir();

        return true;

    }

    return false;

}

 

void SvgView::Serialize(Stream& s)

{

    int version = 0;

    s / version;

    SerializePlacement(s);

    files.SerializeSettings(s);

    s % dir;

    s % splitter;

}

 

SvgView::SvgView()

{

    files.WhenEnterItem = THISBACK(Enter);

    files.WhenLeftDouble = THISBACK(DoDir);

    dirup.Height(max(CtrlImg::DirUp().GetSize().cy, Draw::GetStdFontCy() + 6));

    dirup.SetImage(CtrlImg::DirUp());

    dirup.NormalStyle();

    dirup <<= THISBACK(DirUp);

    files.AddFrame(dirup);

 

    Sizeable().Zoomable();

    

    AddFrame(splitter.Left(files, 200));

 

    dir = GetDataFile("svg");

}

 

GUI_APP_MAIN

{

    SvgView x;

    LoadFromFile(x);

    x.LoadDir();

    x.Run();

    StoreToFile(x);

}

 

 

 

 

Do you want to contribute?