diff --git a/CHANGELOG.md b/CHANGELOG.md index fdcff63..7e37b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.9.x +### 0.9.0: UI Enhancements and Language Refinements +- Changed text, labels, buttons, and checkboxes for clearer understanding. +- Improved UI language to make the interface easier to navigate. +- Added tooltips for more helpful information and guidance. +- Updates applied across the main window (both tabs) and the preview window. + +--- + ## 0.8.x ### 0.8.5: Patch for New PyPiUpdater Version - **PyPiUpdater 0.5** introduced breaking changes; adjusted code to ensure compatibility with the new version. diff --git a/README.md b/README.md index f489d04..722f656 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # **OptimaLab35** -_Last updated: 28 Jan 2025_ +_Last updated: 02 Feb 2025 (v.0.9.0)_ ## **Overview** @@ -10,13 +10,12 @@ It serves as a GUI for the [OPTIMA35 library](https://gitlab.com/CodeByMrFinchum --- ## **Current Status** -### **Alpha Stage** +### **Early Development** +OptimaLab35 is actively developed using **PySide6** and **Qt**, providing a modern interface for **OPTIMA35**. -OptimaLab35 is built using **PySide6** and **Qt**, offering a modern and flexible interface for **OPTIMA35**. +The program is still in its early stages, and features may change drastically over time. Some features might be added but later removed if they don't prove useful. Expect significant changes to the UI and functionality between updates. -The program is under **active development**, and while versions released on PyPI should not contain major bugs, occasional issues may arise. - -For the most accurate and detailed update information, please refer to the well-maintained [**CHANGELOG**](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/CHANGELOG.md), as this README may occasionally lag behind the latest updates. +For the most accurate and detailed update information, please refer to the [**CHANGELOG**](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/blob/main/CHANGELOG.md) as the readme might lack behind. --- @@ -28,8 +27,8 @@ For the most accurate and detailed update information, please refer to the well- - Adjust brightness and contrast - Add customizable text-based watermarks -### **Image preview** -- Load a single image and see how change in brightness and contrast changes the image +### **Image Preview** +- Load a single image and see how changes in brightness and contrast affect the image ### **EXIF Management** - Add EXIF data using a simple dictionary @@ -39,6 +38,10 @@ For the most accurate and detailed update information, please refer to the well- - Automatically adjust EXIF timestamps based on image file names - Add GPS coordinates to images +### **Updater** +- Checks for updates on PyPI, automatically downloads and installs the latest version +- Restarts the program after update + --- ## **Installation** @@ -50,17 +53,13 @@ pip install OptimaLab35 --- -## Preview GUI +## Preview GUI **0.9.0** **PREVIEW** might be out of date. **Main tab** ![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/main_tab.png){width=40%} -**Preview window** - -![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/preview_window.png){width=40%} - **Exif tab** ![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/exif_tab.png){width=40%} @@ -69,6 +68,18 @@ pip install OptimaLab35 ![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/exif_editor.png){width=40%} +**Preview window** + +![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/preview_window.png){width=40%} + +**About** + +![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/about_window.png){width=40%} + +**Updater** + +![main](https://gitlab.com/CodeByMrFinchum/OptimaLab35/-/raw/main/media/updater_window.png){width=40%} + --- # Use of LLMs diff --git a/media/about_window.png b/media/about_window.png new file mode 100644 index 0000000..f97c061 Binary files /dev/null and b/media/about_window.png differ diff --git a/media/demo_v041.gif b/media/demo_v041.gif deleted file mode 100644 index d5398b2..0000000 Binary files a/media/demo_v041.gif and /dev/null differ diff --git a/media/exif_editor.png b/media/exif_editor.png index 81fa4b0..8457cb8 100644 Binary files a/media/exif_editor.png and b/media/exif_editor.png differ diff --git a/media/exif_tab.png b/media/exif_tab.png index 723c814..7d62403 100644 Binary files a/media/exif_tab.png and b/media/exif_tab.png differ diff --git a/media/info_window.png b/media/info_window.png deleted file mode 100644 index dea48ac..0000000 Binary files a/media/info_window.png and /dev/null differ diff --git a/media/main_tab.png b/media/main_tab.png index 3c0ebf6..bf9d2f0 100644 Binary files a/media/main_tab.png and b/media/main_tab.png differ diff --git a/media/preview_window.png b/media/preview_window.png index 2057ce4..5fcc363 100644 Binary files a/media/preview_window.png and b/media/preview_window.png differ diff --git a/media/updater_window.png b/media/updater_window.png new file mode 100644 index 0000000..506a184 Binary files /dev/null and b/media/updater_window.png differ diff --git a/src/OptimaLab35/ui/main_window.py b/src/OptimaLab35/ui/main_window.py index bca1e18..d19d062 100644 --- a/src/OptimaLab35/ui/main_window.py +++ b/src/OptimaLab35/ui/main_window.py @@ -538,6 +538,9 @@ class Ui_MainWindow(object): self.dateEdit.setObjectName(u"dateEdit") self.dateEdit.setEnabled(False) self.dateEdit.setDateTime(QDateTime(QDate(2025, 1, 1), QTime(0, 0, 0))) + self.dateEdit.setMaximumDate(QDate(2038, 12, 31)) + self.dateEdit.setMinimumDate(QDate(1970, 1, 1)) + self.dateEdit.setCalendarPopup(True) self.horizontalLayout_2.addWidget(self.dateEdit) @@ -603,27 +606,60 @@ class Ui_MainWindow(object): self.actionPreview.setText(QCoreApplication.translate("MainWindow", u"Preview image", None)) self.actionAbout.setText(QCoreApplication.translate("MainWindow", u"About", None)) self.actionUpdate.setText(QCoreApplication.translate("MainWindow", u"Update", None)) +#if QT_CONFIG(tooltip) + self.input_folder_button.setToolTip(QCoreApplication.translate("MainWindow", u"Open a file browser to select a folder for loading images.", None)) +#endif // QT_CONFIG(tooltip) self.input_folder_button.setText(QCoreApplication.translate("MainWindow", u"Input", None)) self.output_path.setText("") self.output_path.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Output folder", None)) +#if QT_CONFIG(tooltip) + self.input_path.setToolTip("") +#endif // QT_CONFIG(tooltip) self.input_path.setText("") self.input_path.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Input folder", None)) +#if QT_CONFIG(tooltip) + self.output_folder_button.setToolTip(QCoreApplication.translate("MainWindow", u"Open a file browser to select a folder for saving images.", None)) +#endif // QT_CONFIG(tooltip) self.output_folder_button.setText(QCoreApplication.translate("MainWindow", u"Output", None)) - self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"Essential group", None)) + self.groupBox.setTitle(QCoreApplication.translate("MainWindow", u"Export Settings", None)) self.quality_label_2.setText(QCoreApplication.translate("MainWindow", u"Quality", None)) self.label_11.setText(QCoreApplication.translate("MainWindow", u"Format ", None)) - self.optimize_checkBox.setText(QCoreApplication.translate("MainWindow", u"optimize", None)) +#if QT_CONFIG(tooltip) + self.optimize_checkBox.setToolTip(QCoreApplication.translate("MainWindow", u"Recommended for web use. Enables PIL optimization to slightly reduce file size without visible quality loss. ", None)) +#endif // QT_CONFIG(tooltip) + self.optimize_checkBox.setText(QCoreApplication.translate("MainWindow", u"Optimize", None)) +#if QT_CONFIG(tooltip) + self.png_quality_Slider.setToolTip("") +#endif // QT_CONFIG(tooltip) self.quality_label_1.setText(QCoreApplication.translate("MainWindow", u"Quality", None)) +#if QT_CONFIG(tooltip) + self.image_type.setToolTip(QCoreApplication.translate("MainWindow", u"Select export file type.", None)) +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(tooltip) + self.label_13.setToolTip(QCoreApplication.translate("MainWindow", u"Choose image scaling options. \u26a0 Upscaling large images may freeze the system depending on hardware.", None)) +#endif // QT_CONFIG(tooltip) self.label_13.setText(QCoreApplication.translate("MainWindow", u"Resize", None)) - self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow", u"Extra stuff", None)) +#if QT_CONFIG(tooltip) + self.resize_Slider.setToolTip("") +#endif // QT_CONFIG(tooltip) +#if QT_CONFIG(tooltip) + self.resize_spinBox.setToolTip("") +#endif // QT_CONFIG(tooltip) + self.groupBox_2.setTitle(QCoreApplication.translate("MainWindow", u"Image Adjustments", None)) self.label_9.setText(QCoreApplication.translate("MainWindow", u"Brightness", None)) self.label_10.setText(QCoreApplication.translate("MainWindow", u"Contrast", None)) - self.grayscale_checkBox.setText(QCoreApplication.translate("MainWindow", u"Turn image to Black and White", None)) +#if QT_CONFIG(tooltip) + self.grayscale_checkBox.setToolTip(QCoreApplication.translate("MainWindow", u"Converts image to Grayscale", None)) +#endif // QT_CONFIG(tooltip) + self.grayscale_checkBox.setText(QCoreApplication.translate("MainWindow", u"Black and White Mode", None)) +#if QT_CONFIG(tooltip) + self.preview_Button.setToolTip(QCoreApplication.translate("MainWindow", u"Open a preview window to see how brightness, contrast, and grayscale adjustments affect your image.", None)) +#endif // QT_CONFIG(tooltip) self.preview_Button.setText(QCoreApplication.translate("MainWindow", u"Preview", None)) - self.groupBox_3.setTitle(QCoreApplication.translate("MainWindow", u"Watermark", None)) + self.groupBox_3.setTitle(QCoreApplication.translate("MainWindow", u"Watermarking", None)) self.watermark_lineEdit.setText("") - self.watermark_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter Watermark", None)) + self.watermark_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter Watermark Text", None)) self.label_12.setText(QCoreApplication.translate("MainWindow", u"Size", None)) self.font_size_comboBox.setItemText(0, QCoreApplication.translate("MainWindow", u"Tiny", None)) self.font_size_comboBox.setItemText(1, QCoreApplication.translate("MainWindow", u"Small", None)) @@ -631,20 +667,41 @@ class Ui_MainWindow(object): self.font_size_comboBox.setItemText(3, QCoreApplication.translate("MainWindow", u"Large", None)) self.font_size_comboBox.setItemText(4, QCoreApplication.translate("MainWindow", u"Huge", None)) +#if QT_CONFIG(tooltip) + self.font_size_comboBox.setToolTip(QCoreApplication.translate("MainWindow", u"Adjust the font size for the watermark. Size scales proportionally to image dimensions.", None)) +#endif // QT_CONFIG(tooltip) self.font_size_comboBox.setCurrentText(QCoreApplication.translate("MainWindow", u"Normal", None)) - self.rename_group.setTitle(QCoreApplication.translate("MainWindow", u"files", None)) + self.rename_group.setTitle(QCoreApplication.translate("MainWindow", u"File Naming", None)) +#if QT_CONFIG(tooltip) + self.rename_checkbox.setToolTip(QCoreApplication.translate("MainWindow", u"Enable to rename all images with a new base name. '_xx' will be added at the end of each filename.", None)) +#endif // QT_CONFIG(tooltip) self.rename_checkbox.setText(QCoreApplication.translate("MainWindow", u"Rename", None)) +#if QT_CONFIG(tooltip) + self.revert_checkbox.setToolTip(QCoreApplication.translate("MainWindow", u"Reverses the order of images. Useful for scanned film rolls where the last image (e.g., 36) is scanned first.", None)) +#endif // QT_CONFIG(tooltip) self.revert_checkbox.setText(QCoreApplication.translate("MainWindow", u"Revert order", None)) self.filename.setText("") - self.filename.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter file name", None)) + self.filename.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter new File Names", None)) self.start_button.setText(QCoreApplication.translate("MainWindow", u"Convert", None)) +#if QT_CONFIG(tooltip) + self.insert_exif_Button.setToolTip(QCoreApplication.translate("MainWindow", u"Insert EXIF without modifying images.", None)) +#endif // QT_CONFIG(tooltip) self.insert_exif_Button.setText(QCoreApplication.translate("MainWindow", u"Insert Exif", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), QCoreApplication.translate("MainWindow", u"Main", None)) - self.exif_group.setTitle(QCoreApplication.translate("MainWindow", u"EXIF EXPERIMENTAL", None)) - self.exif_checkbox.setText(QCoreApplication.translate("MainWindow", u"own exif", None)) - self.exif_copy_checkBox.setText(QCoreApplication.translate("MainWindow", u"copy exif", None)) - self.edit_exif_button.setText(QCoreApplication.translate("MainWindow", u"Edit Exif", None)) - self.exif_options_group.setTitle(QCoreApplication.translate("MainWindow", u"Must", None)) + self.exif_group.setTitle(QCoreApplication.translate("MainWindow", u"EXIF Settings", None)) +#if QT_CONFIG(tooltip) + self.exif_checkbox.setToolTip(QCoreApplication.translate("MainWindow", u"Add your own EXIF data to the images with the selection from below.", None)) +#endif // QT_CONFIG(tooltip) + self.exif_checkbox.setText(QCoreApplication.translate("MainWindow", u"Custom EXIF", None)) +#if QT_CONFIG(tooltip) + self.exif_copy_checkBox.setToolTip(QCoreApplication.translate("MainWindow", u"Copy EXIF from the input data.", None)) +#endif // QT_CONFIG(tooltip) + self.exif_copy_checkBox.setText(QCoreApplication.translate("MainWindow", u"Copy EXIF", None)) +#if QT_CONFIG(tooltip) + self.edit_exif_button.setToolTip(QCoreApplication.translate("MainWindow", u"Open the EXIF Editor to add or remove metadata entries, making them available for selection.", None)) +#endif // QT_CONFIG(tooltip) + self.edit_exif_button.setText(QCoreApplication.translate("MainWindow", u"EXIF editor", None)) + self.exif_options_group.setTitle(QCoreApplication.translate("MainWindow", u"Essential EXIF Info", None)) self.label_7.setText(QCoreApplication.translate("MainWindow", u"Artist", None)) self.label_4.setText(QCoreApplication.translate("MainWindow", u"ISO", None)) self.label_6.setText(QCoreApplication.translate("MainWindow", u"Scanner", None)) @@ -655,14 +712,26 @@ class Ui_MainWindow(object): self.make_comboBox.setPlaceholderText("") self.label_3.setText(QCoreApplication.translate("MainWindow", u"Model", None)) self.label_8.setText(QCoreApplication.translate("MainWindow", u"Copyright", None)) - self.gps_groupBox.setTitle(QCoreApplication.translate("MainWindow", u"GPS", None)) - self.gps_checkBox.setText(QCoreApplication.translate("MainWindow", u"add gps", None)) + self.gps_groupBox.setTitle(QCoreApplication.translate("MainWindow", u"GPS Coordinates", None)) +#if QT_CONFIG(tooltip) + self.gps_checkBox.setToolTip(QCoreApplication.translate("MainWindow", u"From a Homepage like latlong.net", None)) +#endif // QT_CONFIG(tooltip) + self.gps_checkBox.setText(QCoreApplication.translate("MainWindow", u"Enable GPS Data", None)) +#if QT_CONFIG(tooltip) + self.lat_lineEdit.setToolTip(QCoreApplication.translate("MainWindow", u"Format: xx.xxxxxx (e.g., 57.618520)", None)) +#endif // QT_CONFIG(tooltip) self.lat_lineEdit.setText("") - self.lat_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"xx.xxxxxx latitude", None)) + self.lat_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Latitude", None)) +#if QT_CONFIG(tooltip) + self.long_lineEdit.setToolTip(QCoreApplication.translate("MainWindow", u"Format: xx.xxxxxx (e.g., -13.779602)", None)) +#endif // QT_CONFIG(tooltip) self.long_lineEdit.setText("") - self.long_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"xx.xxxxxx longitude", None)) - self.date_groupBox.setTitle(QCoreApplication.translate("MainWindow", u"Optional", None)) - self.add_date_checkBox.setText(QCoreApplication.translate("MainWindow", u"add date", None)) + self.long_lineEdit.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Longitude", None)) + self.date_groupBox.setTitle(QCoreApplication.translate("MainWindow", u"Original Capture Data and Time", None)) +#if QT_CONFIG(tooltip) + self.add_date_checkBox.setToolTip(QCoreApplication.translate("MainWindow", u"Adds \"Date and Time (original)\" to the image, i.e. when the picture was taking.", None)) +#endif // QT_CONFIG(tooltip) + self.add_date_checkBox.setText(QCoreApplication.translate("MainWindow", u"Enable Timestamp", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"EXIF", None)) self.menuHelp.setTitle(QCoreApplication.translate("MainWindow", u"Help", None)) self.menuSettings.setTitle(QCoreApplication.translate("MainWindow", u"Settings", None)) diff --git a/src/OptimaLab35/ui/main_window.ui b/src/OptimaLab35/ui/main_window.ui index 62acda5..57986b7 100644 --- a/src/OptimaLab35/ui/main_window.ui +++ b/src/OptimaLab35/ui/main_window.ui @@ -63,6 +63,9 @@ 0 + + Open a file browser to select a folder for loading images. + Input @@ -83,6 +86,9 @@ + + + @@ -99,6 +105,9 @@ 0 + + Open a file browser to select a folder for saving images. + Output @@ -116,7 +125,7 @@ - Essential group + Export Settings @@ -148,13 +157,19 @@ + + Recommended for web use. Enables PIL optimization to slightly reduce file size without visible quality loss. + - optimize + Optimize + + + 1 @@ -197,6 +212,9 @@ + + Select export file type. + jpg @@ -232,6 +250,9 @@ + + Choose image scaling options. ⚠ Upscaling large images may freeze the system depending on hardware. + Resize @@ -239,6 +260,9 @@ + + + 1 @@ -258,6 +282,9 @@ true + + + 1 @@ -287,7 +314,7 @@ false - Extra stuff + Image Adjustments @@ -364,13 +391,19 @@ + + Converts image to Grayscale + - Turn image to Black and White + Black and White Mode + + Open a preview window to see how brightness, contrast, and grayscale adjustments affect your image. + Preview @@ -385,7 +418,7 @@ true - Watermark + Watermarking false @@ -406,7 +439,7 @@ - Enter Watermark + Enter Watermark Text @@ -419,6 +452,9 @@ + + Adjust the font size for the watermark. Size scales proportionally to image dimensions. + Normal @@ -464,11 +500,14 @@ - files + File Naming + + Enable to rename all images with a new base name. '_xx' will be added at the end of each filename. + Rename @@ -479,6 +518,9 @@ false + + Reverses the order of images. Useful for scanned film rolls where the last image (e.g., 36) is scanned first. + Revert order @@ -493,7 +535,7 @@ - Enter file name + Enter new File Names @@ -534,6 +576,9 @@ false + + Insert EXIF without modifying images. + Insert Exif @@ -552,7 +597,7 @@ - EXIF EXPERIMENTAL + EXIF Settings @@ -560,15 +605,21 @@ true + + Add your own EXIF data to the images with the selection from below. + - own exif + Custom EXIF + + Copy EXIF from the input data. + - copy exif + Copy EXIF @@ -577,8 +628,11 @@ true + + Open the EXIF Editor to add or remove metadata entries, making them available for selection. + - Edit Exif + EXIF editor @@ -591,7 +645,7 @@ false - Must + Essential EXIF Info @@ -738,13 +792,16 @@ false - GPS + GPS Coordinates + + From a Homepage like latlong.net + - add gps + Enable GPS Data @@ -753,6 +810,9 @@ false + + Format: xx.xxxxxx (e.g., 57.618520) + @@ -760,7 +820,7 @@ 8 - xx.xxxxxx latitude + Latitude @@ -769,6 +829,9 @@ false + + Format: xx.xxxxxx (e.g., -13.779602) + @@ -776,7 +839,7 @@ 8 - xx.xxxxxx longitude + Longitude @@ -789,13 +852,16 @@ false - Optional + Original Capture Data and Time + + Adds "Date and Time (original)" to the image, i.e. when the picture was taking. + - add date + Enable Timestamp @@ -814,6 +880,23 @@ 1 + + + 2038 + 12 + 31 + + + + + 1970 + 1 + 1 + + + + true + diff --git a/src/OptimaLab35/ui/preview_window.py b/src/OptimaLab35/ui/preview_window.py index f9f6d3e..5d2a021 100644 --- a/src/OptimaLab35/ui/preview_window.py +++ b/src/OptimaLab35/ui/preview_window.py @@ -40,23 +40,24 @@ class Ui_Preview_Window(object): self.widget = QWidget(self.centralwidget) self.widget.setObjectName(u"widget") - self.widget.setMinimumSize(QSize(140, 628)) - self.widget.setMaximumSize(QSize(140, 16777215)) - self.verticalLayout_3 = QVBoxLayout(self.widget) - self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.widget.setMinimumSize(QSize(150, 628)) + self.widget.setMaximumSize(QSize(150, 16777215)) + self.verticalLayout_4 = QVBoxLayout(self.widget) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.image_path_lineEdit = QLineEdit(self.widget) self.image_path_lineEdit.setObjectName(u"image_path_lineEdit") - self.verticalLayout_3.addWidget(self.image_path_lineEdit) + self.verticalLayout_4.addWidget(self.image_path_lineEdit) self.load_Button = QPushButton(self.widget) self.load_Button.setObjectName(u"load_Button") - self.verticalLayout_3.addWidget(self.load_Button) + self.verticalLayout_4.addWidget(self.load_Button) self.widget_2 = QWidget(self.widget) self.widget_2.setObjectName(u"widget_2") - self.widget_2.setMaximumSize(QSize(16777215, 120)) + self.widget_2.setMinimumSize(QSize(0, 250)) + self.widget_2.setMaximumSize(QSize(16777215, 250)) self.verticalLayout = QVBoxLayout(self.widget_2) self.verticalLayout.setObjectName(u"verticalLayout") self.label = QLabel(self.widget_2) @@ -84,94 +85,75 @@ class Ui_Preview_Window(object): self.verticalLayout.addWidget(self.reset_brightness_Button) - - self.verticalLayout_3.addWidget(self.widget_2) - - self.widget_3 = QWidget(self.widget) - self.widget_3.setObjectName(u"widget_3") - self.widget_3.setMaximumSize(QSize(16777215, 120)) - self.verticalLayout_2 = QVBoxLayout(self.widget_3) - self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.label_2 = QLabel(self.widget_3) - self.label_2.setObjectName(u"label_2") - - self.verticalLayout_2.addWidget(self.label_2) - - self.contrast_spinBox = QSpinBox(self.widget_3) - self.contrast_spinBox.setObjectName(u"contrast_spinBox") - self.contrast_spinBox.setMinimum(-100) - self.contrast_spinBox.setMaximum(100) - - self.verticalLayout_2.addWidget(self.contrast_spinBox) - - self.contrast_Slider = QSlider(self.widget_3) + self.contrast_Slider = QSlider(self.widget_2) self.contrast_Slider.setObjectName(u"contrast_Slider") self.contrast_Slider.setMinimum(-100) self.contrast_Slider.setMaximum(100) self.contrast_Slider.setOrientation(Qt.Horizontal) - self.verticalLayout_2.addWidget(self.contrast_Slider) + self.verticalLayout.addWidget(self.contrast_Slider) - self.reset_contrast_Button = QPushButton(self.widget_3) + self.contrast_spinBox = QSpinBox(self.widget_2) + self.contrast_spinBox.setObjectName(u"contrast_spinBox") + self.contrast_spinBox.setMinimum(-100) + self.contrast_spinBox.setMaximum(100) + + self.verticalLayout.addWidget(self.contrast_spinBox) + + self.label_2 = QLabel(self.widget_2) + self.label_2.setObjectName(u"label_2") + + self.verticalLayout.addWidget(self.label_2) + + self.reset_contrast_Button = QPushButton(self.widget_2) self.reset_contrast_Button.setObjectName(u"reset_contrast_Button") - self.verticalLayout_2.addWidget(self.reset_contrast_Button) + self.verticalLayout.addWidget(self.reset_contrast_Button) - - self.verticalLayout_3.addWidget(self.widget_3) - - self.grayscale_checkBox = QCheckBox(self.widget) + self.grayscale_checkBox = QCheckBox(self.widget_2) self.grayscale_checkBox.setObjectName(u"grayscale_checkBox") - self.verticalLayout_3.addWidget(self.grayscale_checkBox) + self.verticalLayout.addWidget(self.grayscale_checkBox) - self.update_Button = QPushButton(self.widget) - self.update_Button.setObjectName(u"update_Button") - self.verticalLayout_3.addWidget(self.update_Button) + self.verticalLayout_4.addWidget(self.widget_2) self.widget_5 = QWidget(self.widget) self.widget_5.setObjectName(u"widget_5") - self.verticalLayout_5 = QVBoxLayout(self.widget_5) - self.verticalLayout_5.setObjectName(u"verticalLayout_5") - self.label_4 = QLabel(self.widget_5) - self.label_4.setObjectName(u"label_4") - self.label_4.setWordWrap(True) + self.verticalLayout_2 = QVBoxLayout(self.widget_5) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") - self.verticalLayout_5.addWidget(self.label_4) - - self.live_update = QCheckBox(self.widget_5) - self.live_update.setObjectName(u"live_update") - - self.verticalLayout_5.addWidget(self.live_update) - - - self.verticalLayout_3.addWidget(self.widget_5) + self.verticalLayout_4.addWidget(self.widget_5) self.widget_4 = QWidget(self.widget) self.widget_4.setObjectName(u"widget_4") - self.verticalLayout_4 = QVBoxLayout(self.widget_4) - self.verticalLayout_4.setObjectName(u"verticalLayout_4") - self.label_3 = QLabel(self.widget_4) - self.label_3.setObjectName(u"label_3") - self.label_3.setScaledContents(False) - self.label_3.setWordWrap(True) + self.verticalLayout_3 = QVBoxLayout(self.widget_4) + self.verticalLayout_3.setObjectName(u"verticalLayout_3") + self.live_update = QCheckBox(self.widget_4) + self.live_update.setObjectName(u"live_update") - self.verticalLayout_4.addWidget(self.label_3) + self.verticalLayout_3.addWidget(self.live_update) + + self.update_Button = QPushButton(self.widget_4) + self.update_Button.setObjectName(u"update_Button") + self.update_Button.setAutoFillBackground(False) + + self.verticalLayout_3.addWidget(self.update_Button) self.checkBox = QCheckBox(self.widget_4) self.checkBox.setObjectName(u"checkBox") + self.checkBox.setLayoutDirection(Qt.LeftToRight) self.checkBox.setChecked(True) - self.verticalLayout_4.addWidget(self.checkBox) + self.verticalLayout_3.addWidget(self.checkBox) self.close_Button = QPushButton(self.widget_4) self.close_Button.setObjectName(u"close_Button") - self.verticalLayout_4.addWidget(self.close_Button) + self.verticalLayout_3.addWidget(self.close_Button) - self.verticalLayout_3.addWidget(self.widget_4) + self.verticalLayout_4.addWidget(self.widget_4) self.horizontalLayout.addWidget(self.widget) @@ -194,18 +176,40 @@ class Ui_Preview_Window(object): def retranslateUi(self, Preview_Window): Preview_Window.setWindowTitle(QCoreApplication.translate("Preview_Window", u"OptimaLab35 - Preview", None)) self.QLabel.setText("") - self.image_path_lineEdit.setPlaceholderText(QCoreApplication.translate("Preview_Window", u"Path to image", None)) +#if QT_CONFIG(tooltip) + self.image_path_lineEdit.setToolTip(QCoreApplication.translate("Preview_Window", u"Enter the path to the image file or use the 'Select Image' button to browse.", None)) +#endif // QT_CONFIG(tooltip) + self.image_path_lineEdit.setPlaceholderText(QCoreApplication.translate("Preview_Window", u"Image Path", None)) self.load_Button.setText(QCoreApplication.translate("Preview_Window", u"Select image", None)) self.label.setText(QCoreApplication.translate("Preview_Window", u"Brightness", None)) +#if QT_CONFIG(tooltip) + self.reset_brightness_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Click to reset the brightness to its default value (0).", None)) +#endif // QT_CONFIG(tooltip) self.reset_brightness_Button.setText(QCoreApplication.translate("Preview_Window", u"Reset", None)) self.label_2.setText(QCoreApplication.translate("Preview_Window", u"Contrast", None)) +#if QT_CONFIG(tooltip) + self.reset_contrast_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Click to reset the contrast to its default value (0).", None)) +#endif // QT_CONFIG(tooltip) self.reset_contrast_Button.setText(QCoreApplication.translate("Preview_Window", u"Reset", None)) - self.grayscale_checkBox.setText(QCoreApplication.translate("Preview_Window", u"Grayscale", None)) - self.update_Button.setText(QCoreApplication.translate("Preview_Window", u"Update preview", None)) - self.label_4.setText(QCoreApplication.translate("Preview_Window", u"Update preview live might have large impact on system, especilly if image is large.", None)) +#if QT_CONFIG(tooltip) + self.grayscale_checkBox.setToolTip(QCoreApplication.translate("Preview_Window", u"Convert the image to grayscale (black and white).", None)) +#endif // QT_CONFIG(tooltip) + self.grayscale_checkBox.setText(QCoreApplication.translate("Preview_Window", u"Black n White", None)) +#if QT_CONFIG(tooltip) + self.live_update.setToolTip(QCoreApplication.translate("Preview_Window", u"Enable live updates to immediately preview changes as you adjust brightness, contrast, or grayscale. Be aware that this might impact performance, especially with large images.", None)) +#endif // QT_CONFIG(tooltip) self.live_update.setText(QCoreApplication.translate("Preview_Window", u"Live update", None)) - self.label_3.setText(QCoreApplication.translate("Preview_Window", u"Copy values to main window when closing", None)) +#if QT_CONFIG(tooltip) + self.update_Button.setToolTip(QCoreApplication.translate("Preview_Window", u"Apply Changes to Preview", None)) +#endif // QT_CONFIG(tooltip) + self.update_Button.setText(QCoreApplication.translate("Preview_Window", u"Update Preview", None)) +#if QT_CONFIG(tooltip) + self.checkBox.setToolTip(QCoreApplication.translate("Preview_Window", u"Enable to copy adjustments to the main window upon closing", None)) +#endif // QT_CONFIG(tooltip) self.checkBox.setText(QCoreApplication.translate("Preview_Window", u"Copy Values", None)) +#if QT_CONFIG(tooltip) + self.close_Button.setToolTip("") +#endif // QT_CONFIG(tooltip) self.close_Button.setText(QCoreApplication.translate("Preview_Window", u"Close", None)) # retranslateUi diff --git a/src/OptimaLab35/ui/preview_window.ui b/src/OptimaLab35/ui/preview_window.ui index 6bd17b7..33ad094 100644 --- a/src/OptimaLab35/ui/preview_window.ui +++ b/src/OptimaLab35/ui/preview_window.ui @@ -44,21 +44,24 @@ - 140 + 150 628 - 140 + 150 16777215 - + + + Enter the path to the image file or use the 'Select Image' button to browse. + - Path to image + Image Path @@ -71,10 +74,16 @@ + + + 0 + 250 + + 16777215 - 120 + 250 @@ -110,40 +119,14 @@ + + Click to reset the brightness to its default value (0). + Reset - - - - - - - - 16777215 - 120 - - - - - - - Contrast - - - - - - - -100 - - - 100 - - - @@ -157,71 +140,85 @@ + + + + -100 + + + 100 + + + + + + + Contrast + + + + + Click to reset the contrast to its default value (0). + Reset + + + + Convert the image to grayscale (black and white). + + + Black n White + + + - - - - Grayscale - - - - - - - Update preview - - - - - - - - Update preview live might have large impact on system, especilly if image is large. - - - true - - - + + + + + + + + Enable live updates to immediately preview changes as you adjust brightness, contrast, or grayscale. Be aware that this might impact performance, especially with large images. + Live update - - - - - - - - - Copy values to main window when closing + + + Apply Changes to Preview - + false - - true + + Update Preview + + Enable to copy adjustments to the main window upon closing + + + Qt::LeftToRight + Copy Values @@ -232,6 +229,9 @@ + + + Close