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

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;

    }

    if(key == K_F5) {

        dir = GetDataFile("svg");

        LoadDir();

        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?