6 #ifndef SWIFT_GUI_VIEWBASE_H
7 #define SWIFT_GUI_VIEWBASE_H
11 #include <QAbstractItemView>
13 #include <QHeaderView>
14 #include <QJsonDocument>
15 #include <QJsonObject>
17 #include <QModelIndexList>
25 #include "gui/menus/menuaction.h"
38 class QDragEnterEvent;
39 class QDragLeaveEvent;
42 class QItemSelectionModel;
78 class CTextEditDialog;
91 Q_PROPERTY(
bool isShowingLoadIndicator READ isShowingLoadIndicator NOTIFY loadIndicatorVisibilityChanged)
121 MenuRemoveSelectedRows = 1 << 1,
122 MenuRefresh = 1 << 2,
123 MenuBackend = 1 << 3,
124 MenuDisplayAutomatically = 1 << 4,
125 MenuDisplayAutomaticallyAndRefresh = MenuDisplayAutomatically | MenuRefresh,
127 MenuMaterializeFilter = 1 << 6,
130 MenuToggleSelectionMode = 1 << 9,
131 MenuOrderable = 1 << 10,
136 MenuLoadAndSave = MenuLoad | MenuSave,
137 MenuDefault = MenuToggleSelectionMode | MenuDisplayAutomaticallyAndRefresh | MenuFont | MenuClear,
138 MenuDefaultNoClear = MenuToggleSelectionMode | MenuDisplayAutomaticallyAndRefresh | MenuFont,
139 MenuDefaultDbViews = MenuToggleSelectionMode | MenuBackend | MenuFont,
142 MenuHighlightStashed = 1 << 15,
143 MenuCanStashModels = 1 << 16,
144 MenuDisableModelsTemp = 1 << 17,
145 MenuStashing = MenuHighlightStashed | MenuCanStashModels,
147 Q_DECLARE_FLAGS(Menu, MenuFlag)
150 static constexpr
int ASyncRowsCountThreshold = 50;
153 static constexpr
int ResizeSubsetThreshold = 250;
157 static constexpr
int ResizeRowsToContentThreshold = 20;
160 virtual
void clear() = 0;
163 virtual
bool isEmpty() const = 0;
166 virtual
int rowCount() const = 0;
169 virtual
bool isOrderable() const = 0;
172 virtual
bool setSorting(const swift::misc::CPropertyIndex &propertyIndex,
173 Qt::SortOrder order = Qt::AscendingOrder) = 0;
176 virtual
void sortByPropertyIndex(const swift::misc::CPropertyIndex &propertyIndex,
177 Qt::SortOrder order = Qt::AscendingOrder) = 0;
180 virtual
void setNoSorting() = 0;
183 virtual swift::misc::CPropertyIndex getSortProperty() const = 0;
186 virtual
int getSortColumn() const = 0;
189 virtual
bool hasValidSortColumn() const = 0;
192 virtual
bool endsWithEmptyColumn() const = 0;
195 virtual Qt::SortOrder getSortOrder() const = 0;
198 virtual
void allowDragDrop(
bool allowDrag,
bool allowDrop,
bool allowDropJsonFile = false) = 0;
201 virtual
bool isDropAllowed() const = 0;
204 virtual
bool acceptDrop(const QMimeData *mimeData) const = 0;
207 virtual
bool setParentDockWidgetInfoArea(swift::gui::
CDockWidgetInfoArea *parentDockableWidget) override;
227 Q_ASSERT(this->horizontalHeader());
228 return this->horizontalHeader()->font();
232 int getHorizontalHeaderFontHeight()
const;
235 bool hasSelection()
const;
238 QModelIndexList selectedRows()
const;
241 virtual QModelIndexList unselectedRows()
const;
244 int selectRows(
const QSet<int> &rows);
247 int selectedRowCount()
const;
250 int unselectedRowCount()
const;
253 bool hasSingleSelectedRow()
const;
256 bool hasMultipleSelectedRows()
const;
259 bool allowsMultipleSelectedRows()
const;
262 bool isCurrentlyAllowingMultipleRowSelections()
const;
277 void enableLoadIndicator(
bool enable);
280 bool isShowingLoadIndicator()
const;
292 void menuRemoveItems(Menu menusToRemove);
295 void menuAddItems(Menu menusToAdd);
298 void setMenu(Menu menuItems) { m_menus = menuItems; }
304 virtual void setSelectionModel(QItemSelectionModel *model)
override;
307 QWidget *mainApplicationWindowWidget()
const;
330 void setHorizontalHeaderSectionResizeMode(QHeaderView::ResizeMode mode);
335 m_dirSettingsIndex = directoryIndex;
380 virtual void resizeToContents();
383 virtual void fullResizeToContents();
389 void rowsResizeModeToInteractive();
393 void rowsResizeModeToContent();
396 void rowsResizeModeBasedOnThreshold(
int elements);
402 int showLoadIndicator(
int containerSizeDependent = -1,
403 std::chrono::milliseconds timeout = std::chrono::milliseconds { 0 },
404 bool processEvents =
true);
407 int showLoadIndicatorWithTimeout(std::chrono::milliseconds timeout = std::chrono::milliseconds { 0 },
408 bool processEvents =
true);
411 void onModelChanged();
414 void hideLoadIndicator(
int loadingId = -1);
443 virtual void resizeEvent(QResizeEvent *event)
override;
446 virtual void dragEnterEvent(QDragEnterEvent *event)
override;
449 virtual void dragMoveEvent(QDragMoveEvent *event)
override;
452 virtual void dragLeaveEvent(QDragLeaveEvent *event)
override;
455 virtual void dropEvent(QDropEvent *event)
override;
472 virtual bool isResizeConditionMet(
int containerSize = -1)
const;
475 int getPresizeRandomElementsSize(
int containerSize = -1)
const;
478 void centerLoadIndicator();
484 QString getFileDialogFileName(
bool load)
const;
499 void saveJsonAction();
502 void saveSelectedJsonAction();
511 void loadJsonAction();
517 void displayFilterDialog();
520 void settingsChanged();
523 void selectAll()
override;
527 void setMultiSelection();
528 void setExtendedSelection();
529 void setSingleSelection();
534 virtual void rememberLastJsonDirectory(
const QString &selectedFileOrDir);
538 virtual QString getRememberedLastJsonDirectory()
const;
563 void triggerReload();
566 void triggerReloadFromBackend();
572 void showVerticalHeader();
585 SelectionMode m_originalSelectionMode = this->selectionMode();
586 int m_resizeCount = 0;
587 int m_skipResizeThreshold = 40;
588 int m_resizeAutoNthTime = 1;
589 std::chrono::milliseconds m_loadIndicatorTimeoutDefault { 30 * 1000 };
590 bool m_forceStretchLastColumnWhenResized =
592 bool m_showingLoadIndicator =
false;
593 bool m_enabledLoadIndicator =
false;
594 bool m_acceptClickSelection =
false;
595 bool m_acceptRowSelection =
false;
596 bool m_acceptDoubleClickSelection =
false;
597 bool m_displayAutomatically =
true;
598 bool m_enableDeleteSelectedRows =
false;
599 bool m_dropIndicator =
false;
600 bool m_forceColumnsToMaxSize =
true;
601 bool m_allowCacheFileJson =
true;
602 QWidget *m_filterWidget =
nullptr;
603 Menu m_menus = MenuDefault;
611 IndexDirLastViewJsonOrDefault;
622 void removeSelectedRowsChecked();
625 void toggleAutoDisplay();
628 void customMenuRequested(
const QPoint &pos);
631 void onLoadIndicatorTimedOut();
634 void toggleResizeMode(
bool checked);
637 void toggleWordWrap(
bool checked);
641 void setFilterWidgetImpl(QWidget *filterWidget);
643 Q_DECLARE_OPERATORS_FOR_FLAGS(swift::gui::views::CViewBaseNonTemplate::Menu)
741 template <
class K0,
class V0,
class... KeysValues>
742 int removeIf(K0 k0, V0 v0, KeysValues... keysValues)
744 if (this->
rowCount() < 1) {
return 0; }
746 int r = cp.removeIf(k0, v0, keysValues...);
747 if (r < 1) {
return 0; }
753 template <
class K1,
class V1>
757 cp.replaceOrAdd(key1, value1, replacement);
781 virtual void clear()
override;
784 virtual int rowCount()
const override;
787 virtual bool isEmpty()
const override;
793 virtual void allowDragDrop(
bool allowDrag,
bool allowDrop,
bool allowDropJsonFile =
false)
override;
799 virtual void dropEvent(QDropEvent *event)
override;
802 virtual bool acceptDrop(
const QMimeData *mimeData)
const override;
806 Qt::SortOrder order = Qt::AscendingOrder)
override;
810 Qt::SortOrder order = Qt::AscendingOrder)
override;
841 QJsonObject
toJson(
bool selectedOnly =
false)
const;
844 QString
toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented,
845 bool selectedOnly =
false)
const;
866 m_model->setDropActions(dropActions);
904 virtual void mouseOverCallback(
const QModelIndex &index,
bool mouseOver)
override;
910 virtual void copy()
override;
913 virtual void cut()
override;
916 virtual void paste()
override;
957 virtual void onClicked(
const QModelIndex &index)
override;
963 virtual void onRowSelected(
const QModelIndex &index)
override;
970 const QString &directory = {})
override;
The QProgressIndicator class lets an application display a progress indicator to show that a lengthy ...
Using this class provides a QTableView with the overlay functionality already integrated.
Allow to get and select objects.
void sort()
Sort if columns or order changed.
virtual ContainerType unselectedObjects() const
Unselected objects.
virtual bool filterDialogFinished(int status)
Filter dialog finished.
int rowOf(const ObjectType &obj) const
The row of the given object.
virtual void cut()
Clipboard cut/copy/paste.
virtual int performUpdateContainer(const swift::misc::CVariant &variant, bool sort, bool resize)
Helper method with template free signature.
void standardInit(ModelClass *model=nullptr)
Standard initialization.
virtual swift::misc::CStatusMessage loadJsonFile(const QString &fileName)
Method creating the menu.
void initAsOrderable()
Init so items can be ordered, includes enabling drag and drop.
virtual bool acceptDrop(const QMimeData *mimeData) const
Accept drop data?
QList< int > rowsOf(const ContainerType &container) const
The rows of the given objects.
virtual void removeFilter()
Remove filter.
virtual void onRowSelected(const QModelIndex &index)
Row selected.
void setTabWidgetViewText(QTabWidget *tw, int index)
Set a tab widget text based on row count, filter etc.
virtual swift::misc::CStatusMessage loadJson(const QString &directory={})
Load JSON.
virtual void allowDragDrop(bool allowDrag, bool allowDrop, bool allowDropJsonFile=false)
Allow to drag and/or drop value objects.
virtual void clearHighlighting()
Clear any highlighted objects.
virtual bool isEmpty() const
Empty?
void updateContainerMaybeAsync(const ContainerType &container, bool sort=true, bool resize=true)
Based on size call sync / async update.
void insert(const ObjectType &value, bool resize=true)
Insert.
virtual ContainerType selectedObjects() const
Selected objects.
virtual void displayJsonPopup()
Display JSON data.
virtual swift::misc::CStatusMessage saveJson(bool selectedOnly=false, const QString &directory={})
Save JSON.
ModelClass * derivedModel()
Model.
ModelClass * m_model
corresponding model
void setSortIndicator()
Set the search indicator based on model.
virtual int rowCount() const
Elements in container.
const ObjectType & at(const QModelIndex &index) const
Value object at.
void setDropActions(Qt::DropActions dropActions)
Drop actions.
virtual void clear()
Clear data.
virtual bool hasValidSortColumn() const
Has valid sort column?
typename T::ObjectType ObjectType
Model container element type.
virtual void sortByPropertyIndex(const swift::misc::CPropertyIndex &propertyIndex, Qt::SortOrder order=Qt::AscendingOrder)
Sort by index.
void takeFilterOwnership(std::unique_ptr< models::IModelFilter< ContainerType >> &filter)
Set filter and take ownership, any previously set filter will be destroyed.
virtual bool filterWidgetChangedFilter(bool enabled)
Filter changed in filter widget.
virtual void setObjectName(const QString &name)
Set own name and the model's name.
void push_back(const ObjectType &value, bool resize=true)
Push back.
int columnCount() const
Column count.
virtual swift::misc::CStatusMessage validateLoadedJsonData(const ContainerType &data) const
Verify JSON data loaded in swift::gui::views::CViewBaseNonTemplate::loadJson.
virtual ~CViewBase()
Destructor.
virtual bool reachedResizeThreshold(int containrerSize=-1) const
Skip resizing because of size?
QString toJsonString(QJsonDocument::JsonFormat format=QJsonDocument::Indented, bool selectedOnly=false) const
Convert to JSON string.
virtual swift::misc::CStatusMessage modifyLoadedJsonData(ContainerType &data) const
Modify JSON data loaded in swift::gui::views::CViewBaseNonTemplate::loadJson.
virtual void selectObjects(const ContainerType &selectedObjects)
Select.
const models::CColumns & getColumns() const
The columns.
virtual void onDoubleClicked(const QModelIndex &index)
Index double clicked.
void setPercentageColumnWidths()
Set the widths based on the column percentages.
CViewBase(QWidget *parent, ModelClass *model=nullptr)
Constructor.
virtual void displayContainerAsJsonPopup(bool selectedOnly)
Display the container as JSON popup.
virtual void performModeBasedResizeToContent()
Perform resizing (no presizing) / non slot method for template.
bool hasFilter() const
Has filter set?
virtual int removeSelectedRows()
Remove selected rows.
virtual bool isDropAllowed() const
Drop allowed?
swift::misc::CWorker * updateContainerAsync(const ContainerType &container, bool sort=true, bool resize=true)
Update whole container in background.
void resort()
Resort ("forced sorting")
virtual void onClicked(const QModelIndex &index)
Remove filter.
virtual void setNoSorting()
Disable sorting.
virtual void jsonLoadedAndModelUpdated(const ContainerType &data)
In swift::gui::views::CViewBaseNonTemplate::loadJson the view has been updated because of loaded JSON...
virtual swift::misc::CPropertyIndex getSortProperty() const
Sorted by property.
ObjectType selectedObject() const
Selected object (or default)
const ContainerType & container() const
Access to container.
int removeIf(K0 k0, V0 v0, KeysValues... keysValues)
Remove elements matching some particular key/value pair(s).
virtual bool endsWithEmptyColumn() const
Using void column at the end?
typename T::ContainerType ContainerType
Model container type.
virtual void displaySelectedJsonPopup()
Display JSON data.
QJsonObject toJson(bool selectedOnly=false) const
Convert to JSON.
void replaceOrAdd(K1 key1, V1 value1, const ObjectType &replacement)
Replace elements matching the given element. If there is no match, push the new element on the end.
virtual void materializeFilter()
Materialize filter.
virtual void presizeOrFullResizeToContents()
Depending on CViewBaseNonTemplate::ResizeSubsetThreshold presize or fully resize.
const ContainerType & containerOrFilteredContainer(bool *filtered=nullptr) const
Full container or cached filtered container as approproiate.
virtual int getSortColumn() const
Get sort column property index.
virtual bool setSorting(const swift::misc::CPropertyIndex &propertyIndex, Qt::SortOrder order=Qt::AscendingOrder)
Sorting.
virtual void mouseOverCallback(const QModelIndex &index, bool mouseOver)
From delegate indicating we are in mouse over state.
virtual void drawDropIndicator(bool indicator)
Draw drop indicator.
virtual void copy()
Clipboard cut/copy/paste.
const ModelClass * derivedModel() const
Model.
int updateSelected(const swift::misc::CVariant &variant, const swift::misc::CPropertyIndex &index)
Update selected objects.
virtual void updateSortIndicator()
Set the sort indicator to the current sort column.
void addContainerTypesAsDropTypes(bool objectType=true, bool containerType=true)
Add the object and container type as accepted drop types CDropBase::addAcceptedMetaTypeId.
virtual void customMenu(menus::CMenuActions &menuActions)
Method creating the menu.
virtual Qt::SortOrder getSortOrder() const
Get sort order.
virtual void dropEvent(QDropEvent *event)
ObjectType firstSelectedOrDefaultObject() const
First selected, the only one, or default.
int updateContainer(const ContainerType &container, bool sort=true, bool resize=true)
Update whole container.
virtual bool isOrderable() const
Is the corresponding model orderable, swift::misc::models::CListModelBaseNonTemplate::isOrderable.
virtual void paste()
Clipboard cut/copy/paste.
Delegate for our view items.
Non templated base class, allows Q_OBJECT and signals / slots to be used.
virtual bool filterWidgetChangedFilter(bool enabled)=0
Filter changed in filter widget.
virtual void drawDropIndicator(bool indicator)=0
Draw drop indicator.
void setAllowCacheFileFormatJson(bool allow)
Enable/disable cache file format to be loaded as JSON.
virtual bool reachedResizeThreshold(int containerSize=-1) const =0
Skip resizing because of size?
void hideLoadIndicatorForced()
Parameterless version of hideLoadIndicator.
ResizeMode
Resize mode, when to resize rows / columns.
@ PresizeSubset
use a subset of the data to resize
@ ResizingAlways
always resize
@ ResizingOnce
only one time
virtual int removeSelectedRows()=0
Remove selected rows.
virtual void mouseOverCallback(const QModelIndex &index, bool mouseOver)=0
From delegate indicating we are in mouse over state.
void acceptDoubleClickSelection(bool accept)
Accept double click selection.
void requestNewBackendData()
Load data from backend (where it makes sense)
virtual int performUpdateContainer(const swift::misc::CVariant &variant, bool sort, bool resize)=0
Helper method with template free signature.
virtual void removeFilter()=0
Remove filter.
virtual void onDoubleClicked(const QModelIndex &index)=0
Index double clicked.
virtual void displaySelectedJsonPopup()=0
Display JSON data.
virtual void clearHighlighting()=0
Clear any highlighted objects.
virtual void onClicked(const QModelIndex &index)=0
Index clicked.
bool allowCacheFileFormatJson() const
Allow cache file JSON to be loaded.
QWidget * getFilterWidget() const
Filter widget if any.
RowsResizeMode
How rows are resized, makes sense when.
void loadIndicatorVisibilityChanged(bool visible)
Load indicator's visibility has been changed.
void setSaveFileName(const QString &saveName)
Save file name (optional)
void modelChanged()
Model bas been changed (means data in view have been changed)
void setSettingsDirectoryIndex(swift::misc::CDirectories::ColumnIndex directoryIndex)
Index of the directory we "remember".
virtual swift::misc::CStatusMessage loadJson(const QString &directory={})=0
Load JSON.
void requestUpdate()
Ask for new data from currently loaded data.
void setResizeMode(ResizeMode mode)
Set resize mode.
virtual swift::misc::CStatusMessage loadJsonFile(const QString &filePath)=0
Load JSON file.
void setDisplayAutomatically(bool automatically)
Display automatically (when models are loaded)
void objectChanged(const swift::misc::CVariant &object, const swift::misc::CPropertyIndex &changedIndex)
Single object was changed in model.
virtual void displayJsonPopup()=0
Display JSON data.
virtual void performModeBasedResizeToContent()=0
Perform resizing (no presizing) / non slot method for template.
virtual void materializeFilter()=0
Materialize filter.
void jsonLoadCompleted(const swift::misc::CStatusMessage &msg)
JSON data load from disk completed, the swift::misc::CStatusMessage represents the success.
QMap< MenuFlag, menus::CMenuActions > m_menuFlagActions
initialized actions for menu flag (enum)
virtual void onRowSelected(const QModelIndex &index)=0
Row selected.
virtual bool filterDialogFinished(int status)=0
Filter dialog finished.
QString m_saveFileName
save file name (JSON)
void objectSelected(const swift::misc::CVariant &object)
Object has been selected.
void modelDataChangedDigest(int count, bool withFilter)
Model data changed,.
virtual void presizeOrFullResizeToContents()=0
Depending on CViewBaseNonTemplate::ResizeSubsetThreshold presize or fully resize.
virtual void updateSortIndicator()=0
Set the sort indicator to the current sort column.
void setAutoResizeFrequency(int updateEveryNthTime)
In.
virtual swift::misc::CStatusMessage saveJson(bool selectedOnly=false, const QString &directory={})=0
Save JSON.
void setMenu(Menu menuItems)
Set menu items.
void asyncUpdateFinished()
Asynchronous update finished.
void setForceColumnsToMaxSize(bool force)
Force that columns are extended to full viewport width. Workaround as of https://stackoverflow....
void settingsChanged()
Settings have been changed.
void modelDataChanged(int count, bool withFilter)
Model data changed.
virtual void paste()=0
Clipboard cut/copy/paste.
virtual void copy()=0
Clipboard cut/copy/paste.
void objectsDeleted(const swift::misc::CVariant &objectContainer)
Objects deleted from model.
void acceptClickSelection(bool accept)
Accept click selection.
void acceptRowSelection(bool accept)
Accept row selection.
Menu getMenu() const
Menus.
void objectDoubleClicked(const swift::misc::CVariant &object)
Object has been double clicked.
bool displayAutomatically() const
Display automatically (when models are loaded)
const QFont & getHorizontalHeaderFont() const
Header (horizontal) font.
virtual void cut()=0
Clipboard cut/copy/paste.
void objectClicked(const swift::misc::CVariant &object)
Object has been clicked.
Proxy for style of our views.
ColumnIndex
Properties by index.
Specialized value object compliant map for variants, based on indexes.
Class template for accessing a specific value in the CSettingsCache.
Streamable status message, e.g.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Class for doing some arbitrary parcel of work in its own thread.
Free functions in swift::misc.
#define SWIFT_GUI_EXPORT
Export a class or function from the library.