Home  Contents

Menus in GTK#

فى هذه الجزئية سنتحدث على القوائم

شريط القوائم احد اوضح الأجزاء فى واجهة التطبيق، هو مجموعة من الأوامر المرتبطة موجودة فى قوائم. فى تطبيق الكونسول كنت تحتاج لتذكر كل هذه الأوامر، ولكن هنا نجدها مجمعة فى اماكن منطقية



Simple menu

فى المثال الأول، سننشئ شريط قوائم وبقائمة file والتى تحوى بدورها على عنصر واحد عند اختياره يتم غلق التطبيق



simplemenu.cs
 
using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Simple menu")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        MenuBar mb = new MenuBar();

        Menu filemenu = new Menu();
        MenuItem file = new MenuItem("File");
        file.Submenu = filemenu;
       
        MenuItem exit = new MenuItem("Exit");
        exit.Activated += OnActivated;
        filemenu.Append(exit);

        mb.Append(file);

        VBox vbox = new VBox(false, 2);
        vbox.PackStart(mb, false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnActivated(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

مثال بسيط على وظائف شريط الأدوات

 MenuBar mb = new MenuBar();

انشاء الشريط

 Menu filemenu = new Menu();
 MenuItem file = new MenuItem("File");
 file.Submenu = filemenu;

انشاء العنصر العلوى file اللذى سيحوى قائمة filemenu

 MenuItem exit = new MenuItem("Exit");
 exit.Activated += OnActivated;
 filemenu.Append(exit);

انشاء العنصر exit واضافته للfilemenu



 mb.Append(file);

اضافة العنصر العلوى لشريط القوائم

 VBox vbox = new VBox(false, 2);
 vbox.PackStart(mb, false, false, 0);

بعكس الtoolkits الأخرى، يجب علينا الإهتمام بإدارة المخططات بنفسنا، فنضع شريط القوائم فى صندوق رأسى




Simple menu

Figure: Simple menu



Image menu

فى المثال التالى، سنستكشف القوائم اكثر.. سنضيف صورا ومسرعات -اختصارات- لعناصر القائمة



imagemenu.cs
 
using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Image menu")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        MenuBar mb = new MenuBar();

        Menu filemenu = new Menu();
        MenuItem file = new MenuItem("File");
        file.Submenu = filemenu;
       
        AccelGroup agr = new AccelGroup();
        AddAccelGroup(agr);

        ImageMenuItem newi = new ImageMenuItem(Stock.New, agr);
        newi.AddAccelerator("activate", agr, new AccelKey(
            Gdk.Key.n, Gdk.ModifierType.ControlMask, AccelFlags.Visible));
        filemenu.Append(newi);

        ImageMenuItem open = new ImageMenuItem(Stock.Open, agr);
        open.AddAccelerator("activate", agr, new AccelKey(
            Gdk.Key.n, Gdk.ModifierType.ControlMask, AccelFlags.Visible));
        filemenu.Append(open);

        SeparatorMenuItem sep = new SeparatorMenuItem();
        filemenu.Append(sep);

        ImageMenuItem exit = new ImageMenuItem(Stock.Quit, agr);
        exit.AddAccelerator("activate", agr, new AccelKey(
            Gdk.Key.q, Gdk.ModifierType.ControlMask, AccelFlags.Visible));

        exit.Activated += OnActivated;
        filemenu.Append(exit);

        mb.Append(file);

        VBox vbox = new VBox(false, 2);
        vbox.PackStart(mb, false, false, 0);
        vbox.PackStart(new Label(), false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnActivated(object sender, EventArgs args)
    {
        Application.Quit();
    }


    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

مثالنا يعرض قائمة علوية تحوى 3 عناصر فرعية كل منها له صورة ومسرع، المسرع لعنصر quit مفعل



 AccelGroup agr = new AccelGroup();
 AddAccelGroup(agr);

للعمل مع المسرعات.. ننشئ كائن عام من الصف AccelGroup.. سنستخدمه لاحقا

 ImageMenuItem newi = new ImageMenuItem(Stock.New, agr);

انشاء العنصر، والصورة تأتى من ال Stock وهى صورة ملف جديد

 exit.AddAccelerator("activate", agr, new AccelKey(
     Gdk.Key.q, Gdk.ModifierType.ControlMask, AccelFlags.Visible));

هذا ينشئ مسرع -اختصار- من الزرين كنترول و Q للعنصر exit

 SeparatorMenuItem sep = new SeparatorMenuItem();
 filemenu.Append(sep);

السابق ينشئ عنصر فاصل، ليتم تقسيم العناصر لمجموعات منطقية
Image menu

Figure: Image menu



CheckMenuItem

يستخدم فى اضافة عنصر قابل للتنشيط، يستخدم للقيم المنطقية كال CheckButton



checkmenuitem.cs

using Gtk;
using System;
 
class SharpApp : Window {
 
    private Statusbar statusbar;

    public SharpApp() : base("Check menu item")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        MenuBar mb = new MenuBar();

        Menu filemenu = new Menu();
        MenuItem file = new MenuItem("File");
        file.Submenu = filemenu;

        Menu viewmenu = new Menu();
        MenuItem view = new MenuItem("View");
        view.Submenu = viewmenu;

        CheckMenuItem stat = new CheckMenuItem("View Statusbar");
        stat.Toggle();
        stat.Toggled += OnStatusView;
        viewmenu.Append(stat);
       
        MenuItem exit = new MenuItem("Exit");
        exit.Activated += OnActivated;
        filemenu.Append(exit);

        mb.Append(file);
        mb.Append(view);

        statusbar = new Statusbar();
        statusbar.Push(1, "Ready");

        VBox vbox = new VBox(false, 2);
        vbox.PackStart(mb, false, false, 0);
        vbox.PackStart(new Label(), true, false, 0);
        vbox.PackStart(statusbar, false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnStatusView(object sender, EventArgs args)
    {
        CheckMenuItem item = (CheckMenuItem) sender;

        if (item.Active) {
            statusbar.Show();
        } else {
            statusbar.Hide();
        }
    }
 
    void OnActivated(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

فى مثالنا نعرض عنصر قابل للتنشيط ، وفى حال تنشيطه سيتم اظهار شريط الحالة وإلا سيكون مخفى



CheckMenuItem stat = new CheckMenuItem("View Statusbar");

انشاء الكائن

 stat.Toggle();

الطريقة Toggle تعكس حالته

 if (item.Active) {
     statusbar.Show();
 } else {
     statusbar.Hide();
 }

بناءا على حالة العنصر يتم تحديد حالة شريط الحالة


CheckMenuItem

Figure: CheckMenuItem



Submenu

فى مثالنا الأخير سنتعرض لكيفية انشاء قائمة فرعية فى GTK#

submenu.cs

using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Submenu")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        MenuBar mb = new MenuBar();

        Menu filemenu = new Menu();
        MenuItem file = new MenuItem("File");
        file.Submenu = filemenu;

        // submenu creation
        Menu imenu = new Menu();

        MenuItem import = new MenuItem("Import");
        import.Submenu = imenu;

        MenuItem inews = new MenuItem("Import news feed...");
        MenuItem ibookmarks = new MenuItem("Import bookmarks...");
        MenuItem imail = new MenuItem("Import mail...");

        imenu.Append(inews);
        imenu.Append(ibookmarks);
        imenu.Append(imail);

        // exit menu item
        MenuItem exit = new MenuItem("Exit");
        exit.Activated += OnActivated;
       
        filemenu.Append(import);
        filemenu.Append(exit);
        mb.Append(file);

        VBox vbox = new VBox(false, 2);
        vbox.PackStart(mb, false, false, 0);
        vbox.PackStart(new Label(), false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnActivated(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

انشاء القائمة الفرعية

 Menu imenu = new Menu();

القائمة الفرعية هى قائمة لذا تنشئ من الصف Menu

 MenuItem import = new MenuItem("Import");
 import.Submenu = imenu;

وتكون هى القائمة الفرعية لعنصر ما، فنستطيع تحديد ذلك من الخاصية Submenu

 MenuItem inews = new MenuItem("Import news feed...");
 MenuItem ibookmarks = new MenuItem("Import bookmarks...");
 MenuItem imail = new MenuItem("Import mail...");

 imenu.Append(inews);
 imenu.Append(ibookmarks);
 imenu.Append(imail);

للقائمة الفرعية مجموعة من العناصر داخلها


Submenu

Figure: Submenu



فى هذه الجزئية تعرضنا لإنشاء القوائم فى GTK#



Home ‡ Contents ‡ Top of Page