From a3b99bace5a3a23a72492e58d8275cd10f005398 Mon Sep 17 00:00:00 2001
From: morkolai <nikolai-mork@live.no>
Date: Sat, 25 Apr 2020 16:03:32 +0200
Subject: [PATCH] #96 WIP Laget module base funksjoner

---
 soitool/media/phonetable.png        | Bin 0 -> 10068 bytes
 soitool/modules/module_phonebook.py |  63 ++++++++++++++++++++++------
 2 files changed, 50 insertions(+), 13 deletions(-)
 create mode 100644 soitool/media/phonetable.png

diff --git a/soitool/media/phonetable.png b/soitool/media/phonetable.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e699d71b68a4b6f7ccb259efbbebd341dcdbdde
GIT binary patch
literal 10068
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

literal 0
HcmV?d00001

diff --git a/soitool/modules/module_phonebook.py b/soitool/modules/module_phonebook.py
index 5ca1a39..4625f58 100644
--- a/soitool/modules/module_phonebook.py
+++ b/soitool/modules/module_phonebook.py
@@ -10,7 +10,7 @@ from PySide2.QtWidgets import (
     QCheckBox,
 )
 from PySide2.QtCore import Qt, QSize
-from PySide2.QtGui import QKeySequence, QBrush, QColor
+from PySide2.QtGui import QKeySequence, QBrush, QColor, QIcon
 from soitool.modules.module_base import (
     ModuleBase,
     HEADLINE_FONT,
@@ -303,24 +303,61 @@ class PhonebookModule(ModuleBase, QWidget, metaclass=Meta):
     #   !!!!! MODULE BASE OPERATIONS !!!!!
 
     def get_size(self):
-        return super().get_size()
+        """Getter for module size.
+
+        Returns
+        -------
+        tupple
+            Size of the module (width, height)
+        """
+        self.resize()
+        return (self.minimumWidth, self.minimumHeight)
 
     def get_data(self):
-        return super().get_data()
+        """Get module content as serialized data.
+
+        Returns
+        -------
+        dict
+            Serialized module content.
+        """
+
+        data = {}
+
+        for column_index in range(self.table.columnCount()):
+            self.table.setCurrentCell(0, column_index)
+            header = self.table.currentItem().text()
+            if self.selected_columns[header]:
+                row_data = []
+                for row_index in range(1, self.table.rowCount()):
+                    self.table.setCurrentCell(row_index, column_index)
+                    row_item = self.table.currentItem()
+                    if row_item:
+                        row_data.append(row_item.text())
+                    else:
+                        row_data.append("")
+                data[header] = row_data
+
+        return data
 
     @staticmethod
     def get_user_friendly_name():
-        pass
+        """Get user friendly name.
+
+        Returns
+        -------
+        string
+            User friendly name.
+        """
+        return "Telefonliste"
 
     @staticmethod
     def get_icon():
-        pass
+        """Get icon.
 
-
-if __name__ == "__main__":
-    from PySide2.QtWidgets import QApplication
-
-    app = QApplication()
-    module = PhonebookModule()
-    module.show()
-    app.exec_()
+        Returns
+        -------
+        QIcon
+            Picture of module.
+        """
+        return QIcon("soitool/media/phonetable.png")
-- 
GitLab