Files
2026-08-16 18:24:52 +07:00

129 lines
3.9 KiB
C++

// This file is part of VSTGUI. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
#pragma once
#include "vstguifwd.h"
#include "cscrollview.h"
#include "cfont.h"
#include "ccolor.h"
#include "cstring.h"
#include <vector>
namespace VSTGUI {
// forward private internal views
class CDataBrowserView;
class CDataBrowserHeader;
//-----------------------------------------------------------------------------
// CDataBrowser Declaration
//! @brief DataBrowser view
/// @ingroup controls
//-----------------------------------------------------------------------------------------------
class CDataBrowser : public CScrollView
{
protected:
enum
{
kDrawRowLinesFlag = kLastScrollViewStyleFlag,
kDrawColumnLinesFlag,
kDrawHeaderFlag,
kMultiSelectionStyleFlag
};
public:
CDataBrowser (const CRect& size, IDataBrowserDelegate* db, int32_t style = 0, CCoord scrollbarWidth = 16, CBitmap* pBackground = nullptr);
enum CDataBrowserStyle
{
// see CScrollView for more styles
kDrawRowLines = 1 << kDrawRowLinesFlag,
kDrawColumnLines = 1 << kDrawColumnLinesFlag,
kDrawHeader = 1 << kDrawHeaderFlag,
kMultiSelectionStyle = 1 << kMultiSelectionStyleFlag
};
enum
{
kNoSelection = -1
};
/// @brief CDataBrowser Cell position description
struct Cell {
int32_t row {-1};
int32_t column {-1};
Cell () = default;
Cell (int32_t row, int32_t column) : row (row), column (column) {}
bool isValid () const { return row > -1 && column > -1; }
};
using Selection = std::vector<int32_t>;
//-----------------------------------------------------------------------------
/// @name CDataBrowser Methods
//-----------------------------------------------------------------------------
//@{
/** trigger recalculation, call if numRows or numColumns changed */
virtual void recalculateLayout (bool rememberSelection = false);
/** invalidates an individual cell */
virtual void invalidate (const Cell& cell);
/** invalidates a complete row */
virtual void invalidateRow (int32_t row);
/** scrolls the scrollview so that row is visible */
virtual void makeRowVisible (int32_t row);
/** get bounds of a cell */
virtual CRect getCellBounds (const Cell& cell);
/** get the cell at position where */
virtual Cell getCellAt (const CPoint& where) const;
/** get first selected row */
virtual int32_t getSelectedRow () const;
/** set the exclusive selected row */
virtual void setSelectedRow (int32_t row, bool makeVisible = false);
/** get all selected rows */
const Selection& getSelection () const { return selection; }
/** add row to selection */
virtual void selectRow (int32_t row);
/** remove row from selection */
virtual void unselectRow (int32_t row);
/** empty selection */
virtual void unselectAll ();
/** starts a text edit for a cell */
virtual void beginTextEdit (const Cell& cell, UTF8StringPtr initialText);
/** get delegate object */
IDataBrowserDelegate* getDelegate () const { return db; }
//@}
void setAutosizeFlags (int32_t flags) override;
void setViewSize (const CRect& size, bool invalid) override;
void setWantsFocus (bool state) override;
void onKeyboardEvent (KeyboardEvent& event) override;
CMouseEventResult onMouseDown (CPoint& where, const CButtonState& buttons) override;
protected:
~CDataBrowser () noexcept override;
void valueChanged (CControl *pControl) override;
CMessageResult notify (CBaseObject* sender, IdStringPtr message) override;
bool attached (CView *parent) override;
bool removed (CView* parent) override;
bool wantsFocus () const override;
void validateSelection ();
IDataBrowserDelegate* db;
CDataBrowserView* dbView;
CDataBrowserHeader* dbHeader;
CViewContainer* dbHeaderContainer;
Selection selection;
};
//-----------------------------------------------------------------------------
} // VSTGUI