#ifndef INSTALLEDAPPSWIDGET_H #define INSTALLEDAPPSWIDGET_H #include "iDescriptor.h" #include "zlineedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Custom App Tab Widget class AppTabWidget : public QGroupBox { Q_OBJECT public: AppTabWidget(const QString &appName, const QString &bundleId, const QString &version, QWidget *parent = nullptr); void setSelected(bool selected); bool isSelected() const { return m_selected; } QString getBundleId() const { return m_bundleId; } QString getAppName() const { return m_appName; } QString getVersion() const { return m_version; } void updateStyles(); signals: void clicked(); protected: void mousePressEvent(QMouseEvent *event) override; void enterEvent(QEnterEvent *event) override; void leaveEvent(QEvent *event) override; private: void fetchAppIcon(); void setupUI(); QString m_appName; QString m_bundleId; QString m_version; bool m_selected = false; bool m_hovered = false; QLabel *m_iconLabel; QLabel *m_nameLabel; QLabel *m_versionLabel; QList m_appTabs; }; class InstalledAppsWidget : public QWidget { Q_OBJECT public: explicit InstalledAppsWidget(iDescriptorDevice *device, QWidget *parent = nullptr); private slots: void onAppsDataReady(); void onAppTabClicked(); void onContainerDataReady(); void onFileSharingFilterChanged(bool enabled); private: void setupUI(); void createLoadingWidget(); void createErrorWidget(); void createContentWidget(); void createLeftPanel(); void createRightPanel(); void fetchInstalledApps(); void createAppTab(const QString &appName, const QString &bundleId, const QString &version); void showLoadingState(); void showErrorState(const QString &error); void selectAppTab(AppTabWidget *tab); void filterApps(const QString &searchText); void loadAppContainer(const QString &bundleId); void createHouseArrestAfcClient(); iDescriptorDevice *m_device; QHBoxLayout *m_mainLayout; QStackedWidget *m_stackedWidget; QWidget *m_loadingWidget; QWidget *m_errorWidget; QWidget *m_contentWidget; QLabel *m_errorLabel; ZLineEdit *m_searchEdit; QCheckBox *m_fileSharingCheckBox; QScrollArea *m_tabScrollArea; QWidget *m_tabContainer; QVBoxLayout *m_tabLayout; QProgressBar *m_progressBar; QScrollArea *m_containerScrollArea; QWidget *m_containerWidget; QVBoxLayout *m_containerLayout; QFutureWatcher *m_watcher; QFutureWatcher *m_containerWatcher; QSplitter *m_splitter; // App data storage QList m_appTabs; AppTabWidget *m_selectedTab = nullptr; }; #endif // INSTALLEDAPPSWIDGET_H