Програми для обліку

Українське програмне забезпечення з відкритим кодом

Gtk

Дописи

Програмування / Gtk

30.05.2024 16:43 Gtk

Приклад програми на C# з використанням GtkSharp | Notebook

Демонстрація роботи з віджетом Notebook

Віджет Notebook дозволяє створювати безліч сторінок з різним наповненням.

В даному прикладі продемонстровано добавлення нових сторінок, закриття і запам'ятовування послідовності переключення сторінок. Для зручності закриття сторінки в заголовок додано іконку, клік по якій закриває її. Після закриття сторінки активною стає сторінка яка була відкрита раніше.

Gtk form

Для програмування використовую Visual Studio Code.
Лінки на програми внизу допису.

В програмі Visual Studio Code створюємо новий проект
dotnet new console

Додаємо до проекту пакет GtkSharp
dotnet add package GtkSharp

Запуск програми
dotnet run

Program.cs
using Gtk;

class Program
{
    public static void Main()
    {
        Application.Init();
        new FirstWindow();
        Application.Run();
    }

    public static void Quit()
    {
        Application.Quit();
    }
}
FirstWindow.cs
using Gtk;

class FirstWindow : Window
{
    Notebook notebook = new()
    {
        Scrollable = true,
        EnablePopup = true,
        BorderWidth = 0,
        ShowBorder = false,
        TabPos = PositionType.Top
    };

    //Список для збереження історії послідовності відкриття вкладок
    List<string> historyNotebookSwitchList = [];

    public FirstWindow() : base("Test")
    {
        SetDefaultSize(800, 900);
        SetPosition(WindowPosition.Center);
        Maximize();

        DeleteEvent += delegate { Program.Quit(); };

        VBox vBox = new VBox();
        Add(vBox);

        HBox hBoxButton = new HBox();
        vBox.PackStart(hBoxButton, false, false, 5);

        Button buttonAddPage = new Button("Додати сторінку");
        buttonAddPage.Clicked += OnAddPage;
        hBoxButton.PackStart(buttonAddPage, false, false, 5);

        HBox hBox = new HBox();
        vBox.PackStart(hBox, true, true, 0);

        hBox.PackStart(notebook, true, true, 0);
        notebook.SwitchPage += OnSwitchPageNotebook;

        ShowAll();
    }

    void OnAddPage(object? sender, EventArgs args)
    {
        //Функція яка будує вміст сторінки блокноту
        static Widget func()
        {
            VBox vBox = new VBox();

            HBox hBox = new HBox();
            vBox.PackStart(hBox, false, false, 0);

            hBox.PackStart(new Label("Test"), false, false, 5);

            return vBox;
        }

        CreateNotebookPage("Нова сторінка", func, false);
    }

    //Переключення сторінок блокноту
    void OnSwitchPageNotebook(object? sender, SwitchPageArgs args)
    {
        string currPageUID = args.Page.Name;

        if (historyNotebookSwitchList.Contains(currPageUID))
            historyNotebookSwitchList.Remove(currPageUID);

        /* Поточна сторінка ставиться у кінець списку */
        historyNotebookSwitchList.Add(currPageUID);
    }

    // Створити сторінку в блокноті.
    // Код сторінки задається в назву віджета - widget.Name = codePage;
    void CreateNotebookPage(string tabName, Func<Widget>? pageWidget, bool insertPage = false)
    {
        int numPage;
        string codePage = Guid.NewGuid().ToString();

        ScrolledWindow scroll = new() { ShadowType = ShadowType.In, Name = codePage };
        scroll.SetPolicy(PolicyType.Automatic, PolicyType.Automatic);

        HBox hBoxLabel = CreateLabelPageWidget(tabName, codePage, notebook);

        if (insertPage)
            numPage = notebook.InsertPage(scroll, hBoxLabel, notebook.CurrentPage);
        else
            numPage = notebook.AppendPage(scroll, hBoxLabel);

        //Переміщення сторінок
        notebook.SetTabReorderable(scroll, true);

        if (pageWidget != null)
        {
            Widget widget = pageWidget.Invoke();
            scroll.Add(widget);

            widget.Name = codePage;
        }

        notebook.ShowAll();
        notebook.CurrentPage = numPage;
        notebook.GrabFocus();
    }

    // Заголовок сторінки блокноту
    HBox CreateLabelPageWidget(string caption, string codePage, Notebook notebook)
    {
        HBox hBoxLabel = new HBox();

        //Ico
        hBoxLabel.PackStart(new Image(Stock.File, IconSize.Menu), false, false, 2);

        //Текст
        Label label = new() { Text = caption, TooltipText = caption, Expand = false, Halign = Align.Start };
        hBoxLabel.PackStart(label, false, false, 2);

        //Лінк закриття сторінки
        LinkButton lbClose = new("Закрити", "")
        {
            Image = new Image(Stock.Close, IconSize.Menu),
            AlwaysShowImage = true,
            Name = codePage
        };

        lbClose.Clicked += (object? sender, EventArgs args) =>
        {
            CloseNotebookPageToCode(notebook, ((Widget)sender!).Name);
        };

        hBoxLabel.PackEnd(lbClose, false, false, 0);
        hBoxLabel.ShowAll();

        return hBoxLabel;
    }

    // Закрити сторінку блокноту по коду
    void CloseNotebookPageToCode(Notebook notebook, string codePage)
    {
        notebook.Foreach(
            (Widget wg) =>
            {
                if (wg.Name == codePage)
                {
                    if (historyNotebookSwitchList.Contains(codePage))
                        historyNotebookSwitchList.Remove(codePage);

                    if (historyNotebookSwitchList.Count > 0)
                        CurrentNotebookPageToCode(notebook, historyNotebookSwitchList[historyNotebookSwitchList.Count - 1]);

                    notebook.DetachTab(wg);
                }
            });
    }

    // Встановлення поточної сторінки по коду
    void CurrentNotebookPageToCode(Notebook notebook, string codePage)
    {
        int counter = 0;

        notebook.Foreach(
            (Widget wg) =>
            {
                if (wg.Name == codePage)
                    notebook.CurrentPage = counter;

                counter++;
            });
    }
}

Visual Studio Code


© accounting.org.ua - 2024