import tabs.Tab; import elements.GuiSkinElement; import elements.GuiListbox; import elements.GuiText; import elements.GuiPanel; from tabs.tabbar import newTab, switchToTab; Tab@ createSkinViewerTab() { return SkinViewer(); } class SkinViewerCommand : ConsoleCommand { void execute(const string& args) { Tab@ editor = createSkinViewerTab(); newTab(editor); switchToTab(editor); } }; void init() { addConsoleCommand("skin_viewer", SkinViewerCommand()); } class SkinViewer : Tab { dictionary skinStyles; GuiListbox@ styles; GuiPanel@ leftPanel; SkinStyle selStyle; uint eleCnt; array skinHeaders; array skinExamples; void draw() { //Draw the background skin.draw(SS_DesignOverviewBG, SF_Normal, AbsolutePosition); BaseGuiElement::draw(); } SkinViewer() { super(); title = "Skin Viewer"; @leftPanel = GuiPanel(this, Alignment(Left, Top, Right-0.25f, Bottom)); @styles = GuiListbox(this, Alignment(Right-0.25f, Top+0+4, Right-0-4, Bottom-0-4)); styles.required = true; updateStyles(); updateAbsolutePosition(); showSelectedStyle(); } void updateStyles() { getSkinStyles(skinStyles); styles.clearItems(); dictionary_iterator style = skinStyles.iterator(); string name; int64 value; while(style.iterate(name, value)) styles.addItem(name); } void addSkinExample(SkinStyle style, uint flags, Alignment@ alignment) { GuiSkinElement@ example = GuiSkinElement(leftPanel, recti(), 0); @example.alignment = alignment; example.style = style; example.flags = flags; skinExamples.insertLast(example); } void showStyle(SkinStyle style) { //Remove old ones for(uint i = 0; i < skinExamples.length; ++i) skinExamples[i].remove(); for(uint i = 0; i < skinHeaders.length; ++i) skinHeaders[i].remove(); skinExamples.length = 0; skinHeaders.length = 0; selStyle = style; //Add new ones eleCnt = skin.getStyleElementCount(style); int y = 0; for(uint i = 0; i < eleCnt; ++i) { uint flags = skin.getStyleElementFlags(style, i); //Add header GuiText@ txt = GuiText(leftPanel, recti(), getElementFlagName(flags)); @txt.alignment = Alignment(Left+4, Top+4 + y, Right-0.5f-4, Top+24 + y); skinHeaders.insertLast(txt); y += 32; //Add examples addSkinExample(style, flags, Alignment(Left+4, Top+4 + y, Right-0.5f-4, Top+250 + y)); addSkinExample(style, flags, Alignment(Left+4, Top+254 + y, Left+0.0f+20, Top+270 + y)); addSkinExample(style, flags, Alignment(Left+24, Top+254 + y, Left+0.0f+88, Top+318 + y)); addSkinExample(style, flags, Alignment(Left+92, Top+254 + y, Left+0.0f+292, Top+276 + y)); y += 326; } } void tick(double time) { if(skinStyles.getSize() != getSkinStyleCount()) updateStyles(); if(skin.getStyleElementCount(selStyle) != eleCnt) showStyle(selStyle); } void showSelectedStyle() { if(styles.selected >= 0) { int64 styleID; skinStyles.get(styles.getItem(styles.selected), styleID); showStyle(SkinStyle(styleID)); } } bool onGuiEvent(const GuiEvent& event) { if(event.type == GUI_Changed) { if(event.caller is styles) { showSelectedStyle(); return true; } } return BaseGuiElement::onGuiEvent(event); } }