#pragma once #include "lts_base.h" #include "lts_widgets_export.h" #include "lts_notification_box.h" #include "qevent.h" #include #include #include #include class QButtonGroup; class QPropertyAnimation; class QPushButton; class QTimer; class QToolButton; namespace Ui { class LtsBaseLayoutWidget; } namespace IDL { enum class PartitionType; } namespace LtsUtils { class Promise; } namespace LtsWidgets { class LtsDragIcon; class LtsProgressDialogHelper; class LtsTabWidget; class LtsToolBarArea; class LtsToolBox; struct ExerciseData { QString exName; QString exDescription; int phId = -1; QString phName; QString phDescription; QString exStateString; ExcState exState = ExerciseState::eUnknown; QColor exStateCol; QString partitionType; bool operator==(const ExerciseData &o) const { return exName == o.exName && exDescription == o.exDescription && phId == o.phId && phName == o.phName && phDescription == o.phDescription && exStateString == o.exStateString && exState == o.exState && exStateCol == o.exStateCol && partitionType == o.partitionType; } bool operator!=(const ExerciseData &o) const { return !operator ==(o); } }; class LTSWIDGETS_EXPORT LtsBaseLayoutWidget : public QWidget { Q_OBJECT public: explicit LtsBaseLayoutWidget(QWidget *parent = nullptr, bool splitMenu = true); ~LtsBaseLayoutWidget(); void hideVisibleLayouts(); void resetLayoutVisibility(); void setMenuVisible(bool visible); bool isMenuVisible() const; bool isTopBarVisible() const; void setTopBarVisible(bool visible); bool isMenuCollapsed() const; void collapseMenu(bool collapse = true); void setSessionInfo(const int domainId, const IDL::PartitionType &partitionType, const int partitionId, const QString &workspaceId); LtsDragIcon *addMenuAction(const PluginData &plData, bool isFirstRun = false); bool removeMenuAction(const PluginData &plData); bool removeMenuAction(LtsDragIcon *icon); bool removeMenuAction(const QString &byIdentifier); void clearMenuActions(); void setAppName(const QString &appName); bool isDialogFocused(const LtsDialog *dialog) const; void setCustomText(const QString &text); const QString customText() const; LtsTabWidget *getTabFromLayoutArea(LayoutArea area) const; LtsDialog *getWidget(const QString &menuGroup, const QString &identifier, LayoutArea area = LayoutArea::eUnknown); QWidget *getMenu() const; LtsToolBarArea *getToolbar() const; void setOperatorName(const QString &operatorName, bool showTerminalButton); void setProfilePicture(const QPixmap &profilePicture); void setExerciseData(const ExerciseData &data); void initilizationFinished(); void addNotification(QToolButton *noti); bool isWidgetsHidden() const; bool notificationExists(const QString &identifier) const; const QMap &mapButtons() const { return m_mapButtons; } void setToolBarActions(const QStringList &actions); QStringList toolBarActions() const; void setFunctionKeys(const QMap &actions); QMap functionKeys() const; void setWorkspaceId(const QString &workspaceId) { m_workspaceId = workspaceId; } void showMessage(const QString &title, const QString &text, LtsNotificationBox::MessageType type = LtsNotificationBox::MessageType::Info, const std::function &clickedLinkCallback = nullptr, bool closeOnLinkClicked = true, const QString &identifier = {}); bool messageIdentifierExists(const QString &identifier) const; void executeAction(const QString &actionIdentifier); bool isSecondaryWidget() const { return m_isSecondaryWidget; } void setSecondaryWidget() { m_isSecondaryWidget = true; } void removeQueuedMessage(const QString &messageIdentifier); public slots: bool slotClose(); void slotLogout(); void slotScreenCountChanged(int count); void onMenuEntryClicked(); void onHideAnimated(); void onReShowAnimated(); bool addWidget(LtsWidgets::LtsDialog *dialog, const QString &menuGroup, const QString &identifier, LtsWidgets::LayoutArea area = LayoutArea::eUnknown, bool setClosable = true, bool focusNewTab = true); bool addOrReplaceWidget(LtsDialog *dialog, const QString &menuGroup, const QString &identifier, LayoutArea area = LayoutArea::eUnknown, bool setClosable = true, bool focusNewTab = true ); bool focusTab(const QString &menuGroup, const QString &identifier, LtsWidgets::LayoutArea area); void executeCreateInstantFunctions(const LtsWidgets::PluginData &plData); void setExerciseTime(qint64 mSecsSinceEpoch); bool haveUnsavedChanges(); bool notifyUnsavedChanges(); void setIrreplaceableOnce() { m_irreplaceableOnce = true; } bool irreplaceableReset() { bool r = m_irreplaceableOnce; m_irreplaceableOnce = false; return r; } bool isIrreplaceable() const { return m_irreplaceableOnce; } void showWidgets(); void hideWidgets(); private slots: void slotOperatorMenuClicked(); void setCurrentTime(); signals: void signalClose(); void signalLogout(); void signalShowOperatorSettings(); void signalRetranslateActions(); void signalSwap(); void signalStapleTopicLockHandler(LtsWidgets::LtsDialog *widget); void signalSuccessfullyPlaced(); void signalNotifyUnsavedChanges(bool &reject); protected: void closeEvent(QCloseEvent *event) override; void showEvent(QShowEvent *event) override; void changeEvent(QEvent *e) override; private: void addDebugMenu(); void retranslate(); void addTouchScroll(QWidget *widget); LtsDragIcon *createButton(const PluginData &plData); int getIndexOfTab(LtsTabWidget *tab); LtsToolBox *getToolBox(const ExercisePart &exercisePart) const; QPushButton *getExercisePartButton(const ExercisePart &exercisePart) const; void checkExercisePartButtonVisibility(); void checkMenuGroup(const QString &menuGroup, const ExercisePart &exercisePart); bool isDialogFocused(const LtsDialog *dialog, const LayoutArea &layoutArea) const; bool isDialogFocused(const LtsDialog *dialog, const LtsTabWidget *tab) const; void applyExerciseStateRestricition(); void executePluginData(const PluginData &plData); void showNextQueuedMessage(); struct Message { public: QString title; QString text; LtsNotificationBox::MessageType type; std::function clickedLinkCallback; bool closeOnLinkClicked; QString identifier; }; ExerciseData m_exerciseData; QMap m_mapButtons; QList m_mainSplitterSizes; QList m_menuSplitterSizes; bool m_isHidden; QPropertyAnimation *m_currentAnimation{nullptr}; Ui::LtsBaseLayoutWidget *m_ui{nullptr}; IDL::PartitionType m_partitionType; int m_domainId; int m_partitionId; QString m_operatorName; bool m_firstShow; bool m_showTerminalButton; qint64 m_exerciseTime; QTimer *m_setCurrentTimeTimer{nullptr}; bool m_irreplaceableOnce; QButtonGroup *m_bg{nullptr}; QString m_workspaceId; int m_screenCount; bool m_menuCollapsed; QMap, bool> m_oldLayoutVisibilityStates; LtsNotificationBox *m_notiBox{nullptr}; QStringList m_notFoundYet; bool m_isSecondaryWidget { false }; QVector m_currentMessage; QVector m_messageQueue; }; }