# 3. Yeni əlavələrin yazılması

Accerciser
-ə istədiyiniz funksiyaları əlavə etmə
Eitan Isaacson
eitan@ascender.com
Peter Parente
pparent@us.ibm.com
Aline Bessa
alibezz@gmail.com

Creative Commons Eyni Şərtlərlə Paylaş 3.0

Tərcümə: Ramal Rəhimov
jhonaluman@gmail.com 2025

# Accerciser üçün əlavələrin yazılması

Accerciser-ə yeni əlavələr əlavə etmək bu dərslik yazıldıqdan sonra daha da sadələşdi. Dərslik mövzunu ətraflı izah etdiyindən, bu bölmə əsasən onun orijinal məzmunundan ibarətdir – sadəcə kiçik redaktələr və yeniləmələr edilmişdir.

Accerciser üç əsas əlavə növünü dəstəkləyir:

Əsas əlavələr – Bu əlavələr Plugin əsas sinfindən törəmişdir. Onlar görünən interfeys təqdim etmirlər, lakin Accerciser-ə əlavə funksionallıq təmin edə bilərlər.

Konsol əlavələri – Bu əlavələr əlavələr panelindəki mətn sahəsinə sadə konsol çıxışı təmin edir. Onları paketlənmiş IPython Konsol Əlavəsi ilə qarışdırmayın.

Baxış paneli əlavələri – Accerciser-in əksər standart əlavələri bu növdəndir. Bunlar ayrıca vərəqdə xüsusi qrafik interfeys təqdim edir.

# Əsas Əlavənin Yaradılması

Sürətli Seçim Əlavəsi-nin sadələşdirilmiş versiyasını yaradacağıq. Bu əlavə Ctrl Alt E düymələrinə basıldıqda son fokuslanmış əlçatan elementi seçəcək.

Əvvəlcə istifadə edəcəyimiz import sətirləri bunlardır:

from accerciser.plugin import Plugin import gtk import pyatspi

Sonra Plugin əsas sinfindən yeni bir sinif yaradacağıq və ona bəzi vacib sinif atributlarını təyin edəcəyik:

class FocusSelect(Plugin): plugin_name = 'Fokus Seçimi' plugin_description = 'Son fokuslanmış əlçatan obyektin seçilməsinə imkan verir.'

İndi `init` metodunu yenidən müəyyən edəcəyik. Burada son fokuslanmış əlçatan obyektin seçilməsi üçün qlobal düymə əməliyyatı təyin edəcəyik, "fokus" hadisəsi üçün dinləyici qeydiyyatdan keçirəcəyik və last_focused dəyişənini None olaraq təyin edəcəyik.

def init(self): pyatspi.Registry.registerEventListener(self.accEventFocusChanged, 'focus') self.global_hotkeys = [('Son fokuslanmış əlçatan obyektə baxış', self.inspectLastFocused, gtk.keysyms.e, gtk.gdk.CONTROL_MASK | gtk.gdk.MOD1_MASK)] self.last_focused = None

global_hotkeys nümunə dəyişəninin siyahı şəklində qoşalılardan ibarət olduğunu nəzərə alın. Hər bir qoşalı qlobal qısayol əməliyyatını təmsil edir – bu əməliyyat təsviri, çağırılacaq metod, düymə simvolu və düymə dəyişdirici maskasından ibarətdir.

"fokus" hadisəsinin geri çağırılmasında, last_focused nümunə dəyişənini bu hadisəni göndərmiş əlçatan obyektlə doldururuq.

def accEventFocusChanged(self, event): if not self.isMyApp(event.source): self.last_focused = event.source

Qısayol düyməsinin əməliyyatı üçün geri çağırmada, əgər qeyd olunubsa, tətbiqdəki əsas düyünü son fokuslanmış əlçatan obyektlə yeniləyirik:

def inspectLastFocused(self): if self.last_focused: self.node.update(self.last_focused)

# Konsol Əlavəsinin Yaradılması

"Push button" (təzyiq düyməsi) roluna malik əlçatan element tərəfindən göndərilən fokus dəyişikliklərini göstərmək üçün konsol əlavəsi yaradacağıq — unutmayın ki, hər hansı bir elementin rolunu Accerciser vasitəsilə asanlıqla yoxlamaq olar; məsələn, bunu Tətbiq Ağacı Baxışında yoxlaya bilərsiniz.

Tələb olunan import sətirləri bunlardır:

from accerciser.plugin import ConsolePlugin import pyatspi

Sonra bir sinif təyin edirik və ona əlavənin adını və təsvirini əlavə edirik:

class PushButtonFocus(ConsolePlugin): plugin_name = 'Basılan Düymə Fokus' plugin_description = 'Basılan düymə fokuslandıqda hadisəni çap edir.'

init metodunu yenidən yazırıq və dinləyici qeydiyyatını əlavə edirik:

def init(self): pyatspi.Registry.registerEventListener(self.accEventFocusChanged, 'focus')

Geri çağırma metodunda bütün basılan düymə hadisələri çap olunur.

def accEventFocusChanged(self, event): if event.source.getRole() == pyatspi.ROLE_PUSH_BUTTON: self.appendText(str(event)+'\n')

# Qrafik Görünüşlü Əlavənin Yaradılması

AT-SPI Əməliyyat interfeysini dəstəkləyən və "click" adlı əməliyyatı olan əlçatan obyektlərdə

Əvvəlcə vacib olan bəzi import sətirləri:

import gtk from accerciser.plugin import ViewportPlugin

Sonra isə bir sinif təyini, adı və təsviri ilə birlikdə:

class Clicker(ViewportPlugin): plugin_name = 'Klikləyici' plugin_description = 'Əlçatan obyektlərdə "click" əməliyyatını yoxlayır.'

`init` metodunu yenidən yazırıq, burada bir istifadəçi interfeysi qururuq və düyməyə siqnal üçün geri çağırma funksiyası qoşuruq. Düymənin əlavənin səhifəsində ortalanması və bütün sahəni tutmaması üçün düzülüşü təyin edirik. Nəzərə alın ki, plugin_area dəyişəni `gtk.Frame` obyektidir və bu sahə bütün əlavə vidcetləri ilə doldurula bilər.

def init(self): self.click_button = gtk.Button('Klikləyin!') self.click_button.set_halign(gtk.Align.CENTER) self.click_button.set_valign(gtk.Align.CENTER) self.plugin_area.add(self.click_button)

self.click_button.connect('clicked', self.onClick)

self.show_all()

Bundan əlavə, cari seçilmiş əlçatan obyektin dəstəklədiyi əməliyyatların siyahısını qaytaran köməkçi metod yaratmışıq – əgər bu obyekt Action interfeysini dəstəkləmirsə, boş siyahı qaytarır:

def accSupportedActions(self): try: ai = self.node.acc.queryAction() except NotImplementedError: action_names = [] else: action_names = [ai.getName(i) for i in xrange(ai.nActions)] return action_names

Əsas əlavə sinifində `onAccChanged` adlı metod var və bu metod hədəf tətbiqin seçilmiş əlçatan obyektində dəyişiklik olduqda çağırılır. Bu metodu yenidən yazaraq düymənin yalnız cari obyektin "click" əməliyyatını dəstəklədiyi halda aktivləşməsini təmin edəcəyik:

def onAccChanged(self, acc): has_click = 'click' in self.accSupportedActions() self.click_button.set_sensitive(has_click)

Düymənin "clicked" siqnalı üçün geri çağırma funksiyası cari əlçatan obyekt üzərində "click" əməliyyatını icra edir. Bu funksiyanın yalnız düymə aktiv olduqda çağırıla biləcəyini bildiyimiz üçün, obyektin "click" əməliyyatına malik olub-olmadığını ayrıca yoxlamağa ehtiyac yoxdur.

def onClick(self, button): ai = self.node.acc.queryAction() action_names = [ai.getName(i) for i in xrange(ai.nActions)] ai.doAction(action_names.index('click'))