diff --git a/app-new.py b/app-new.py
new file mode 100644
index 0000000..7b64b95
--- /dev/null
+++ b/app-new.py
@@ -0,0 +1,442 @@
+import sys
+import json
+import os
+import re
+from PyQt5.QtWidgets import (
+ QApplication, QWidget, QVBoxLayout, QHBoxLayout,
+ QLineEdit, QPushButton, QTextEdit, QMessageBox,
+ QSpacerItem, QSizePolicy, QLabel, QFileDialog, QDialog,
+ QFormLayout, QTableWidget, QTableWidgetItem, QHeaderView,
+ QComboBox
+)
+from PyQt5.QtGui import QIcon
+from PyQt5.QtCore import Qt, QDateTime, QUrl
+from PyQt5.QtSvg import QSvgWidget
+from PyQt5.QtGui import QDesktopServices
+
+
+class URLSearch:
+ def __init__(self, url, search_engine_url):
+ self.url = url
+ self.search_engine_url = search_engine_url
+ self.filters_dir = 'filters/'
+ self.available_filters = self.load_filters()
+
+ def load_filters(self):
+ filters = {}
+ for file_name in os.listdir(self.filters_dir):
+ if file_name.endswith('.filter.py'):
+ domain = '.'.join(file_name.split('.')[:-2]) # Extracting domain.tld from domain.tld.filter.py
+ filters[domain] = os.path.join(self.filters_dir, file_name)
+ # print("Loaded filters:", filters) # Debug print
+ return filters
+
+ def extract_terms(self):
+ parsed_url = QUrl(self.url)
+ host_parts = parsed_url.host().split('.')
+ domain = '.'.join(host_parts[-2:]) # Extract full domain including TLD
+ # print("Extracted domain:", domain) # Debug print
+ if domain in self.available_filters:
+ filter_file = self.available_filters[domain]
+ terms = self.apply_filter(filter_file)
+ if terms:
+ return terms
+ return None
+
+ def apply_filter(self, filter_file):
+ try:
+ with open(filter_file, 'r') as file:
+ filter_code = file.read()
+ local_vars = {'url': self.url, 'terms': [], 'QUrl': QUrl}
+ exec(filter_code, {}, local_vars)
+ return local_vars['terms']
+ except Exception as e:
+ print(f"Error applying filter: {e}")
+ return None
+
+ def search(self):
+ terms = self.extract_terms()
+ if terms:
+ search_query = '+'.join(terms)
+ search_url = f"{self.search_engine_url}{search_query}"
+ QDesktopServices.openUrl(QUrl(search_url))
+ else:
+ print("No valid search term extracted, search disabled.")
+
+class URLManager(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ self.settings = self.load_settings()
+ self.translations = {}
+ self.load_translations(f'lang/translations_{self.settings["language"].lower()[:2]}.json')
+ self.setWindowTitle(self.translations['title'])
+ self.setGeometry(100, 100, 600, 800)
+ self.setWindowIcon(QIcon('assets/logo.png'))
+
+ self.layout = QVBoxLayout()
+
+ # URL input and settings button layout
+ self.url_layout = QHBoxLayout()
+ self.url_input = QLineEdit()
+ self.url_input.setPlaceholderText(self.translations['url_placeholder'])
+ self.url_layout.addWidget(self.url_input)
+
+ self.settings_button = QPushButton()
+ self.settings_button.setFixedSize(24, 24)
+ self.settings_button.clicked.connect(self.show_settings_dialog)
+ self.url_layout.addWidget(self.settings_button)
+
+ self.info_button = QPushButton()
+ self.info_button.setFixedSize(24, 24)
+ self.info_button.clicked.connect(self.show_info_dialog)
+ self.url_layout.addWidget(self.info_button)
+
+ self.layout.addLayout(self.url_layout)
+
+ self.update_icon_color()
+
+ self.description_input = QTextEdit()
+ self.description_input.setPlaceholderText(self.translations['description_placeholder'])
+ self.description_input.setMaximumHeight(100)
+ self.layout.addWidget(self.description_input)
+
+ self.add_button = QPushButton(self.translations['save_url_button'])
+ self.add_button.clicked.connect(self.add_url)
+ self.layout.addWidget(self.add_button)
+
+ self.layout.addSpacerItem(QSpacerItem(0, 10, QSizePolicy.Minimum, QSizePolicy.Fixed))
+
+ self.search_layout = QHBoxLayout()
+ self.search_input = QLineEdit()
+ self.search_input.setPlaceholderText(self.translations['search_placeholder'])
+ self.search_input.textChanged.connect(self.filter_urls)
+ self.search_layout.addWidget(self.search_input)
+ self.layout.addLayout(self.search_layout)
+
+ self.search_input.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
+
+ self.url_list = QTableWidget()
+ self.url_list.setColumnCount(3)
+ self.url_list.setHorizontalHeaderLabels([self.translations['url_placeholder'], self.translations['column_date'], self.translations['column_actions']])
+ self.url_list.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
+ self.url_list.setColumnWidth(1, 150)
+ self.url_list.setColumnWidth(2, 100)
+ self.layout.addWidget(self.url_list)
+
+ self.setLayout(self.layout)
+
+ self.urls = []
+
+ self.load_urls()
+
+ self.search_engines = {
+ "Bing": "https://www.bing.com/search?q=",
+ "Brave": "https://search.brave.com/search?q=",
+ "DuckDuckGo": "https://duckduckgo.com/?q=",
+ "Ecosia": "https://www.ecosia.org/search?q=",
+ "Google": "https://www.google.com/search?q=",
+ "Startpage": "https://www.startpage.com/do/search?q=",
+ "Swisscows": "https://swisscows.com/web?query="
+ }
+
+ def load_translations(self, file_path):
+ if os.path.exists(file_path):
+ with open(file_path, 'r') as file:
+ data = json.load(file)
+ self.translations = data['translations']
+
+ def update_icon_color(self):
+ palette = self.palette()
+ if palette.color(palette.Window).value() < 128:
+ settings_icon_path = 'assets/cogwheel_dark.svg'
+ info_icon_path = 'assets/info_dark.svg'
+ self.action_icons = {
+ "search": 'assets/search_dark.svg',
+ "delete": 'assets/delete_dark.svg'
+ }
+ else:
+ settings_icon_path = 'assets/cogwheel_light.svg'
+ info_icon_path = 'assets/info_light.svg'
+ self.action_icons = {
+ "search": 'assets/search_light.svg',
+ "delete": 'assets/delete_light.svg'
+ }
+
+ self.settings_button.setIcon(QIcon(settings_icon_path))
+ self.info_button.setIcon(QIcon(info_icon_path))
+
+ def add_url(self):
+ url = self.url_input.text()
+ description = self.description_input.toPlainText()
+ if url:
+ date_added = QDateTime.currentDateTime().toString(Qt.ISODate)
+ url_data = {'url': url, 'description': description, 'date': date_added}
+ self.urls.append(url_data)
+ self.save_url(url_data)
+ self.update_url_list()
+ self.url_input.clear()
+ self.description_input.clear()
+
+ def save_url(self, url_data):
+ url_path = os.path.join(self.settings['data_directory'], 'urls.json')
+ if os.path.exists(url_path):
+ with open(url_path, 'r') as file:
+ url_list = json.load(file)
+ else:
+ url_list = []
+ url_list.append(url_data)
+ with open(url_path, 'w') as file:
+ json.dump(url_list, file)
+
+ def update_url(self):
+ selected_item = self.url_list.currentItem()
+ if selected_item:
+ row = selected_item.row()
+ new_url = self.url_input.text()
+ new_description = self.description_input.toPlainText()
+ self.urls[row]['url'] = new_url
+ self.urls[row]['description'] = new_description
+ self.save_urls()
+ self.update_url_list()
+ self.url_input.clear()
+ self.description_input.clear()
+
+ def delete_url(self, row):
+ reply = QMessageBox.question(self, self.translations['delete_confirmation_title'], self.translations['delete_confirmation'],
+ QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+ if reply == QMessageBox.Yes:
+ del self.urls[row]
+ self.save_urls()
+ self.update_url_list()
+
+ def filter_urls(self):
+ search_term = self.search_input.text().strip().lower()
+ if not search_term:
+ self.update_url_list()
+ return
+
+ filtered_urls = [url for url in self.urls if search_term in url['url'].lower() or search_term in url['description'].lower()]
+ self.update_url_list(filtered_urls)
+
+ def update_url_list(self, urls=None):
+ self.url_list.setRowCount(0)
+ urls_to_display = urls if urls else self.urls
+ for row, url in enumerate(urls_to_display):
+ self.url_list.insertRow(row)
+ self.url_list.setItem(row, 0, QTableWidgetItem(url['url']))
+ formatted_date = self.format_date(url['date'])
+ self.url_list.setItem(row, 1, QTableWidgetItem(formatted_date))
+
+ actions_layout = QHBoxLayout()
+
+ search_button = QPushButton()
+ search_button.setIcon(QIcon(self.action_icons["search"]))
+ search_button.setFixedSize(18, 18)
+ search_button.setStyleSheet("border: none; padding: 0px;")
+ search_button.clicked.connect(lambda _, url=url['url']: self.search_url(url))
+ actions_layout.addWidget(search_button)
+
+ delete_button = QPushButton()
+ delete_button.setIcon(QIcon(self.action_icons["delete"]))
+ delete_button.setFixedSize(18, 18)
+ delete_button.setStyleSheet("border: none; padding: 0px;")
+ delete_button.clicked.connect(lambda _, row=row: self.delete_url(row))
+ actions_layout.addWidget(delete_button)
+
+ actions_widget = QWidget()
+ actions_widget.setLayout(actions_layout)
+
+ self.url_list.setCellWidget(row, 2, actions_widget)
+
+ vertical_header = self.url_list.verticalHeader()
+ vertical_header.setVisible(False)
+
+ def format_date(self, date_str):
+ date = QDateTime.fromString(date_str, Qt.ISODate)
+ if self.settings['date_format'] == 'Nerdy':
+ return date.toString("yyyy-MM-ddTHH:mm:ss")
+ elif self.settings['date_format'] == 'Normal':
+ return date.toString("dd/MM/yy @ HH:mm")
+ elif self.settings['date_format'] == 'Murica!':
+ return date.toString("MM/dd/yyyy hh:mm AP")
+ else:
+ return date_str
+
+ def search_url(self, url):
+ search_engine_url = self.search_engines[self.settings['search_engine']]
+ url_search = URLSearch(url, search_engine_url)
+ url_search.search()
+
+ def load_settings(self):
+ settings_path = 'data/settings.json'
+ if os.path.exists(settings_path):
+ with open(settings_path, 'r') as file:
+ settings = json.load(file)
+ self.data_directory = settings['data_directory']
+ self.search_engine = settings['search_engine']
+ self.date_format = settings.get('date_format', 'Nerdy')
+ self.language = settings.get('language', 'English')
+ return settings
+ else:
+ default_settings = {
+ 'data_directory': 'data/',
+ 'search_engine': 'Google',
+ 'date_format': 'Nerdy',
+ 'language': 'English'
+ }
+ self.save_settings(default_settings)
+ return default_settings
+
+ def save_settings(self, settings=None):
+ settings_path = 'data/settings.json'
+ os.makedirs(os.path.dirname(settings_path), exist_ok=True)
+ if settings is None:
+ settings = {
+ 'data_directory': self.data_directory,
+ 'search_engine': self.search_engine,
+ 'date_format': self.date_format,
+ 'language': self.language
+ }
+ with open(settings_path, 'w') as file:
+ json.dump(settings, file)
+
+ def load_urls(self):
+ url_path = os.path.join(self.settings['data_directory'], 'urls.json')
+ if os.path.exists(url_path):
+ with open(url_path, 'r') as file:
+ self.urls = json.load(file)
+ self.update_url_list()
+
+ def save_urls(self):
+ url_path = os.path.join(self.settings['data_directory'], 'urls.json')
+ with open(url_path, 'w') as file:
+ json.dump(self.urls, file)
+
+ def show_info_dialog(self):
+ dialog = QDialog(self)
+ dialog.setWindowTitle(self.translations['about_title'])
+
+ layout = QVBoxLayout()
+
+ svg_widget = QSvgWidget('assets/logo.svg')
+ svg_widget.setFixedSize(256, 256)
+ layout.addWidget(svg_widget, alignment=Qt.AlignCenter)
+
+ written_by_label = QLabel(self.translations['developed_by'])
+ layout.addWidget(written_by_label, alignment=Qt.AlignCenter)
+
+ link_label = QLabel()
+ link_label.setText(f'{self.translations["repository_link_name"]}')
+ link_label.setOpenExternalLinks(True)
+ layout.addWidget(link_label, alignment=Qt.AlignCenter)
+
+ dialog.setLayout(layout)
+ dialog.exec_()
+
+ def show_settings_dialog(self):
+ dialog = SettingsDialog(self)
+ if dialog.exec_() == QDialog.Accepted:
+ self.settings = self.load_settings()
+ self.update_url_list()
+
+class SettingsDialog(QDialog):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setWindowTitle(parent.translations['settings_title'])
+ self.setFixedWidth(360)
+
+ self.parent = parent
+
+ layout = QVBoxLayout()
+
+ directory_label = QLabel(parent.translations['data_directory_label'])
+ layout.addWidget(directory_label)
+
+ directory_layout = QHBoxLayout()
+ self.directory_input = QLineEdit(self.parent.settings['data_directory'])
+ self.browse_button = QPushButton(self.parent.translations['browse_button'])
+ self.browse_button.clicked.connect(self.browse_directory)
+ directory_layout.addWidget(self.directory_input)
+ directory_layout.addWidget(self.browse_button)
+ layout.addLayout(directory_layout)
+
+ layout.addSpacerItem(QSpacerItem(0, 4, QSizePolicy.Minimum, QSizePolicy.Fixed))
+
+ form_layout = QFormLayout()
+
+ # Populate Search Engine Combobox
+ self.search_engine_combobox = QComboBox()
+ search_engines = sorted(self.parent.search_engines.keys())
+ self.search_engine_combobox.addItems(search_engines)
+ self.search_engine_combobox.setCurrentText(self.parent.settings['search_engine'])
+ form_layout.addRow(self.parent.translations['search_engine_label'], self.search_engine_combobox)
+
+ # Populate Date Format Combobox
+ self.date_format_combobox = QComboBox()
+ self.date_format_combobox.addItems(["Nerdy", "Normal", "Murica!"])
+ self.date_format_combobox.setCurrentText(self.parent.settings['date_format'])
+ form_layout.addRow(self.parent.translations['date_format_label'], self.date_format_combobox)
+
+ # Populate Language Combobox
+ self.language_combobox = QComboBox()
+ self.populate_language_combobox()
+ current_language_code = self.parent.settings['language']
+ self.set_current_language(current_language_code)
+ form_layout.addRow(self.parent.translations['language_label'], self.language_combobox)
+
+ layout.addLayout(form_layout)
+
+ self.save_button = QPushButton(self.parent.translations['save_button'])
+ self.save_button.clicked.connect(self.save_settings)
+ layout.addWidget(self.save_button)
+
+ self.setLayout(layout)
+
+ def browse_directory(self):
+ directory = QFileDialog.getExistingDirectory(self, "Select Directory")
+ if directory:
+ self.directory_input.setText(directory)
+
+ def populate_language_combobox(self):
+ lang_dir = 'lang/'
+ language_files = [f for f in os.listdir(lang_dir) if f.startswith('translations_') and f.endswith('.json')]
+ self.language_map = {}
+
+ for file_name in language_files:
+ file_path = os.path.join(lang_dir, file_name)
+ with open(file_path, 'r') as file:
+ data = json.load(file)
+ language_name = data.get('language', 'Unknown')
+ language_code = file_name[len('translations_'):-len('.json')]
+ display_text = f"{language_name} ({language_code})"
+ self.language_combobox.addItem(display_text)
+ self.language_map[language_code] = display_text
+
+ def set_current_language(self, language_code):
+ if language_code in self.language_map:
+ display_text = self.language_map[language_code]
+ index = self.language_combobox.findText(display_text)
+ if index != -1:
+ self.language_combobox.setCurrentIndex(index)
+
+ def save_settings(self):
+ selected_language = self.language_combobox.currentText()
+ language_code = selected_language.split('(')[-1].strip(' )') # Extract language code from "(en)" format
+ old_language = self.parent.settings['language']
+ self.parent.settings['data_directory'] = self.directory_input.text()
+ self.parent.settings['search_engine'] = self.search_engine_combobox.currentText()
+ self.parent.settings['date_format'] = self.date_format_combobox.currentText()
+ self.parent.settings['language'] = language_code
+ self.parent.save_settings(self.parent.settings)
+
+ if old_language != language_code:
+ QMessageBox.information(self, self.parent.translations['restart_required_title'], self.parent.translations['restart_required_message'])
+
+ self.accept()
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = URLManager()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/app.py b/app.py
index 95f0f4e..4dd4ed8 100644
--- a/app.py
+++ b/app.py
@@ -15,11 +15,11 @@ class URLManager(QWidget):
def __init__(self):
super().__init__()
+ self.settings = self.load_settings()
self.translations = {}
- self.load_translations('lang/translations_en.json')
+ self.load_translations(f'lang/translations_{self.settings["language"].lower()[:2]}.json')
self.setWindowTitle(self.translations['title'])
self.setGeometry(100, 100, 600, 800)
-
self.setWindowIcon(QIcon('assets/logo.png'))
self.layout = QVBoxLayout()
@@ -58,7 +58,7 @@ class URLManager(QWidget):
self.group_layout.addWidget(self.group_combobox)
self.category_input = QLineEdit()
- self.category_input.setPlaceholderText("Category name")
+ self.category_input.setPlaceholderText(self.translations['category_name'])
self.category_input.setFixedWidth(3 * 100) # Fixed width for the text input box, assuming "Save" button width is 100
self.group_layout.addWidget(self.category_input)
@@ -86,7 +86,7 @@ class URLManager(QWidget):
self.url_list = QTableWidget()
self.url_list.setColumnCount(3)
- self.url_list.setHorizontalHeaderLabels(['URL', 'Date', 'Actions'])
+ self.url_list.setHorizontalHeaderLabels(['URL', self.translations['column_date'], self.translations['column_actions']])
self.url_list.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
self.url_list.setColumnWidth(1, 150)
self.url_list.setColumnWidth(2, 100)
@@ -97,8 +97,6 @@ class URLManager(QWidget):
self.urls = []
self.groups = set()
- self.load_settings()
-
self.load_categories()
self.load_urls()
@@ -156,7 +154,7 @@ class URLManager(QWidget):
def save_url(self, url_data):
category = url_data['group']
category_filename = self.get_category_filename(category)
- category_path = os.path.join(self.data_directory, category_filename)
+ category_path = os.path.join(self.settings['data_directory'], category_filename)
if os.path.exists(category_path):
with open(category_path, 'r') as file:
category_urls = json.load(file)
@@ -210,7 +208,8 @@ class URLManager(QWidget):
for row, url in enumerate(urls_to_display):
self.url_list.insertRow(row)
self.url_list.setItem(row, 0, QTableWidgetItem(url['url']))
- self.url_list.setItem(row, 1, QTableWidgetItem(url['date']))
+ formatted_date = self.format_date(url['date'])
+ self.url_list.setItem(row, 1, QTableWidgetItem(formatted_date))
actions_layout = QHBoxLayout()
@@ -236,6 +235,17 @@ class URLManager(QWidget):
vertical_header = self.url_list.verticalHeader()
vertical_header.setVisible(False)
+ def format_date(self, date_str):
+ date = QDateTime.fromString(date_str, Qt.ISODate)
+ if self.settings['date_format'] == 'Nerdy':
+ return date.toString("yyyy-MM-ddTHH:mm:ss")
+ elif self.settings['date_format'] == 'Normal':
+ return date.toString("dd/MM/yy @ HH:mm")
+ elif self.settings['date_format'] == 'Murica!':
+ return date.toString("MM/dd/yyyy hh:mm AP")
+ else:
+ return date_str
+
def edit_url(self, row):
url = self.urls[row]['url']
description = self.urls[row]['description']
@@ -251,29 +261,33 @@ class URLManager(QWidget):
self.search_engine = settings['search_engine']
self.date_format = settings.get('date_format', 'Nerdy')
self.language = settings.get('language', 'English')
- self.load_translations(f'translations_{self.language.lower()[:2]}.json')
+ return settings
else:
- self.data_directory = 'data/'
- self.search_engine = 'Google'
- self.date_format = 'Nerdy'
- self.language = 'English'
- self.save_settings()
+ default_settings = {
+ 'data_directory': 'data/',
+ 'search_engine': 'Google',
+ 'date_format': 'Nerdy',
+ 'language': 'English'
+ }
+ self.save_settings(default_settings)
+ return default_settings
- def save_settings(self):
+ def save_settings(self, settings=None):
settings_path = 'data/settings.json'
os.makedirs(os.path.dirname(settings_path), exist_ok=True)
- with open(settings_path, 'w') as file:
+ if settings is None:
settings = {
'data_directory': self.data_directory,
'search_engine': self.search_engine,
'date_format': self.date_format,
'language': self.language
}
+ with open(settings_path, 'w') as file:
json.dump(settings, file)
def load_categories(self):
self.groups = set()
- categories_path = os.path.join(self.data_directory, 'categories.json')
+ categories_path = os.path.join(self.settings['data_directory'], 'categories.json')
if os.path.exists(categories_path):
with open(categories_path, 'r') as file:
self.groups = set(json.load(file))
@@ -281,7 +295,7 @@ class URLManager(QWidget):
self.group_combobox.setCurrentText(self.translations['default_category'])
def save_categories(self):
- categories_path = os.path.join(self.data_directory, 'categories.json')
+ categories_path = os.path.join(self.settings['data_directory'], 'categories.json')
os.makedirs(os.path.dirname(categories_path), exist_ok=True)
with open(categories_path, 'w') as file:
json.dump(list(self.groups), file)
@@ -305,7 +319,7 @@ class URLManager(QWidget):
self.urls = []
for group in self.groups:
category_filename = self.get_category_filename(group)
- category_path = os.path.join(self.data_directory, category_filename)
+ category_path = os.path.join(self.settings['data_directory'], category_filename)
if os.path.exists(category_path):
with open(category_path, 'r') as file:
self.urls.extend(json.load(file))
@@ -315,7 +329,7 @@ class URLManager(QWidget):
for group in self.groups:
group_urls = [url for url in self.urls if url['group'] == group]
category_filename = self.get_category_filename(group)
- category_path = os.path.join(self.data_directory, category_filename)
+ category_path = os.path.join(self.settings['data_directory'], category_filename)
with open(category_path, 'w') as file:
json.dump(group_urls, file)
@@ -339,7 +353,7 @@ class URLManager(QWidget):
layout.addWidget(written_by_label, alignment=Qt.AlignCenter)
link_label = QLabel()
- link_label.setText(f'{self.translations["repository_link"]}')
+ link_label.setText(f'{self.translations["repository_link_name"]}')
link_label.setOpenExternalLinks(True)
layout.addWidget(link_label, alignment=Qt.AlignCenter)
@@ -366,7 +380,7 @@ class SettingsDialog(QDialog):
layout.addWidget(directory_label)
directory_layout = QHBoxLayout()
- self.directory_input = QLineEdit(self.parent.data_directory)
+ self.directory_input = QLineEdit(self.parent.settings['data_directory'])
self.browse_button = QPushButton(self.parent.translations['browse_button'])
self.browse_button.clicked.connect(self.browse_directory)
directory_layout.addWidget(self.directory_input)
@@ -376,20 +390,25 @@ class SettingsDialog(QDialog):
layout.addSpacerItem(QSpacerItem(0, 4, QSizePolicy.Minimum, QSizePolicy.Fixed))
form_layout = QFormLayout()
+
+ # Populate Search Engine Combobox
self.search_engine_combobox = QComboBox()
search_engines = sorted(self.parent.search_engines.keys())
self.search_engine_combobox.addItems(search_engines)
- self.search_engine_combobox.setCurrentText(self.parent.search_engine)
+ self.search_engine_combobox.setCurrentText(self.parent.settings['search_engine'])
form_layout.addRow(self.parent.translations['search_engine_label'], self.search_engine_combobox)
+ # Populate Date Format Combobox
self.date_format_combobox = QComboBox()
self.date_format_combobox.addItems(["Nerdy", "Normal", "Murica!"])
- self.date_format_combobox.setCurrentText(self.parent.date_format)
+ self.date_format_combobox.setCurrentText(self.parent.settings['date_format'])
form_layout.addRow(self.parent.translations['date_format_label'], self.date_format_combobox)
+ # Populate Language Combobox
self.language_combobox = QComboBox()
- self.language_combobox.addItems(["English"]) # Add other languages as needed
- self.language_combobox.setCurrentText(self.parent.language)
+ self.populate_language_combobox()
+ current_language_code = self.parent.settings['language']
+ self.set_current_language(current_language_code)
form_layout.addRow(self.parent.translations['language_label'], self.language_combobox)
layout.addLayout(form_layout)
@@ -405,12 +424,41 @@ class SettingsDialog(QDialog):
if directory:
self.directory_input.setText(directory)
+ def populate_language_combobox(self):
+ lang_dir = 'lang/'
+ language_files = [f for f in os.listdir(lang_dir) if f.startswith('translations_') and f.endswith('.json')]
+ self.language_map = {}
+
+ for file_name in language_files:
+ file_path = os.path.join(lang_dir, file_name)
+ with open(file_path, 'r') as file:
+ data = json.load(file)
+ language_name = data.get('language', 'Unknown')
+ language_code = file_name[len('translations_'):-len('.json')]
+ display_text = f"{language_name} ({language_code})"
+ self.language_combobox.addItem(display_text)
+ self.language_map[language_code] = display_text
+
+ def set_current_language(self, language_code):
+ if language_code in self.language_map:
+ display_text = self.language_map[language_code]
+ index = self.language_combobox.findText(display_text)
+ if index != -1:
+ self.language_combobox.setCurrentIndex(index)
+
def save_settings(self):
- self.parent.data_directory = self.directory_input.text()
- self.parent.search_engine = self.search_engine_combobox.currentText()
- self.parent.date_format = self.date_format_combobox.currentText()
- self.parent.language = self.language_combobox.currentText()
- self.parent.save_settings()
+ selected_language = self.language_combobox.currentText()
+ language_code = selected_language.split('(')[-1].strip(' )') # Extract language code from "(en)" format
+ old_language = self.parent.settings['language']
+ self.parent.settings['data_directory'] = self.directory_input.text()
+ self.parent.settings['search_engine'] = self.search_engine_combobox.currentText()
+ self.parent.settings['date_format'] = self.date_format_combobox.currentText()
+ self.parent.settings['language'] = language_code
+ self.parent.save_settings(self.parent.settings)
+
+ if old_language != language_code:
+ QMessageBox.information(self, self.parent.translations['restart_required_title'], self.parent.translations['restart_required_message'])
+
self.accept()
if __name__ == '__main__':
diff --git a/assets/search_light.svg b/assets/search_light.svg
index d76bfe5..8204929 100644
--- a/assets/search_light.svg
+++ b/assets/search_light.svg
@@ -1,4 +1,4 @@
-
diff --git a/assets/visit_dark.svg b/assets/visit_dark.svg
new file mode 100644
index 0000000..6d8d099
--- /dev/null
+++ b/assets/visit_dark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/assets/visit_light.svg b/assets/visit_light.svg
new file mode 100644
index 0000000..7614c47
--- /dev/null
+++ b/assets/visit_light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/filters/tumblr.com.filter.py b/filters/tumblr.com.filter.py
new file mode 100644
index 0000000..ae1bad8
--- /dev/null
+++ b/filters/tumblr.com.filter.py
@@ -0,0 +1,11 @@
+# Extract terms from the Tumblr URL
+parsed_url = QUrl(url)
+host_parts = parsed_url.host().split('.')
+domain = '.'.join(host_parts[-2:]) # Extracting the domain name with TLD
+path = parsed_url.path().strip('/').split('/')
+
+terms.append(domain)
+if len(path) > 0:
+ terms.append(path[0]) # User name
+if len(path) > 2:
+ terms.append(path[2]) # Post name
\ No newline at end of file
diff --git a/lang/translations_en.json b/lang/translations_en.json
index 83c77bd..995309c 100644
--- a/lang/translations_en.json
+++ b/lang/translations_en.json
@@ -5,6 +5,7 @@
"title": "tabRemember - URL Manager",
"url_placeholder": "URL",
"description_placeholder": "Enter Description or Thoughts",
+ "category_name": "Category Name",
"all_categories": "All Categories",
"default_category": "Default Category",
"save_category_button": "Save Category",
@@ -24,6 +25,8 @@
"save_button": "Save",
"language_label": "Language:",
"restart_required_title": "Restart Required",
- "restart_required_message": "You need to restart the application for the language changes to take effect."
+ "restart_required_message": "You need to restart the application for the language changes to take effect.",
+ "column_date": "Date",
+ "column_actions": "Actions"
}
}
diff --git a/lang/translations_is.json b/lang/translations_is.json
index c5d3995..32a60cf 100644
--- a/lang/translations_is.json
+++ b/lang/translations_is.json
@@ -2,13 +2,14 @@
"language": "Íslenska",
"contributors": ["Axel Rafn "],
"translations": {
- "title": "tabRemember - URL Manager",
- "url_placeholder": "URL",
+ "title": "tabRemember - Slóðastjóri",
+ "url_placeholder": "Slóð",
"description_placeholder": "Skrifaðu lýsingu eða hvað þú ert að hugsa um",
+ "category_name": "Nafn Flokks",
"all_categories": "Allir Flokkar",
"default_category": "Sjálgefinn Flokkur",
"save_category_button": "Vista Flokk",
- "save_url_button": "Vista URL",
+ "save_url_button": "Vista Slóð",
"search_placeholder": "Leita..",
"delete_confirmation": "Ertu viss um að þú viljir eyða þessu URLi?",
"delete_confirmation_title": "Eyða URLi",
@@ -20,10 +21,12 @@
"data_directory_label": "Gagna Mappa:",
"browse_button": "Velja..",
"search_engine_label": "Leitarvél:",
- "date_format_label": "Dagsetnigar form:",
+ "date_format_label": "Dagsetningar form:",
"save_button": "Vista",
"language_label": "Tungumál:",
"restart_required_title": "Endurræsingu krafist",
- "restart_required_message": "Þú þarft að endurræsa forritið til að breytingar á tungumáli taki gildi."
+ "restart_required_message": "Þú þarft að endurræsa forritið til að breytingar á tungumáli taki gildi.",
+ "column_date": "Dags",
+ "column_actions": "Aðgerðir"
}
}