diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5507249 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.cpp linguist-language=C++ +*.h linguist-language=C++ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b86780 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# IDE files +.vscode/ +.idea/ + +# Qt build files +*.pro.user +*.pro.user.* +.qmake.stash +Makefile.Debug +Makefile.Release +release/ +debug/ +.qtc_clangd/ + +# Build directories +build/ +*.o +*.exe +moc_*.cpp +moc_*.h +ui_*.h +qrc_*.cpp + +# Temporary files +nul +*.tmp +*.log + +# OS files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/MultimediaLibrary.iml b/.idea/MultimediaLibrary.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/MultimediaLibrary.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..95d51a7 --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,580 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0b76fe5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..cdf27a5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ac4079f --- /dev/null +++ b/Makefile @@ -0,0 +1,840 @@ +############################################################################# +# Makefile for building: MultimediaLibrary +# Generated by qmake (3.1) (Qt 6.8.3) +# Project: MultimediaLibrary.pro +# Template: app +# Command: D:\qt\6.8.3\mingw_64\bin\qmake.exe -o Makefile MultimediaLibrary.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +first: release +install: release-install +uninstall: release-uninstall +QMAKE = D:\qt\6.8.3\mingw_64\bin\qmake.exe +DEL_FILE = del +CHK_DIR_EXISTS= if not exist +MKDIR = mkdir +COPY = copy /y +COPY_FILE = copy /y +COPY_DIR = xcopy /s /q /y /i +INSTALL_FILE = copy /y +INSTALL_PROGRAM = copy /y +INSTALL_DIR = xcopy /s /q /y /i +QINSTALL = D:\qt\6.8.3\mingw_64\bin\qmake.exe -install qinstall +QINSTALL_PROGRAM = D:\qt\6.8.3\mingw_64\bin\qmake.exe -install qinstall -exe +DEL_FILE = del +SYMLINK = $(QMAKE) -install ln -f -s +DEL_DIR = rmdir +MOVE = move +IDC = idc +IDL = midl +ZIP = zip -r -9 +DEF_FILE = +RES_FILE = +SED = $(QMAKE) -install sed +MOVE = move +SUBTARGETS = \ + release \ + debug + + +release: FORCE + $(MAKE) -f $(MAKEFILE).Release +release-make_first: FORCE + $(MAKE) -f $(MAKEFILE).Release +release-all: FORCE + $(MAKE) -f $(MAKEFILE).Release all +release-clean: FORCE + $(MAKE) -f $(MAKEFILE).Release clean +release-distclean: FORCE + $(MAKE) -f $(MAKEFILE).Release distclean +release-install: FORCE + $(MAKE) -f $(MAKEFILE).Release install +release-uninstall: FORCE + $(MAKE) -f $(MAKEFILE).Release uninstall +debug: FORCE + $(MAKE) -f $(MAKEFILE).Debug +debug-make_first: FORCE + $(MAKE) -f $(MAKEFILE).Debug +debug-all: FORCE + $(MAKE) -f $(MAKEFILE).Debug all +debug-clean: FORCE + $(MAKE) -f $(MAKEFILE).Debug clean +debug-distclean: FORCE + $(MAKE) -f $(MAKEFILE).Debug distclean +debug-install: FORCE + $(MAKE) -f $(MAKEFILE).Debug install +debug-uninstall: FORCE + $(MAKE) -f $(MAKEFILE).Debug uninstall + +Makefile: MultimediaLibrary.pro D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf D:/qt/6.8.3/mingw_64/mkspecs/features/spec_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/device_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/sanitize.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/gcc-base.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/g++-base.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows_vulkan_sdk.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/windows-vulkan.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/g++-win32.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/common/windows-desktop.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/qconfig.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_freetype.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libjpeg.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libpng.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_openxr_loader.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axbase_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bodymovin_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_entrypoint_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_example_icons_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_fb_support_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_ffmpegmediapluginimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_freetype_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_harfbuzz_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jpeg_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jsonrpc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_languageserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_linguist.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediaquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediatestlibprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_png_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatch_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchconversions_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchgenerators_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompilerplus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldebug_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldom_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlls_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltoolingsettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dglslparser_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickeffects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickshapes_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimagegenerator_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testinternals_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_tools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uiplugin.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserverquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_zlib_private.pri \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt_functions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/spec_post.prf \ + .qmake.stash \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/toolchain.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/default_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/default_pre.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resolve_config.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds_post.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/default_post.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/precompile_header.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/warn_on.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/permissions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qt.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resources_functions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/resources.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/moc.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/opengl.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/uic.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/qmake_use.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/file_copies.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/testcase_targets.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/exceptions.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/yacc.prf \ + D:/qt/6.8.3/mingw_64/mkspecs/features/lex.prf \ + MultimediaLibrary.pro \ + D:/qt/6.8.3/mingw_64/lib/Qt6Widgets.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6Gui.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6Core.prl \ + D:/qt/6.8.3/mingw_64/lib/Qt6EntryPoint.prl \ + D:/qt/6.8.3/mingw_64/mkspecs/features/build_pass.prf + $(QMAKE) -o Makefile MultimediaLibrary.pro +D:/qt/6.8.3/mingw_64/mkspecs/features/spec_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/device_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/common/sanitize.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/gcc-base.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/g++-base.conf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows_vulkan_sdk.prf: +D:/qt/6.8.3/mingw_64/mkspecs/common/windows-vulkan.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/g++-win32.conf: +D:/qt/6.8.3/mingw_64/mkspecs/common/windows-desktop.conf: +D:/qt/6.8.3/mingw_64/mkspecs/qconfig.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_freetype.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libjpeg.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_libpng.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_ext_openxr_loader.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3danimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dcore_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dextras_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dinput_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dlogic_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickextras_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickinput_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickrender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3dquickscene3d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_3drender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_activeqt_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axbase_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axcontainer_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_axserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bluetooth_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_bodymovin_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_charts_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_chartsqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_coap_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_concurrent_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core5compat_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_core_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualization_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_datavisualizationqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_dbus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_declarativeopcua_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designer_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_designercomponents_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_entrypoint_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_example_icons_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_examples_asset_downloader_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_fb_support_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_ffmpegmediapluginimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_freetype_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphs_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_graphswidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_grpcquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_gui_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_harfbuzz_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_help_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_httpserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jpeg_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_jsonrpc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsanimation_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsfolderlistmodel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsplatform_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labsqmlmodels_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labssharedimage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_labswavefrontmesh_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_languageserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_linguist.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_location_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_mqtt_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimedia_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediaquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediatestlibprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_network_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_networkauth_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_nfc_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opcua_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_opengl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_openglwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_packetprotocol_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_png_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioning_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_positioningquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_printsupport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobuf_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtcoretypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufqtguitypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_protobufwellknowntypes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatch_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchconversions_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qdoccatchgenerators_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlassetdownloader_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompiler_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcompilerplus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlcore_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldebug_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmldom_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlintegration_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmllocalstorage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlls_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmeta_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlmodels_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlnetwork_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltest_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltoolingsettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmltyperegistrar_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_qmlxmllistmodel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3d_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetimport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dassetutils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3deffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dglslparser_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpers_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dhelpersimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3diblbaker_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticleeffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dparticles_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysics_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dphysicshelpers_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3druntimerender_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dspatialaudio_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dutils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick3dxr_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basic_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2basicstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fluentwinui3styleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusion_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2fusionstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imagine_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2imaginestyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2impl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2material_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2materialstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universal_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2universalstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrols2windowsstyleimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickcontrolstestutilsprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2quickimpl_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickdialogs2utils_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickeffects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicklayouts_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickparticles_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickshapes_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktestutilsprivate_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimeline_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quicktimelineblendtrees_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimage_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickvectorimagegenerator_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_quickwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjects_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_remoteobjectsqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_repparser_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_scxmlqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensors_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sensorsquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialbus_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_serialport_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_shadertools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_spatialaudio_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_sql_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachine_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_statemachineqml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svg_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_svgwidgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testinternals_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_testlib_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_texttospeech_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_tools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uiplugin.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_uitools_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboard_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_virtualkeyboardsettings_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserver_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_vncserverquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannel_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webchannelquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_websockets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webview_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_webviewquick_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_widgets_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_xml_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/modules/qt_lib_zlib_private.pri: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt_functions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/win32-g++/qmake.conf: +D:/qt/6.8.3/mingw_64/mkspecs/features/spec_post.prf: +.qmake.stash: +D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/toolchain.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/default_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/default_pre.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resolve_config.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/exclusive_builds_post.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/default_post.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/precompile_header.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/warn_on.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/permissions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qt.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resources_functions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/resources.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/moc.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/opengl.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/uic.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/qmake_use.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/file_copies.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/win32/windows.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/testcase_targets.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/exceptions.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/yacc.prf: +D:/qt/6.8.3/mingw_64/mkspecs/features/lex.prf: +MultimediaLibrary.pro: +D:/qt/6.8.3/mingw_64/lib/Qt6Widgets.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6Gui.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6Core.prl: +D:/qt/6.8.3/mingw_64/lib/Qt6EntryPoint.prl: +D:/qt/6.8.3/mingw_64/mkspecs/features/build_pass.prf: +qmake: FORCE + @$(QMAKE) -o Makefile MultimediaLibrary.pro + +qmake_all: FORCE + +make_first: release-make_first debug-make_first FORCE +all: release-all debug-all FORCE +clean: release-clean debug-clean FORCE +distclean: release-distclean debug-distclean FORCE + -$(DEL_FILE) Makefile + -$(DEL_FILE) .qmake.stash + +release-mocclean: + $(MAKE) -f $(MAKEFILE).Release mocclean +debug-mocclean: + $(MAKE) -f $(MAKEFILE).Debug mocclean +mocclean: release-mocclean debug-mocclean + +release-mocables: + $(MAKE) -f $(MAKEFILE).Release mocables +debug-mocables: + $(MAKE) -f $(MAKEFILE).Debug mocables +mocables: release-mocables debug-mocables + +check: first + +benchmark: first +FORCE: + +.SUFFIXES: + +$(MAKEFILE).Release: Makefile +$(MAKEFILE).Debug: Makefile diff --git a/MultimediaLibrary.pro b/MultimediaLibrary.pro new file mode 100644 index 0000000..09610bd --- /dev/null +++ b/MultimediaLibrary.pro @@ -0,0 +1,48 @@ +QT += core widgets + +CONFIG += c++17 + +TARGET = MultimediaLibrary +TEMPLATE = app + +# Backend sources +SOURCES += \ + src/main.cpp \ + src/Backend/Elements/Date.cpp \ + src/Backend/Elements/Media.cpp \ + src/Backend/Elements/Book.cpp \ + src/Backend/Elements/Movie.cpp \ + src/Backend/Elements/Song.cpp \ + src/Backend/Elements/Magazine.cpp \ + src/Backend/Elements/Podcast.cpp \ + src/Backend/Enums/Genres.cpp \ + src/Backend/Enums/Languages.cpp \ + src/Backend/Library/Library.cpp \ + src/Frontend/Windows/MainWindow.cpp + +# Backend headers +HEADERS += \ + src/Backend/Elements/Date.h \ + src/Backend/Elements/Media.h \ + src/Backend/Elements/Book.h \ + src/Backend/Elements/Movie.h \ + src/Backend/Elements/Song.h \ + src/Backend/Elements/Magazine.h \ + src/Backend/Elements/Podcast.h \ + src/Backend/Enums/Genres.h \ + src/Backend/Enums/Languages.h \ + src/Backend/Library/Library.h \ + src/Frontend/Windows/MainWindow.h + +# Include paths +INCLUDEPATH += \ + src/Backend/Elements \ + src/Backend/Enums \ + src/Backend/Library \ + src/Frontend/Windows + +# Compiler flags +QMAKE_CXXFLAGS += -std=c++17 -Wall -Wextra + +# Output directory +DESTDIR = build/bin diff --git a/README.md b/README.md index 7c1a0ac..6ca3008 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,214 @@ -# 📦 OOP Project – Academic Year 2024/2025 +# Multimedia Library -## 📚 Multimedia Library +Una libreria multimediale completa con backend C++ e frontend Qt. -This repository contains the Object-Oriented Programming (OOP) project developed during the 2024/2025 academic year for the course taught by Professor Francesco Ranzato (SC1167 - Computer Science @UniPD). +## 🚀 **Caratteristiche** -The project demonstrates core OOP principles such as encapsulation, inheritance, polymorphism, and abstraction. It is designed following best practices in software design and aims to provide a clean, modular, and maintainable codebase. +- **Backend C++**: Gestione completa di libri, film, canzoni, riviste e podcast +- **Frontend Qt**: Interfaccia grafica moderna e intuitiva +- **Sistema di Enum**: Generi e lingue tipizzati per ogni tipo di media +- **Classe Date Personalizzata**: Gestione date con validazione +- **Build System Unificato**: Makefile per backend e frontend -## 🛠️ Technologies & Tools +## 📁 **Struttura del Progetto** -- Language: C++, Qt -- IDE: VS Code +``` +MultimediaLibrary/ +├── src/ +│ ├── Backend/ +│ │ ├── Elements/ # Classi base e derivate +│ │ │ ├── Media.h/.cpp # Classe base astratta +│ │ │ ├── Book.h/.cpp # Gestione libri +│ │ │ ├── Movie.h/.cpp # Gestione film +│ │ │ ├── Song.h/.cpp # Gestione canzoni +│ │ │ ├── Magazine.h/.cpp # Gestione riviste +│ │ │ ├── Podcast.h/.cpp # Gestione podcast +│ │ │ └── Date.h/.cpp # Classe data personalizzata +│ │ ├── Enums/ # Enum per generi e lingue +│ │ │ ├── Genres.h/.cpp +│ │ │ └── Languages.h/.cpp +│ │ └── Library/ # Gestione collezione media +│ │ └── Library.h/.cpp +│ ├── Frontend/ +│ │ └── Windows/ +│ │ └── MainWindow.h/.cpp # Interfaccia Qt +│ └── main.cpp # Entry point unificato +├── build/bin/ # Eseguibili compilati +├── Makefile # Build system per backend +├── MultimediaLibrary.pro # Progetto Qt +└── README.md # Questo file +``` -## 📁 Structure +## 🛠️ **Prerequisiti** -- `src/`: Source code of the application -- `test/`: Unit tests -- `docs/`: Documentation and UML diagrams (if applicable) +### Per il Backend (Obbligatorio) +- **MSYS2** con MinGW-w64 +- **Make** (installato tramite MSYS2) +- **g++** (compilatore C++17) -## ✅ Features +### Per il Frontend Qt (Opzionale) +- **Qt 6.8.3** installato in `D:\qt\6.8.3\mingw_64` +- **Qt Creator** per sviluppo -- [List here the main functionalities your project implements] +## 🔧 **Installazione e Setup** -## 🤝 Contributors +### 1. Installare Make (se non presente) +```bash +# Aggiungere al PATH +$env:PATH += ";C:\msys64\usr\bin" +``` -- **Davide** - [GitHub](https://github.com/DavideColabove) -- **Oussama** - [GitHub](https://github.com/m4hd1-exe) +### 2. Configurare Qt (se installato) +```bash +# Aggiungere Qt al PATH +$env:PATH += ";D:\qt\6.8.3\mingw_64\bin" +``` + +## 🏗️ **Compilazione** + +### Opzione 1: Usando il Makefile Personalizzato +```bash +# Compila solo il backend test +make test + +# Compila la GUI Qt (se Qt disponibile) +make gui + +# Compila tutto +make all + +# Pulisci i file di build +make clean + +# Mostra aiuto +make help +``` + +### Opzione 2: Usando Qt/qmake (Raccomandato per GUI) +```bash +# Genera Makefile da progetto Qt +qmake MultimediaLibrary.pro + +# Compila +make + +# Pulisci +make clean +``` + +## 🚀 **Esecuzione** + +### Modalità Test (Backend) +```bash +# Esegue test del backend in console +./build/bin/MultimediaLibraryTest +# oppure +./build/bin/MultimediaLibraryTest --test +``` + +### Modalità GUI +```bash +# Avvia l'interfaccia grafica Qt +./build/bin/MultimediaLibrary.exe +# oppure +./build/bin/MultimediaLibrary.exe --gui +``` + +### Aiuto +```bash +./build/bin/MultimediaLibraryTest --help +./build/bin/MultimediaLibrary.exe --help +``` + +## 📚 **Classi e Funzionalità** + +### Classe Base: `Media` +- **Attributi**: title, author, releaseDate, id, kbSize, isAvailable, imagePath +- **Metodi**: getters/setters, `isValid()` (virtuale puro) + +### Classi Derivate +- **`Book`**: publisher, pages, isbn, language, genre (BookGenre) +- **`Movie`**: director, duration, rating, language, genre (MovieGenre) +- **`Song`**: artist, album, duration, genre (MusicGenre) +- **`Magazine`**: publisher, issue, language, genre (MagazineGenre) +- **`Podcast`**: host, episodes, duration, genre (PodcastGenre) + +### Classe `Library` (Gestione Collezione) +- **CRUD Operations**: `addMedia()`, `removeMedia()`, `findMediaById()`, `getAllMedia()` +- **Search & Filter**: `searchByTitle()`, `searchByAuthor()`, `filterByType()`, `filterByAvailability()` +- **File Operations**: `saveToFile()`, `loadFromFile()` (formato CSV) +- **Statistics**: `getTotalCount()`, `getAvailableCount()`, `getMediaTypeStats()` +- **Utility**: `getNextId()`, `clear()`, `isEmpty()` + +### Sistema Enum +- **Generi**: `BookGenre`, `MovieGenre`, `MusicGenre`, `MagazineGenre`, `PodcastGenre` +- **Lingue**: `Language` +- **Conversioni**: `enumToString()`, `stringToEnum()` + +## 🎨 **Interfaccia Qt** + +### Componenti Principali +- **Menu Bar**: File, Edit, Search, Help +- **Tool Bar**: Azioni rapide (Add, Edit, Delete, Search, Export) +- **Table Widget**: Visualizzazione tabellare dei media +- **Status Bar**: Messaggi di stato + +### Funzionalità (da implementare) +- ✅ **Struttura base** completata +- 🔄 **AddMediaDialog** - Dialog per aggiungere media +- 🔄 **EditMediaDialog** - Dialog per modificare media +- 🔄 **SearchDialog** - Dialog per cercare e filtrare +- 🔄 **Import/Export** - Salvataggio e caricamento dati + +## 🔍 **Debug e Sviluppo** + +### Compilazione con Debug +```bash +make debug +``` + +### Verifica Qt +```bash +qmake --version +``` + +### Verifica Make +```bash +make --version +``` + +## 📝 **Note di Sviluppo** + +### Per Aprire in Qt Creator +1. Apri `MultimediaLibrary.pro` in Qt Creator +2. Configura il kit MinGW +3. Compila ed esegui direttamente da Qt Creator + +### Per Sviluppo da Terminale +1. Usa `make test` per testare il backend +2. Usa `qmake && make` per compilare la GUI +3. Usa `./build/bin/MultimediaLibrary.exe` per eseguire + +## 🎯 **Prossimi Passi** + +1. **Implementare AddMediaDialog** con ComboBox per generi e lingue +2. **Implementare EditMediaDialog** per modificare media esistenti +3. **Implementare SearchDialog** per cercare e filtrare +4. **Aggiungere validazione input** con QValidator +5. **Implementare salvataggio/caricamento** dati +6. **Aggiungere stili CSS** per migliorare l'aspetto + +## ✅ **Stato Attuale** + +- ✅ **Backend**: Completamente funzionante +- ✅ **Classi derivate**: Implementate con enum +- ✅ **Classe Library**: Gestione completa della collezione +- ✅ **Sistema build**: Makefile e qmake funzionanti +- ✅ **GUI base**: MainWindow con menu e toolbar +- ✅ **Qt integration**: Compilazione e linking corretti +- 🔄 **Dialog**: In sviluppo +- 🔄 **Funzionalità avanzate**: Da implementare + +--- + +**Sviluppato con C++17, Qt 6.8.3 e Make** 🚀 diff --git a/src/Backend/Elements/Book.cpp b/src/Backend/Elements/Book.cpp new file mode 100644 index 0000000..ab59841 --- /dev/null +++ b/src/Backend/Elements/Book.cpp @@ -0,0 +1,79 @@ +#include "Book.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +// Constructors +Book::Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), pages(pages), isbn(isbn), language(language), genre(genre) {} + +Book::Book(const Book& book) + : Media(book), publisher(book.publisher), pages(book.pages), isbn(book.isbn), language(book.language), genre(book.genre) {} + +Book::Book() : Media(), publisher(""), pages(0), isbn(""), language(Enums::Language::ITALIAN), genre(Enums::BookGenre::FICTION) {} + +Book::~Book() {} + +// Virtual method implementations for non-trivial polymorphism +bool Book::isValid() const { + return !getTitle().empty() && !getAuthor().empty() && !publisher.empty() && + pages > 0 && !isbn.empty(); +} + +// Book-specific getters and setters +std::string Book::getPublisher() const { + return publisher; +} + +Book& Book::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Book::getPages() const { + return pages; +} + +Book& Book::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Book::getIsbn() const { + return isbn; +} + +Book& Book::setIsbn(const std::string& isbn) { + this->isbn = isbn; + return *this; +} + +Enums::Language Book::getLanguage() const { + return language; +} + +Book& Book::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Book::getLanguageString() const { + return Enums::languageToString(language); +} + +// Genre-specific methods +Enums::BookGenre Book::getGenre() const { + return genre; +} + +Book& Book::setGenre(Enums::BookGenre g) { + genre = g; + return *this; +} + +std::string Book::getGenreString() const { + return Enums::bookGenreToString(genre); +} diff --git a/src/Backend/Elements/Book.h b/src/Backend/Elements/Book.h new file mode 100644 index 0000000..e20f2a8 --- /dev/null +++ b/src/Backend/Elements/Book.h @@ -0,0 +1,46 @@ +#ifndef BOOK_H +#define BOOK_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +class Book : public Media { + private: + std::string publisher; + unsigned int pages; + std::string isbn; + Enums::Language language; + Enums::BookGenre genre; + + public: + // Constructors + Book(std::string title, std::string author, Enums::BookGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int pages, std::string isbn, Enums::Language language); + Book(const Book& book); + Book(); + virtual ~Book(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Book-specific getters and setters + std::string getPublisher() const; + Book& setPublisher(const std::string& pub); + unsigned int getPages() const; + Book& setPages(unsigned int p); + std::string getIsbn() const; + Book& setIsbn(const std::string& isbn); + Enums::Language getLanguage() const; + Book& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + + // Genre-specific methods + Enums::BookGenre getGenre() const; + Book& setGenre(Enums::BookGenre genre); + std::string getGenreString() const; +}; + +#endif // BOOK_H diff --git a/src/Backend/Elements/Date.cpp b/src/Backend/Elements/Date.cpp new file mode 100644 index 0000000..ecd9104 --- /dev/null +++ b/src/Backend/Elements/Date.cpp @@ -0,0 +1,123 @@ +#include "Date.h" +#include +#include +#include + +// Constructors +Date::Date(int y, int m, int d) : year(y), month(m), day(d) { + if (!isValid()) { + throw std::invalid_argument("Invalid date"); + } +} + +Date::Date(const Date& date) : year(date.year), month(date.month), day(date.day) {} + +Date::Date() : year(1900), month(1), day(1) {} + +// Getters and setters +int Date::getYear() const { + return year; +} + +Date& Date::setYear(int y) { + year = y; + if (!isValid()) { + throw std::invalid_argument("Invalid year"); + } + return *this; +} + +int Date::getMonth() const { + return month; +} + +Date& Date::setMonth(int m) { + month = m; + if (!isValid()) { + throw std::invalid_argument("Invalid month"); + } + return *this; +} + +int Date::getDay() const { + return day; +} + +Date& Date::setDay(int d) { + day = d; + if (!isValid()) { + throw std::invalid_argument("Invalid day"); + } + return *this; +} + +// Utility methods +bool Date::isValid() const { + if (year < 1900 || year > 2100) return false; + if (month < 1 || month > 12) return false; + + int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + + // Leap year check + if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) { + daysInMonth[1] = 29; + } + + return day >= 1 && day <= daysInMonth[month - 1]; +} + +std::string Date::toString() const { + return toString("YYYY-MM-DD"); +} + +std::string Date::toString(const std::string& format) const { + std::string result = format; + + // Replace placeholders with actual values + std::string yearStr = std::to_string(year); + std::string monthStr = std::to_string(month); + std::string dayStr = std::to_string(day); + + // Pad with zeros if needed + if (monthStr.length() == 1) monthStr = "0" + monthStr; + if (dayStr.length() == 1) dayStr = "0" + dayStr; + + // Replace YYYY, MM, DD + size_t pos = result.find("YYYY"); + if (pos != std::string::npos) result.replace(pos, 4, yearStr); + + pos = result.find("MM"); + if (pos != std::string::npos) result.replace(pos, 2, monthStr); + + pos = result.find("DD"); + if (pos != std::string::npos) result.replace(pos, 2, dayStr); + + return result; +} + +// Operators +bool Date::operator==(const Date& other) const { + return year == other.year && month == other.month && day == other.day; +} + +bool Date::operator!=(const Date& other) const { + return !(*this == other); +} + +bool Date::operator<(const Date& other) const { + if (year != other.year) return year < other.year; + if (month != other.month) return month < other.month; + return day < other.day; +} + +bool Date::operator>(const Date& other) const { + return other < *this; +} + +bool Date::operator<=(const Date& other) const { + return *this < other || *this == other; +} + +bool Date::operator>=(const Date& other) const { + return *this > other || *this == other; +} \ No newline at end of file diff --git a/src/Backend/Elements/Date.h b/src/Backend/Elements/Date.h new file mode 100644 index 0000000..d860175 --- /dev/null +++ b/src/Backend/Elements/Date.h @@ -0,0 +1,40 @@ +#ifndef DATE_H +#define DATE_H + +#include + +class Date { +private: + int year; + int month; + int day; + +public: + // Constructors + Date(int y, int m, int d); + Date(const Date& date); + Date(); + + // Getters and setters + int getYear() const; + Date& setYear(int y); + int getMonth() const; + Date& setMonth(int m); + int getDay() const; + Date& setDay(int d); + + // Utility methods + bool isValid() const; + std::string toString() const; + std::string toString(const std::string& format) const; // format: "YYYY-MM-DD", "DD/MM/YYYY", etc. + + // Operators + bool operator==(const Date& other) const; + bool operator!=(const Date& other) const; + bool operator<(const Date& other) const; + bool operator>(const Date& other) const; + bool operator<=(const Date& other) const; + bool operator>=(const Date& other) const; +}; + +#endif // DATE_H \ No newline at end of file diff --git a/src/Backend/Elements/Magazine.cpp b/src/Backend/Elements/Magazine.cpp new file mode 100644 index 0000000..c56d3d4 --- /dev/null +++ b/src/Backend/Elements/Magazine.cpp @@ -0,0 +1,94 @@ +#include "Magazine.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Magazine::Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + publisher(publisher), issueNumber(issueNumber), issn(issn), editor(editor), pages(pages), frequency(frequency), genre(genre) {} + +Magazine::Magazine(const Magazine& magazine) + : Media(magazine), publisher(magazine.publisher), issueNumber(magazine.issueNumber), issn(magazine.issn), + editor(magazine.editor), pages(magazine.pages), frequency(magazine.frequency), genre(magazine.genre) {} + +Magazine::Magazine() : Media(), publisher(""), issueNumber(0), issn(""), editor(""), pages(0), frequency(""), genre(Enums::MagazineGenre::NEWS) {} + +Magazine::~Magazine() {} + +// Virtual method implementations for non-trivial polymorphism +bool Magazine::isValid() const { + return !getTitle().empty() && !publisher.empty() && issueNumber > 0 && + !issn.empty() && !editor.empty() && pages > 0 && !frequency.empty(); +} + +// Magazine-specific getters and setters +std::string Magazine::getPublisher() const { + return publisher; +} + +Magazine& Magazine::setPublisher(const std::string& pub) { + publisher = pub; + return *this; +} + +unsigned int Magazine::getIssueNumber() const { + return issueNumber; +} + +Magazine& Magazine::setIssueNumber(unsigned int issue) { + issueNumber = issue; + return *this; +} + +std::string Magazine::getIssn() const { + return issn; +} + +Magazine& Magazine::setIssn(const std::string& issn) { + this->issn = issn; + return *this; +} + +std::string Magazine::getEditor() const { + return editor; +} + +Magazine& Magazine::setEditor(const std::string& ed) { + editor = ed; + return *this; +} + +unsigned int Magazine::getPages() const { + return pages; +} + +Magazine& Magazine::setPages(unsigned int p) { + pages = p; + return *this; +} + +std::string Magazine::getFrequency() const { + return frequency; +} + +Magazine& Magazine::setFrequency(const std::string& freq) { + frequency = freq; + return *this; +} + +// Genre-specific methods +Enums::MagazineGenre Magazine::getGenre() const { + return genre; +} + +Magazine& Magazine::setGenre(Enums::MagazineGenre g) { + genre = g; + return *this; +} + +std::string Magazine::getGenreString() const { + return Enums::magazineGenreToString(genre); +} diff --git a/src/Backend/Elements/Magazine.h b/src/Backend/Elements/Magazine.h new file mode 100644 index 0000000..db92de2 --- /dev/null +++ b/src/Backend/Elements/Magazine.h @@ -0,0 +1,51 @@ +#ifndef MAGAZINE_H +#define MAGAZINE_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Magazine : public Media { + private: + std::string publisher; + unsigned int issueNumber; + std::string issn; + std::string editor; + unsigned int pages; + std::string frequency; // Monthly, Weekly, etc. + Enums::MagazineGenre genre; + + public: + // Constructors + Magazine(std::string title, std::string author, Enums::MagazineGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string publisher, unsigned int issueNumber, std::string issn, std::string editor, + unsigned int pages, std::string frequency); + Magazine(const Magazine& magazine); + Magazine(); + virtual ~Magazine(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Magazine-specific getters and setters + std::string getPublisher() const; + Magazine& setPublisher(const std::string& pub); + unsigned int getIssueNumber() const; + Magazine& setIssueNumber(unsigned int issue); + std::string getIssn() const; + Magazine& setIssn(const std::string& issn); + std::string getEditor() const; + Magazine& setEditor(const std::string& ed); + unsigned int getPages() const; + Magazine& setPages(unsigned int p); + std::string getFrequency() const; + Magazine& setFrequency(const std::string& freq); + + // Genre-specific methods + Enums::MagazineGenre getGenre() const; + Magazine& setGenre(Enums::MagazineGenre genre); + std::string getGenreString() const; +}; + +#endif // MAGAZINE_H diff --git a/src/Backend/Elements/Media.cpp b/src/Backend/Elements/Media.cpp new file mode 100644 index 0000000..e21d56e --- /dev/null +++ b/src/Backend/Elements/Media.cpp @@ -0,0 +1,70 @@ +#include "Media.h" + +#include +#include + +Media::Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im): title(t), author(a), releaseDate(rD), id(id), kbSize(kb), isAvailable(isAv), imagePath(im) {} + +Media::Media(const Media& media): title(media.title), id(media.id), author(media.author), releaseDate(media.releaseDate), kbSize(media.kbSize), isAvailable(media.isAvailable), imagePath(media.imagePath) {} + +Media::Media() : title(""), id(0), author(""), releaseDate(), kbSize(0), isAvailable(false), imagePath("") {} + + + +Media& Media::setTitle(const std::string& t) { + this->title = t; + return *this; +} +const std::string& Media::getTitle() const { + return title; +} + +Media& Media::setAuthor(const std::string& a) { + this->author = a; + return *this; +} +const std::string& Media::getAuthor() const { + return author; +} + + + +Media& Media::setReleaseDate(const Date& rD) { + this->releaseDate = rD; + return *this; +} +const Date& Media::getReleaseDate() const { + return releaseDate; +} + +Media& Media::setID(unsigned int id) { + this->id = id; + return *this; +} +unsigned int Media::getID() const { + return id; +} + +Media& Media::setKbSize(unsigned int kb) { + this->kbSize = kb; + return *this; +} +unsigned int Media::getKbSize() const { + return kbSize; +} + +Media& Media::setIsAvailable(bool isAv) { + this->isAvailable = isAv; + return *this; +} +bool Media::getIsAvailable() const { + return isAvailable; +} + +Media& Media::setImagePath(const std::string& im) { + this->imagePath = im; + return *this; +} +const std::string& Media::getImagePath() const { + return imagePath; +} \ No newline at end of file diff --git a/src/Backend/Elements/Media.h b/src/Backend/Elements/Media.h new file mode 100644 index 0000000..52e3c9a --- /dev/null +++ b/src/Backend/Elements/Media.h @@ -0,0 +1,44 @@ +#ifndef MEDIA_H +#define MEDIA_H + +#include +#include "Date.h" +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +class Media{ + protected: + std::string title; + std::string author; + // Genre will be handled by derived classes with specific enum types + Date releaseDate; + unsigned int id; + unsigned int kbSize; + bool isAvailable; + std::string imagePath; + public: + Media(std::string t, std::string a, Date rD, unsigned int id, unsigned int kb, bool isAv, std::string im); + Media(const Media& media); + Media(); + virtual ~Media() = default; // Virtual destructor + + // Virtual methods for non-trivial polymorphism + virtual bool isValid() const = 0; // Validates media-specific attributes + + Media& setTitle(const std::string& t); + const std::string& getTitle() const; + Media& setAuthor(const std::string& a); + const std::string& getAuthor() const; + Media& setReleaseDate(const Date& rD); + const Date& getReleaseDate() const; + Media& setID(unsigned int id); + unsigned int getID() const; + Media& setKbSize(unsigned int kb); + unsigned int getKbSize() const; + Media& setIsAvailable(bool isAv); + bool getIsAvailable() const; + Media& setImagePath(const std::string& im); + const std::string& getImagePath() const; +}; + +#endif // MEDIA_H \ No newline at end of file diff --git a/src/Backend/Elements/Movie.cpp b/src/Backend/Elements/Movie.cpp new file mode 100644 index 0000000..07489e9 --- /dev/null +++ b/src/Backend/Elements/Movie.cpp @@ -0,0 +1,99 @@ +#include "Movie.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +// Constructors +Movie::Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + director(director), duration(duration), studio(studio), rating(rating), language(language), country(country), genre(genre) {} + +Movie::Movie(const Movie& movie) + : Media(movie), director(movie.director), duration(movie.duration), studio(movie.studio), + rating(movie.rating), language(movie.language), country(movie.country), genre(movie.genre) {} + +Movie::Movie() : Media(), director(""), duration(0), studio(""), rating(""), language(Enums::Language::ENGLISH), country(""), genre(Enums::MovieGenre::DRAMA) {} + +Movie::~Movie() {} + +// Virtual method implementations for non-trivial polymorphism +bool Movie::isValid() const { + return !getTitle().empty() && !director.empty() && !studio.empty() && + duration > 0 && !rating.empty() && !country.empty(); +} + +// Movie-specific getters and setters +std::string Movie::getDirector() const { + return director; +} + +Movie& Movie::setDirector(const std::string& dir) { + director = dir; + return *this; +} + +unsigned int Movie::getDuration() const { + return duration; +} + +Movie& Movie::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Movie::getStudio() const { + return studio; +} + +Movie& Movie::setStudio(const std::string& stu) { + studio = stu; + return *this; +} + +std::string Movie::getRating() const { + return rating; +} + +Movie& Movie::setRating(const std::string& rat) { + rating = rat; + return *this; +} + +Enums::Language Movie::getLanguage() const { + return language; +} + +Movie& Movie::setLanguage(Enums::Language lang) { + language = lang; + return *this; +} + +std::string Movie::getLanguageString() const { + return Enums::languageToString(language); +} + +std::string Movie::getCountry() const { + return country; +} + +Movie& Movie::setCountry(const std::string& cou) { + country = cou; + return *this; +} + +// Genre-specific methods +Enums::MovieGenre Movie::getGenre() const { + return genre; +} + +Movie& Movie::setGenre(Enums::MovieGenre g) { + genre = g; + return *this; +} + +std::string Movie::getGenreString() const { + return Enums::movieGenreToString(genre); +} diff --git a/src/Backend/Elements/Movie.h b/src/Backend/Elements/Movie.h new file mode 100644 index 0000000..8664696 --- /dev/null +++ b/src/Backend/Elements/Movie.h @@ -0,0 +1,53 @@ +#ifndef MOVIE_H +#define MOVIE_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" +#include "../Enums/Languages.h" + +class Movie : public Media { + private: + std::string director; + unsigned int duration; // in minutes + std::string studio; + std::string rating; // PG, PG-13, R, etc. + Enums::Language language; + std::string country; + Enums::MovieGenre genre; + + public: + // Constructors + Movie(std::string title, std::string author, Enums::MovieGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string director, unsigned int duration, std::string studio, std::string rating, + Enums::Language language, std::string country); + Movie(const Movie& movie); + Movie(); + virtual ~Movie(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Movie-specific getters and setters + std::string getDirector() const; + Movie& setDirector(const std::string& dir); + unsigned int getDuration() const; + Movie& setDuration(unsigned int dur); + std::string getStudio() const; + Movie& setStudio(const std::string& stu); + std::string getRating() const; + Movie& setRating(const std::string& rat); + Enums::Language getLanguage() const; + Movie& setLanguage(Enums::Language lang); + std::string getLanguageString() const; + std::string getCountry() const; + Movie& setCountry(const std::string& cou); + + // Genre-specific methods + Enums::MovieGenre getGenre() const; + Movie& setGenre(Enums::MovieGenre genre); + std::string getGenreString() const; +}; + +#endif // MOVIE_H diff --git a/src/Backend/Elements/Podcast.cpp b/src/Backend/Elements/Podcast.cpp new file mode 100644 index 0000000..604eee2 --- /dev/null +++ b/src/Backend/Elements/Podcast.cpp @@ -0,0 +1,95 @@ +#include "Podcast.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Podcast::Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + host(host), episodeNumber(episodeNumber), platform(platform), duration(duration), + series(series), description(description), genre(genre) {} + +Podcast::Podcast(const Podcast& podcast) + : Media(podcast), host(podcast.host), episodeNumber(podcast.episodeNumber), platform(podcast.platform), + duration(podcast.duration), series(podcast.series), description(podcast.description), genre(podcast.genre) {} + +Podcast::Podcast() : Media(), host(""), episodeNumber(0), platform(""), duration(0), series(""), description(""), genre(Enums::PodcastGenre::EDUCATION) {} + +Podcast::~Podcast() {} + +// Virtual method implementations for non-trivial polymorphism +bool Podcast::isValid() const { + return !getTitle().empty() && !host.empty() && episodeNumber > 0 && + !platform.empty() && duration > 0 && !series.empty() && !description.empty(); +} + +// Podcast-specific getters and setters +std::string Podcast::getHost() const { + return host; +} + +Podcast& Podcast::setHost(const std::string& h) { + host = h; + return *this; +} + +unsigned int Podcast::getEpisodeNumber() const { + return episodeNumber; +} + +Podcast& Podcast::setEpisodeNumber(unsigned int ep) { + episodeNumber = ep; + return *this; +} + +std::string Podcast::getPlatform() const { + return platform; +} + +Podcast& Podcast::setPlatform(const std::string& plat) { + platform = plat; + return *this; +} + +unsigned int Podcast::getDuration() const { + return duration; +} + +Podcast& Podcast::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Podcast::getSeries() const { + return series; +} + +Podcast& Podcast::setSeries(const std::string& ser) { + series = ser; + return *this; +} + +std::string Podcast::getDescription() const { + return description; +} + +Podcast& Podcast::setDescription(const std::string& desc) { + description = desc; + return *this; +} + +// Genre-specific methods +Enums::PodcastGenre Podcast::getGenre() const { + return genre; +} + +Podcast& Podcast::setGenre(Enums::PodcastGenre g) { + genre = g; + return *this; +} + +std::string Podcast::getGenreString() const { + return Enums::podcastGenreToString(genre); +} diff --git a/src/Backend/Elements/Podcast.h b/src/Backend/Elements/Podcast.h new file mode 100644 index 0000000..e0f6d96 --- /dev/null +++ b/src/Backend/Elements/Podcast.h @@ -0,0 +1,51 @@ +#ifndef PODCAST_H +#define PODCAST_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Podcast : public Media { + private: + std::string host; + unsigned int episodeNumber; + std::string platform; // Spotify, Apple Podcasts, etc. + unsigned int duration; // in minutes + std::string series; + std::string description; + Enums::PodcastGenre genre; + + public: + // Constructors + Podcast(std::string title, std::string author, Enums::PodcastGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string host, unsigned int episodeNumber, std::string platform, unsigned int duration, + std::string series, std::string description); + Podcast(const Podcast& podcast); + Podcast(); + virtual ~Podcast(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Podcast-specific getters and setters + std::string getHost() const; + Podcast& setHost(const std::string& h); + unsigned int getEpisodeNumber() const; + Podcast& setEpisodeNumber(unsigned int ep); + std::string getPlatform() const; + Podcast& setPlatform(const std::string& plat); + unsigned int getDuration() const; + Podcast& setDuration(unsigned int dur); + std::string getSeries() const; + Podcast& setSeries(const std::string& ser); + std::string getDescription() const; + Podcast& setDescription(const std::string& desc); + + // Genre-specific methods + Enums::PodcastGenre getGenre() const; + Podcast& setGenre(Enums::PodcastGenre genre); + std::string getGenreString() const; +}; + +#endif // PODCAST_H diff --git a/src/Backend/Elements/Song.cpp b/src/Backend/Elements/Song.cpp new file mode 100644 index 0000000..796c4e9 --- /dev/null +++ b/src/Backend/Elements/Song.cpp @@ -0,0 +1,94 @@ +#include "Song.h" +#include +#include "../Enums/Genres.h" + +// Constructors +Song::Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber) + : Media(title, author, releaseDate, id, kbSize, isAvailable, imagePath), + artist(artist), album(album), duration(duration), format(format), label(label), trackNumber(trackNumber), genre(genre) {} + +Song::Song(const Song& song) + : Media(song), artist(song.artist), album(song.album), duration(song.duration), + format(song.format), label(song.label), trackNumber(song.trackNumber), genre(song.genre) {} + +Song::Song() : Media(), artist(""), album(""), duration(0), format(""), label(""), trackNumber(0), genre(Enums::MusicGenre::POP) {} + +Song::~Song() {} + +// Virtual method implementations for non-trivial polymorphism +bool Song::isValid() const { + return !getTitle().empty() && !artist.empty() && !album.empty() && + duration > 0 && !format.empty() && !label.empty() && trackNumber > 0; +} + +// Song-specific getters and setters +std::string Song::getArtist() const { + return artist; +} + +Song& Song::setArtist(const std::string& art) { + artist = art; + return *this; +} + +std::string Song::getAlbum() const { + return album; +} + +Song& Song::setAlbum(const std::string& alb) { + album = alb; + return *this; +} + +unsigned int Song::getDuration() const { + return duration; +} + +Song& Song::setDuration(unsigned int dur) { + duration = dur; + return *this; +} + +std::string Song::getFormat() const { + return format; +} + +Song& Song::setFormat(const std::string& fmt) { + format = fmt; + return *this; +} + +std::string Song::getLabel() const { + return label; +} + +Song& Song::setLabel(const std::string& lab) { + label = lab; + return *this; +} + +unsigned int Song::getTrackNumber() const { + return trackNumber; +} + +Song& Song::setTrackNumber(unsigned int track) { + trackNumber = track; + return *this; +} + +// Genre-specific methods +Enums::MusicGenre Song::getGenre() const { + return genre; +} + +Song& Song::setGenre(Enums::MusicGenre g) { + genre = g; + return *this; +} + +std::string Song::getGenreString() const { + return Enums::musicGenreToString(genre); +} diff --git a/src/Backend/Elements/Song.h b/src/Backend/Elements/Song.h new file mode 100644 index 0000000..c620674 --- /dev/null +++ b/src/Backend/Elements/Song.h @@ -0,0 +1,51 @@ +#ifndef SONG_H +#define SONG_H + +#include "Media.h" +#include +#include "../Enums/Genres.h" + +class Song : public Media { + private: + std::string artist; + std::string album; + unsigned int duration; // in seconds + std::string format; // MP3, FLAC, WAV, etc. + std::string label; + unsigned int trackNumber; + Enums::MusicGenre genre; + + public: + // Constructors + Song(std::string title, std::string author, Enums::MusicGenre genre, Date releaseDate, + unsigned int id, unsigned int kbSize, bool isAvailable, std::string imagePath, + std::string artist, std::string album, unsigned int duration, std::string format, + std::string label, unsigned int trackNumber); + Song(const Song& song); + Song(); + virtual ~Song(); + + // Virtual method implementations for non-trivial polymorphism + virtual bool isValid() const override; + + // Song-specific getters and setters + std::string getArtist() const; + Song& setArtist(const std::string& art); + std::string getAlbum() const; + Song& setAlbum(const std::string& alb); + unsigned int getDuration() const; + Song& setDuration(unsigned int dur); + std::string getFormat() const; + Song& setFormat(const std::string& fmt); + std::string getLabel() const; + Song& setLabel(const std::string& lab); + unsigned int getTrackNumber() const; + Song& setTrackNumber(unsigned int track); + + // Genre-specific methods + Enums::MusicGenre getGenre() const; + Song& setGenre(Enums::MusicGenre genre); + std::string getGenreString() const; +}; + +#endif // SONG_H diff --git a/src/Backend/Enums/Genres.cpp b/src/Backend/Enums/Genres.cpp new file mode 100644 index 0000000..90ae8e3 --- /dev/null +++ b/src/Backend/Enums/Genres.cpp @@ -0,0 +1,310 @@ +#include "Genres.h" +#include + +namespace Enums { + + std::string musicGenreToString(MusicGenre genre) { + static const std::map genreMap = { + {MusicGenre::ROCK, "Rock"}, + {MusicGenre::POP, "Pop"}, + {MusicGenre::JAZZ, "Jazz"}, + {MusicGenre::CLASSICAL, "Classical"}, + {MusicGenre::HIP_HOP, "Hip Hop"}, + {MusicGenre::ELECTRONIC, "Electronic"}, + {MusicGenre::COUNTRY, "Country"}, + {MusicGenre::FOLK, "Folk"}, + {MusicGenre::BLUES, "Blues"}, + {MusicGenre::REGGAE, "Reggae"}, + {MusicGenre::METAL, "Metal"}, + {MusicGenre::PUNK, "Punk"}, + {MusicGenre::INDIE, "Indie"}, + {MusicGenre::RAP, "Rap"}, + {MusicGenre::SOUL, "Soul"}, + {MusicGenre::FUNK, "Funk"}, + {MusicGenre::DISCO, "Disco"}, + {MusicGenre::GOSPEL, "Gospel"}, + {MusicGenre::LATIN, "Latin"}, + {MusicGenre::WORLD_MUSIC, "World Music"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre) { + static const std::map genreMap = { + {"Rock", MusicGenre::ROCK}, + {"Pop", MusicGenre::POP}, + {"Jazz", MusicGenre::JAZZ}, + {"Classical", MusicGenre::CLASSICAL}, + {"Hip Hop", MusicGenre::HIP_HOP}, + {"Electronic", MusicGenre::ELECTRONIC}, + {"Country", MusicGenre::COUNTRY}, + {"Folk", MusicGenre::FOLK}, + {"Blues", MusicGenre::BLUES}, + {"Reggae", MusicGenre::REGGAE}, + {"Metal", MusicGenre::METAL}, + {"Punk", MusicGenre::PUNK}, + {"Indie", MusicGenre::INDIE}, + {"Rap", MusicGenre::RAP}, + {"Soul", MusicGenre::SOUL}, + {"Funk", MusicGenre::FUNK}, + {"Disco", MusicGenre::DISCO}, + {"Gospel", MusicGenre::GOSPEL}, + {"Latin", MusicGenre::LATIN}, + {"World Music", MusicGenre::WORLD_MUSIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MusicGenre::ROCK; + } + + std::string bookGenreToString(BookGenre genre) { + static const std::map genreMap = { + {BookGenre::FICTION, "Fiction"}, + {BookGenre::NON_FICTION, "Non-Fiction"}, + {BookGenre::MYSTERY, "Mystery"}, + {BookGenre::THRILLER, "Thriller"}, + {BookGenre::ROMANCE, "Romance"}, + {BookGenre::SCIENCE_FICTION, "Science Fiction"}, + {BookGenre::FANTASY, "Fantasy"}, + {BookGenre::HORROR, "Horror"}, + {BookGenre::HISTORICAL_FICTION, "Historical Fiction"}, + {BookGenre::BIOGRAPHY, "Biography"}, + {BookGenre::AUTOBIOGRAPHY, "Autobiography"}, + {BookGenre::MEMOIR, "Memoir"}, + {BookGenre::SELF_HELP, "Self-Help"}, + {BookGenre::BUSINESS, "Business"}, + {BookGenre::PHILOSOPHY, "Philosophy"}, + {BookGenre::RELIGION, "Religion"}, + {BookGenre::SCIENCE, "Science"}, + {BookGenre::TECHNOLOGY, "Technology"}, + {BookGenre::COOKING, "Cooking"}, + {BookGenre::TRAVEL, "Travel"}, + {BookGenre::POETRY, "Poetry"}, + {BookGenre::DRAMA, "Drama"}, + {BookGenre::CHILDREN, "Children"}, + {BookGenre::YOUNG_ADULT, "Young Adult"}, + {BookGenre::ACADEMIC, "Academic"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + BookGenre stringToBookGenre(const std::string& genre) { + static const std::map genreMap = { + {"Fiction", BookGenre::FICTION}, + {"Non-Fiction", BookGenre::NON_FICTION}, + {"Mystery", BookGenre::MYSTERY}, + {"Thriller", BookGenre::THRILLER}, + {"Romance", BookGenre::ROMANCE}, + {"Science Fiction", BookGenre::SCIENCE_FICTION}, + {"Fantasy", BookGenre::FANTASY}, + {"Horror", BookGenre::HORROR}, + {"Historical Fiction", BookGenre::HISTORICAL_FICTION}, + {"Biography", BookGenre::BIOGRAPHY}, + {"Autobiography", BookGenre::AUTOBIOGRAPHY}, + {"Memoir", BookGenre::MEMOIR}, + {"Self-Help", BookGenre::SELF_HELP}, + {"Business", BookGenre::BUSINESS}, + {"Philosophy", BookGenre::PHILOSOPHY}, + {"Religion", BookGenre::RELIGION}, + {"Science", BookGenre::SCIENCE}, + {"Technology", BookGenre::TECHNOLOGY}, + {"Cooking", BookGenre::COOKING}, + {"Travel", BookGenre::TRAVEL}, + {"Poetry", BookGenre::POETRY}, + {"Drama", BookGenre::DRAMA}, + {"Children", BookGenre::CHILDREN}, + {"Young Adult", BookGenre::YOUNG_ADULT}, + {"Academic", BookGenre::ACADEMIC} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : BookGenre::FICTION; + } + + std::string movieGenreToString(MovieGenre genre) { + static const std::map genreMap = { + {MovieGenre::ACTION, "Action"}, + {MovieGenre::ADVENTURE, "Adventure"}, + {MovieGenre::COMEDY, "Comedy"}, + {MovieGenre::DRAMA, "Drama"}, + {MovieGenre::HORROR, "Horror"}, + {MovieGenre::THRILLER, "Thriller"}, + {MovieGenre::SCIENCE_FICTION, "Science Fiction"}, + {MovieGenre::FANTASY, "Fantasy"}, + {MovieGenre::ROMANCE, "Romance"}, + {MovieGenre::MYSTERY, "Mystery"}, + {MovieGenre::CRIME, "Crime"}, + {MovieGenre::WESTERN, "Western"}, + {MovieGenre::WAR, "War"}, + {MovieGenre::HISTORICAL, "Historical"}, + {MovieGenre::DOCUMENTARY, "Documentary"}, + {MovieGenre::ANIMATION, "Animation"}, + {MovieGenre::FAMILY, "Family"}, + {MovieGenre::MUSICAL, "Musical"}, + {MovieGenre::SPORTS, "Sports"}, + {MovieGenre::BIOGRAPHY, "Biography"}, + {MovieGenre::FILM_NOIR, "Film Noir"}, + {MovieGenre::EXPERIMENTAL, "Experimental"}, + {MovieGenre::SHORT_FILM, "Short Film"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MovieGenre stringToMovieGenre(const std::string& genre) { + static const std::map genreMap = { + {"Action", MovieGenre::ACTION}, + {"Adventure", MovieGenre::ADVENTURE}, + {"Comedy", MovieGenre::COMEDY}, + {"Drama", MovieGenre::DRAMA}, + {"Horror", MovieGenre::HORROR}, + {"Thriller", MovieGenre::THRILLER}, + {"Science Fiction", MovieGenre::SCIENCE_FICTION}, + {"Fantasy", MovieGenre::FANTASY}, + {"Romance", MovieGenre::ROMANCE}, + {"Mystery", MovieGenre::MYSTERY}, + {"Crime", MovieGenre::CRIME}, + {"Western", MovieGenre::WESTERN}, + {"War", MovieGenre::WAR}, + {"Historical", MovieGenre::HISTORICAL}, + {"Documentary", MovieGenre::DOCUMENTARY}, + {"Animation", MovieGenre::ANIMATION}, + {"Family", MovieGenre::FAMILY}, + {"Musical", MovieGenre::MUSICAL}, + {"Sports", MovieGenre::SPORTS}, + {"Biography", MovieGenre::BIOGRAPHY}, + {"Film Noir", MovieGenre::FILM_NOIR}, + {"Experimental", MovieGenre::EXPERIMENTAL}, + {"Short Film", MovieGenre::SHORT_FILM} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MovieGenre::DRAMA; + } + + std::string magazineGenreToString(MagazineGenre genre) { + static const std::map genreMap = { + {MagazineGenre::NEWS, "News"}, + {MagazineGenre::POLITICS, "Politics"}, + {MagazineGenre::BUSINESS, "Business"}, + {MagazineGenre::TECHNOLOGY, "Technology"}, + {MagazineGenre::SCIENCE, "Science"}, + {MagazineGenre::HEALTH, "Health"}, + {MagazineGenre::FITNESS, "Fitness"}, + {MagazineGenre::FOOD, "Food"}, + {MagazineGenre::TRAVEL, "Travel"}, + {MagazineGenre::FASHION, "Fashion"}, + {MagazineGenre::BEAUTY, "Beauty"}, + {MagazineGenre::HOME, "Home"}, + {MagazineGenre::GARDEN, "Garden"}, + {MagazineGenre::AUTOMOTIVE, "Automotive"}, + {MagazineGenre::SPORTS, "Sports"}, + {MagazineGenre::ENTERTAINMENT, "Entertainment"}, + {MagazineGenre::ARTS, "Arts"}, + {MagazineGenre::LITERATURE, "Literature"}, + {MagazineGenre::EDUCATION, "Education"}, + {MagazineGenre::ACADEMIC, "Academic"}, + {MagazineGenre::TRADE, "Trade"}, + {MagazineGenre::HOBBIES, "Hobbies"}, + {MagazineGenre::CRAFTS, "Crafts"}, + {MagazineGenre::PHOTOGRAPHY, "Photography"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + MagazineGenre stringToMagazineGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", MagazineGenre::NEWS}, + {"Politics", MagazineGenre::POLITICS}, + {"Business", MagazineGenre::BUSINESS}, + {"Technology", MagazineGenre::TECHNOLOGY}, + {"Science", MagazineGenre::SCIENCE}, + {"Health", MagazineGenre::HEALTH}, + {"Fitness", MagazineGenre::FITNESS}, + {"Food", MagazineGenre::FOOD}, + {"Travel", MagazineGenre::TRAVEL}, + {"Fashion", MagazineGenre::FASHION}, + {"Beauty", MagazineGenre::BEAUTY}, + {"Home", MagazineGenre::HOME}, + {"Garden", MagazineGenre::GARDEN}, + {"Automotive", MagazineGenre::AUTOMOTIVE}, + {"Sports", MagazineGenre::SPORTS}, + {"Entertainment", MagazineGenre::ENTERTAINMENT}, + {"Arts", MagazineGenre::ARTS}, + {"Literature", MagazineGenre::LITERATURE}, + {"Education", MagazineGenre::EDUCATION}, + {"Academic", MagazineGenre::ACADEMIC}, + {"Trade", MagazineGenre::TRADE}, + {"Hobbies", MagazineGenre::HOBBIES}, + {"Crafts", MagazineGenre::CRAFTS}, + {"Photography", MagazineGenre::PHOTOGRAPHY} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : MagazineGenre::NEWS; + } + + std::string podcastGenreToString(PodcastGenre genre) { + static const std::map genreMap = { + {PodcastGenre::NEWS, "News"}, + {PodcastGenre::POLITICS, "Politics"}, + {PodcastGenre::BUSINESS, "Business"}, + {PodcastGenre::TECHNOLOGY, "Technology"}, + {PodcastGenre::SCIENCE, "Science"}, + {PodcastGenre::HEALTH, "Health"}, + {PodcastGenre::FITNESS, "Fitness"}, + {PodcastGenre::EDUCATION, "Education"}, + {PodcastGenre::HISTORY, "History"}, + {PodcastGenre::TRUE_CRIME, "True Crime"}, + {PodcastGenre::COMEDY, "Comedy"}, + {PodcastGenre::ENTERTAINMENT, "Entertainment"}, + {PodcastGenre::SPORTS, "Sports"}, + {PodcastGenre::ARTS, "Arts"}, + {PodcastGenre::LITERATURE, "Literature"}, + {PodcastGenre::PHILOSOPHY, "Philosophy"}, + {PodcastGenre::RELIGION, "Religion"}, + {PodcastGenre::SELF_HELP, "Self-Help"}, + {PodcastGenre::INTERVIEW, "Interview"}, + {PodcastGenre::STORYTELLING, "Storytelling"}, + {PodcastGenre::MUSIC, "Music"}, + {PodcastGenre::FOOD, "Food"}, + {PodcastGenre::TRAVEL, "Travel"}, + {PodcastGenre::PARENTING, "Parenting"}, + {PodcastGenre::GAMING, "Gaming"} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : "Unknown"; + } + + PodcastGenre stringToPodcastGenre(const std::string& genre) { + static const std::map genreMap = { + {"News", PodcastGenre::NEWS}, + {"Politics", PodcastGenre::POLITICS}, + {"Business", PodcastGenre::BUSINESS}, + {"Technology", PodcastGenre::TECHNOLOGY}, + {"Science", PodcastGenre::SCIENCE}, + {"Health", PodcastGenre::HEALTH}, + {"Fitness", PodcastGenre::FITNESS}, + {"Education", PodcastGenre::EDUCATION}, + {"History", PodcastGenre::HISTORY}, + {"True Crime", PodcastGenre::TRUE_CRIME}, + {"Comedy", PodcastGenre::COMEDY}, + {"Entertainment", PodcastGenre::ENTERTAINMENT}, + {"Sports", PodcastGenre::SPORTS}, + {"Arts", PodcastGenre::ARTS}, + {"Literature", PodcastGenre::LITERATURE}, + {"Philosophy", PodcastGenre::PHILOSOPHY}, + {"Religion", PodcastGenre::RELIGION}, + {"Self-Help", PodcastGenre::SELF_HELP}, + {"Interview", PodcastGenre::INTERVIEW}, + {"Storytelling", PodcastGenre::STORYTELLING}, + {"Music", PodcastGenre::MUSIC}, + {"Food", PodcastGenre::FOOD}, + {"Travel", PodcastGenre::TRAVEL}, + {"Parenting", PodcastGenre::PARENTING}, + {"Gaming", PodcastGenre::GAMING} + }; + auto it = genreMap.find(genre); + return (it != genreMap.end()) ? it->second : PodcastGenre::EDUCATION; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Genres.h b/src/Backend/Enums/Genres.h new file mode 100644 index 0000000..4f36855 --- /dev/null +++ b/src/Backend/Enums/Genres.h @@ -0,0 +1,159 @@ +#ifndef GENRES_H +#define GENRES_H + +#include + +namespace Enums { + // Music genres + enum class MusicGenre { + ROCK, + POP, + JAZZ, + CLASSICAL, + HIP_HOP, + ELECTRONIC, + COUNTRY, + FOLK, + BLUES, + REGGAE, + METAL, + PUNK, + INDIE, + RAP, + SOUL, + FUNK, + DISCO, + GOSPEL, + LATIN, + WORLD_MUSIC + }; + + // Book genres + enum class BookGenre { + FICTION, + NON_FICTION, + MYSTERY, + THRILLER, + ROMANCE, + SCIENCE_FICTION, + FANTASY, + HORROR, + HISTORICAL_FICTION, + BIOGRAPHY, + AUTOBIOGRAPHY, + MEMOIR, + SELF_HELP, + BUSINESS, + PHILOSOPHY, + RELIGION, + SCIENCE, + TECHNOLOGY, + COOKING, + TRAVEL, + POETRY, + DRAMA, + CHILDREN, + YOUNG_ADULT, + ACADEMIC + }; + + // Movie genres + enum class MovieGenre { + ACTION, + ADVENTURE, + COMEDY, + DRAMA, + HORROR, + THRILLER, + SCIENCE_FICTION, + FANTASY, + ROMANCE, + MYSTERY, + CRIME, + WESTERN, + WAR, + HISTORICAL, + DOCUMENTARY, + ANIMATION, + FAMILY, + MUSICAL, + SPORTS, + BIOGRAPHY, + FILM_NOIR, + EXPERIMENTAL, + SHORT_FILM + }; + + // Magazine genres + enum class MagazineGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + FOOD, + TRAVEL, + FASHION, + BEAUTY, + HOME, + GARDEN, + AUTOMOTIVE, + SPORTS, + ENTERTAINMENT, + ARTS, + LITERATURE, + EDUCATION, + ACADEMIC, + TRADE, + HOBBIES, + CRAFTS, + PHOTOGRAPHY + }; + + // Podcast genres + enum class PodcastGenre { + NEWS, + POLITICS, + BUSINESS, + TECHNOLOGY, + SCIENCE, + HEALTH, + FITNESS, + EDUCATION, + HISTORY, + TRUE_CRIME, + COMEDY, + ENTERTAINMENT, + SPORTS, + ARTS, + LITERATURE, + PHILOSOPHY, + RELIGION, + SELF_HELP, + INTERVIEW, + STORYTELLING, + MUSIC, + FOOD, + TRAVEL, + PARENTING, + GAMING + }; + + // Helper functions to convert enum to string + std::string musicGenreToString(MusicGenre genre); + std::string bookGenreToString(BookGenre genre); + std::string movieGenreToString(MovieGenre genre); + std::string magazineGenreToString(MagazineGenre genre); + std::string podcastGenreToString(PodcastGenre genre); + + // Helper functions to convert string to enum + MusicGenre stringToMusicGenre(const std::string& genre); + BookGenre stringToBookGenre(const std::string& genre); + MovieGenre stringToMovieGenre(const std::string& genre); + MagazineGenre stringToMagazineGenre(const std::string& genre); + PodcastGenre stringToPodcastGenre(const std::string& genre); +} + +#endif // GENRES_H \ No newline at end of file diff --git a/src/Backend/Enums/Languages.cpp b/src/Backend/Enums/Languages.cpp new file mode 100644 index 0000000..aaf30fb --- /dev/null +++ b/src/Backend/Enums/Languages.cpp @@ -0,0 +1,159 @@ +#include "Languages.h" +#include + +namespace Enums { + + std::string languageToString(Language language) { + static const std::map languageMap = { + {Language::ITALIAN, "Italian"}, + {Language::ENGLISH, "English"}, + {Language::SPANISH, "Spanish"}, + {Language::FRENCH, "French"}, + {Language::GERMAN, "German"}, + {Language::PORTUGUESE, "Portuguese"}, + {Language::RUSSIAN, "Russian"}, + {Language::CHINESE, "Chinese"}, + {Language::JAPANESE, "Japanese"}, + {Language::KOREAN, "Korean"}, + {Language::ARABIC, "Arabic"}, + {Language::HINDI, "Hindi"}, + {Language::DUTCH, "Dutch"}, + {Language::SWEDISH, "Swedish"}, + {Language::NORWEGIAN, "Norwegian"}, + {Language::DANISH, "Danish"}, + {Language::FINNISH, "Finnish"}, + {Language::POLISH, "Polish"}, + {Language::CZECH, "Czech"}, + {Language::HUNGARIAN, "Hungarian"}, + {Language::ROMANIAN, "Romanian"}, + {Language::BULGARIAN, "Bulgarian"}, + {Language::GREEK, "Greek"}, + {Language::TURKISH, "Turkish"}, + {Language::HEBREW, "Hebrew"}, + {Language::PERSIAN, "Persian"}, + {Language::THAI, "Thai"}, + {Language::VIETNAMESE, "Vietnamese"}, + {Language::INDONESIAN, "Indonesian"}, + {Language::MALAY, "Malay"}, + {Language::FILIPINO, "Filipino"}, + {Language::LATIN, "Latin"}, + {Language::ANCIENT_GREEK, "Ancient Greek"}, + {Language::SANSKRIT, "Sanskrit"}, + {Language::OLD_ENGLISH, "Old English"}, + {Language::MIDDLE_ENGLISH, "Middle English"}, + {Language::OLD_FRENCH, "Old French"}, + {Language::OLD_GERMAN, "Old German"}, + {Language::OLD_ITALIAN, "Old Italian"}, + {Language::OLD_SPANISH, "Old Spanish"}, + {Language::OLD_PORTUGUESE, "Old Portuguese"}, + {Language::OLD_RUSSIAN, "Old Russian"}, + {Language::OLD_CHINESE, "Old Chinese"}, + {Language::OLD_JAPANESE, "Old Japanese"}, + {Language::OLD_KOREAN, "Old Korean"}, + {Language::OLD_ARABIC, "Old Arabic"}, + {Language::OLD_HINDI, "Old Hindi"}, + {Language::OLD_DUTCH, "Old Dutch"}, + {Language::OLD_SWEDISH, "Old Swedish"}, + {Language::OLD_NORWEGIAN, "Old Norwegian"}, + {Language::OLD_DANISH, "Old Danish"}, + {Language::OLD_FINNISH, "Old Finnish"}, + {Language::OLD_POLISH, "Old Polish"}, + {Language::OLD_CZECH, "Old Czech"}, + {Language::OLD_HUNGARIAN, "Old Hungarian"}, + {Language::OLD_ROMANIAN, "Old Romanian"}, + {Language::OLD_BULGARIAN, "Old Bulgarian"}, + {Language::OLD_GREEK, "Old Greek"}, + {Language::OLD_TURKISH, "Old Turkish"}, + {Language::OLD_HEBREW, "Old Hebrew"}, + {Language::OLD_PERSIAN, "Old Persian"}, + {Language::OLD_THAI, "Old Thai"}, + {Language::OLD_VIETNAMESE, "Old Vietnamese"}, + {Language::OLD_INDONESIAN, "Old Indonesian"}, + {Language::OLD_MALAY, "Old Malay"}, + {Language::OLD_FILIPINO, "Old Filipino"}, + {Language::OLD_LATIN, "Old Latin"}, + {Language::OLD_ANCIENT_GREEK, "Old Ancient Greek"}, + {Language::OLD_SANSKRIT, "Old Sanskrit"}, + {Language::OTHER, "Other"} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : "Unknown"; + } + + Language stringToLanguage(const std::string& language) { + static const std::map languageMap = { + {"Italian", Language::ITALIAN}, + {"English", Language::ENGLISH}, + {"Spanish", Language::SPANISH}, + {"French", Language::FRENCH}, + {"German", Language::GERMAN}, + {"Portuguese", Language::PORTUGUESE}, + {"Russian", Language::RUSSIAN}, + {"Chinese", Language::CHINESE}, + {"Japanese", Language::JAPANESE}, + {"Korean", Language::KOREAN}, + {"Arabic", Language::ARABIC}, + {"Hindi", Language::HINDI}, + {"Dutch", Language::DUTCH}, + {"Swedish", Language::SWEDISH}, + {"Norwegian", Language::NORWEGIAN}, + {"Danish", Language::DANISH}, + {"Finnish", Language::FINNISH}, + {"Polish", Language::POLISH}, + {"Czech", Language::CZECH}, + {"Hungarian", Language::HUNGARIAN}, + {"Romanian", Language::ROMANIAN}, + {"Bulgarian", Language::BULGARIAN}, + {"Greek", Language::GREEK}, + {"Turkish", Language::TURKISH}, + {"Hebrew", Language::HEBREW}, + {"Persian", Language::PERSIAN}, + {"Thai", Language::THAI}, + {"Vietnamese", Language::VIETNAMESE}, + {"Indonesian", Language::INDONESIAN}, + {"Malay", Language::MALAY}, + {"Filipino", Language::FILIPINO}, + {"Latin", Language::LATIN}, + {"Ancient Greek", Language::ANCIENT_GREEK}, + {"Sanskrit", Language::SANSKRIT}, + {"Old English", Language::OLD_ENGLISH}, + {"Middle English", Language::MIDDLE_ENGLISH}, + {"Old French", Language::OLD_FRENCH}, + {"Old German", Language::OLD_GERMAN}, + {"Old Italian", Language::OLD_ITALIAN}, + {"Old Spanish", Language::OLD_SPANISH}, + {"Old Portuguese", Language::OLD_PORTUGUESE}, + {"Old Russian", Language::OLD_RUSSIAN}, + {"Old Chinese", Language::OLD_CHINESE}, + {"Old Japanese", Language::OLD_JAPANESE}, + {"Old Korean", Language::OLD_KOREAN}, + {"Old Arabic", Language::OLD_ARABIC}, + {"Old Hindi", Language::OLD_HINDI}, + {"Old Dutch", Language::OLD_DUTCH}, + {"Old Swedish", Language::OLD_SWEDISH}, + {"Old Norwegian", Language::OLD_NORWEGIAN}, + {"Old Danish", Language::OLD_DANISH}, + {"Old Finnish", Language::OLD_FINNISH}, + {"Old Polish", Language::OLD_POLISH}, + {"Old Czech", Language::OLD_CZECH}, + {"Old Hungarian", Language::OLD_HUNGARIAN}, + {"Old Romanian", Language::OLD_ROMANIAN}, + {"Old Bulgarian", Language::OLD_BULGARIAN}, + {"Old Greek", Language::OLD_GREEK}, + {"Old Turkish", Language::OLD_TURKISH}, + {"Old Hebrew", Language::OLD_HEBREW}, + {"Old Persian", Language::OLD_PERSIAN}, + {"Old Thai", Language::OLD_THAI}, + {"Old Vietnamese", Language::OLD_VIETNAMESE}, + {"Old Indonesian", Language::OLD_INDONESIAN}, + {"Old Malay", Language::OLD_MALAY}, + {"Old Filipino", Language::OLD_FILIPINO}, + {"Old Latin", Language::OLD_LATIN}, + {"Old Ancient Greek", Language::OLD_ANCIENT_GREEK}, + {"Old Sanskrit", Language::OLD_SANSKRIT}, + {"Other", Language::OTHER} + }; + auto it = languageMap.find(language); + return (it != languageMap.end()) ? it->second : Language::ENGLISH; + } +} \ No newline at end of file diff --git a/src/Backend/Enums/Languages.h b/src/Backend/Enums/Languages.h new file mode 100644 index 0000000..0840b12 --- /dev/null +++ b/src/Backend/Enums/Languages.h @@ -0,0 +1,88 @@ +#ifndef LANGUAGES_H +#define LANGUAGES_H + +#include + +namespace Enums { + // Language enum + enum class Language { + ITALIAN, + ENGLISH, + SPANISH, + FRENCH, + GERMAN, + PORTUGUESE, + RUSSIAN, + CHINESE, + JAPANESE, + KOREAN, + ARABIC, + HINDI, + DUTCH, + SWEDISH, + NORWEGIAN, + DANISH, + FINNISH, + POLISH, + CZECH, + HUNGARIAN, + ROMANIAN, + BULGARIAN, + GREEK, + TURKISH, + HEBREW, + PERSIAN, + THAI, + VIETNAMESE, + INDONESIAN, + MALAY, + FILIPINO, + LATIN, + ANCIENT_GREEK, + SANSKRIT, + OLD_ENGLISH, + MIDDLE_ENGLISH, + OLD_FRENCH, + OLD_GERMAN, + OLD_ITALIAN, + OLD_SPANISH, + OLD_PORTUGUESE, + OLD_RUSSIAN, + OLD_CHINESE, + OLD_JAPANESE, + OLD_KOREAN, + OLD_ARABIC, + OLD_HINDI, + OLD_DUTCH, + OLD_SWEDISH, + OLD_NORWEGIAN, + OLD_DANISH, + OLD_FINNISH, + OLD_POLISH, + OLD_CZECH, + OLD_HUNGARIAN, + OLD_ROMANIAN, + OLD_BULGARIAN, + OLD_GREEK, + OLD_TURKISH, + OLD_HEBREW, + OLD_PERSIAN, + OLD_THAI, + OLD_VIETNAMESE, + OLD_INDONESIAN, + OLD_MALAY, + OLD_FILIPINO, + OLD_LATIN, + OLD_ANCIENT_GREEK, + OLD_SANSKRIT, + OTHER + }; + + // Helper function to convert enum to string + std::string languageToString(Language language); + + // Helper function to convert string to enum + Language stringToLanguage(const std::string& language); +} + +#endif // LANGUAGES_H \ No newline at end of file diff --git a/src/Backend/Library/Library.cpp b/src/Backend/Library/Library.cpp new file mode 100644 index 0000000..5d1b2ca --- /dev/null +++ b/src/Backend/Library/Library.cpp @@ -0,0 +1,342 @@ +#include "Library.h" +#include "../Elements/Media.h" +#include "../Elements/Book.h" +#include "../Elements/Movie.h" +#include "../Elements/Song.h" +#include "../Elements/Magazine.h" +#include "../Elements/Podcast.h" +#include +#include +#include +#include + +Library::Library() : nextId(1) +{ +} + +void Library::addMedia(std::unique_ptr media) +{ + if (!media) return; + + // Assign the next available ID + media->setID(getNextId()); + mediaCollection.push_back(std::move(media)); +} + +void Library::removeMedia(int id) +{ + auto it = std::find_if(mediaCollection.begin(), mediaCollection.end(), + [id](const std::unique_ptr& media) { + return media->getID() == id; + }); + + if (it != mediaCollection.end()) { + mediaCollection.erase(it); + } +} + +Media* Library::findMediaById(int id) +{ + auto it = std::find_if(mediaCollection.begin(), mediaCollection.end(), + [id](const std::unique_ptr& media) { + return media->getID() == id; + }); + + return (it != mediaCollection.end()) ? it->get() : nullptr; +} + +std::vector Library::getAllMedia() const +{ + std::vector result; + result.reserve(mediaCollection.size()); + + for (const auto& media : mediaCollection) { + result.push_back(media.get()); + } + + return result; +} + +std::vector Library::searchByTitle(const std::string& title) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + std::string mediaTitle = media->getTitle(); + if (mediaTitle.find(title) != std::string::npos) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::searchByAuthor(const std::string& author) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + std::string mediaAuthor = media->getAuthor(); + if (mediaAuthor.find(author) != std::string::npos) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::filterByType(const std::string& type) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + if (getMediaType(media.get()) == type) { + result.push_back(media.get()); + } + } + + return result; +} + +std::vector Library::filterByAvailability(bool available) const +{ + std::vector result; + + for (const auto& media : mediaCollection) { + if (media->getIsAvailable() == available) { + result.push_back(media.get()); + } + } + + return result; +} + +bool Library::saveToFile(const std::string& filename) const +{ + std::ofstream file(filename); + if (!file.is_open()) { + return false; + } + + // Write header + file << "ID,Type,Title,Author,ReleaseDate,Size,Available"; + + // Write specific fields for each type + file << ",Publisher,Pages,ISBN,Language,Genre"; // Book fields + file << ",Director,Duration,Rating"; // Movie fields + file << ",Artist,Album"; // Song fields + file << ",Issue"; // Magazine fields + file << ",Host,Episodes"; // Podcast fields + file << "\n"; + + for (const auto& media : mediaCollection) { + // Common fields + file << media->getID() << "," + << getMediaType(media.get()) << "," + << media->getTitle() << "," + << media->getAuthor() << "," + << media->getReleaseDate().toString() << "," + << media->getKbSize() << "," + << (media->getIsAvailable() ? "1" : "0"); + + // Type-specific fields + if (auto book = dynamic_cast(media.get())) { + file << "," << book->getPublisher() + << "," << book->getPages() + << "," << book->getIsbn() + << "," << static_cast(book->getLanguage()) + << "," << static_cast(book->getGenre()); + } else { + file << ",,,,,"; // Empty fields for non-books + } + + if (auto movie = dynamic_cast(media.get())) { + file << "," << movie->getDirector() + << "," << movie->getDuration() + << "," << movie->getRating(); + } else { + file << ",,,"; // Empty fields for non-movies + } + + if (auto song = dynamic_cast(media.get())) { + file << "," << song->getArtist() + << "," << song->getAlbum(); + } else { + file << ",,"; // Empty fields for non-songs + } + + if (auto magazine = dynamic_cast(media.get())) { + file << "," << magazine->getIssueNumber(); + } else { + file << ","; // Empty field for non-magazines + } + + if (auto podcast = dynamic_cast(media.get())) { + file << "," << podcast->getHost() + << "," << podcast->getEpisodeNumber(); + } else { + file << ",,"; // Empty fields for non-podcasts + } + + file << "\n"; + } + + file.close(); + return true; +} + +bool Library::loadFromFile(const std::string& filename) +{ + std::ifstream file(filename); + if (!file.is_open()) { + return false; + } + + // Clear existing data + clear(); + + std::string line; + // Skip header + std::getline(file, line); + + while (std::getline(file, line)) { + std::stringstream ss(line); + std::string token; + std::vector tokens; + + while (std::getline(ss, token, ',')) { + tokens.push_back(token); + } + + if (tokens.size() < 7) continue; // Skip invalid lines + + // Parse common fields + int id = std::stoi(tokens[0]); + std::string type = tokens[1]; + std::string title = tokens[2]; + std::string author = tokens[3]; + Date releaseDate; // TODO: Parse date from string + int size = std::stoi(tokens[5]); + bool available = (tokens[6] == "1"); + + // Create media based on type + std::unique_ptr media; + + if (type == "Book" && tokens.size() >= 12) { + auto book = std::make_unique(); + book->setPublisher(tokens[7]); + book->setPages(std::stoi(tokens[8])); + book->setIsbn(tokens[9]); + book->setLanguage(static_cast(std::stoi(tokens[10]))); + book->setGenre(static_cast(std::stoi(tokens[11]))); + media = std::move(book); + } else if (type == "Movie" && tokens.size() >= 15) { + auto movie = std::make_unique(); + movie->setDirector(tokens[12]); + movie->setDuration(std::stoi(tokens[13])); + movie->setRating(tokens[14]); + media = std::move(movie); + } else if (type == "Song" && tokens.size() >= 17) { + auto song = std::make_unique(); + song->setArtist(tokens[15]); + song->setAlbum(tokens[16]); + media = std::move(song); + } else if (type == "Magazine" && tokens.size() >= 18) { + auto magazine = std::make_unique(); + magazine->setIssueNumber(std::stoi(tokens[17])); + media = std::move(magazine); + } else if (type == "Podcast" && tokens.size() >= 20) { + auto podcast = std::make_unique(); + podcast->setHost(tokens[18]); + podcast->setEpisodeNumber(std::stoi(tokens[19])); + media = std::move(podcast); + } + + if (media) { + media->setID(id); + media->setTitle(title); + media->setAuthor(author); + media->setReleaseDate(releaseDate); + media->setKbSize(size); + media->setIsAvailable(available); + + mediaCollection.push_back(std::move(media)); + nextId = std::max(nextId, static_cast(id + 1)); + } + } + + file.close(); + return true; +} + +size_t Library::getTotalCount() const +{ + return mediaCollection.size(); +} + +size_t Library::getAvailableCount() const +{ + return std::count_if(mediaCollection.begin(), mediaCollection.end(), + [](const std::unique_ptr& media) { + return media->getIsAvailable(); + }); +} + +size_t Library::getCountByType(const std::string& type) const +{ + return std::count_if(mediaCollection.begin(), mediaCollection.end(), + [this, &type](const std::unique_ptr& media) { + return getMediaType(media.get()) == type; + }); +} + +std::map Library::getMediaTypeStats() const +{ + std::map stats; + + for (const auto& media : mediaCollection) { + std::string type = getMediaType(media.get()); + stats[type]++; + } + + return stats; +} + +int Library::getNextId() +{ + return nextId++; +} + +void Library::clear() +{ + mediaCollection.clear(); + nextId = 1; +} + +bool Library::isEmpty() const +{ + return mediaCollection.empty(); +} + +std::string Library::getMediaType(const Media* media) const +{ + if (dynamic_cast(media)) return "Book"; + if (dynamic_cast(media)) return "Movie"; + if (dynamic_cast(media)) return "Song"; + if (dynamic_cast(media)) return "Magazine"; + if (dynamic_cast(media)) return "Podcast"; + return "Unknown"; +} + +void Library::generateNextId() +{ + if (mediaCollection.empty()) { + nextId = 1; + } else { + unsigned int maxId = 0; + for (const auto& media : mediaCollection) { + maxId = std::max(maxId, static_cast(media->getID())); + } + nextId = maxId + 1; + } +} diff --git a/src/Backend/Library/Library.h b/src/Backend/Library/Library.h new file mode 100644 index 0000000..8da1698 --- /dev/null +++ b/src/Backend/Library/Library.h @@ -0,0 +1,60 @@ +#ifndef LIBRARY_H +#define LIBRARY_H + +#include +#include +#include +#include +#include + +// Forward declarations +class Media; +class Book; +class Movie; +class Song; +class Magazine; +class Podcast; + +class Library +{ +public: + Library(); + ~Library() = default; + + // CRUD Operations + void addMedia(std::unique_ptr media); + void removeMedia(int id); + Media* findMediaById(int id); + std::vector getAllMedia() const; + + // Search and Filter Operations + std::vector searchByTitle(const std::string& title) const; + std::vector searchByAuthor(const std::string& author) const; + std::vector filterByType(const std::string& type) const; + std::vector filterByAvailability(bool available) const; + + // File Operations + bool saveToFile(const std::string& filename) const; + bool loadFromFile(const std::string& filename); + + // Statistics + size_t getTotalCount() const; + size_t getAvailableCount() const; + size_t getCountByType(const std::string& type) const; + std::map getMediaTypeStats() const; + + // Utility + int getNextId(); + void clear(); + bool isEmpty() const; + std::string getMediaType(const Media* media) const; + +private: + std::vector> mediaCollection; + unsigned int nextId; + + // Helper methods + void generateNextId(); +}; + +#endif // LIBRARY_H diff --git a/src/Frontend/Windows/MainWindow.cpp b/src/Frontend/Windows/MainWindow.cpp new file mode 100644 index 0000000..1b221dc --- /dev/null +++ b/src/Frontend/Windows/MainWindow.cpp @@ -0,0 +1,244 @@ +#include "MainWindow.h" +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) +{ + // Initialize library + library = std::make_unique(); + + setupUI(); + setupMenuBar(); + setupToolBar(); + setupStatusBar(); + setupTable(); + setupConnections(); + + // Set window properties + setWindowTitle("Multimedia Library"); + setMinimumSize(800, 600); + resize(1200, 800); +} + +MainWindow::~MainWindow() +{ +} + +void MainWindow::setupUI() +{ + centralWidget = new QWidget(this); + setCentralWidget(centralWidget); + + QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); + + // Create table + mediaTable = new QTableWidget(this); + mainLayout->addWidget(mediaTable); +} + +void MainWindow::setupMenuBar() +{ + QMenuBar *menuBar = this->menuBar(); + + // File menu + QMenu *fileMenu = menuBar->addMenu("&File"); + importAction = fileMenu->addAction("&Import..."); + exportAction = fileMenu->addAction("&Export..."); + fileMenu->addSeparator(); + fileMenu->addAction("E&xit", this, &QWidget::close); + + // Edit menu + QMenu *editMenu = menuBar->addMenu("&Edit"); + addAction = editMenu->addAction("&Add Media..."); + editAction = editMenu->addAction("&Edit Media..."); + deleteAction = editMenu->addAction("&Delete Media"); + + // Search menu + QMenu *searchMenu = menuBar->addMenu("&Search"); + searchAction = searchMenu->addAction("&Search..."); + + // Help menu + QMenu *helpMenu = menuBar->addMenu("&Help"); + aboutAction = helpMenu->addAction("&About"); +} + +void MainWindow::setupToolBar() +{ + toolBar = addToolBar("Main Toolbar"); + toolBar->setMovable(false); + + toolBar->addAction(addAction); + toolBar->addAction(editAction); + toolBar->addAction(deleteAction); + toolBar->addSeparator(); + toolBar->addAction(searchAction); + toolBar->addSeparator(); + toolBar->addAction(exportAction); +} + +void MainWindow::setupStatusBar() +{ + statusBarWidget = this->statusBar(); + statusBarWidget->showMessage("Ready"); +} + +void MainWindow::setupTable() +{ + // Set table properties + mediaTable->setAlternatingRowColors(true); + mediaTable->setSelectionBehavior(QAbstractItemView::SelectRows); + mediaTable->setSelectionMode(QAbstractItemView::SingleSelection); + mediaTable->setSortingEnabled(true); + + // Set column headers + QStringList headers; + headers << "ID" << "Type" << "Title" << "Author" << "Genre" << "Release Date" << "Size (KB)" << "Available"; + mediaTable->setColumnCount(headers.size()); + mediaTable->setHorizontalHeaderLabels(headers); + + // Set column widths + mediaTable->setColumnWidth(0, 50); // ID + mediaTable->setColumnWidth(1, 80); // Type + mediaTable->setColumnWidth(2, 200); // Title + mediaTable->setColumnWidth(3, 150); // Author + mediaTable->setColumnWidth(4, 120); // Genre + mediaTable->setColumnWidth(5, 100); // Release Date + mediaTable->setColumnWidth(6, 80); // Size + mediaTable->setColumnWidth(7, 80); // Available + + // Make columns stretch + mediaTable->horizontalHeader()->setStretchLastSection(true); +} + +void MainWindow::setupConnections() +{ + // Connect menu actions + connect(addAction, &QAction::triggered, this, &MainWindow::addMedia); + connect(editAction, &QAction::triggered, this, &MainWindow::editMedia); + connect(deleteAction, &QAction::triggered, this, &MainWindow::deleteMedia); + connect(searchAction, &QAction::triggered, this, &MainWindow::searchMedia); + connect(exportAction, &QAction::triggered, this, &MainWindow::exportData); + connect(importAction, &QAction::triggered, this, &MainWindow::importData); + connect(aboutAction, &QAction::triggered, this, &MainWindow::about); +} + +void MainWindow::addMedia() +{ + statusBarWidget->showMessage("Add Media - Not implemented yet"); + // TODO: Implement AddMediaDialog + // Example usage: + // auto book = std::make_unique(); + // book->setTitle("Sample Book"); + // book->setAuthor("Sample Author"); + // library->addMedia(std::move(book)); + // refreshTable(); +} + +void MainWindow::editMedia() +{ + statusBarWidget->showMessage("Edit Media - Not implemented yet"); + // TODO: Implement EditMediaDialog +} + +void MainWindow::deleteMedia() +{ + statusBarWidget->showMessage("Delete Media - Not implemented yet"); + // TODO: Implement delete functionality + // Example usage: + // int selectedRow = mediaTable->currentRow(); + // if (selectedRow >= 0) { + // int id = mediaTable->item(selectedRow, 0)->text().toInt(); + // library->removeMedia(id); + // refreshTable(); + // } +} + +void MainWindow::searchMedia() +{ + statusBarWidget->showMessage("Search Media - Not implemented yet"); + // TODO: Implement SearchDialog +} + +void MainWindow::exportData() +{ + statusBarWidget->showMessage("Export Data - Not implemented yet"); + // TODO: Implement export functionality + // Example usage: + // QString filename = QFileDialog::getSaveFileName(this, "Export Library", "", "CSV Files (*.csv)"); + // if (!filename.isEmpty()) { + // library->saveToFile(filename.toStdString()); + // } +} + +void MainWindow::importData() +{ + statusBarWidget->showMessage("Import Data - Not implemented yet"); + // TODO: Implement import functionality + // Example usage: + // QString filename = QFileDialog::getOpenFileName(this, "Import Library", "", "CSV Files (*.csv)"); + // if (!filename.isEmpty()) { + // library->loadFromFile(filename.toStdString()); + // refreshTable(); + // } +} + +void MainWindow::about() +{ + QMessageBox::about(this, "About Multimedia Library", + "Multimedia Library v1.0.0\n\n" + "A comprehensive media management application.\n\n" + "Features:\n" + "- Book management\n" + "- Movie management\n" + "- Music management\n" + "- Magazine management\n" + "- Podcast management"); +} + +void MainWindow::refreshTable() +{ + clearTable(); + + auto allMedia = library->getAllMedia(); + for (size_t i = 0; i < allMedia.size(); ++i) { + addMediaToTable(allMedia[i], i); + } +} + +void MainWindow::addMediaToTable(const Media* media, int row) +{ + if (!media) return; + + mediaTable->insertRow(row); + + // ID + mediaTable->setItem(row, 0, new QTableWidgetItem(QString::number(media->getID()))); + + // Type (using Library's getMediaType method) + mediaTable->setItem(row, 1, new QTableWidgetItem(QString::fromStdString(library->getMediaType(media)))); + + // Title + mediaTable->setItem(row, 2, new QTableWidgetItem(QString::fromStdString(media->getTitle()))); + + // Author + mediaTable->setItem(row, 3, new QTableWidgetItem(QString::fromStdString(media->getAuthor()))); + + // Genre (to be implemented in derived classes) + mediaTable->setItem(row, 4, new QTableWidgetItem("N/A")); + + // Release Date + mediaTable->setItem(row, 5, new QTableWidgetItem(QString::fromStdString(media->getReleaseDate().toString()))); + + // Size + mediaTable->setItem(row, 6, new QTableWidgetItem(QString::number(media->getKbSize()))); + + // Available + mediaTable->setItem(row, 7, new QTableWidgetItem(media->getIsAvailable() ? "Yes" : "No")); +} + +void MainWindow::clearTable() +{ + mediaTable->setRowCount(0); +} \ No newline at end of file diff --git a/src/Frontend/Windows/MainWindow.h b/src/Frontend/Windows/MainWindow.h new file mode 100644 index 0000000..df1645b --- /dev/null +++ b/src/Frontend/Windows/MainWindow.h @@ -0,0 +1,74 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../Backend/Elements/Media.h" +#include "../../Backend/Elements/Book.h" +#include "../../Backend/Elements/Movie.h" +#include "../../Backend/Elements/Song.h" +#include "../../Backend/Elements/Magazine.h" +#include "../../Backend/Elements/Podcast.h" +#include "../../Backend/Library/Library.h" + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void addMedia(); + void editMedia(); + void deleteMedia(); + void searchMedia(); + void exportData(); + void importData(); + void about(); + +private: + void setupUI(); + void setupMenuBar(); + void setupToolBar(); + void setupStatusBar(); + void setupTable(); + void setupConnections(); + + // UI Components + QWidget *centralWidget; + QTableWidget *mediaTable; + QToolBar *toolBar; + QStatusBar *statusBarWidget; + + // Actions + QAction *addAction; + QAction *editAction; + QAction *deleteAction; + QAction *searchAction; + QAction *exportAction; + QAction *importAction; + QAction *aboutAction; + + // Data + std::unique_ptr library; + + // Helper methods + void refreshTable(); + void addMediaToTable(const Media* media, int row); + void clearTable(); +}; + +#endif // MAINWINDOW_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..61d3e31 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,167 @@ +#include +#include + +// Backend includes +#include "Backend/Elements/Media.h" +#include "Backend/Elements/Book.h" +#include "Backend/Elements/Movie.h" +#include "Backend/Elements/Song.h" +#include "Backend/Elements/Magazine.h" +#include "Backend/Elements/Podcast.h" +#include "Backend/Enums/Genres.h" +#include "Backend/Enums/Languages.h" + +// Qt includes (conditional compilation) +#ifdef USE_QT +#include +#include +#include "Frontend/Windows/MainWindow.h" +#endif + +void testBackend() { + std::cout << "=== Test Compilazione Multimedia Library ===" << std::endl; + + try { + // Test Book + std::cout << "\n--- Test Book ---" << std::endl; + Book book("Il Nome della Rosa", "Umberto Eco", + Enums::BookGenre::HISTORICAL_FICTION, + Date(1980, 1, 1), + 1, 2048, true, "book_cover.jpg", + "Bompiani", 512, "978-88-452-1234-5", Enums::Language::ITALIAN); + + std::cout << "Book: " << book.getTitle() << " by " << book.getAuthor() << std::endl; + std::cout << "Genre: " << book.getGenreString() << std::endl; + std::cout << "Language: " << book.getLanguageString() << std::endl; + std::cout << "Valid: " << (book.isValid() ? "Yes" : "No") << std::endl; + + // Test Movie + std::cout << "\n--- Test Movie ---" << std::endl; + Movie movie("The Matrix", "Wachowski Sisters", + Enums::MovieGenre::SCIENCE_FICTION, + Date(1999, 3, 31), + 2, 4096, true, "matrix_cover.jpg", + "Lana Wachowski", 136, "Warner Bros.", "R", + Enums::Language::ENGLISH, "USA"); + + std::cout << "Movie: " << movie.getTitle() << " by " << movie.getDirector() << std::endl; + std::cout << "Genre: " << movie.getGenreString() << std::endl; + std::cout << "Language: " << movie.getLanguageString() << std::endl; + std::cout << "Valid: " << (movie.isValid() ? "Yes" : "No") << std::endl; + + // Test Song + std::cout << "\n--- Test Song ---" << std::endl; + Song song("Bohemian Rhapsody", "Queen", + Enums::MusicGenre::ROCK, + Date(1975, 10, 31), + 3, 1024, true, "queen_cover.jpg", + "Queen", "A Night at the Opera", 355, "MP3", "EMI", 1); + + std::cout << "Song: " << song.getTitle() << " by " << song.getArtist() << std::endl; + std::cout << "Genre: " << song.getGenreString() << std::endl; + std::cout << "Valid: " << (song.isValid() ? "Yes" : "No") << std::endl; + + // Test Magazine + std::cout << "\n--- Test Magazine ---" << std::endl; + Magazine magazine("National Geographic", "Various Authors", + Enums::MagazineGenre::SCIENCE, + Date(2024, 1, 1), + 4, 512, true, "natgeo_cover.jpg", + "National Geographic Society", 1, "0027-9358", "Susan Goldberg", + 80, "Monthly"); + + std::cout << "Magazine: " << magazine.getTitle() << std::endl; + std::cout << "Genre: " << magazine.getGenreString() << std::endl; + std::cout << "Valid: " << (magazine.isValid() ? "Yes" : "No") << std::endl; + + // Test Podcast + std::cout << "\n--- Test Podcast ---" << std::endl; + Podcast podcast("Serial", "Sarah Koenig", + Enums::PodcastGenre::TRUE_CRIME, + Date(2014, 10, 3), + 5, 256, true, "serial_cover.jpg", + "Sarah Koenig", 1, "Spotify", 45, "Serial", + "A true crime podcast about a real murder case."); + + std::cout << "Podcast: " << podcast.getTitle() << " by " << podcast.getHost() << std::endl; + std::cout << "Genre: " << podcast.getGenreString() << std::endl; + std::cout << "Valid: " << (podcast.isValid() ? "Yes" : "No") << std::endl; + + std::cout << "\n=== Test Backend completato con successo! ===" << std::endl; + + } catch (const std::exception& e) { + std::cerr << "Errore: " << e.what() << std::endl; + throw; + } +} + +void showUsage(const char* programName) { + std::cout << "Uso: " << programName << " [opzione]" << std::endl; + std::cout << "Opzioni:" << std::endl; + std::cout << " --test Esegui solo il test del backend (console)" << std::endl; +#ifdef USE_QT + std::cout << " --gui Avvia l'interfaccia grafica Qt" << std::endl; +#endif + std::cout << " --help Mostra questo messaggio" << std::endl; + std::cout << std::endl; + std::cout << "Se non viene specificata alcuna opzione, viene eseguito il test del backend." << std::endl; +} + +int main(int argc, char *argv[]) { + // Parse command line arguments + std::string mode = "test"; // Default: test mode + + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg == "--gui" || arg == "-g") { +#ifdef USE_QT + mode = "gui"; +#else + std::cerr << "GUI mode not available - Qt not compiled in" << std::endl; + return 1; +#endif + } else if (arg == "--test" || arg == "-t") { + mode = "test"; + } else if (arg == "--help" || arg == "-h") { + showUsage(argv[0]); + return 0; + } else { + std::cerr << "Opzione sconosciuta: " << arg << std::endl; + showUsage(argv[0]); + return 1; + } + } + + if (mode == "test") { + // Test mode - console only + try { + testBackend(); + return 0; + } catch (const std::exception& e) { + std::cerr << "Errore nel test: " << e.what() << std::endl; + return 1; + } + } +#ifdef USE_QT + else if (mode == "gui") { + // GUI mode - Qt application + QApplication app(argc, argv); + + // Set application properties + app.setApplicationName("Multimedia Library"); + app.setApplicationVersion("1.0.0"); + app.setOrganizationName("MultimediaLibrary"); + + // Set application style + app.setStyle(QStyleFactory::create("Fusion")); + + // Create and show main window + MainWindow mainWindow; + mainWindow.show(); + + return app.exec(); + } +#endif + + return 0; +}