Compare commits
20 Commits
v4.0.0-RC3
...
v4.0.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d3cdb7abb | ||
|
|
5b8670814b | ||
|
|
19acf11b1a | ||
|
|
39056d1d91 | ||
|
|
436c54b733 | ||
|
|
b48a42dcc8 | ||
|
|
e00e21c46a | ||
|
|
2aa821ee65 | ||
|
|
5ab0c39aa9 | ||
|
|
f09bbd3311 | ||
|
|
91589018a3 | ||
|
|
d41c9e1ed6 | ||
|
|
0cbd9a7a0b | ||
|
|
7db68ab2ad | ||
|
|
c7c53b5a68 | ||
|
|
9d2443b0f0 | ||
|
|
2c3ffd5e66 | ||
|
|
485eccb373 | ||
|
|
faf9a5293a | ||
|
|
e58cf4d206 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,3 +6,6 @@ data/
|
|||||||
*.qtds
|
*.qtds
|
||||||
artemis_rc.py
|
artemis_rc.py
|
||||||
site
|
site
|
||||||
|
Generated
|
||||||
|
app.build
|
||||||
|
app.dist
|
||||||
|
|||||||
18
CHANGELOG.md
18
CHANGELOG.md
@@ -3,7 +3,19 @@
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and the format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
> This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and the format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## [Unreleased] - 2024-05-28
|
## [Unreleased]
|
||||||
|
|
||||||
|
|
||||||
|
## [4.0.3] - 2024-06-10
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Optimized final package size (reduced by 30% to 50%) by explicitly including necessary plugins/DLLs and excluding unnecessary ones with Nuitka [#47](https://github.com/AresValley/Artemis/issues/47)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- When the links/urls in the description field of a signal are clicked, they open the default browser [#46](https://github.com/AresValley/Artemis/issues/46)
|
||||||
|
- Fixed an error occurig on Linux where configuration file path are not properly resolved during startup with the binary version of the program (they are if running from source) [#48](https://github.com/AresValley/Artemis/issues/48)
|
||||||
|
|
||||||
|
## [4.0.1] - 2024-06-9
|
||||||
### Added
|
### Added
|
||||||
- Database format has been changed from .csv to a proper relational DB (sqlite) which is much easier handled thanks to the native library shipped with python
|
- Database format has been changed from .csv to a proper relational DB (sqlite) which is much easier handled thanks to the native library shipped with python
|
||||||
- Possibility to create an arbitrary number of new databases for storing new custom signals
|
- Possibility to create an arbitrary number of new databases for storing new custom signals
|
||||||
@@ -89,7 +101,9 @@ First release.
|
|||||||
|
|
||||||
|
|
||||||
<!-- Links definitions -->
|
<!-- Links definitions -->
|
||||||
[Unreleased]: https://github.com/AresValley/Artemis/compare/v3.2.4...HEAD
|
[Unreleased]: https://github.com/AresValley/Artemis/compare/v4.0.3...HEAD
|
||||||
|
[4.0.1]: https://github.com/AresValley/Artemis/compare/v4.0.1...v4.0.3
|
||||||
|
[4.0.1]: https://github.com/AresValley/Artemis/compare/v3.2.4...v4.0.1
|
||||||
[3.2.4]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.4
|
[3.2.4]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.4
|
||||||
[3.2.3]: https://github.com/AresValley/Artemis/compare/v3.2.2...v3.2.3
|
[3.2.3]: https://github.com/AresValley/Artemis/compare/v3.2.2...v3.2.3
|
||||||
[3.2.2]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.2
|
[3.2.2]: https://github.com/AresValley/Artemis/compare/v3.2.1...v3.2.2
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
|
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="docs/assets/artemis_preview.png">
|
<img src="docs/assets/artemis_preview.webp">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|||||||
1525
artemis/resources.py
1525
artemis/resources.py
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,7 @@ from artemis.utils.path_utils import DATA_DIR
|
|||||||
from artemis.utils.network_utils import NetworkManager
|
from artemis.utils.network_utils import NetworkManager
|
||||||
from artemis.utils.generic_utils import generate_filter_query
|
from artemis.utils.generic_utils import generate_filter_query
|
||||||
from artemis.utils.path_utils import normalize_dialog_path
|
from artemis.utils.path_utils import normalize_dialog_path
|
||||||
|
from artemis.utils.config_utils import CONFIGURE_QT
|
||||||
|
|
||||||
from artemis.ui.preferences import UIPreferences
|
from artemis.ui.preferences import UIPreferences
|
||||||
from artemis.ui.dbmanager import UIdbmanager
|
from artemis.ui.dbmanager import UIdbmanager
|
||||||
@@ -69,6 +70,8 @@ class UIArtemis(QObject):
|
|||||||
|
|
||||||
self.network_manager = NetworkManager(self)
|
self.network_manager = NetworkManager(self)
|
||||||
|
|
||||||
|
self.autoload_db()
|
||||||
|
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
# QML > Python connections
|
# QML > Python connections
|
||||||
@@ -331,6 +334,13 @@ class UIArtemis(QObject):
|
|||||||
self.cateditor.load_cateditor_ui()
|
self.cateditor.load_cateditor_ui()
|
||||||
|
|
||||||
|
|
||||||
|
def autoload_db(self):
|
||||||
|
sig_id_path = DATA_DIR / 'SigID' / Constants.SQL_NAME
|
||||||
|
autoload = CONFIGURE_QT.value("Database", "autoload", 0)
|
||||||
|
if sig_id_path.exists() and int(autoload):
|
||||||
|
self.load_db('SigID')
|
||||||
|
|
||||||
|
|
||||||
def dialog_popup(self, message_type, title, message):
|
def dialog_popup(self, message_type, title, message):
|
||||||
""" Opens a general dialog popup
|
""" Opens a general dialog popup
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ class UIDownloader(QObject):
|
|||||||
# Python > QML Signals
|
# Python > QML Signals
|
||||||
show_ui = Signal()
|
show_ui = Signal()
|
||||||
close_ui = Signal()
|
close_ui = Signal()
|
||||||
|
update_progress_bar = Signal(int, int)
|
||||||
|
update_status = Signal(str)
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -21,8 +24,6 @@ class UIDownloader(QObject):
|
|||||||
self._engine = QQmlApplicationEngine()
|
self._engine = QQmlApplicationEngine()
|
||||||
self._engine.load('qrc:/ui/Downloader.qml')
|
self._engine.load('qrc:/ui/Downloader.qml')
|
||||||
self._window = self._engine.rootObjects()[0]
|
self._window = self._engine.rootObjects()[0]
|
||||||
self._progress_bar = self._window.findChild(QObject, "progressBar")
|
|
||||||
self._label_progress = self._window.findChild(QObject, "labelProgress")
|
|
||||||
|
|
||||||
self._connect()
|
self._connect()
|
||||||
|
|
||||||
@@ -34,6 +35,8 @@ class UIDownloader(QObject):
|
|||||||
# Python > QML connections
|
# Python > QML connections
|
||||||
self.show_ui.connect(self._window.show)
|
self.show_ui.connect(self._window.show)
|
||||||
self.close_ui.connect(self._window.close)
|
self.close_ui.connect(self._window.close)
|
||||||
|
self.update_progress_bar.connect(self._window.updateProgressBar)
|
||||||
|
self.update_status.connect(self._window.updateStatus)
|
||||||
|
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
@@ -66,7 +69,7 @@ class UIDownloader(QObject):
|
|||||||
""" Stop the download when user press abort button """
|
""" Stop the download when user press abort button """
|
||||||
if self.reply:
|
if self.reply:
|
||||||
self.reply.abort()
|
self.reply.abort()
|
||||||
self._progress_bar.setProperty("value", 0)
|
self.update_progress_bar.emit(0, 0)
|
||||||
|
|
||||||
if self.file:
|
if self.file:
|
||||||
self.file.cancelWriting()
|
self.file.cancelWriting()
|
||||||
@@ -93,10 +96,10 @@ class UIDownloader(QObject):
|
|||||||
if self.file:
|
if self.file:
|
||||||
self.file.commit()
|
self.file.commit()
|
||||||
|
|
||||||
self._label_progress.setProperty("text", "Checking DB integrity (SHA-256)")
|
self.update_status.emit("Checking DB integrity (SHA-256)")
|
||||||
|
|
||||||
if match_hash(self.dest_file, self._parent.network_manager.remote_db_hash):
|
if match_hash(self.dest_file, self._parent.network_manager.remote_db_hash):
|
||||||
self._label_progress.setProperty("text", "Unpacking archive...")
|
self.update_status.emit("Unpacking archive...")
|
||||||
delete_dir(DATA_DIR / 'SigID')
|
delete_dir(DATA_DIR / 'SigID')
|
||||||
unpack_tar(self.dest_file, DATA_DIR / 'SigID')
|
unpack_tar(self.dest_file, DATA_DIR / 'SigID')
|
||||||
delete_file(self.dest_file)
|
delete_file(self.dest_file)
|
||||||
@@ -109,9 +112,8 @@ class UIDownloader(QObject):
|
|||||||
""" Update progress bar and label
|
""" Update progress bar and label
|
||||||
"""
|
"""
|
||||||
total_bytes = self._parent.network_manager.remote_db_size
|
total_bytes = self._parent.network_manager.remote_db_size
|
||||||
self._label_progress.setProperty("text", "{:.1f} Mb / {:.1f} Mb".format(bytesReceived/10**6, total_bytes/10**6))
|
self.update_status.emit("{:.1f} Mb / {:.1f} Mb".format(bytesReceived/10**6, total_bytes/10**6))
|
||||||
self._progress_bar.setProperty("to", total_bytes)
|
self.update_progress_bar.emit(bytesReceived, total_bytes)
|
||||||
self._progress_bar.setProperty("value", bytesReceived)
|
|
||||||
|
|
||||||
|
|
||||||
@Slot(QNetworkReply.NetworkError)
|
@Slot(QNetworkReply.NetworkError)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ class UIPreferences(QObject):
|
|||||||
show_ui = Signal()
|
show_ui = Signal()
|
||||||
load_material_accent = Signal(str)
|
load_material_accent = Signal(str)
|
||||||
load_material_theme = Signal(str)
|
load_material_theme = Signal(str)
|
||||||
|
load_autoload = Signal(int)
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
@@ -27,18 +28,21 @@ class UIPreferences(QObject):
|
|||||||
# QML > Python connections
|
# QML > Python connections
|
||||||
self._window.saveMaterialAccent.connect(self.save_material_accent)
|
self._window.saveMaterialAccent.connect(self.save_material_accent)
|
||||||
self._window.saveMaterialTheme.connect(self.save_material_theme)
|
self._window.saveMaterialTheme.connect(self.save_material_theme)
|
||||||
|
self._window.saveAutoload.connect(self.save_autoload)
|
||||||
|
|
||||||
# Python > QML connections
|
# Python > QML connections
|
||||||
self.show_ui.connect(self._window.show)
|
self.show_ui.connect(self._window.show)
|
||||||
self.load_material_accent.connect(self._window.loadMaterialAccent)
|
self.load_material_accent.connect(self._window.loadMaterialAccent)
|
||||||
self.load_material_theme.connect(self._window.loadMaterialTheme)
|
self.load_material_theme.connect(self._window.loadMaterialTheme)
|
||||||
|
self.load_autoload.connect(self._window.loadAutoload)
|
||||||
|
|
||||||
|
|
||||||
def load_preferences_ui(self):
|
def load_preferences_ui(self):
|
||||||
""" Loading all the initial preferences from the conf file to the UI
|
""" Loading all the initial preferences from the conf file to the UI
|
||||||
"""
|
"""
|
||||||
self.load_material_accent.emit(CONFIGURE_QT.get_or_default("Material", "Accent", "Green"))
|
self.load_material_accent.emit(CONFIGURE_QT.value("Material", "Accent", "Green"))
|
||||||
self.load_material_theme.emit(CONFIGURE_QT.get_or_default("Material", "Theme", "System"))
|
self.load_material_theme.emit(CONFIGURE_QT.value("Material", "Theme", "System"))
|
||||||
|
self.load_autoload.emit(int(CONFIGURE_QT.value("Database", "autoload", 0)))
|
||||||
self.show_ui.emit()
|
self.show_ui.emit()
|
||||||
|
|
||||||
|
|
||||||
@@ -54,3 +58,10 @@ class UIPreferences(QObject):
|
|||||||
""" Saving material theme setting
|
""" Saving material theme setting
|
||||||
"""
|
"""
|
||||||
CONFIGURE_QT.set("Material", "Theme", material_theme)
|
CONFIGURE_QT.set("Material", "Theme", material_theme)
|
||||||
|
|
||||||
|
|
||||||
|
@Slot(int)
|
||||||
|
def save_autoload(self, autoload):
|
||||||
|
""" Saving autoload setting
|
||||||
|
"""
|
||||||
|
CONFIGURE_QT.set("Database", "autoload", str(autoload))
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from artemis.utils.sys_utils import copy_file
|
|||||||
|
|
||||||
class Config(ConfigParser):
|
class Config(ConfigParser):
|
||||||
""" Custom configuration class derived from ConfigParser.
|
""" Custom configuration class derived from ConfigParser.
|
||||||
Used to get, set, save and remove any configuration from the conf file
|
Used to get value, set, save and remove any configuration from the conf file
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config_file_path, space_around_delimiters=False):
|
def __init__(self, config_file_path, space_around_delimiters=False):
|
||||||
@@ -15,11 +15,13 @@ class Config(ConfigParser):
|
|||||||
self.read(self._config_file_path)
|
self.read(self._config_file_path)
|
||||||
self._space_around_delimiters = space_around_delimiters
|
self._space_around_delimiters = space_around_delimiters
|
||||||
|
|
||||||
def get_or_default(self, section, option, default_value):
|
def value(self, section, option, default_value):
|
||||||
value = super().get(section, option)
|
value = super().get(section, option, fallback=default_value)
|
||||||
return value if value else default_value
|
return value
|
||||||
|
|
||||||
def set(self, section, option, value=None):
|
def set(self, section, option, value=None):
|
||||||
|
if not self.has_section(section):
|
||||||
|
self.add_section(section)
|
||||||
super().set(section, option, value)
|
super().set(section, option, value)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
@@ -32,10 +34,42 @@ class Config(ConfigParser):
|
|||||||
self.write(f, space_around_delimiters=self._space_around_delimiters)
|
self.write(f, space_around_delimiters=self._space_around_delimiters)
|
||||||
|
|
||||||
|
|
||||||
if not (PREFERENCES_DIR / 'qtquickcontrols2.conf').exists():
|
def merge_config_files(old_config_path, template_config_path):
|
||||||
copy_file(
|
""" Merge two configuration files: if the old one lacks some
|
||||||
BASE_DIR / 'config' / 'qtquickcontrols2.conf',
|
sections or options from a comparison with a template,
|
||||||
PREFERENCES_DIR / 'qtquickcontrols2.conf'
|
this function will add what is missing to the old conf file
|
||||||
)
|
"""
|
||||||
|
old_config = ConfigParser()
|
||||||
|
old_config.read(old_config_path)
|
||||||
|
|
||||||
|
new_config = ConfigParser()
|
||||||
|
new_config.read(template_config_path)
|
||||||
|
|
||||||
|
for section in new_config.sections():
|
||||||
|
if not old_config.has_section(section):
|
||||||
|
old_config.add_section(section)
|
||||||
|
for option in new_config.options(section):
|
||||||
|
if not old_config.has_option(section, option):
|
||||||
|
old_config.set(section, option, new_config.get(section, option))
|
||||||
|
|
||||||
|
with open(old_config_path, 'w') as f:
|
||||||
|
old_config.write(f)
|
||||||
|
|
||||||
|
|
||||||
|
def check_conf_file():
|
||||||
|
""" Check the integrity of the used conf file.
|
||||||
|
If it is not present it will add a copy to the PREF_DIR
|
||||||
|
and if it is different in structure (different section/options)
|
||||||
|
it will merge the conf file with the new template one
|
||||||
|
"""
|
||||||
|
active_conf = (PREFERENCES_DIR / 'qtquickcontrols2.conf').resolve()
|
||||||
|
template_conf = (BASE_DIR / 'config' / 'qtquickcontrols2.conf').resolve()
|
||||||
|
|
||||||
|
if not active_conf.exists():
|
||||||
|
copy_file(template_conf, active_conf)
|
||||||
|
else:
|
||||||
|
merge_config_files(active_conf, template_conf)
|
||||||
|
|
||||||
|
|
||||||
|
check_conf_file()
|
||||||
CONFIGURE_QT = Config((PREFERENCES_DIR / 'qtquickcontrols2.conf').resolve().as_posix())
|
CONFIGURE_QT = Config((PREFERENCES_DIR / 'qtquickcontrols2.conf').resolve().as_posix())
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Constants():
|
|||||||
APPLICATION_NAME = 'Artemis'
|
APPLICATION_NAME = 'Artemis'
|
||||||
ORGANIZATION_NAME = 'AresValley'
|
ORGANIZATION_NAME = 'AresValley'
|
||||||
ORGANIZATION_DOMAIN = 'aresvalley.com'
|
ORGANIZATION_DOMAIN = 'aresvalley.com'
|
||||||
APPLICATION_VERSION = '4.0.0'
|
APPLICATION_VERSION = '4.0.3'
|
||||||
|
|
||||||
SQL_NAME = 'data.sqlite'
|
SQL_NAME = 'data.sqlite'
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ def _app_dir():
|
|||||||
elif is_linux():
|
elif is_linux():
|
||||||
app_dir_path = Path.home() / '.local' / 'share' / Constants.ORGANIZATION_NAME / Constants.APPLICATION_NAME
|
app_dir_path = Path.home() / '.local' / 'share' / Constants.ORGANIZATION_NAME / Constants.APPLICATION_NAME
|
||||||
else:
|
else:
|
||||||
app_dir_path = BASE_DIR
|
app_dir_path = BASE_DIR.resolve()
|
||||||
|
|
||||||
if not app_dir_path.exists():
|
if not app_dir_path.exists():
|
||||||
app_dir_path.mkdir(parents=True)
|
app_dir_path.mkdir(parents=True)
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ from artemis.utils.config_utils import CONFIGURE_QT
|
|||||||
|
|
||||||
|
|
||||||
def set_ui():
|
def set_ui():
|
||||||
os.environ['QT_QUICK_CONTROLS_STYLE'] = CONFIGURE_QT.get_or_default('Controls', 'style', 'Material')
|
os.environ['QT_QUICK_CONTROLS_STYLE'] = CONFIGURE_QT.value('Controls', 'style', 'Material')
|
||||||
os.environ['QT_QUICK_CONTROLS_MATERIAL_VARIANT'] = CONFIGURE_QT.get_or_default('Material', 'variant', 'Dense')
|
os.environ['QT_QUICK_CONTROLS_MATERIAL_VARIANT'] = CONFIGURE_QT.value('Material', 'variant', 'Dense')
|
||||||
os.environ['QT_QUICK_CONTROLS_MATERIAL_THEME'] = CONFIGURE_QT.get_or_default('Material', 'theme', 'System')
|
os.environ['QT_QUICK_CONTROLS_MATERIAL_THEME'] = CONFIGURE_QT.value('Material', 'theme', 'System')
|
||||||
os.environ['QT_QUICK_CONTROLS_MATERIAL_ACCENT'] = CONFIGURE_QT.get_or_default('Material', 'accent', 'Green')
|
os.environ['QT_QUICK_CONTROLS_MATERIAL_ACCENT'] = CONFIGURE_QT.value('Material', 'accent', 'Green')
|
||||||
|
|
||||||
if is_windows():
|
if is_windows():
|
||||||
os.environ['QSG_RHI_BACKEND'] = 'opengl'
|
os.environ['QSG_RHI_BACKEND'] = 'opengl'
|
||||||
|
|||||||
@@ -13,13 +13,21 @@ python -m nuitka app.py \
|
|||||||
--show-modules \
|
--show-modules \
|
||||||
--assume-yes-for-downloads \
|
--assume-yes-for-downloads \
|
||||||
--enable-plugin=pyside6 \
|
--enable-plugin=pyside6 \
|
||||||
--force-stderr-spec="{TEMP}/artemis.err.log" \
|
--noinclude-dlls=libQt6Charts* \
|
||||||
--force-stdout-spec="{TEMP}/artemis.out.log" \
|
--noinclude-dlls=libQt6Quick3D* \
|
||||||
--include-qt-plugins=sensible,styles,qml,multimedia \
|
--noinclude-dlls=libQt6Sensors* \
|
||||||
|
--noinclude-dlls=libQt6Test* \
|
||||||
|
--noinclude-dlls=libQt6WebEngine* \
|
||||||
|
--include-qt-plugins=sensible \
|
||||||
|
--include-qt-plugins=styles \
|
||||||
|
--include-qt-plugins=qml \
|
||||||
|
--include-qt-plugins=multimedia \
|
||||||
--include-data-files=./artemis/resources.py=./artemis/resources.py \
|
--include-data-files=./artemis/resources.py=./artemis/resources.py \
|
||||||
--include-data-files=./config/qtquickcontrols2.conf=./config/qtquickcontrols2.conf \
|
--include-data-files=./config/qtquickcontrols2.conf=./config/qtquickcontrols2.conf \
|
||||||
--include-data-files=./building/Linux/create_shortcut.sh=./create_shortcut.sh \
|
--include-data-files=./building/Linux/create_shortcut.sh=./create_shortcut.sh \
|
||||||
--include-data-files=./images/artemis_icon.svg=./images/artemis_icon.svg
|
--include-data-files=./images/artemis_icon.svg=./images/artemis_icon.svg \
|
||||||
|
--force-stderr-spec="{TEMP}/artemis.err.log" \
|
||||||
|
--force-stdout-spec="{TEMP}/artemis.out.log"
|
||||||
|
|
||||||
chmod 755 ./app.dist/app.bin
|
chmod 755 ./app.dist/app.bin
|
||||||
|
|
||||||
|
|||||||
@@ -12,15 +12,23 @@ python -m nuitka app.py `
|
|||||||
--assume-yes-for-downloads `
|
--assume-yes-for-downloads `
|
||||||
--windows-console-mode=disable `
|
--windows-console-mode=disable `
|
||||||
--enable-plugin=pyside6 `
|
--enable-plugin=pyside6 `
|
||||||
--force-stderr-spec="{TEMP}\artemis.err.log" `
|
--noinclude-dlls="Qt6Charts*" `
|
||||||
--force-stdout-spec="{TEMP}\artemis.out.log" `
|
--noinclude-dlls="Qt6Quick3D*" `
|
||||||
--include-qt-plugins=sensible,styles,qml,multimedia `
|
--noinclude-dlls="Qt6Sensors*" `
|
||||||
|
--noinclude-dlls="Qt6Test*" `
|
||||||
|
--noinclude-dlls="Qt6WebEngine*" `
|
||||||
|
--include-qt-plugins=sensible `
|
||||||
|
--include-qt-plugins=styles `
|
||||||
|
--include-qt-plugins=qml `
|
||||||
|
--include-qt-plugins=multimedia `
|
||||||
--include-data-files=.\artemis\resources.py=.\artemis\resources.py `
|
--include-data-files=.\artemis\resources.py=.\artemis\resources.py `
|
||||||
--include-data-files=.\config\qtquickcontrols2.conf=.\config\qtquickcontrols2.conf `
|
--include-data-files=.\config\qtquickcontrols2.conf=.\config\qtquickcontrols2.conf `
|
||||||
|
--force-stderr-spec="{TEMP}\artemis.err.log" `
|
||||||
|
--force-stdout-spec="{TEMP}\artemis.out.log" `
|
||||||
--windows-company-name=Aresvalley.com `
|
--windows-company-name=Aresvalley.com `
|
||||||
--windows-product-name=Artemis `
|
--windows-product-name=Artemis `
|
||||||
--windows-file-version=4.0.0 `
|
--windows-file-version=4.0.3 `
|
||||||
--windows-product-version=4.0.0 `
|
--windows-product-version=4.0.3 `
|
||||||
--windows-file-description=Artemis `
|
--windows-file-description=Artemis `
|
||||||
--windows-icon-from-ico=images\artemis_icon.ico
|
--windows-icon-from-ico=images\artemis_icon.ico
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#define MyAppName "Artemis"
|
#define MyAppName "Artemis"
|
||||||
#define MyAppVersion "4.0.0"
|
#define MyAppVersion "4.0.3"
|
||||||
#define MyAppPublisher "AresValley"
|
#define MyAppPublisher "AresValley"
|
||||||
#define MyAppURL "https://www.aresvalley.com/"
|
#define MyAppURL "https://www.aresvalley.com/"
|
||||||
#define MyAppExeName "artemis.exe"
|
#define MyAppExeName "artemis.exe"
|
||||||
@@ -18,7 +18,7 @@ LicenseFile=..\..\LICENSE
|
|||||||
PrivilegesRequiredOverridesAllowed=dialog
|
PrivilegesRequiredOverridesAllowed=dialog
|
||||||
OutputDir=..\
|
OutputDir=..\
|
||||||
OutputBaseFilename=Artemis
|
OutputBaseFilename=Artemis
|
||||||
SetupIconFile=..\..\images\artemis_icon.ico
|
SetupIconFile=..\..\images\installer_icon.ico
|
||||||
Compression=lzma2/ultra64
|
Compression=lzma2/ultra64
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
VersionInfoVersion={#MyAppVersion}
|
VersionInfoVersion={#MyAppVersion}
|
||||||
|
|||||||
@@ -23,6 +23,6 @@ python -m nuitka app.py \
|
|||||||
--macos-app-name=Artemis \
|
--macos-app-name=Artemis \
|
||||||
--macos-app-mode=gui \
|
--macos-app-mode=gui \
|
||||||
--macos-sign-identity=ad-hoc \
|
--macos-sign-identity=ad-hoc \
|
||||||
--macos-app-version=4.0.0
|
--macos-app-version=4.0.3
|
||||||
|
|
||||||
echo "Building Linux target finished."
|
echo "Building Linux target finished."
|
||||||
|
|||||||
@@ -5,3 +5,6 @@ style=Material
|
|||||||
variant=Dense
|
variant=Dense
|
||||||
theme=System
|
theme=System
|
||||||
accent=Green
|
accent=Green
|
||||||
|
|
||||||
|
[Database]
|
||||||
|
autoload=0
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
"total_bytes": 244449280
|
"total_bytes": 244449280
|
||||||
},
|
},
|
||||||
"windows": {
|
"windows": {
|
||||||
"version": "4.0.0"
|
"version": "4.0.1"
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"version": "4.0.0"
|
"version": "4.0.1"
|
||||||
},
|
},
|
||||||
"mac": {
|
"mac": {
|
||||||
"version": "4.0.0"
|
"version": "4.0.0"
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 810 KiB |
BIN
docs/assets/artemis_preview.webp
Normal file
BIN
docs/assets/artemis_preview.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 209 KiB |
@@ -12,65 +12,3 @@ Artemis is maintained by Marco Dalla Tiezza and released under the [GPLv3](https
|
|||||||
* [**Eric Wiessner (KI7POL)**](https://github.com/WheezyE "GitHub profile") - *ARM port (Raspberry Pi3B+ and Pi4B)*
|
* [**Eric Wiessner (KI7POL)**](https://github.com/WheezyE "GitHub profile") - *ARM port (Raspberry Pi3B+ and Pi4B)*
|
||||||
* [**Pierpaolo Pravatto**](https://github.com/ppravatto "GitHub profile") - *Wiki page, β Tester*
|
* [**Pierpaolo Pravatto**](https://github.com/ppravatto "GitHub profile") - *Wiki page, β Tester*
|
||||||
* [**Francesco Capostagno**](https://github.com/fcapostagno "GitHub profile"), **Luca**, **Pietro** - *β Tester*
|
* [**Francesco Capostagno**](https://github.com/fcapostagno "GitHub profile"), **Luca**, **Pietro** - *β Tester*
|
||||||
|
|
||||||
## Donators
|
|
||||||
|
|
||||||
* Eric Hahn
|
|
||||||
* Alan Lawrence
|
|
||||||
* Diego Gil Fernandez
|
|
||||||
* Torsten Teichert
|
|
||||||
* Charles Preston
|
|
||||||
* Brad Hein
|
|
||||||
* Paolo Romani
|
|
||||||
* Michelle Corbani
|
|
||||||
* Martin van Duinen
|
|
||||||
* Valentino Zardi
|
|
||||||
* Emmanuel Fabre
|
|
||||||
* Oscar Nilsson
|
|
||||||
* Pierre Declercq
|
|
||||||
* Detlef Jahn
|
|
||||||
* Oliver Schellenberg
|
|
||||||
* Stephane Imbertone
|
|
||||||
* Roel Ketelaars
|
|
||||||
* Timothy Ehrhart
|
|
||||||
* George Mager
|
|
||||||
* Gerhard Amon
|
|
||||||
* Gerald Schmidt
|
|
||||||
* Carlos Rocha
|
|
||||||
* Joshua Frohberg
|
|
||||||
* Bill Riches
|
|
||||||
* Jeffrey Krehbiel
|
|
||||||
* Володимир Багмет
|
|
||||||
* Philip Hamlin
|
|
||||||
* David Davies
|
|
||||||
* Nigel P. Lawrence
|
|
||||||
* Marco Rissi (PP5ZX)
|
|
||||||
* Martin van Duinen
|
|
||||||
* Alex Diamantopulo
|
|
||||||
* Joseph Winter
|
|
||||||
* Mark Bender
|
|
||||||
* Rolf Gerhardt
|
|
||||||
* Denese Harris
|
|
||||||
* Benjamin Steele
|
|
||||||
* Alexander Irmscher
|
|
||||||
* Jonathan Chang
|
|
||||||
* Torsten Lipke
|
|
||||||
* Massimo Petrantoni
|
|
||||||
* William Arcand
|
|
||||||
* Jon Carp
|
|
||||||
* Robert Crone
|
|
||||||
* William Houston
|
|
||||||
* Richard Quasne
|
|
||||||
* Tom Krugliakov
|
|
||||||
* Francisco Neira Basso
|
|
||||||
* Alistair Macrae
|
|
||||||
* Kevin Arburn
|
|
||||||
* Marek Barłóg
|
|
||||||
* Gabriel Glösmann
|
|
||||||
* Corbin Williams
|
|
||||||
* Ton Machielsen
|
|
||||||
* Ivan Rancic
|
|
||||||
* Alipio Fernandez
|
|
||||||
* Matt Eisele
|
|
||||||
* Martin Dudel
|
|
||||||
* Harald Geier
|
|
||||||
|
|||||||
@@ -9,3 +9,7 @@ title: Documentation
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
|
**Artemis** is a software designed to assist **radio frequency (RF) signal identification and storage**. It simplifies real-time spectrum analysis by leveraging one of the most extensive and community-driven databases, containing nearly **500 recognized signals**. This comprehensive software solution allows users to collect RF signals with specific parameters such as frequency, bandwidth, modulation, etc. Users can also store spectrum waterfalls, audio samples, and all types of documents for future reference. Artemis provides a robust platform to manage a wide range of RF data with precision and ease.
|
||||||
|
|
||||||
|
<p align="center" markdown>
|
||||||
|
[Artemis Homepage](https://www.aresvalley.com){ .md-button }
|
||||||
|
</p>
|
||||||
|
|||||||
@@ -12,7 +12,12 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
## :simple-linux: Linux
|
## :simple-linux: Linux
|
||||||
1. Download `Artemis-Linux-x86_64-4.x.x.tar` in the Assets menu from the [:material-download: LATEST RELEASE](https://github.com/AresValley/Artemis/releases) and extract the tarball archive in a folder of your choice and run the executable `app.bin`.
|
1. Download `Artemis-Linux-x86_64-4.x.x.tar` in the Assets menu from the [:material-download: LATEST RELEASE](https://github.com/AresValley/Artemis/releases) and extract the tarball archive in a folder of your choice.
|
||||||
|
2. Before running `app.bin`, be sure to have the executable permissions to the binary file with:
|
||||||
|
|
||||||
|
```
|
||||||
|
chmod 700 app.bin
|
||||||
|
```
|
||||||
|
|
||||||
### Create a Shortcut
|
### Create a Shortcut
|
||||||
|
|
||||||
@@ -38,5 +43,5 @@ The support for the macOS compiled version of the program is temporarily limited
|
|||||||
|
|
||||||
* **Run the program directly from the source:** Follow the instructions provided in [this chapter](run_from_source.md) to launch the program from the source code.
|
* **Run the program directly from the source:** Follow the instructions provided in [this chapter](run_from_source.md) to launch the program from the source code.
|
||||||
* **Compile the Artemis 4 binaries on your machine:** In this case, you can contribute by reporting any issues you encounter by [opening an Issue](https://github.com/AresValley/Artemis/issues).
|
* **Compile the Artemis 4 binaries on your machine:** In this case, you can contribute by reporting any issues you encounter by [opening an Issue](https://github.com/AresValley/Artemis/issues).
|
||||||
* **Use the last available compiled version (3.2.1):** Although this version is no longer officially supported, it remains available for use: [:material-download: Artemis-3.2.1.dmg](https://aresvalley.com/download/11/).
|
* **Use the last available compiled version (3.2.1):** Although this version is no longer officially supported, it remains available for use: [:material-download: Artemis-3.2.1.dmg](https://www.aresvalley.com/?sdm_process_download=1&download_id=377).
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,21 @@
|
|||||||
## 1. Kp Index
|
## 1. Kp Index
|
||||||
The **K index** is a number (from 0 to 9) that shows how much Earth's magnetic field is disturbed. A K index of 1 means things are calm, while a K index of 5 or higher indicates a geomagnetic storm. These disturbances are measured with magnetometers that track changes in Earth's magnetic field every three hours. The K itself comes from a German word "Kennziffer" meaning "characteristic digit". To get a big picture of what's happening around the world, an official planetary **Kp index** is calculated. This is done by averaging the K indices from a special network of 13 geomagnetic observatories located around the globe at mid-latitudes.
|
The **K index** is a number (from 0 to 9) that shows how much Earth's magnetic field is disturbed. A K index of 1 means things are calm, while a K index of 5 or higher indicates a geomagnetic storm. These disturbances are measured with magnetometers that track changes in Earth's magnetic field every three hours. The K itself comes from a German word "Kennziffer" meaning "characteristic digit". To get a big picture of what's happening around the world, an official planetary **Kp index** is calculated. This is done by averaging the K indices from a special network of 13 geomagnetic observatories located around the globe at mid-latitudes.
|
||||||
|
|
||||||
## 2. A Index
|
|Index|Activity Level|High Latitudes|Low Latitudes|Possible Source|
|
||||||
The **A index** represents the three-hourly equivalent amplitude of geomagnetic activity at a specific magnetometer station, derived from the station-specific K index. Due to the quasi-logarithmic nature of the K-scale in relation to magnetometer fluctuations, directly averaging a set of K indices is not really meaningful. Instead each K is converted back into a linear scale. The **Ap index** is determined by averaging the eight daily A values, providing a measure of geomagnetic activity for a specific day. Days with higher levels of geomagnetic activity correspond to higher daily Ap values.
|
|-|-|-|-|-|
|
||||||
|
|**Kp 0**|Inactive|Weak & slow aurora possible|Aurora extremely unlikely|Small influx of particles due to some reconnections mostly at the magnetotail|
|
||||||
|
|**Kp 1**|Very Quiet|Weak & slow aurora likely|Aurora very unlikely|Vide supra|
|
||||||
|
|**Kp 2**|Quiet|Moderate auroral display|Aurora unlikely|Vide supra|
|
||||||
|
|**Kp 3**|Unsettled|Active auroral display, sporadic substorm possible|Weak aurora display possible|Coronal hole sending fast winds or remains after days of storming, enhanced solar wind|
|
||||||
|
|**Kp 4**|Active|Active auroral display, multiple sporadic substorms possible|Weak Aurora Display Possible|Vide supra|
|
||||||
|
|**Kp 5**|Minor Storm (G1)|Very active auroral display, multiple substorms likely|Aurora display likely|Coronal hole sending fast winds or coronal mass ejection (CME), enhanced solar wind|
|
||||||
|
|**Kp 6**|Moderate Storm (G2)|Strong auroral display, longer substorms|Active auroral display very likely|Vide supra|
|
||||||
|
|**Kp 7**|Strong Storm (G3)|Very strong auroral display|Strong auroral display extremely likely|Large CMEs caused by solar storms or flares, very enhanced solar wind with strong shock wave|
|
||||||
|
|**Kp 8**|Severe Storm (G4)|Extremely strong aurora, long periods of substorming|Strong auroral display extremely likely|Vide supra|
|
||||||
|
|**Kp 9**|Extreme Storm (G5)|Extremely strong aurora, long periods of substorming|Very strong auroral display, overhead aurora possible|Super CMEs, Carrington-class events, devastating solar wind with extreme shock waves|
|
||||||
|
|
||||||
|
## 2. Ap Index
|
||||||
|
The **A index** represents the three-hourly equivalent amplitude of geomagnetic activity at a specific magnetometer station, derived from the station-specific K index. Due to the quasi-logarithmic nature of the K-scale in relation to magnetometer fluctuations, directly averaging a set of K indices is not really meaningful. Instead each K is converted back into a linear scale. The **Ap index** is determined by averaging the eight daily Ap values (3-hour) and using the same stations grid explained for the Kp index in the previous section. This provides a measure of geomagnetic activity for a specific day. Days with higher levels of geomagnetic activity correspond to higher daily Ap values.
|
||||||
|
|
||||||
## 3. NOAA Space Weather Scale
|
## 3. NOAA Space Weather Scale
|
||||||
|
|
||||||
|
|||||||
BIN
images/installer_icon.ico
Normal file
BIN
images/installer_icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 173 KiB |
@@ -82,18 +82,6 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function contentChanged() {
|
|
||||||
if (listView.currentIndex !== -1) {
|
|
||||||
myModel.set(
|
|
||||||
listView.currentIndex,
|
|
||||||
{
|
|
||||||
'name': nameField.text,
|
|
||||||
'description': descriptionField.text,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function lockMenu(toggle) {
|
function lockMenu(toggle) {
|
||||||
if (toggle) {
|
if (toggle) {
|
||||||
openButton.enabled = false
|
openButton.enabled = false
|
||||||
@@ -236,16 +224,18 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollView {
|
Flickable {
|
||||||
Layout.fillHeight: true
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
ScrollBar.vertical.interactive: true
|
Layout.fillHeight: true
|
||||||
|
TextArea.flickable: TextArea {
|
||||||
TextArea {
|
|
||||||
id: newDescriptionField
|
id: newDescriptionField
|
||||||
placeholderText: qsTr("Description")
|
placeholderText: qsTr("Description")
|
||||||
|
font.pointSize: 10
|
||||||
wrapMode: TextEdit.WordWrap
|
wrapMode: TextEdit.WordWrap
|
||||||
}
|
}
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
width: 10
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,16 +283,18 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollView {
|
Flickable {
|
||||||
Layout.fillHeight: true
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
ScrollBar.vertical.interactive: true
|
Layout.fillHeight: true
|
||||||
|
TextArea.flickable: TextArea {
|
||||||
TextArea {
|
|
||||||
id: editDescriptionField
|
id: editDescriptionField
|
||||||
placeholderText: qsTr("Description")
|
placeholderText: qsTr("Description")
|
||||||
|
font.pointSize: 10
|
||||||
wrapMode: TextEdit.WordWrap
|
wrapMode: TextEdit.WordWrap
|
||||||
}
|
}
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
width: 10
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,9 +438,7 @@ Window {
|
|||||||
id: nameField
|
id: nameField
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
placeholderText: qsTr("Name")
|
placeholderText: qsTr("Name")
|
||||||
onTextChanged: {
|
readOnly: true
|
||||||
contentChanged()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TextField {
|
TextField {
|
||||||
@@ -458,18 +448,18 @@ Window {
|
|||||||
readOnly: true
|
readOnly: true
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollView {
|
Flickable {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
ScrollBar.vertical.interactive: true
|
TextArea.flickable: TextArea {
|
||||||
|
|
||||||
TextArea {
|
|
||||||
id: descriptionField
|
id: descriptionField
|
||||||
wrapMode: TextEdit.WordWrap
|
placeholderText: qsTr("Description")
|
||||||
|
readOnly: true
|
||||||
font.pointSize: 10
|
font.pointSize: 10
|
||||||
onTextChanged: {
|
wrapMode: TextEdit.WordWrap
|
||||||
contentChanged()
|
|
||||||
}
|
}
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
width: 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import QtQuick.Controls
|
|||||||
import QtQuick.Controls.Material
|
import QtQuick.Controls.Material
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
|
||||||
Window {
|
Window {
|
||||||
id: windowDownloader
|
id: windowDownloader
|
||||||
|
|
||||||
@@ -23,6 +24,15 @@ Window {
|
|||||||
|
|
||||||
signal onAbort()
|
signal onAbort()
|
||||||
|
|
||||||
|
function updateProgressBar(bytesReceived, bytesTotal) {
|
||||||
|
progressBar.value = bytesReceived
|
||||||
|
progressBar.to = bytesTotal
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateStatus(arg) {
|
||||||
|
progressLabel.text = arg
|
||||||
|
}
|
||||||
|
|
||||||
Page {
|
Page {
|
||||||
id: page
|
id: page
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@@ -37,17 +47,19 @@ Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ProgressBar {
|
ProgressBar {
|
||||||
objectName: "progressBar"
|
id: progressBar
|
||||||
Layout.rightMargin: 20
|
Layout.rightMargin: 20
|
||||||
Layout.leftMargin: 20
|
Layout.leftMargin: 20
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
value: 0
|
value: 0
|
||||||
|
to: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
objectName: "labelProgress"
|
id: progressLabel
|
||||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: qsTr("Abort")
|
text: qsTr("Abort")
|
||||||
icon.source: "qrc:/images/icons/abort.svg"
|
icon.source: "qrc:/images/icons/abort.svg"
|
||||||
|
|||||||
@@ -23,10 +23,12 @@ Window {
|
|||||||
|
|
||||||
signal saveMaterialAccent(string arg)
|
signal saveMaterialAccent(string arg)
|
||||||
signal saveMaterialTheme(string arg)
|
signal saveMaterialTheme(string arg)
|
||||||
|
signal saveAutoload(int arg)
|
||||||
|
|
||||||
function saveAll() {
|
function saveAll() {
|
||||||
saveMaterialAccent(comboBoxAccent.currentText)
|
saveMaterialAccent(comboBoxAccent.currentText)
|
||||||
saveMaterialTheme(comboBoxTheme.currentText)
|
saveMaterialTheme(comboBoxTheme.currentText)
|
||||||
|
saveAutoload(checkBoxAutoload.checked)
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadMaterialAccent(accent) {
|
function loadMaterialAccent(accent) {
|
||||||
@@ -47,6 +49,14 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadAutoload(toggle) {
|
||||||
|
if (toggle) {
|
||||||
|
checkBoxAutoload.checked = true
|
||||||
|
} else {
|
||||||
|
checkBoxAutoload.checked = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DialogMessage {
|
DialogMessage {
|
||||||
id: dialogPreferencesSaved
|
id: dialogPreferencesSaved
|
||||||
modal: true
|
modal: true
|
||||||
@@ -132,6 +142,21 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: "Auto-load SigID Database on Startup"
|
||||||
|
font.pixelSize: 12
|
||||||
|
clip: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: checkBoxAutoload
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,17 +154,18 @@ Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollView {
|
Flickable {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 5
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
ScrollBar.vertical.interactive: true
|
Layout.topMargin: 5
|
||||||
|
TextArea.flickable: TextArea {
|
||||||
TextArea {
|
|
||||||
id: paramDescription
|
id: paramDescription
|
||||||
placeholderText: qsTr("Description")
|
placeholderText: qsTr("Description")
|
||||||
wrapMode: TextEdit.WordWrap
|
|
||||||
font.pointSize: 10
|
font.pointSize: 10
|
||||||
|
wrapMode: TextEdit.WordWrap
|
||||||
|
}
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
width: 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -274,7 +274,6 @@ Page {
|
|||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
width: 100
|
width: 100
|
||||||
height: 100
|
height: 100
|
||||||
@@ -573,18 +572,23 @@ Page {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollView {
|
Flickable {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.topMargin: 5
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
ScrollBar.vertical.interactive: true
|
Layout.topMargin: 5
|
||||||
|
TextArea.flickable: TextArea {
|
||||||
TextArea {
|
|
||||||
id: descriptionTextArea
|
id: descriptionTextArea
|
||||||
|
placeholderText: qsTr("Description")
|
||||||
|
font.pointSize: 10
|
||||||
wrapMode: TextEdit.WordWrap
|
wrapMode: TextEdit.WordWrap
|
||||||
textFormat: Text.MarkdownText
|
textFormat: Text.MarkdownText
|
||||||
font.pointSize: 10
|
|
||||||
readOnly: true
|
readOnly: true
|
||||||
|
onLinkActivated: (link) => {
|
||||||
|
Qt.openUrlExternally(link)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ScrollBar.vertical: ScrollBar {
|
||||||
|
width: 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("MAJOR STORM")
|
text: qsTr("STRONG STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
@@ -78,7 +78,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("MINOR STORM")
|
text: qsTr("MODERATE STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
@@ -94,7 +94,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("ACTIVE")
|
text: qsTr("ACTIVE-STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Item {
|
|||||||
topLeftRadius: 10
|
topLeftRadius: 10
|
||||||
topRightRadius: 10
|
topRightRadius: 10
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("SUPER STORM")
|
text: qsTr("EXTREME STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
@@ -74,7 +74,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("EXTREME STORM")
|
text: qsTr("SEVERE STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
@@ -90,7 +90,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("SEVERE STORM")
|
text: qsTr("STRONG STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
@@ -106,7 +106,7 @@ Item {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
clip: true
|
clip: true
|
||||||
Label {
|
Label {
|
||||||
text: qsTr("MAJOR STORM")
|
text: qsTr("MODERATE STORM")
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
|||||||
Reference in New Issue
Block a user