guick

C++ GUI quick made.

teroxGuick single page application

teroxGuick work in progress

teroxGuick screenshot

/////////////////////////////////////////////////////////////////////////////
//
//	teroxGuick
//
//	copyright (C++) 2019 public domain
//
//	version 2019.07.07
//
/////////////////////////////////////////////////////////////////////////////

#include <webui/spartaWebUi.hxx>

namespace terox::guick
{

/////////////////////////////////////////////////////////////////////////////

class Guick final
{
public:

	Guick();

private:

	auto updateBoard(UiPoint) -> void;

	struct Self final
	{
		UiFrame  frame   {};
		UiLabel  title   { "teroxGuick" };
		UiLine   hline   {};
		UiGraph  board   {};
		UiLabel  help    { "Click to add or toggle a point" };
		UiLine   fline   {};
		UiLabel  count   {};
		UiButton discard { "Discard" };
		UiButton close   { "Close"   };

		Vector<UiCircle> circles {};
	}
	self;
};

/////////////////////////////////////////////////////////////////////////////

Guick::Guick()
{
	self.frame =
	{
		self.title   .geometry(  1,   3,   4,  -3 ),
		self.hline   .geometry(  4,   3,   4,  -3 ),
		self.board   .geometry(  5,   3,  -4,  -3 ),
		self.help    .geometry( -4,   3,  -3,  -3 ),
		self.fline   .geometry( -3,   3,  -2,  -3 ),
		self.count   .geometry( -2,   3,  -1, -17 ),
		self.discard .geometry( -2, -16,  -1, -10 ),
		self.close   .geometry( -2,  -9,  -1,  -3 ),
	};

	self.title.onClick = [] { UiApplication::toggleFullScreen(); };
	self.close.onClick = [] { UiApplication::exit();             };

	self.board.backColor (kUiColorCornFlowerBlue);
	self.board.color     (kUiColorLightSkyBlue);

	self.board.onPoint = [this](UiPoint point)
	{
		self.board.begin(), updateBoard(point), self.board.end();
	};

	self.discard.onClick = [this]
	{
		~self.circles;

		self.board.clear();
		self.count.clear();
	};
}

/////////////////////////////////////////////////////////////////////////////

auto Guick::updateBoard(UiPoint point) -> void
{
	auto constexpr radius = 8;
	auto const     size   = self.circles.size();

	for(auto i = self.circles.size(); i-- > 0; )
	{
		if(self.circles[i].contains(point))
		{
			self.circles.remove(i);
			break;
		}
	}

	for(auto const& circle : self.circles)
	{
		self.board.draw(circle);
	}

	if(self.circles.size() == size)
	{
		auto circle   = circleOf(point, radius);
		self.circles += circle;
		self.board.draw(circle);
	}

	self.count = format("Count: %", self.circles.size());
}

/////////////////////////////////////////////////////////////////////////////

} // namespace terox::guick

/////////////////////////////////////////////////////////////////////////////

auto webMain() -> void
{
	UiApplication::run<terox::guick::Guick>();
}

/////////////////////////////////////////////////////////////////////////////