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












SourceForge.net Logo
Home » U++ Library support » Look and Chameleon Technology » A little theming
Re: A little theming [message #18649 is a reply to message #18647] Tue, 14 October 2008 14:39 Go to previous messageGo to previous message
mrjt is currently offline  mrjt
Messages: 705
Registered: March 2007
Location: London
Contributor
Well, I've bodged it. The problems:
1- As above, you have to add code to serialize the look based on it's type.
2- The reason the style was being ignored was that you can't just create a ChStyle and expect it to work, it needs to registered properly with Upp. This is normally done by the CH_STYLE macro, but you can also do it by copying an existing ChStyle before altering it. It may also be possible to use ChRegisterStyle__ directly.

Below is the code I used. There is a bit more bodging with StringStreams because for some reason PNGRaster and PNGEncoder are slightly incompatible.

Personally I would avoid supporting saving themes, and just create a sensible file format than can be edited externally.

enum {
	ImageLookType = 0,
	ColorLookType	
};

void SerializeLook(Stream &s, Value &v) {
	int type;
	if (s.IsStoring()) {
		if(IsType<Color>(v)) {
			Color c = v;
			type = ColorLookType;
			s % type % c;
		}
		else if(IsType<Image>(v)) {
			type = ImageLookType;
			s % type;
			StringStream png;
			Image img = v;
			PNGEncoder().Save(png, img);
			s % (String)png;
			Point p1 = img.GetHotSpot();
			Point p2 = img.Get2ndSpot();
			s % p1 % p2;
		}
	}
	else {
		s % type; 
		if (type == ImageLookType) {
			String png;
			s % png;
			StringStream str(png);
			Image img = PNGRaster().Load(str);
			ASSERT(!IsNull(img));
			Point p1;
			Point p2;
			s % p1 % p2;
			ImageBuffer ib(img);
			ib.SetHotSpot(p1);
			ib.Set2ndSpot(p2);
			v = (Image)ib;
		}
		else if (type == ColorLookType) {
			Color c;
			s % c;
			ASSERT(!IsNull(c));
			v = c;
		}			
	}
};

void Theme::ButtonStyle::Serialize(Stream& s)
{
	if (s.IsLoading())
		d = Button::StyleNormal(); // Make sure style is initialised
	s % d.cancel % d.exit % d.focusmargin;
	for (int i = 0; i < 4; i++)	{	
		SerializeLook(s, d.look[i]);
	}
}

[Updated on: Tue, 14 October 2008 14:43]

Report message to a moderator

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: The problem with the operation of the buffer.
Next Topic: Set fields side to other fields and fields width to text width
Goto Forum:
  


Current Time: Thu Mar 28 20:04:17 CET 2024

Total time taken to generate the page: 0.00990 seconds