mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 09:56:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from docutils import nodes
 | 
						|
from docutils.parsers.rst import Directive, directives
 | 
						|
 | 
						|
class OMWSettingDirective(Directive):
 | 
						|
    has_content = True
 | 
						|
    option_spec = {
 | 
						|
        'title': directives.unchanged_required,
 | 
						|
        'type': directives.unchanged_required,
 | 
						|
        'range': directives.unchanged,
 | 
						|
        'default': directives.unchanged,
 | 
						|
        'location': directives.unchanged,
 | 
						|
    }
 | 
						|
 | 
						|
    badge_map = {
 | 
						|
        'float32': 'bdg-secondary', 'float64': 'bdg-muted',
 | 
						|
        'int': 'bdg-primary', 'uint': 'bdg-light',
 | 
						|
        'string': 'bdg-success', 'boolean': 'bdg-warning',
 | 
						|
        'color': 'bdg-info',
 | 
						|
    }
 | 
						|
 | 
						|
    def run(self):
 | 
						|
        opts = self.options
 | 
						|
        title = opts['title']
 | 
						|
        type_tags = opts['type'].split('|')
 | 
						|
        badges = ' '.join(f':{self.badge_map.get(t)}:`{t}`' for t in type_tags)
 | 
						|
 | 
						|
        values = [
 | 
						|
            badges,
 | 
						|
            opts.get('range', ''),
 | 
						|
            opts.get('default', ''),
 | 
						|
            opts.get('location', ':bdg-danger:`user settings.cfg`')
 | 
						|
        ]
 | 
						|
 | 
						|
        table = nodes.table(classes=['omw-setting'])
 | 
						|
        tgroup = nodes.tgroup(cols=4)
 | 
						|
        table += tgroup
 | 
						|
        for _ in range(4):
 | 
						|
            tgroup += nodes.colspec(colwidth=20)
 | 
						|
 | 
						|
        thead = nodes.thead()
 | 
						|
        tgroup += thead
 | 
						|
        thead += nodes.row('', *[
 | 
						|
            nodes.entry('', nodes.paragraph(text=label))
 | 
						|
            for label in ['Type', 'Range', 'Default', 'Location']
 | 
						|
        ])
 | 
						|
 | 
						|
        tbody = nodes.tbody()
 | 
						|
        tgroup += tbody
 | 
						|
        row = nodes.row()
 | 
						|
 | 
						|
        for i, val in enumerate(values):
 | 
						|
            entry = nodes.entry()
 | 
						|
            inline, _ = self.state.inline_text(val, self.lineno)
 | 
						|
            if i == 2 and 'color' in type_tags:
 | 
						|
                rgba = [float(c) for c in opts['default'].split()]
 | 
						|
                style = f'background-color:rgba({rgba[0]*255}, {rgba[1]*255}, {rgba[2]*255}, {rgba[3]})'
 | 
						|
                chip = nodes.raw('', f'<span class="color-chip" style="{style}"></span>', format='html')
 | 
						|
                wrapper = nodes.container(classes=['type-color-wrapper'], children=[chip] + inline)
 | 
						|
                entry += wrapper
 | 
						|
            else:
 | 
						|
                entry += inline
 | 
						|
            row += entry
 | 
						|
        tbody += row
 | 
						|
 | 
						|
        desc = nodes.paragraph()
 | 
						|
        self.state.nested_parse(self.content, self.content_offset, desc)
 | 
						|
 | 
						|
        section = nodes.section(ids=[nodes.make_id(title)])
 | 
						|
        section += nodes.title(text=title)
 | 
						|
        section += table
 | 
						|
        section += desc
 | 
						|
        return [section]
 | 
						|
 | 
						|
def setup(app):
 | 
						|
    app.add_css_file("omw-directives.css")
 | 
						|
    app.add_directive("omw-setting", OMWSettingDirective)
 |