gui::CImageGUISkin* CGUISkinSystem::loadSkinFromFile(const c8 *skinname) { gui::CImageGUISkin* skin ; gui::SImageGUISkinConfig skinConfig; gui::EGUI_SKIN_TYPE fallbackType; gui::IGUISkin *fallbackSkin; s32 i,x; core::stringc tmp; core::stringw wtmp; core::stringc path = "./"; path += skinname; if(!registry->loadFile(SKINSYSTEM_SKINFILE,path.c_str())) { return NULL; } // Easiest way to see if an xml is loading correctly // is to make the registry write out the root node and see what comes out. //registry->writeFile("Skin","."); // To switch on the fly, we have to set the skin to the fallback skin first tmp = registry->getValueAsCStr(L"skin",L"Skin/Properties/Fallback"); // Always default to metalic fallbackType = gui::EGST_WINDOWS_METALLIC; if(tmp.equals_ignore_case("EGST_WINDOWS_CLASSIC")) fallbackType = gui::EGST_WINDOWS_CLASSIC; else if(tmp.equals_ignore_case("EGST_BURNING_SKIN")) fallbackType = gui::EGST_BURNING_SKIN; // I'm not dealing with the 'unknown skin' fallbackSkin = device->getGUIEnvironment()->createSkin(fallbackType); device->getGUIEnvironment()->setSkin(fallbackSkin); fallbackSkin->drop(); skin = new gui::CImageGUISkin(device->getVideoDriver(), device->getGUIEnvironment()->getSkin()); fs->changeWorkingDirectoryTo(path.c_str()); ParseGUIElementStyle(skinConfig.Button,"Button"); ParseGUIElementStyle(skinConfig.ButtonPressed, "Button/Pressed"); ParseGUIElementStyle(skinConfig.ButtonDisabled, "Button/ButtonDisabled"); ParseGUIElementStyle(skinConfig.SunkenPane, "SunkenPane"); ParseGUIElementStyle(skinConfig.Window, "Window"); ParseGUIElementStyle(skinConfig.ProgressBar, "ProgressBar",true); ParseGUIElementStyle(skinConfig.ProgressBarFilled, "ProgressBar/Filled",true); ParseGUIElementStyle(skinConfig.TabBody,"TabControl"); ParseGUIElementStyle(skinConfig.TabButton,"TabControl/TabButton"); ParseGUIElementStyle(skinConfig.TabButtonPressed,"TabControl/TabButtonPressed"); ParseGUIElementStyle(skinConfig.MenuBar,"MenuBar"); ParseGUIElementStyle(skinConfig.MenuPane,"MenuBar/MenuPane"); ParseGUIElementStyle(skinConfig.MenuPressed,"MenuBar/MenuPressed"); ParseGUIElementStyle(skinConfig.CheckBox,"CheckBox"); ParseGUIElementStyle(skinConfig.CheckBoxDisabled,"CheckBox/CheckBoxDisabled"); ParseGUIElementStyle(skinConfig.ComboBox,"ComboBox"); ParseGUIElementStyle(skinConfig.ComboBoxDisabled,"ComboBox/ComboBoxDisabled"); skinConfig.CheckBoxColor = registry->getValueAsColor(L"Skin/Global/CheckBoxColor"); // If there was no progress bar colors set, set them in the config to the defaults // otherwise their 0,0,0,0. This is neccicary for the old klagui. if(skinConfig.ProgressBar.Color == NULL) skinConfig.ProgressBar.Color = video::SColor(); if(skinConfig.ProgressBarFilled.Color == NULL) skinConfig.ProgressBarFilled.Color = video::SColor(255,255,0,0); // Load in the Info loadProperty((core::stringw)L"Name",skin); loadProperty((core::stringw)L"Author",skin); loadProperty((core::stringw)L"Version",skin); loadProperty((core::stringw)L"Date",skin); loadProperty((core::stringw)L"Desc",skin); loadProperty((core::stringw)L"SpecialColor",skin); skin->loadConfig(skinConfig); tmp = registry->getValueAsCStr(L"texture",L"Skin/Properties/Font"); gui::IGUIFont *font = device->getGUIEnvironment()->getFont(tmp.c_str()); if(font !=0) { device->getGUIEnvironment()->getSkin()->setFont(font, gui::EGDF_DEFAULT); device->getGUIEnvironment()->getSkin()->setFont(font, gui::EGDF_WINDOW); } // Get and set global alpha, problem with this, you can't set it to 0 // He does this to make ALL the default stuff completly transparent // This has the downside that it whipes out things like checkbox and window button colors video::SColor newCol = video::SColor(); video::SColor oldCol = newCol; x = registry->getValueAsInt(L"guialpha",L"Skin/Global/"); if(x && x != NULL) { i = gui::EGDC_COUNT; while(i--) { oldCol = skin->getColor((gui::EGUI_DEFAULT_COLOR)i); newCol = oldCol; newCol.setAlpha(x); skin->setColor((gui::EGUI_DEFAULT_COLOR)i, newCol); } } checkSkinColor(gui::EGDC_3D_DARK_SHADOW,L"Skin/Global/EGDC_32_DARK_SHADOW",skin); checkSkinColor(gui::EGDC_3D_SHADOW,L"Skin/Global/EGDC_3D_SHADOW",skin); checkSkinColor(gui::EGDC_3D_FACE,L"Skin/Global/EGDC_3D_FACE",skin); checkSkinColor(gui::EGDC_3D_HIGH_LIGHT,L"Skin/Global/EGDC_3D_HIGH_LIGHT",skin); checkSkinColor(gui::EGDC_3D_LIGHT,L"Skin/Global/EGDC_3D_LIGHT",skin); checkSkinColor(gui::EGDC_ACTIVE_BORDER,L"Skin/Global/EGDC_ACTIVE_BORDER",skin); checkSkinColor(gui::EGDC_ACTIVE_CAPTION,L"Skin/Global/EGDC_ACTIVE_CAPTION",skin); checkSkinColor(gui::EGDC_APP_WORKSPACE,L"Skin/Global/EGDC_APP_WORKSPACE",skin); checkSkinColor(gui::EGDC_BUTTON_TEXT,L"Skin/Global/EGDC_BUTTON_TEXT",skin); checkSkinColor(gui::EGDC_GRAY_TEXT,L"Skin/Global/EGDC_GRAY_TEXT",skin); checkSkinColor(gui::EGDC_HIGH_LIGHT_TEXT,L"Skin/Global/EGDC_HIGH_LIGHT_TEXT",skin); checkSkinColor(gui::EGDC_INACTIVE_BORDER,L"Skin/Global/EGDC_INACTIVE_BORDER",skin); checkSkinColor(gui::EGDC_INACTIVE_CAPTION,L"Skin/Global/EGDC_INACTIVE_CAPTION",skin); checkSkinColor(gui::EGDC_TOOLTIP,L"Skin/Global/EGDC_TOOLTIP",skin); checkSkinColor(gui::EGDC_TOOLTIP_BACKGROUND,L"Skin/Global/EGDC_TOOLTIP_BACKGROUND",skin); checkSkinColor(gui::EGDC_SCROLLBAR,L"Skin/Global/EGDC_SCROLLBAR",skin); checkSkinColor(gui::EGDC_WINDOW,L"Skin/Global/EGDC_WINDOW",skin); checkSkinColor(gui::EGDC_WINDOW_SYMBOL,L"Skin/Global/EGDC_WINDOW_SYMBOL",skin); checkSkinColor(gui::EGDC_ICON,L"Skin/Global/EGDC_ICON",skin); checkSkinColor(gui::EGDC_ICON_HIGH_LIGHT,L"Skin/Global/EGDC_ICON_HIGH_LIGHT",skin); checkSkinSize(gui::EGDS_WINDOW_BUTTON_WIDTH, L"Skin/Global/WindowButton",L"width",skin); checkSkinSize(gui::EGDS_TITLEBARTEXT_DISTANCE_X, L"Skin/Global/Caption",L"tbardistancex",skin); checkSkinSize(gui::EGDS_TITLEBARTEXT_DISTANCE_Y, L"Skin/Global/Caption",L"tbardistancey",skin); return skin; }
gui::CImageGUISkin* CGUISkinSystem::loadSkinFromFile(const c8 *skinname) { core::stringc tmp; core::stringw wtmp; core::stringc path = "./"; path += skinname; if(!registry->loadFile(SKINSYSTEM_SKINFILE,path.c_str())) { return NULL; } // Easiest way to see if an xml is loading correctly // is to make the registry write out the root node and see what comes out. //registry->writeFile("Skin","."); gui::CImageGUISkin* skin = new gui::CImageGUISkin(device->getVideoDriver(), device->getGUIEnvironment()->getSkin()); gui::SImageGUISkinConfig skinConfig; fs->changeWorkingDirectoryTo(path.c_str()); ParseGUIElementStyle(skinConfig.Button,"Button"); ParseGUIElementStyle(skinConfig.ButtonPressed, "Button/Pressed"); ParseGUIElementStyle(skinConfig.ButtonDisabled, "Button/ButtonDisabled"); ParseGUIElementStyle(skinConfig.SunkenPane, "SunkenPane"); ParseGUIElementStyle(skinConfig.Window, "Window"); ParseGUIElementStyle(skinConfig.TabBody,"TabControl"); ParseGUIElementStyle(skinConfig.TabButton,"TabControl/TabButton"); ParseGUIElementStyle(skinConfig.TabButtonPressed,"TabControl/TabButtonPressed"); ParseGUIElementStyle(skinConfig.MenuBar,"MenuBar"); ParseGUIElementStyle(skinConfig.MenuPane,"MenuBar/MenuPane"); ParseGUIElementStyle(skinConfig.MenuPressed,"MenuBar/MenuPressed"); ParseGUIElementStyle(skinConfig.CheckBox,"CheckBox"); ParseGUIElementStyle(skinConfig.CheckBoxDisabled,"CheckBox/CheckBoxDisabled"); ParseGUIElementStyle(skinConfig.ComboBox,"ComboBox"); ParseGUIElementStyle(skinConfig.ComboBoxDisabled,"ComboBox/ComboBoxDisabled"); skinConfig.CheckBoxColor = registry->getValueAsColor(L"Skin/Global/CheckBoxColor"); // Load in the Info loadProperty((core::stringw)L"Name",skin); loadProperty((core::stringw)L"Author",skin); loadProperty((core::stringw)L"Version",skin); loadProperty((core::stringw)L"Date",skin); loadProperty((core::stringw)L"Desc", skin); loadProperty((core::stringw)L"CardInfoHeaderColor", skin); loadProperty((core::stringw)L"PopupColor", skin); skin->loadConfig(skinConfig); tmp = registry->getValueAsCStr(L"texture",L"Skin/Properties/Font"); gui::IGUIFont *font = device->getGUIEnvironment()->getFont(tmp.c_str()); if(font !=0) { device->getGUIEnvironment()->getSkin()->setFont(font, gui::EGDF_DEFAULT); device->getGUIEnvironment()->getSkin()->setFont(font, gui::EGDF_WINDOW); } // Get and set global alpha, problem with this, you can't set it to 0 // He does this to make ALL the default stuff completly transparent // This has the downside that it whipes out things like checkbox and window button colors video::SColor newCol = video::SColor(); video::SColor oldCol = newCol; s32 x = registry->getValueAsInt(L"guialpha",L"Skin/Global/"); if(x && x != NULL) { s32 i = gui::EGDC_COUNT; while(i--) { oldCol = skin->getColor((gui::EGUI_DEFAULT_COLOR)i); newCol = oldCol; newCol.setAlpha(x); skin->setColor((gui::EGUI_DEFAULT_COLOR)i, newCol); } } checkSkinColor(gui::EGDC_3D_DARK_SHADOW,L"Skin/Global/EGDC_32_DARK_SHADOW",skin); checkSkinColor(gui::EGDC_3D_SHADOW,L"Skin/Global/EGDC_3D_SHADOW",skin); checkSkinColor(gui::EGDC_3D_FACE,L"Skin/Global/EGDC_3D_FACE",skin); checkSkinColor(gui::EGDC_3D_HIGH_LIGHT,L"Skin/Global/EGDC_3D_HIGH_LIGHT",skin); checkSkinColor(gui::EGDC_3D_LIGHT,L"Skin/Global/EGDC_3D_LIGHT",skin); checkSkinColor(gui::EGDC_ACTIVE_BORDER,L"Skin/Global/EGDC_ACTIVE_BORDER",skin); checkSkinColor(gui::EGDC_ACTIVE_CAPTION,L"Skin/Global/EGDC_ACTIVE_CAPTION",skin); checkSkinColor(gui::EGDC_APP_WORKSPACE,L"Skin/Global/EGDC_APP_WORKSPACE",skin); checkSkinColor(gui::EGDC_BUTTON_TEXT,L"Skin/Global/EGDC_BUTTON_TEXT",skin); checkSkinColor(gui::EGDC_GRAY_TEXT,L"Skin/Global/EGDC_GRAY_TEXT",skin); checkSkinColor(gui::EGDC_HIGH_LIGHT_TEXT,L"Skin/Global/EGDC_HIGH_LIGHT_TEXT",skin); checkSkinColor(gui::EGDC_INACTIVE_BORDER,L"Skin/Global/EGDC_INACTIVE_BORDER",skin); checkSkinColor(gui::EGDC_INACTIVE_CAPTION,L"Skin/Global/EGDC_INACTIVE_CAPTION",skin); checkSkinColor(gui::EGDC_TOOLTIP,L"Skin/Global/EGDC_TOOLTIP",skin); checkSkinColor(gui::EGDC_TOOLTIP_BACKGROUND,L"Skin/Global/EGDC_TOOLTIP_BACKGROUND",skin); checkSkinColor(gui::EGDC_SCROLLBAR,L"Skin/Global/EGDC_SCROLLBAR",skin); checkSkinColor(gui::EGDC_WINDOW,L"Skin/Global/EGDC_WINDOW",skin); checkSkinColor(gui::EGDC_WINDOW_SYMBOL,L"Skin/Global/EGDC_WINDOW_SYMBOL",skin); checkSkinColor(gui::EGDC_ICON,L"Skin/Global/EGDC_ICON",skin); checkSkinColor(gui::EGDC_ICON_HIGH_LIGHT,L"Skin/Global/EGDC_ICON_HIGH_LIGHT",skin); checkSkinSize(gui::EGDS_WINDOW_BUTTON_WIDTH, L"Skin/Global/WindowButton",L"width",skin); checkSkinSize(gui::EGDS_TITLEBARTEXT_DISTANCE_X, L"Skin/Global/Caption",L"tbardistancex",skin); checkSkinSize(gui::EGDS_TITLEBARTEXT_DISTANCE_Y, L"Skin/Global/Caption",L"tbardistancey",skin); return skin; }