Files
konsole/src/widgets/ViewContainer.h
Kai Uwe Broulik b5dc442531 Support ConEnmu progress OSC
The 9;4 sequences can be used to show and hide progress on the tab bar.
The error, indeterminate, and paused states are not implemented yet.

If a tab has a custom color, its color is used for the progress, otherwise
the standard highlight color is used.

[1] https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
2025-12-23 19:49:26 +01:00

262 lines
8.0 KiB
C++

/*
SPDX-FileCopyrightText: 2006-2008 Robert Knight <robertknight@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef VIEWCONTAINER_H
#define VIEWCONTAINER_H
// Qt
#include <QObject>
#include <QTabWidget>
// Konsole
#include "ViewManager.h"
#include "session/Session.h"
// Qt
class QPoint;
class QToolButton;
class QMenu;
namespace Konsole
{
class ViewProperties;
class ViewManager;
class TabbedViewContainer;
/**
* An interface for container widgets which can hold one or more views.
*
* The container widget typically displays a list of the views which
* it has and provides a means of switching between them.
*
* Subclasses should reimplement the addViewWidget() and removeViewWidget() functions
* to actually add or remove view widgets from the container widget, as well
* as updating any navigation aids.
*/
class KONSOLEPRIVATE_EXPORT TabbedViewContainer : public QTabWidget
{
Q_OBJECT
public:
/**
* Constructs a new view container with the specified parent.
*
* @param connectedViewManager Connect the new view to this manager
* @param parent The parent object of the container
*/
TabbedViewContainer(ViewManager *connectedViewManager, QWidget *parent);
/**
* Called when the ViewContainer is destroyed. When reimplementing this in
* subclasses, use object->deleteLater() to delete any widgets or other objects
* instead of 'delete object'.
*/
~TabbedViewContainer() override;
/** Adds a new view to the container widget */
void addView(TerminalDisplay *view);
void addSplitter(ViewSplitter *viewSplitter, int index = -1);
/** splits the currently focused Splitter */
void splitView(TerminalDisplay *view, Qt::Orientation orientation);
void setTabActivity(int index, bool activity);
/** Sets tab title to item title if the view is active */
void updateTitle(ViewProperties *item);
/** Sets tab color to item color if the view is active */
void updateColor(ViewProperties *item);
/** Sets tab icon to item icon if the view is active */
void updateIcon(ViewProperties *item);
/** Sets tab activity status if the tab is not active */
void updateActivity(ViewProperties *item);
/** Sets tab notification */
void updateNotification(ViewProperties *item, Konsole::Session::Notification notification, bool enabled);
/** Sets tab special state (copy input or read-only) */
void updateSpecialState(ViewProperties *item);
/** Sets tab progress */
void updateProgress(ViewProperties *item);
/** Changes the active view to the next view */
void activateNextView();
/** Changes the active view to the previous view */
void activatePreviousView();
/** Changes the active view to the last view */
void activateLastView();
void setCssFromFile(const QUrl &url);
ViewSplitter *activeViewSplitter();
/**
* This enum describes the directions
* in which views can be re-arranged within the container
* using the moveActiveView() method.
*/
enum MoveDirection {
/** Moves the view to the left. */
MoveViewLeft,
/** Moves the view to the right. */
MoveViewRight,
};
/**
* Moves the active view within the container and
* updates the order in which the views are shown
* in the container's navigation widget.
*
* The default implementation does nothing.
*/
void moveActiveView(MoveDirection direction);
/** Sets the menu to be shown when the new view button is clicked.
* Only valid if the QuickNewView feature is enabled.
* The default implementation does nothing. */
// TODO: Re-enable this later.
// void setNewViewMenu(QMenu *menu);
void renameTab(int index);
void searchTabs();
ViewManager *connectedViewManager();
void currentTabChanged(int index);
void closeCurrentTab();
void wheelScrolled(int delta);
void currentSessionControllerChanged(SessionController *controller);
void tabDoubleClicked(int index);
void openTabContextMenu(const QPoint &point);
void setNavigationVisibility(ViewManager::NavigationVisibility navigationVisibility);
void moveTabToWindow(int index, QWidget *window);
void toggleMaximizeCurrentTerminal();
void toggleZoomMaximizeCurrentTerminal();
/* return the widget(int index) casted to TerminalDisplay*
*
* The only thing that this class holds are TerminalDisplays, so
* this is the only thing that should be used to retrieve widgets.
*/
ViewSplitter *viewSplitterAt(int index);
ViewSplitter *findSplitter(int id);
/**
* Returns the number of split views (i.e. TerminalDisplay widgets)
* in this tab; if there are no split views, 1 is returned.
*/
int currentTabViewCount();
void connectTerminalDisplay(TerminalDisplay *display);
void disconnectTerminalDisplay(TerminalDisplay *display);
void moveTabLeft();
void moveTabRight();
/**
* This enum describes where newly created tab should be placed.
*/
enum NewTabBehavior {
/** Put newly created tab at the end. */
PutNewTabAtTheEnd = 0,
/** Put newly created tab right after current tab. */
PutNewTabAfterCurrentTab = 1,
};
void setNavigationBehavior(int behavior);
void terminalDisplayDropped(TerminalDisplay *terminalDisplay);
void moveToNewTab(TerminalDisplay *display);
QSize sizeHint() const override;
Q_SIGNALS:
/** Emitted when the container has no more children */
void empty(TabbedViewContainer *container);
/** Emitted when the user requests to open a new view */
void newViewRequest();
/** Requests creation of a new view, with the selected profile. */
void newViewWithProfileRequest(const QExplicitlySharedDataPointer<Profile> &profile);
/** a terminalDisplay was dropped in a child Splitter */
/**
* Emitted when the user requests to move a view from another container
* into this container. If 'success' is set to true by a connected slot
* then the original view will be removed.
*
* @param index Index at which to insert the new view in the container
* or -1 to append it. This index should be passed to addView() when
* the new view has been created.
* @param sessionControllerId The identifier of the view.
*/
void moveViewRequest(int index, int sessionControllerId);
/** Emitted when the active view changes */
void activeViewChanged(TerminalDisplay *view);
/** Emitted when a view is added to the container. */
void viewAdded(TerminalDisplay *view);
/** Emitted when a view is removed from container. */
void viewRemoved();
/** detach the specific tab */
void detachTab(int tabIdx);
/** set the color tab */
void setColor(int index, const QColor &color);
/** remove the color tab */
void removeColor(int idx);
/** set the tab progress */
void setProgress(int idx, const std::optional<int> &progress);
protected:
// close tabs and unregister
void closeTerminalTab(int idx);
void keyReleaseEvent(QKeyEvent *event) override;
private Q_SLOTS:
void viewDestroyed(QObject *view);
void konsoleConfigChanged();
void activateView(const QString &xdgActivationToken);
private:
void forgetView();
struct TabIconState {
TabIconState()
: readOnly(false)
, broadcast(false)
, notification(Session::NoNotification)
{
}
bool readOnly;
bool broadcast;
Session::Notification notification;
bool isAnyStateActive() const
{
return readOnly || broadcast || (notification != Session::NoNotification);
}
};
bool _stylesheetSet = false;
QHash<const QWidget *, TabIconState> _tabIconState;
ViewManager *_connectedViewManager;
QMenu *_contextPopupMenu;
QToolButton *_newTabButton;
QToolButton *_searchTabsButton;
QToolButton *_closeTabButton;
int _contextMenuTabIndex;
NewTabBehavior _newTabBehavior;
};
}
#endif // VIEWCONTAINER_H