#ifndef ORBITHUB_PROFILES_WINDOW_H #define ORBITHUB_PROFILES_WINDOW_H #include "profile_repository.h" #include #include #include #include #include #include #include #include #include class QTreeWidget; class QTreeWidgetItem; class QLineEdit; class QPushButton; class QComboBox; class QPoint; class ProfilesTreeWidget; class ProfilesWindow : public QWidget { Q_OBJECT public: explicit ProfilesWindow(QWidget* parent = nullptr); ~ProfilesWindow() override; void createProfileInCurrentContext(); void createFolderInCurrentContext(); signals: void connectRequested(const Profile& profile); private: QLineEdit* m_searchBox; QComboBox* m_viewModeBox; QComboBox* m_sortBox; QComboBox* m_protocolFilterBox; QComboBox* m_tagFilterBox; ProfilesTreeWidget* m_profilesTree; QPushButton* m_newButton; QPushButton* m_editButton; QPushButton* m_deleteButton; std::unique_ptr m_repository; std::unordered_map m_profileCache; QString m_pendingTagFilterPreference; void setupUi(); void loadProfiles(); ProfileSortOrder selectedSortOrder() const; bool isFolderViewEnabled() const; QString selectedProtocolFilter() const; QString selectedTagFilter() const; void updateTagFilterOptions(const std::vector& profiles); QTreeWidgetItem* upsertFolderNode(const QStringList& folderParts, std::map& folderNodes); void addProfileNode(QTreeWidgetItem* parent, const Profile& profile); QString folderPathForItem(const QTreeWidgetItem* item) const; void showTreeContextMenu(const QPoint& pos); void createFolderInContext(const QString& baseFolderPath); void persistFolderAssignmentsFromTree(); void collectProfileAssignments(const QTreeWidgetItem* item, const QString& parentFolderPath, std::unordered_map& assignments) const; void loadUiPreferences(); void saveUiPreferences() const; std::optional selectedProfile() const; void createProfile(const QString& defaultFolderPath = QString()); void editSelectedProfile(); void deleteSelectedProfile(); void openSessionForItem(QTreeWidgetItem* item); }; #endif