diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 0279790c2c27adf30dedab4a4336b08faa749e24..16d6a69c0b6e672b32a4c2945bd749b7cd4bde02 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -347,7 +347,7 @@ of Bar (Listing [[sql-bar]] and [[sql-foo]]). #+end_src #+NAME: sql-foo -#+CAPTION: Exemple of class Foo inherits SQLSubModel. +#+CAPTION: Exemple of class Foo inherits SQLSubModel and contains a list of Bar object (Listing [[sql-bar]]). #+begin_src python :python python3 :results output :noweb yes class Foo(SQLSubModel): _id_cnt = 0 @@ -420,11 +420,119 @@ basic methods for object dictionary in Model. This class is like PamhyrModelList but use a dictionary instead of list. ** TODO View -*** TODO UI file -*** TODO Translate -*** TODO Window + +Pamhyr2 use Qt as graphical user interface library with the +application "Qt designer" for windows or widget creation (see [[UI file]]) +and "Qt linguist" for interface translate (see [[Translate]]). In +addition, we use matplotlib as ploting library (see [[Plot]]). + +Typically, each model componant have an associated window in +application to add, delete or edit this componant. At top level of +View directory we found the =MainWindow.py= file and some +sub-directories. A view sub-directory contains: A =Window.py= file, a +=Table.py= file with table model definition if nessessary, one or more +=Plot*.py= file with plot class definition, a =translate.py= file with +componant translate, and possible other files or sub-directories. + +*** UI file + +We define as possible all Pamhyr2 windows and custom widgets with "Qt +designer". This application generate UI file who describes interface +organisation with table, layout, button, etc. This method is faster +than hand made windows and widget creation, and saves us some purely +descriptive code. The UI files are saved into =src/View/ui= for +window, and =/src/View/ui/Widgets= for custom widget. + +*** Window + +An abstract class ASubMainWindow is used for most of Pamhyr2 +windows. This class implemente some useful method allows to easy load +an window UI file. In addition, the abstract ListedSubWindow must be +also inherits by a window class, it is allow to keep a list of open +windows and avoid window duplicate. + +#+NAME: window +#+CAPTION: Example of Pamhyr2 window +#+begin_src python :python python3 :results output :noweb yes + class MyWindow(ASubMainWindow, ListedSubWindow): + def __init__(self, title="My window", + study=None, config=None, parent=None): + self._study = study + self._config = config + self._parent = parent + + self._title = title + " - " + study.name + + super(MyWindow, self).__init__( + name=title, # The windows name for windows + # registration (avoid duplicate) + ui="My", # The ui file name (here "My.ui") + parent=parent # The parent window + ) + # Set Windows title + self.ui.setWindowTitle(self._title) + + self.setup_table() + self.setup_connections() + + def setup_table(self): + # Init table(s)... + + def setup_connections(self): + # Init action connection(s)... + + # ... +#+end_src + +Typically we called method =setup_*=, the method to initialize some +window componants or connections. + +*** Table + +An abstract class PamhyrTableModel is available to define a simple +QAbstractTableModel shortly. In simple cases, there are only =data= +and =setData= methode to implement, but the constructor needs more +information than a classic QAbstractTableModel class. + +#+begin_src python :python python3 :results output :noweb yes + # Table headers with display name translatable (translate.py) + table_headers = { + "foo": _translate("My", "Foo"), + "bar": _translate("My", "Bar"), + "baz": _translate("My", "Baz"), + } + + def retranslate(): + # Hack because dict definition is not able to be + # translate... (need to be called in window '__init__') + table_headers["foo"] = _translate("My", "Foo") + table_headers["bar"] = _translate("My", "Bar") + table_headers["baz"] = _translate("My", "Baz") + + # Table model definition (Table.py) + class MyTableModel(PamhyrTableModel): + def data(self, index, role): + # Retrun data at INDEX... + + @pyqtSlot() + def setData(self, index, value, role=Qt.EditRole): + # Set VALUE at INDEX... + + # Table model creation (Window.py) + self._model = MyTableModel( + table_view = table, # The table view object + table_headers = table_headers, # The table column headers dict + # (with traduction) + editable_headers = ["foo", "bar"], # List of editable column name + delegates = { + "bar": self.my_delegate, # Custom delegate for column 'bar' + }, + data = self._my_lst, # The data + undo = self._undo_stack, # The undo command stack + ) +#+end_src + *** TODO UndoCommand -*** TODO Table *** TODO Plot *** TODO Mainwindow ** TODO Solver