Skip to content

Commit

Permalink
ui for configuring expression-based photo names
Browse files Browse the repository at this point in the history
  • Loading branch information
alexbruy committed Jun 29, 2023
1 parent 8a4149c commit 1ebd932
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 15 deletions.
33 changes: 33 additions & 0 deletions Mergin/attachment_fields_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem
from qgis.PyQt.QtCore import Qt
from qgis.core import QgsProject, QgsMapLayer


class AttachmentFieldsModel(QStandardItemModel):

LAYER_ID = Qt.UserRole + 1
FIELD_NAME = Qt.UserRole + 2
EXPRESSION = Qt.UserRole + 3

def __init__(self, parent=None):
super().__init__(parent)

layers = QgsProject.instance().mapLayers()
for layer_id, layer in layers.items():
if layer.type() != QgsMapLayer.VectorLayer:
continue

for field in layer.fields():
widget_setup = field.editorWidgetSetup()
if widget_setup.type() != "ExternalResource":
continue

if not widget_setup.config().get("DocumentViewer", 1):
continue

item = QStandardItem(f"{layer.name()} - {field.name()}")
item.setData(layer_id, AttachmentFieldsModel.LAYER_ID)
item.setData(field.name(), AttachmentFieldsModel.FIELD_NAME)
exp, ok = QgsProject.instance().readEntry("Mergin", f"PhotoNaming/{layer_id}/{field.name()}")
item.setData(exp, AttachmentFieldsModel.EXPRESSION)
self.appendRow(item)
35 changes: 35 additions & 0 deletions Mergin/project_settings_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from qgis.PyQt.QtWidgets import QFileDialog
from qgis.core import QgsProject
from qgis.gui import QgsOptionsWidgetFactory, QgsOptionsPageWidget
from .attachment_fields_model import AttachmentFieldsModel
from .utils import icon_path, mergin_project_local_path

ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "ui", "ui_project_config.ui")
Expand Down Expand Up @@ -56,6 +57,11 @@ def __init__(self, parent=None):
else:
self.selective_sync_group.setEnabled(False)

self.model = AttachmentFieldsModel()
self.list_fields.setModel(self.model)
self.list_fields.selectionModel().currentChanged.connect(self.update_expression_edit)
self.edit_photo_expression.expressionChanged.connect(self.save_expression)

def get_sync_dir(self):
abs_path = QFileDialog.getExistingDirectory(
None, "Select directory", self.local_project_dir, QFileDialog.ShowDirsOnly
Expand Down Expand Up @@ -90,7 +96,36 @@ def save_config_file(self):
with open(self.config_file, "w") as f:
json.dump(config, f, indent=2)

def save_expression(self, expression):
if not self.list_fields.selectionModel().hasSelection():
return
index = self.list_fields.selectionModel().selectedIndexes()[0]
if index.isValid():
item = self.model.itemFromIndex(index)
item.setData(self.edit_photo_expression.expression(), AttachmentFieldsModel.EXPRESSION)

def update_expression_edit(self, current, previous):
item = self.model.itemFromIndex(current)
exp = item.data(AttachmentFieldsModel.EXPRESSION)
layer_id = item.data(AttachmentFieldsModel.LAYER_ID)
layer = QgsProject.instance().mapLayer(layer_id)
if layer and layer.isValid():
self.edit_photo_expression.setLayer(layer)

self.edit_photo_expression.blockSignals(True)
self.edit_photo_expression.setExpression(exp if exp else "")
self.edit_photo_expression.blockSignals(False)

def apply(self):
QgsProject.instance().writeEntry("Mergin", "PhotoQuality", self.cmb_photo_quality.currentData())
QgsProject.instance().writeEntry("Mergin", "Snapping", self.cmb_snapping_mode.currentData())
for i in range(self.model.rowCount()):
index = self.model.index(i, 0)
if index.isValid():
item = self.model.itemFromIndex(index)
layer_id = item.data(AttachmentFieldsModel.LAYER_ID)
field_name = item.data(AttachmentFieldsModel.FIELD_NAME)
expression = item.data(AttachmentFieldsModel.EXPRESSION)
QgsProject.instance().writeEntry("Mergin", f"PhotoNaming/{layer_id}/{field_name}", expression)

self.save_config_file()
94 changes: 79 additions & 15 deletions Mergin/ui/ui_project_config.ui
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>495</width>
<height>367</height>
<width>535</width>
<height>516</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -82,19 +82,6 @@
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="photo_quality_groupbox">
<property name="title">
Expand Down Expand Up @@ -127,6 +114,19 @@
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="snapping_group_box">
<property name="title">
Expand Down Expand Up @@ -159,8 +159,72 @@
</layout>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Photo attachment</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="1" column="1">
<widget class="QLabel" name="label_6">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsExpressionLineEdit" name="edit_photo_expression" native="true"/>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" rowspan="3">
<widget class="QListView" name="list_fields">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsExpressionLineEdit</class>
<extends>QWidget</extends>
<header>qgis.gui</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>chk_sync_enabled</tabstop>
<tabstop>edit_sync_dir</tabstop>
<tabstop>btn_get_sync_dir</tabstop>
<tabstop>cmb_photo_quality</tabstop>
<tabstop>cmb_snapping_mode</tabstop>
<tabstop>list_fields</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

0 comments on commit 1ebd932

Please sign in to comment.