#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Pango

class App(Gtk.Window):
    def __init__(self):
        super().__init__(title='Font Size Tool')
        self.set_default_size(500, 360)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8)
        vbox.set_margin_top(12); vbox.set_margin_bottom(12)
        vbox.set_margin_start(12); vbox.set_margin_end(12)
        self.add(vbox)
        grid = Gtk.Grid(column_spacing=8, row_spacing=8)
        grid.attach(Gtk.Label(label='Text:', xalign=0), 0, 0, 1, 1)
        self.text_entry = Gtk.Entry()
        self.text_entry.set_text('Hello, World!')
        self.text_entry.connect('changed', self.update)
        grid.attach(self.text_entry, 1, 0, 2, 1)
        grid.attach(Gtk.Label(label='Font:', xalign=0), 0, 1, 1, 1)
        ctx = self.get_pango_context()
        self.font_sel = Gtk.ComboBoxText()
        families = sorted([f.get_name() for f in ctx.list_families()])[:50]
        for f in families: self.font_sel.append_text(f)
        self.font_sel.set_active(0)
        self.font_sel.connect('changed', self.update)
        grid.attach(self.font_sel, 1, 1, 2, 1)
        grid.attach(Gtk.Label(label='Size (pt):', xalign=0), 0, 2, 1, 1)
        self.size_slider = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, 8, 72, 1)
        self.size_slider.set_value(24)
        self.size_slider.connect('value-changed', self.update)
        grid.attach(self.size_slider, 1, 2, 2, 1)
        self.info_lbl = Gtk.Label(label='', xalign=0)
        grid.attach(self.info_lbl, 0, 3, 3, 1)
        vbox.pack_start(grid, False, False, 0)
        frame = Gtk.Frame(label='Preview')
        sw = Gtk.ScrolledWindow()
        self.preview = Gtk.Label(label='Hello, World!', xalign=0, wrap=True)
        sw.add(self.preview)
        frame.add(sw)
        vbox.pack_start(frame, True, True, 0)
        self.update()
    def update(self, *_):
        txt = self.text_entry.get_text()
        font = self.font_sel.get_active_text() or 'Sans'
        sz = int(self.size_slider.get_value())
        px = round(sz * 96 / 72, 1)
        self.info_lbl.set_text(f'{font}  {sz}pt  ≈ {px}px')
        self.preview.set_text(txt)
        self.preview.override_font(Pango.FontDescription(f'{font} {sz}'))

win = App()
win.connect('destroy', Gtk.main_quit)
win.show_all()
Gtk.main()
