From b6ed0bddb9e1407e1f823261421380327b9cca49 Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Sat, 13 Jun 2026 10:50:16 +1000 Subject: [PATCH 1/3] changed coding, reports, manage labels to textbrowsers --- src/GUI_UIs/ui_main.ui | 71 +++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/src/GUI_UIs/ui_main.ui b/src/GUI_UIs/ui_main.ui index f07983ee3..7ef461535 100644 --- a/src/GUI_UIs/ui_main.ui +++ b/src/GUI_UIs/ui_main.ui @@ -24,7 +24,7 @@ - 0 + 2 @@ -40,19 +40,26 @@ Manage - + - 20 - 20 - 861 - 71 + 10 + 10 + 780 + 500 - - Select an option in the Files and Cases menu. + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select an option from the Manage menu</p></body></html> - + true @@ -61,19 +68,26 @@ Coding - + - 20 - 20 - 811 - 71 + 10 + 10 + 780 + 500 - - Select an option in the Coding menu. + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select an option from the coding menu</p></body></html> - + true @@ -82,19 +96,26 @@ Reports - + - 20 - 20 - 831 - 71 + 10 + 10 + 780 + 500 - - Select an option in the Reports menu. + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Select an option from the Analysis or Reports menu</p></body></html> - + true From 46e1f23b7a4df54f8b6b01487d0157b907344c5e Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Sat, 13 Jun 2026 10:51:28 +1000 Subject: [PATCH 2/3] changed coding, reports, manage labels to textbrowsers --- src/qualcoder/GUI/ui_main.py | 53 +++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/qualcoder/GUI/ui_main.py b/src/qualcoder/GUI/ui_main.py index d27a97e93..a71615250 100644 --- a/src/qualcoder/GUI/ui_main.py +++ b/src/qualcoder/GUI/ui_main.py @@ -30,24 +30,24 @@ def setupUi(self, MainWindow): self.tabWidget.addTab(self.tab_action_log, "") self.tab_manage = QtWidgets.QWidget() self.tab_manage.setObjectName("tab_manage") - self.label_manage = QtWidgets.QLabel(parent=self.tab_manage) - self.label_manage.setGeometry(QtCore.QRect(20, 20, 861, 71)) - self.label_manage.setWordWrap(True) - self.label_manage.setObjectName("label_manage") + self.textBrowser_manage = QtWidgets.QTextBrowser(parent=self.tab_manage) + self.textBrowser_manage.setGeometry(QtCore.QRect(10, 10, 780, 500)) + self.textBrowser_manage.setOpenExternalLinks(True) + self.textBrowser_manage.setObjectName("textBrowser_manage") self.tabWidget.addTab(self.tab_manage, "") self.tab_coding = QtWidgets.QWidget() self.tab_coding.setObjectName("tab_coding") - self.label_coding = QtWidgets.QLabel(parent=self.tab_coding) - self.label_coding.setGeometry(QtCore.QRect(20, 20, 811, 71)) - self.label_coding.setWordWrap(True) - self.label_coding.setObjectName("label_coding") + self.textBrowser_coding = QtWidgets.QTextBrowser(parent=self.tab_coding) + self.textBrowser_coding.setGeometry(QtCore.QRect(10, 10, 780, 500)) + self.textBrowser_coding.setOpenExternalLinks(True) + self.textBrowser_coding.setObjectName("textBrowser_coding") self.tabWidget.addTab(self.tab_coding, "") self.tab_reports = QtWidgets.QWidget() self.tab_reports.setObjectName("tab_reports") - self.label_reports = QtWidgets.QLabel(parent=self.tab_reports) - self.label_reports.setGeometry(QtCore.QRect(20, 20, 831, 71)) - self.label_reports.setWordWrap(True) - self.label_reports.setObjectName("label_reports") + self.textBrowser_reports = QtWidgets.QTextBrowser(parent=self.tab_reports) + self.textBrowser_reports.setGeometry(QtCore.QRect(10, 10, 780, 500)) + self.textBrowser_reports.setOpenExternalLinks(True) + self.textBrowser_reports.setObjectName("textBrowser_reports") self.tabWidget.addTab(self.tab_reports, "") self.tab_ai_chat = QtWidgets.QWidget() self.tab_ai_chat.setObjectName("tab_ai_chat") @@ -297,18 +297,39 @@ def setupUi(self, MainWindow): self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) - self.tabWidget.setCurrentIndex(0) + self.tabWidget.setCurrentIndex(2) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "QualCoder")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_action_log), _translate("MainWindow", "Action Log")) - self.label_manage.setText(_translate("MainWindow", "Select an option in the Files and Cases menu. ")) + self.textBrowser_manage.setHtml(_translate("MainWindow", "\n" +"\n" +"

Select an option from the Manage menu

")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_manage), _translate("MainWindow", "Manage")) - self.label_coding.setText(_translate("MainWindow", "Select an option in the Coding menu. ")) + self.textBrowser_coding.setHtml(_translate("MainWindow", "\n" +"\n" +"

Select an option from the coding menu

")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_coding), _translate("MainWindow", "Coding")) - self.label_reports.setText(_translate("MainWindow", "Select an option in the Reports menu. ")) + self.textBrowser_reports.setHtml(_translate("MainWindow", "\n" +"\n" +"

Select an option from the Analysis or Reports menu

")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_reports), _translate("MainWindow", "Reports")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_ai_chat), _translate("MainWindow", "AI Chat")) self.menuProject.setTitle(_translate("MainWindow", "Project")) From 135146f2774c6b63fc6d9b69154eea4d05728491 Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Sat, 13 Jun 2026 10:51:57 +1000 Subject: [PATCH 3/3] changed coding, reports, manage labels to textbrowsers --- src/qualcoder/__main__.py | 57 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/qualcoder/__main__.py b/src/qualcoder/__main__.py index 209170881..bee8a7db9 100644 --- a/src/qualcoder/__main__.py +++ b/src/qualcoder/__main__.py @@ -78,7 +78,6 @@ from qualcoder.settings import DialogSettings from qualcoder.special_functions import DialogSpecialFunctions from qualcoder.taguette_import import TaguetteImport -# from qualcoder.text_mining import DialogTextMining from qualcoder.view_av import DialogCodeAV from qualcoder.view_charts import ViewCharts from qualcoder.view_graph import ViewGraph @@ -1603,7 +1602,8 @@ def init_ui(self): self.ui.tabWidget.setCurrentIndex(0) self.ai_chat() - # add tab widget icons + + # Add tab widget icons try: self.ui.tabWidget.setTabIcon(0, qta.icon('mdi6.cog', color=self.app.highlight_color())) # Action Log self.ui.tabWidget.setTabIcon(1, qta.icon('mdi6.file-outline', color=self.app.highlight_color())) # Manage @@ -1769,9 +1769,7 @@ def show_menu_options(self): # Help menu self.ui.actionSpecial_functions.setEnabled(True) - # TODO FOR FUTURE EXPANSION text mining - self.ui.actionText_mining.setEnabled(False) - self.ui.actionText_mining.setVisible(False) + def keyPressEvent(self, event): """ Used to open top level menus. """ @@ -1820,89 +1818,89 @@ def settings_report(self): def text_segments_codes_table(self): """ Show table of text segments (rows) by codes (columns). """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogCodesBySegments(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_sql(self): """ Run SQL statements on database. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogSQL(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_coding_comparison(self): """ Compare two or more coders across all text files using Cohens Kappa. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportCoderComparisons(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_comparison_table(self): - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportComparisonTable(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_compare_coders_by_file(self): """ Compare two coders selection by file - text, A/V or image. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogCompareCoderByFile(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_code_frequencies(self): """ Show code frequencies overall and by coder. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportCodeFrequencies(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_code_relations(self): """ Show code relations in text files. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportRelations(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def co_occurence(self): """ Show overlapping codes in text files. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportCooccurrence(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_exact_text_matches(self): """ Show exact text coding matches in text files. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportExactTextMatches(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_coding(self): """ Report on coding and categories. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportCodes(self.app, self.ui.textEdit, self.ui.tab_coding) self.tab_layout_helper(self.ui.tab_reports, ui) def report_file_summary(self): """ Report on file details. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportFileSummary(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def report_code_summary(self): """ Report on code details. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = DialogReportCodeSummary(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_reports, ui) def view_graph_original(self): """ Show list or acyclic graph of codes and categories. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = ViewGraph(self.app) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_reports, ui) @@ -1910,7 +1908,7 @@ def view_graph_original(self): def view_charts(self): """ Show charts of codes and categories. """ - self.ui.label_reports.hide() + self.ui.textBrowser_reports.hide() ui = ViewCharts(self.app) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_reports, ui) @@ -1949,7 +1947,7 @@ def special_functions(self): def manage_attributes(self): """ Create, edit, delete, rename attributes. """ - self.ui.label_manage.hide() + self.ui.textBrowser_manage.hide() ui = DialogManageAttributes(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_manage, ui) @@ -1975,7 +1973,7 @@ def import_survey(self): Identify qualitative questions and assign these data to the source table for coding and review. Modal dialog. """ - self.ui.label_manage.hide() + self.ui.textBrowser_manage.hide() ui = DialogImportSurvey(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_manage, ui) @@ -1983,7 +1981,7 @@ def manage_cases(self): """ Create, edit, delete, rename cases, add cases to files or parts of files, add memos to cases. """ - self.ui.label_manage.hide() + self.ui.textBrowser_manage.hide() ui = DialogCases(self.app, self.ui.textEdit) self.tab_layout_helper(self.ui.tab_manage, ui) @@ -1992,7 +1990,7 @@ def manage_files(self): plain text. Rename, delete and add memos to files. """ - self.ui.label_manage.hide() + self.ui.textBrowser_manage.hide() ui = DialogManageFiles(self.app, self.ui.textEdit, self.ui.tab_coding, self.ui.tab_reports, self) self.tab_layout_helper(self.ui.tab_manage, ui) @@ -2000,7 +1998,7 @@ def manage_bad_file_links(self): """ Fix any bad links to files. File names must match but paths can be different. """ - self.ui.label_manage.hide() + self.ui.textBrowser_manage.hide() ui = DialogManageLinks(self.app, self.ui.textEdit, self.ui.tab_coding) self.tab_layout_helper(self.ui.tab_manage, ui) bad_links = self.app.check_bad_file_links() @@ -2011,7 +2009,6 @@ def journals(self): """ Create and edit journals. From version 3.4 in a non-modal window. """ - self.ui.label_manage.hide() ui = DialogJournals(self.app, self.ui.textEdit) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.journal_display = ui @@ -2030,7 +2027,7 @@ def text_coding(self, task='documents', doc_id=None, doc_sel_start=0, doc_sel_en files = self.app.get_text_filenames() if len(files) > 0: - self.ui.label_coding.hide() + self.ui.textBrowser_coding.hide() ui = DialogCodeText(self.app, self.ui.textEdit, self.ui.tab_reports) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_coding, ui) @@ -2055,7 +2052,7 @@ def pdf_coding(self): files = self.app.get_pdf_filenames() if len(files) > 0: - self.ui.label_coding.hide() + self.ui.textBrowser_coding.hide() ui = DialogCodePdf(self.app, self.ui.textEdit, self.ui.tab_reports) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_coding, ui) @@ -2071,7 +2068,7 @@ def image_coding(self): pdf_files = self.app.get_pdf_filenames() if len(image_files) + len(pdf_files) > 0: - self.ui.label_coding.hide() + self.ui.textBrowser_coding.hide() ui = DialogCodeImage(self.app, self.ui.textEdit, self.ui.tab_reports) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_coding, ui) @@ -2092,7 +2089,7 @@ def av_coding(self): msg = _("VLC is not installed. Cannot code audio/video files.") Message(self.app, _('Install VLC'), msg).exec() return - self.ui.label_coding.hide() + self.ui.textBrowser_coding.hide() try: ui = DialogCodeAV(self.app, self.ui.textEdit, self.ui.tab_reports) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) @@ -2111,7 +2108,7 @@ def code_color_scheme(self): def code_organiser(self): """ Organise codes structure. """ - self.ui.label_coding.setText("") + self.ui.textBrowser_coding.setText("") ui = CodeOrganiser(self.app, self.ui.textEdit) ui.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.tab_layout_helper(self.ui.tab_reports, None)