Masaüstü ana penceresi yan yana bir kenar çubuğu, bölünebilen bir bölme alanı ve bir sohbet panelinden oluşur. Her bölme sekmeler tutar ve her sekme bir ekran tutar. Bu sayfa src/cluster_erp/desktop/ altındaki widgets/main_window.py, widgets/sidebar.py, widgets/pane_container.py, widgets/pane_widget.py, core/tab_manager.py ve core/pane_controller.py dosyalarını açıklar. Sekmelerin içindeki ekranlar genel bileşenler ve modül ekranları sayfalarında açıklanır.
Kısaca¶
MainWindow;Sidebar,PaneContainerveChatWidgetbileşenlerini tek bir yatay ayırıcıya, altına daStatusBarWidgetyerleştirir (src/cluster_erp/desktop/widgets/main_window.py:69-137).- Kenar çubuğuna tıklamak bir bölüm sekmesi açar. Aynı bölüm herhangi bir bölmede zaten açıksa onun yerine o sekme etkinleştirilir (
src/cluster_erp/desktop/widgets/main_window.py:314-343). TabManagerher sekme için birTabDescriptortutar, aynı modül, bölüm ve kayıttan ikincisini reddeder ve kaydedilmemiş değişikliği olan bir sekmeyi kapatmadan önce sorar (src/cluster_erp/desktop/core/tab_manager.py:17-24,src/cluster_erp/desktop/core/tab_manager.py:87-161).PaneContainerbölmeleri iç içeQSplitterbileşenlerinde böler ve yerleşimi, açık bölüm sekmeleriyle birlikte, yerelpanes/layoutayarına kaydeder (src/cluster_erp/desktop/widgets/pane_container.py:28,src/cluster_erp/desktop/widgets/pane_container.py:261-272).PaneControlleraynı bölme ve sekme işlemlerini metin kimlikleri ve düz sözlüklerle sunar (src/cluster_erp/desktop/core/pane_controller.py:23-30).
Nasıl çalışır¶
Ana pencere¶
_setup_ui pencereyi soldan sağa kurar (src/cluster_erp/desktop/widgets/main_window.py:69-137):
- Bu istemcinin kurabildiği özel bölüm anahtarları kümesiyle oluşturulan
Sidebar(src/cluster_erp/desktop/widgets/main_window.py:79-86). - Tek bölmeli
PaneContainer; bu bölmeappmodül adı vewelcomebölümü altında bir karşılama sekmesi alır (src/cluster_erp/desktop/widgets/main_window.py:88-101). - Gösterilip gizlenebilen
ChatWidget(src/cluster_erp/desktop/widgets/main_window.py:103-112,src/cluster_erp/desktop/widgets/main_window.py:217-229). StatusBarWidgetvePaneController(src/cluster_erp/desktop/widgets/main_window.py:126-137).
_on_navigate, app modülünün dört ayrılmış bölümünü işler: settings tercihler iletişim kutusunu, accessibility erişilebilirlik iletişim kutusunu açar, chat sohbet panelini açıp kapatır ve logout onaydan sonra oturumu kapatır. Diğer her istek bir modül sekmesi açar (src/cluster_erp/desktop/widgets/main_window.py:188-201, src/cluster_erp/desktop/widgets/main_window.py:231-242).
Bir bölüm ekranının kurulması¶
_create_module_widget bölümü modülün kenar çubuğu metadata'sında bulur ve ekranı view_type değerine göre seçer (src/cluster_erp/desktop/widgets/main_window.py:347-381):
view_type |
Ekran | Kaynak |
|---|---|---|
list |
Bölümün varlığı için isteğe bağlı list_endpoint ile GenericListView |
src/cluster_erp/desktop/widgets/main_window.py:399-429 |
tree |
GenericTreeView |
src/cluster_erp/desktop/widgets/main_window.py:431-454 |
settings |
tabs içindeki her varlık anahtarı için bir sekmeyle GenericSettingsView |
src/cluster_erp/desktop/widgets/main_window.py:479-499 |
tabbed_list |
entity_tabs üzerinden kurulan GenericTabbedListView |
src/cluster_erp/desktop/widgets/main_window.py:456-477 |
custom |
_CUSTOM_WIDGET_REGISTRY içinden <module>.<custom_widget> olarak aranan ve ilk kullanımda içe aktarılan bir sınıf |
src/cluster_erp/desktop/widgets/main_window.py:501-553 |
Metadata'nın bildirmediği bir bölüm app.section_missing metniyle bir yer tutucu verir. Bildirilmiş ama kurulabilir ekranı olmayan bir bölüm app.not_implemented metnini verir (src/cluster_erp/desktop/widgets/main_window.py:353-357, src/cluster_erp/desktop/widgets/main_window.py:555-576). Bölüm metadata'sında bir description varsa, onu taşıyan bir satır ekranın üstüne eklenir (src/cluster_erp/desktop/widgets/main_window.py:383-397). Sekme başlığı geçerli dildeki bölüm etiketidir (src/cluster_erp/desktop/widgets/main_window.py:595-604).
Kenar çubuğu¶
Sidebar 200 piksel genişliğindedir (src/cluster_erp/desktop/widgets/sidebar.py:54). Görünen her modülün erişilebilir her bölümü için modül order sırasıyla bir düğme, gruplar arasında da bir ayırıcı listeler (src/cluster_erp/desktop/widgets/sidebar.py:159-215). Bir bölüm üç durumda gizlenir (src/cluster_erp/desktop/widgets/sidebar.py:217-240):
- Bu istemcinin kuramadığı bir
custombölümdür. - Kullanıcının sahip olmadığı bir
required_permissionadlandırır. - Kullanıcının
<entity>.readizni olmayan birlistbölümüdür ya da hiçbir sekme için<tab>.readizni olmayan birsettingsbölümüdür.
İzin listesi boş olduğunda her bölüm gösterilir (src/cluster_erp/desktop/widgets/sidebar.py:224-227). Uygulama kapsamının gizlediği modüller kenar çubuğuna hiç ulaşmaz; bkz. metadata deposu ve yabancı anahtar önbelleği. Sabit bir alt alan sohbet, Erişilebilirlik, Tercihler (anahtar sidebar.settings) ve Çıkış (anahtar auth.logout) düğmelerini tutar (src/cluster_erp/desktop/widgets/sidebar.py:112-151).
Sekme yaşam döngüsü¶
Durum diyagramı bir sekmeyi açılıştan kapanışa kadar gösterir.
stateDiagram-v2 [*] --> Built: çağıran bileşeni kurar Built --> Activated: find_existing aynı module, section, entity_id bulur Activated --> [*]: yeni bileşen deleteLater ile silinir Built --> Open: addTab, TabDescriptor saklanır Open --> Dirty: mark_dirty(True) Dirty --> Open: kaydetmeden sonra mark_dirty(False) Open --> Closed: close_tab Dirty --> Closed: close_tab ve kullanıcı onaylar Dirty --> Dirty: close_tab ve kullanıcı reddeder Closed --> [*]: removeTab, deleteLater, tanımlayıcı silinir
Sözcüklerle:
- Çağıran ekran bileşenini kurar ve
open_tabişlevini modül, bölüm, başlık ve isteğe bağlı kayıt kimliğiyle çağırır (src/cluster_erp/desktop/core/tab_manager.py:87-94). find_existingaynı modül, bölüm ve kayıt kimliğine sahip bir sekme arar. Varsa o sekme etkinleştirilir ve yeni bileşen silinir; böylece sinyal abonelikleri ve çalışanları sona erer (src/cluster_erp/desktop/core/tab_manager.py:95-108,src/cluster_erp/desktop/core/tab_manager.py:173-179).- Yoksa bir
TabDescriptorsaklanır, sekme eklenir ve etkinleştirilir, bileşentab_idözelliğini alır ve sekmeye özel bir kapatma düğmesi yerleştirilir (src/cluster_erp/desktop/core/tab_manager.py:110-125). - Kaydedilmemiş düzenlemesi olan bir ekran
mark_dirtyçağırır; bu, sekme metninin başına bir madde imi ekler (src/cluster_erp/desktop/core/tab_manager.py:181-189).GenericDetailViewbunu formu değiştiğinde yapar ve kaydetmeden sonra temizler (src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:571-588). - Kirli bir sekmede
close_tab,common.unsaved_changesile sorar. Zorlanmış kapatma soruyu atlar (src/cluster_erp/desktop/core/tab_manager.py:139-161).close_all_tabs,tabs.close_all_unsavedile bir kez sorar (src/cluster_erp/desktop/core/tab_manager.py:195-211).
Sekme çubuğunun sağ tık menüsü Tüm Sekmeleri Kapat (anahtar tabs.close_all) sunar (src/cluster_erp/desktop/widgets/pane_widget.py:211-220).
Kayıt sekmeleri¶
Kayıt kartları, bölümü varlık türü olan ve kayıt kimliği ayarlı sekmeler olarak açılır. Bir liste görünümü çift tıklamada bir tane açar (src/cluster_erp/desktop/widgets/generic/generic_list_view.py:395-431). MainWindow._on_open_entity, open_entity sinyali için etkin bölmede bir tane açar; gönderenin verdiği başlığı ya da varlık etiketini kullanır (src/cluster_erp/desktop/widgets/main_window.py:270-312). _on_navigate_to bir bölüm açar ve parametreleri, varsa ekranın apply_navigation yöntemine verir (src/cluster_erp/desktop/widgets/main_window.py:203-215).
Bölmeler¶
Her PaneWidget 2 piksellik bir etkinlik göstergesine, bölme, büyütme ve kapatma düğmeleri olan bir PaneBar bileşenine ve kendi TabManager nesnesinin yönettiği taşınabilir sekmeli bir QTabWidget bileşenine sahiptir (src/cluster_erp/desktop/widgets/pane_widget.py:105-167). Etkin olmayan bir bölmede fare basışı onu etkin yapar (src/cluster_erp/desktop/widgets/pane_widget.py:206-225). Odağın bir bölmeye geçmesi de onu etkin yapar (src/cluster_erp/desktop/widgets/pane_container.py:369-380).
split_pane, yön eşleşiyorsa yeni bölmeyi aynı ayırıcıda eskisinin yanına ekler, eşleşmiyorsa eski bölmeyi yeni bir ayırıcıya sarar ve ilk bölmede bir kök ayırıcı oluşturur. İki bölme eski boyutu eşit paylaşır (src/cluster_erp/desktop/widgets/pane_container.py:88-152). close_pane son bölmeyi kapatmayı reddeder, bölmede kaydedilmemiş sekme varsa sorar ve tek çocuğu kalan ayırıcıları kaldırır (src/cluster_erp/desktop/widgets/pane_container.py:154-188, src/cluster_erp/desktop/widgets/pane_container.py:323-346).
| Kısayol | Eylem | Kaynak |
|---|---|---|
Alt+[ |
Etkin bölmeyi sola ve sağa böl | src/cluster_erp/desktop/widgets/pane_container.py:387-391 |
Alt+] |
Etkin bölmeyi üste ve alta böl | src/cluster_erp/desktop/widgets/pane_container.py:393-397 |
Alt+Z |
Etkin bölmeyi kapat | src/cluster_erp/desktop/widgets/pane_container.py:399-401 |
Yerleşimin saklanması¶
MainWindow.closeEvent, herhangi bir bölmede kaydedilmemiş sekme varsa bir kez sorar. Ardından bölme yerleşimini, pencere geometrisini ve pencere durumunu kaydeder ve API istemcisini kapatır (src/cluster_erp/desktop/widgets/main_window.py:684-701). _serialize bölmeleri ve ayırıcıları yön ve boyutlarıyla iç içe sözlükler olarak yazar. Yalnızca bölüm sekmelerini tutar; kayıt sekmeleri atlanır (src/cluster_erp/desktop/widgets/pane_container.py:417-447). Açılışta restore_pane_layout ağacı yeniden kurar ve kayıtlı her bölümü aynı bileşen fabrikasıyla yeniden açar (src/cluster_erp/desktop/widgets/main_window.py:669-682, src/cluster_erp/desktop/widgets/pane_container.py:449-509). Eksik ya da bozuk bir kayıtlı yerleşim tek bir boş bölme bırakır (src/cluster_erp/desktop/widgets/pane_container.py:274-285, src/cluster_erp/desktop/widgets/pane_container.py:466-472).
Bölme denetleyicisi¶
PaneController kapsayıcıyı metin kimlikleriyle sarar. Bölmeleri ve sekmeleri listeler; bölmeleri böler, kapatır, büyütür, geri getirir ve etkinleştirir; sekmeleri açar, kapatır ve etkinleştirir ve yerleşimi kaydeder (src/cluster_erp/desktop/core/pane_controller.py:54-230). Belge dizgesi, bir asistanın ya da başka bir otomasyon katmanının çalışma alanını bu yolla bileşen başvurusu tutmadan yönetebileceğini belirtir (src/cluster_erp/desktop/core/pane_controller.py:24-30). MainWindow onu oluşturur ve pane_controller özelliği olarak sunar (src/cluster_erp/desktop/widgets/main_window.py:134-137, src/cluster_erp/desktop/widgets/main_window.py:182-184). src/cluster_erp/desktop/ içinde başka hiçbir kod onu çağırmaz.
Neden böyle kurulmuştur¶
- Yineleme algılamanın yeni bileşeni silmesi:
src/cluster_erp/desktop/core/tab_manager.py:100-105içindeki yorum, sahipsiz bileşenin aksi halde sinyal kaydını ve çalışanlarını görünmez bir görünüm olarak canlı tutacağını belirtir. - Eksik bölüm metadata'sının arıza olarak okunması:
src/cluster_erp/desktop/widgets/main_window.py:355-356içindeki yorum, sunucunun göndermediği bir bölümün yapılmamış bir özellik değil bir arıza olduğunu belirtir. - Özel bölümlerin kenar çubuğunda süzülmesi:
src/cluster_erp/desktop/widgets/sidebar.py:41-43içindeki yorum, kenar çubuğunun asla bir yer tutucuya götürmediğini belirtir. open_entitysinyalini pencerenin işlemesi:src/cluster_erp/desktop/widgets/main_window.py:273-280içindeki belge dizgesi, özel bir bileşenin sekme yöneticisi olmadığını ve bölmelerin sahibinin pencere olduğunu belirtir.
Kurallar ve sınırlar¶
- Projenin yazılı mühendislik kuralları yineleme algılamayı, kirli durum uyarılarını ve
tab_id,module,section,entity_id,title,widgetveis_dirtyalanlı bir tanımlayıcıyı ister.TabDescriptortam olarak bu alanlara sahiptir (src/cluster_erp/desktop/core/tab_manager.py:16-24). - Her zaman bir bölme vardır: liste boşsa
active_panebir tane oluşturur (src/cluster_erp/desktop/widgets/pane_container.py:75-83).
Diğer parçalarla etkileşim¶
- Ekranlar sekme sistemine yalnızca aldıkları
TabManagerüzerinden ya danavigate_toveopen_entitysinyalleriyle ulaşır; bkz. sinyal veri yolu ve watch_entity. - Web istemcisinde bölüm sekmelerinin karşılığı modül uygulamaları ve uygulama kapsamı sayfasında açıklanır. Sunucu tarafındaki yerleşim deposu kullanıcı arayüz durumu sayfasında açıklanır.
Sınırlar ve açık noktalar¶
- Kayıt sekmeleri kaydedilmez, bu yüzden yeniden başlatmadan sonra yeniden açılmaz (
src/cluster_erp/desktop/widgets/pane_container.py:421-422). _retranslate_uidil değişikliğinden sonra bölüm sekmelerini yeniden adlandırır ve kayıt sekmelerini değiştirmez (src/cluster_erp/desktop/widgets/main_window.py:636-648).PaneWidgetsekme bileşenini kapatılabilir yapar; hemen ardından oluşturulanTabManageronu kapatılamaz yapar ve kendi düğmesini ekler (src/cluster_erp/desktop/widgets/pane_widget.py:154,src/cluster_erp/desktop/core/tab_manager.py:84,src/cluster_erp/desktop/core/tab_manager.py:122-123).- Kenar çubuğunun başlık düğmesi bir emeği geçenler iletişim kutusu açar (
src/cluster_erp/desktop/widgets/sidebar.py:70-74).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| tab descriptor | TabDescriptor |
Sekme yöneticisinin açık bir sekme için tuttuğu kayıt. | sekme tanımlayıcı | src/cluster_erp/desktop/core/tab_manager.py:17 |
| tab manager | TabManager |
Bir bölmenin sekmelerini açan, yinelemeyi önleyen, işaretleyen ve kapatan nesne. | sekme yöneticisi | src/cluster_erp/desktop/core/tab_manager.py:73 |
| pane | PaneWidget |
Kendi sekme çubuğu ve sekme yöneticisi olan çalışma alanı parçası. | bölme | src/cluster_erp/desktop/widgets/pane_widget.py:99 |
| pane controller | PaneController |
Bölme ve sekme işlemleri için metin kimlikli arayüz. | bölme denetleyicisi | src/cluster_erp/desktop/core/pane_controller.py:23 |
| custom widget registry | _CUSTOM_WIDGET_REGISTRY |
module.custom_widget anahtarlarından elle yazılmış ekran sınıflarına eşlem. |
özel bileşen kaydı | src/cluster_erp/desktop/widgets/main_window.py:501 |
İlgili sayfalar¶
- Masaüstü istemci
- Genel bileşenler
- Modül ekranları
- Sinyal veri yolu ve watch_entity
- Kullanıcı arayüz durumu
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.