Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Masaüstü istemci

Açıklama

Sekmeler, bölmeler ve yerleşim

Masaüstü ana penceresi, kenar çubuğu, bölmeler, sekme yöneticisi ve bölme denetleyicisinin ekranları açması, izlemesi ve saklaması.

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, PaneContainer ve ChatWidget bileşenlerini tek bir yatay ayırıcıya, altına da StatusBarWidget yerleş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).
  • TabManager her sekme için bir TabDescriptor tutar, 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).
  • PaneContainer bölmeleri iç içe QSplitter bileşenlerinde böler ve yerleşimi, açık bölüm sekmeleriyle birlikte, yerel panes/layout ayarına kaydeder (src/cluster_erp/desktop/widgets/pane_container.py:28, src/cluster_erp/desktop/widgets/pane_container.py:261-272).
  • PaneController aynı 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):

  1. Bu istemcinin kurabildiği özel bölüm anahtarları kümesiyle oluşturulan Sidebar (src/cluster_erp/desktop/widgets/main_window.py:79-86).
  2. Tek bölmeli PaneContainer; bu bölme app modül adı ve welcome bölümü altında bir karşılama sekmesi alır (src/cluster_erp/desktop/widgets/main_window.py:88-101).
  3. Gösterilip gizlenebilen ChatWidget (src/cluster_erp/desktop/widgets/main_window.py:103-112, src/cluster_erp/desktop/widgets/main_window.py:217-229).
  4. StatusBarWidget ve PaneController (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 custom bölümdür.
  • Kullanıcının sahip olmadığı bir required_permission adlandırır.
  • Kullanıcının <entity>.read izni olmayan bir list bölümüdür ya da hiçbir sekme için <tab>.read izni olmayan bir settings bö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:

  1. Çağıran ekran bileşenini kurar ve open_tab iş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).
  2. find_existing aynı 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).
  3. Yoksa bir TabDescriptor saklanır, sekme eklenir ve etkinleştirilir, bileşen tab_id özelliğini alır ve sekmeye özel bir kapatma düğmesi yerleştirilir (src/cluster_erp/desktop/core/tab_manager.py:110-125).
  4. 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). GenericDetailView bunu formu değiştiğinde yapar ve kaydetmeden sonra temizler (src/cluster_erp/desktop/widgets/generic/generic_detail_view.py:571-588).
  5. Kirli bir sekmede close_tab, common.unsaved_changes ile sorar. Zorlanmış kapatma soruyu atlar (src/cluster_erp/desktop/core/tab_manager.py:139-161). close_all_tabs, tabs.close_all_unsaved ile 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-105 iç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-356 iç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-43 içindeki yorum, kenar çubuğunun asla bir yer tutucuya götürmediğini belirtir.
  • open_entity sinyalini pencerenin işlemesi: src/cluster_erp/desktop/widgets/main_window.py:273-280 iç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, widget ve is_dirty alanlı bir tanımlayıcıyı ister. TabDescriptor tam 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_pane bir tane oluşturur (src/cluster_erp/desktop/widgets/pane_container.py:75-83).

Diğer parçalarla etkileşim

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_ui dil 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).
  • PaneWidget sekme bileşenini kapatılabilir yapar; hemen ardından oluşturulan TabManager onu 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


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13