æ¢åã®å®è£ ã«æºè¶³ã§ããªãçç±ã¯çç¥ããŸãïŒããã¯å¥ã®ã¡ã¢ã®ãããã¯ã§ãïŒã
ç§ãã¡ã®ãããžã§ã¯ãã¯ãšã³ãžãã¢ãªã³ã°ãšç§åŠã§ãããè±å¯ãªã°ã©ãã£ãã¯ã¹ãããããªã¹ããšããŒãã«ã¯ã©ãã§ã䜿çšãããŠããŸãã ãããã£ãŠãæ°ããã°ãªããã¯ã倧éã®æ å ±ã衚瀺ãããšãã«ãæè»ãªã«ã¹ã¿ãã€ãºãåªããããã©ãŒãã³ã¹ãããã³æå°éã®ã¡ã¢ãªæ¶è²»ãæäŸããããšã«ãªã£ãŠããŸãã éçºã®éãç§ã¯æ¬¡ã®ã«ãŒã«ãéµå®ããããšããŸãããæ©èœãå¯èœãªéãäžè¬åããã³æœè±¡åããŠå®è£ ããŸããããŠãŒã¶ããªãã£ãšäœæ¥ã®æé©æ§ãæãªããã®ã§ã¯ãããŸããã ãã¡ããããã®ã«ãŒã«ã¯ççŸããŠããŸãããã©ããã£ãŠãã©ã³ã¹ãç¶æãããã¯ããªã次第ã§ãã
äœããå§ããããã«ãã°ãªããã³ã³ãããŒã«ãå®çŸ©ããŠã¿ãŸãããã äžè¬æ§ãç¶æããããã«ãã°ãªããã¯ã¹ããŒã¹ãè¡ãšåã«åå²ããèŠèŠèŠçŽ ã§ãããšèšããŸãã ãã®çµæãã»ã«ã®ã°ãªããïŒè¡ãšåã®äº€ç¹ïŒãçæããããã®äžã«æ å ±ã衚瀺ãããŸãã ãããã£ãŠãã°ãªããã§ã¯ãæ§é ãšããŒã¿ãšãã2ã€ã®ã³ã³ããŒãã³ããåºå¥ã§ããŸãã ã°ãªããæ§é ã¯ãã¹ããŒã¹ãè¡ãšåã«åå²ããæ¹æ³ã決å®ããããŒã¿ã¯å®éãçµæã®ã»ã«ã«è¡šç€ºããå 容ãèšè¿°ããŸãã
äžèšã§æ±ºå®ããããã«ãã°ãªããæ§é ïŒããããžãšèšãããšãã§ããŸãïŒã¯è¡ãšåã§èšè¿°ãããŸãã è¡ãšåã¯éåžžã«ãã䌌ããªããžã§ã¯ãã§ãã åºå¥ã§ããªããšèšãããšãã§ããŸããå¹³é¢ãæ°Žå¹³ã«ç Žå£ãããã®ãšåçŽã«ç Žå£ãããã®ããããŸãã ãããã圌ãã¯ãããåãæ¹æ³ã§è¡ããŸãã ããã§ã¯ãC ++ã¯ã©ã¹ã§ã¹ã¿ã€ã«èšå®ã§ãããããªãå°ãããèªçµŠèªè¶³ã®ãšã³ãã£ãã£ã«ãã§ã«ã¢ãããŒãããŠããŸãã ãã®ã¯ã©ã¹ãLinesãšåŒã³ãŸããïŒãã·ã¢èªã§ã¯LinesãŸãã¯StripesãšããŠå®çŸ©ã§ããŸãïŒã ãã®ã¯ã©ã¹ã¯ãäžé£ã®è¡ïŒè¡ãŸãã¯åïŒãå®çŸ©ããŸãã æ·±ã調ã¹ãŠå¥ã®è¡ã®ã¯ã©ã¹ãå®çŸ©ããå¿ èŠã¯ãããŸããã ã¯ã©ã¹ã¯å°ãããæ©èœããŸããã ãããã£ãŠãLinesã¯è¡ãŸãã¯åã®ã»ããã®ããããã£ãšããããã«å¯ŸããŠå®è¡ã§ããæäœã決å®ããŸãã
- Countã®äž»ãªããããã£ã¯ãLineãæ§æããè¡ã®æ°ã§ãã
- åè¡ã®ãµã€ãºïŒè¡ã®é«ããããã³å-å¹ ïŒãå€æŽã§ããŸã
- è¡ã䞊ã¹æ¿ããããšãã§ããŸãïŒè¡ã®äžŠã¹æ¿ããåã®äžŠã¹æ¿ãïŒ
- è¡ãé衚瀺ã«ããããšãã§ããŸãïŒãŠãŒã¶ãŒã«èŠããªãããã«ããŸãïŒ
class Lines { public: Lines(UINT_t count = 0); UINT_t GetCount() const { return m_count; } void SetCount(UINT_t count); UINT_t GetLineSize(UINT_t line) const; void SetLineSize(UINT_t line, UINT_t size); bool IsLineVisible(UINT_t line) const; void SetLineVisible(UINT_t line, bool visible); template <typename Pred> void Sort(const Pred& pred); const vector<UINT_t>& GetPermutation() const; void SetPermutation(const vector<UINT_t>& permutation); UINT_t GetAbsoluteLineID(UINT_t visibleLine) const; UINT_t GetVisibleLineID(UINT_t absoluteLine) const; Event_t<void(const Lines&, unsigned)> changed; private: UINT_t m_count; vector<UINT_t> m_linesSize; vector<bool> m_linesVisible; };
ããããããããããã«ãã³ã¡ã³ããšäžéšã®ãŠãŒãã£ãªãã£é¢æ°ãšãã£ãŒã«ãã¯çç¥ãããŠããŸãã
ã¯ã©ã¹ã«ã¯ãé¢æ°
GetAbsoluteLineID
ããã³
GetVisibleLineID
ãŸãã è¡ãæ··åšããããé衚瀺ã«ãããã§ããããã絶察ã€ã³ããã¯ã¹è¡ãšè¡šç€ºã€ã³ããã¯ã¹è¡ã¯ç°ãªããŸãã åçããã®ç¶æ³ãã¯ã£ãããšç€ºããŠããããšãé¡ã£ãŠããŸãã
ãŸããè¡ãæ確ã«ããå¿ èŠããããŸã
Event_t<void(const Lines&, unsigned)> changed;
ããã§ä¿¡å·ãå®çŸ©ãããŸãïŒQtãŸãã¯boostã§åŒã³åºãããããïŒã C ++ 11ãšstd ::é¢æ°ã®åºçŸã«ãããå€éšã©ã€ãã©ãªã«äŸåããªãããã«ãä¿¡å·/ã¹ãããã®ç°¡åãªå®è£
ãç°¡åã«èšè¿°ã§ããŸãã ãã®å ŽåãLinesã¯ã©ã¹ã§ã€ãã³ããå®çŸ©ããä»»æã®é¢æ°ãŸãã¯ãã¡ã³ã¯ã¿ãŒãããã«æ¥ç¶ã§ããŸãã ããšãã°ãã°ãªããã¯ãã®ã€ãã³ãã«æ¥ç¶ããLinesã®ã€ã³ã¹ã¿ã³ã¹ãå€æŽããããšã¢ã©ãŒããåä¿¡ããŸãã
ãããã£ãŠãã°ãªããæ§é ã¯2ã€ã®ç·ã§è¡šãããŸãã
private: Lines m_rows; Lines m_columns;
ããŒã¿ã«æž¡ããŸãã 衚瀺ããããŒã¿ãšã°ãªããã®è¡šç€ºæ¹æ³ã«é¢ããã°ãªããæ å ±ã®æäŸæ¹æ³ ç§ãã¡ã®åã«ãã¹ãŠããã§ã«ããã§çºæãããŠããŸã-ç§ã¯MVCïŒModel-View-ControllerïŒãã©ã€ã¢ãã䜿çšããŸããã ãã¥ãŒèŠçŽ ããå§ããŸãããã Linesã¯ã©ã¹ã1è¡ã§ã¯ãªãã»ããå šäœãå®çŸ©ããããã«ãViewã¯ã©ã¹ã¯ãã°ãªããã»ã«ã®ç¹å®ã®ãµãã»ããã«ããçš®ã®åçš®ã®ããŒã¿ã衚瀺ãããã®ãšããŠå®çŸ©ããŸãã ããšãã°ãæåã®åã«ã¯ããã¹ãã衚瀺ãããŸãã ã€ãŸããããã¹ãããŒã¿ã衚瀺ã§ãããªããžã§ã¯ããäœæããå¿ èŠãããããã®ããŒã¿ã¯æåã®åã«è¡šç€ºããå¿ èŠããããšèšããŸãã æã£ãŠããããŒã¿ã¯ããŸããŸãªå Žæã§è¡šç€ºã§ããããããããã®é¢æ°ãããŸããŸãªã¯ã©ã¹ã§å®è£ ããããšããå§ãããŸãã ããŒã¿ã衚瀺ã§ããã¯ã©ã¹ãå®éã«ã¯ãã¥ãŒãããã³ããŒã¿ã衚瀺ãããå Žæã瀺ãããšãã§ããã¯ã©ã¹ïŒç¯å²ïŒã»ã«ã®ã»ããïŒïŒãåŒã³åºããŸãã ãããã®ã¯ã©ã¹ã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãã°ãªããã«æž¡ãã衚瀺ãããã®ãšå Žæãæå®ããã ãã§ãã
Rangeã¯ã©ã¹ã詳ããèŠãŠã¿ãŸãããã ããã¯é©ãã»ã©å°ãããŠåŒ·åãªã¯ã©ã¹ã§ãã ãã®äž»ãªã¿ã¹ã¯ã¯ãç¹å®ã®ã»ã«ãå«ãŸããŠãããã©ããã®è³ªåã«ãã°ããçããããšã§ãã å®éãããã¯1ã€ã®æ©èœãæã€ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
class Range { public: virtual bool HasCell(CellID cell) const = 0; };
ããã«ãããä»»æã®ã»ã«ã®ã»ãããå®çŸ©ã§ããŸãã ãã¡ãããæã圹ç«ã€ã®ã¯æ¬¡ã®2ã€ã§ãã
class RangeAll { public: bool HasCell(CellID cell) const override { return true; } }; class RangeColumn { public: RangeColumn(UINT_t column): m_column(column) {} bool HasCell(CellID cell) const override { return cell.column == m_column; } private: UINT_t m_column; };
æåã®ã¯ã©ã¹ã¯ãã¹ãŠã®ã»ã«ã®ã»ãããå®çŸ©ãã2çªç®ã®ã¯ã©ã¹ã¯1ã€ã®ç¹å®ã®åã®ã»ãããå®çŸ©ããŸãã
Viewã¯ã©ã¹ã«ã¯é¢æ°ã1ã€ã ãæ®ã£ãŠããŸã-ã»ã«ã«ããŒã¿ãæç»ããŸãã å®éãæ¬æ Œçãªäœæ¥ãè¡ãã«ã¯ãViewãããã€ãã®è³ªåã«çããããå¿ èŠããããŸãã
- ããŒã¿ã衚瀺ããããã«å¿ èŠãªã¹ããŒã¹ã®éïŒããšãã°ãããã¹ãã衚瀺ããã®ã«ååãªå¹ ã«åãèšå®ãã-ãã£ããã¢ãŒãïŒ
- ããŒã¿ã®ããã¹ãè¡šçŸãæäŸããŸãïŒããã¹ããšããŠã¯ãªããããŒãã«ã³ããŒããããããŒã«ãããã«è¡šç€ºããŸãïŒ
class View { public: virtual void Draw(DrawContext& dc, Rect rect, CellID cell) const = 0; virtual Size GetSize(DrawContext& dc, CellID cell) const = 0; virtual bool GetText(CellID cell, INTENT intent, String& text) const = 0; };
ããããåãã»ã«ã«ç°ãªãã¿ã€ãã®ããŒã¿ãæç»ãããå Žåã¯ã©ãã§ããããïŒ ããšãã°ãã¢ã€ã³ã³ãšããã¹ããé£ã«æç»ãããããã§ãã¯ããã¯ã¹ãšããã¹ããé£ã«æç»ãããããŸãã ãããã®çµã¿åããã«å¯ŸããŠåå¥ã®ã¿ã€ãã®ãã¥ãŒãå®è£ ããããããŸããã 1ã€ã®ã»ã«ã«è€æ°ã®ãã¥ãŒã衚瀺ã§ããããã«ããŸããããç¹å®ã®ãã¥ãŒãã»ã«ã«é 眮ããæ¹æ³ãæ瀺ããã¯ã©ã¹ãå¿ èŠã§ãã
class Layout { public: virtual void LayoutView(DrawContext& dc, const View* view, Rect& cellRect, Rect& viewRect) const = 0; };
æ確ã«ããããã«ããã§ãã¯ããã¯ã¹ãšããã¹ããæåã®åã«è¡šç€ºãããäŸãèããŠãã ããã 2åç®ã«ã¯ãã©ãžãªãã¿ã³ãè²ä»ãã®ããã¯ã¹ãããã³è²ã®ããã¹ãè¡šçŸã衚瀺ãããŸãã ãããŠãå¥ã®ã»ã«ã«ã¯ã¢ã¹ã¿ãªã¹ã¯ããããŸãã
ããšãã°ããã§ãã¯ããã¯ã¹ã®å Žåã¯ãLayoutLeftã䜿çšããŸããããã¯ãViewã«ãµã€ãºãèŠæ±ããã»ã«ã®åè§åœ¢ããç®çã®ãµã€ãºã®åè§åœ¢ããåã¿åããããŸãã ãŸããããã¹ãã«ã¯LayoutAllã䜿çšããŸããããã«ã¯ãã»ã«ã®æ¢ã«åãæšãŠãããåè§åœ¢ãcellRectãã©ã¡ãŒã¿ãŒã«éãããŸãã LayoutAllã¯ããã®ãã¥ãŒã®ãµã€ãºãèŠæ±ããã®ã§ã¯ãªããã»ã«ã®äœ¿çšå¯èœãªãã¹ãŠã®ã¹ããŒã¹ãåã«ãååŸãããŸãã ãã¥ãŒãšçµã¿åãããå€ãã®äŸ¿å©ãªã¬ã€ã¢ãŠããæãä»ãããšãã§ããŸãã
ããŒã¿ãèšå®ãããGridã¯ã©ã¹ã«æ»ããŸãããã ããªãã«<RangeãViewãLayout>ãä¿åã§ããããšãããããŸããããªãã«ã¯ãã©ã®ã»ã«ã«ããŒã¿ã衚瀺ããããããã³ãã®ããŒã¿ãã»ã«å ã«ã©ã®ããã«é 眮ãããã決å®ããŸãã ãããã£ãŠãGridã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
class Grid { private: Lines m_rows; Lines m_columns; vector<tuple<Range, View, Layout>> m_data; };
ããã¯ããã®äŸã§ã¯m_dataã®ããã«èŠããŸã
æ¬è³ªçã«ãããã¯ã°ãªãããã¬ã³ããªã³ã°ããã®ã«ååã§ãã ããããæ å ±ã¯æé©ãªæ¹æ³ã§ç·šæãããŠããŸãã-ããŒã¿ã®è¡šç€ºã決å®ããã¬ã³ãŒãã®ãªã¹ãã ãã§ãã
Gridã¯ã©ã¹ã䜿çšããŠã»ã«ãæç»ããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã
- m_dataããã£ã«ã¿ãªã³ã°ããã»ã«ãRangeã«è©²åœããããªãã«ã®ã¿ãæ®ãå¿
èŠããããŸã
for (auto d: grid.m_data) if (d.range->HasCell(cell)) cell_data.push_back(d);
- ã»ã«ã®é·æ¹åœ¢ãå®çŸ©ãã
Rect cellRect = CalculateCellRect(grid.m_rows, grid.m_columns, cell);
- ãã¹ãŠã®ãã¥ãŒã®é·æ¹åœ¢ãå®çŸ©ãã
vector<Rect> view_rects(cell_data.size()); auto view_rect_it = view_rects.begin(); for (auto d: cell_data) d.layout->LayoutView(grid.GetDC(), d.view, cellRect, *view_rect_it++);
- ãã¹ãŠã®ãã¥ãŒããããã®ããã«èšç®ãããé·æ¹åœ¢ã«æç»ããŸã
auto view_rect_it = view_rects.begin(); for (auto d: cell_data) d.view->Draw(grid.GetDC(), *view_rect_it++, cell);
ã芧ã®ããã«ãã¬ã³ããªã³ã°ã¯æåŸã®ã¹ãããã§è¡ããããã£ã«ã¿ãŒåŠçããããã¥ãŒã®ãªã¹ããšããããã®ãã¥ãŒãããŒã¿ãæç»ããé·æ¹åœ¢ã®ãªã¹ãã®ã¿ãå¿ èŠã§ãã ãã®ããŒã¿ããã£ãã·ã¥ããå°ããªã¯ã©ã¹ãèãåºãããšãã§ãããã®æç»é¢æ°ã¯åäžã®ãã€ã³ã4ã§æ§æãããŸãã
class CellCache { public: CellCache(Grid grid, CellID cell); void Draw(DrawContext& dc); private: CellID m_cell; Rect m_cellRect; vector<pair<View, Rect>> m_cache; };
ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã®ã¯ã©ã¹ã¯ãæåã®3ã€ã®ãã€ã³ããå®è¡ããçµæãm_cacheã«ä¿åããŸãã åæã«ãDrawé¢æ°ã¯éåžžã«è»œéã§ããããšãå€æããŸããã ãã®ããã軜ãã¯m_cacheã®åœ¢åŒã§æ¯æãå¿ èŠããããŸããã ãããã£ãŠãã»ã«ããšã«ãã®ãããªã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã¯å©çããããŸããïŒã»ã«ã®ç·æ°ã«ãã£ãŠã¯ããŒã¿ãæããªãããšã«åæããŸããïŒã ãã ãããã¹ãŠã®ã»ã«ã«CellCacheã€ã³ã¹ã¿ã³ã¹ãçšæããå¿ èŠã¯ãããŸããã衚瀺ãããã»ã«ã«ååã§ãã ååãšããŠããã¹ãŠã®ã»ã«ã®ããäžéšãã°ãªããã«è¡šç€ºããããã®æ°ã¯ã»ã«ã®ç·æ°ã«ã¯äŸåããŸããã
ãããã£ãŠãã°ãªããã®å¯èŠé åãå¶åŸ¡ããå¯èŠã»ã«ããšã«CellCacheãæ ŒçŽãããããããã°ããæç»ã§ããå¥ã®ã¯ã©ã¹ããããŸãã
class GridCache { public: GridCache(Grid grid); void SetVisibleRect(Rect visibleRect); void Draw(DrawContext& dc); private: Grid m_grid; Rect m_visibleRect; vector<CellCache> m_cells; };
ãŠãŒã¶ãŒãã°ãªããã®ãµã€ãºãå€æŽããããã³ã³ãã³ããã¹ã¯ããŒã«ãããšããã®ãªããžã§ã¯ãã«æ°ããvisibleRectãèšå®ããã ãã§ãã ãã®å Žåãm_cellsã¯ã衚瀺ãããŠããã»ã«ã®ã¿ãå«ãããã«åç·šæãããŸãã GridCacheæ©èœã¯ãèªã¿åãå°çšã°ãªãããå®è£ ããã®ã«ååã§ãã
class GridWindow { public: Grid GetGrid() { return m_gridCache.GetGrid(); } void OnPaint() { m_gridCache.Draw(GetDrawContext()); } void OnScroll() { m_gridCache.SetVisibleRect(GetVisibleRect()); } void OnSize() { m_gridCache.SetVisibleRect(GetVisibleRect()); } private: GridCache m_gridCache; };
Gridã¯ã©ã¹ãšGridCacheã¯ã©ã¹ãåé¢ããããšã¯éåžžã«äŸ¿å©ã§ãã ããšãã°ã1ã€ã®ã°ãªããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠè€æ°ã®GridCacheãäœæã§ããŸãã ããã䜿çšããŠãã°ãªããã³ã³ãã³ãã®ããŒãžããšã®å°å·ãå®è£ ããããç»åãšããŠã°ãªããããã¡ã€ã«ã«ãšã¯ã¹ããŒããããã§ããŸãã åæã«ãGridWindowãªããžã§ã¯ãã¯äžåå€æŽãããŸããããããšã¯å¥ã«ãåãGridã€ã³ã¹ã¿ã³ã¹ãåç §ããGridCacheãã«ãŒãã§äœæãããæ°ããGridCacheãçŸåšã®ããŒãžã®visibleRectãèšå®ããŠå°å·ããŸãã
ã€ã³ã¿ã©ã¯ãã£ãæ©èœãè¿œå ããã«ã¯ïŒ ãããControllerãåé¢ã«åºãŠãããšããã§ãã ä»ã®ã¯ã©ã¹ãšã¯ç°ãªãããã®ã¯ã©ã¹ã¯å€ãã®æ©èœãæã€ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãã ãããããã¯ãããŠã¹ã€ãã³ãèªäœãå€æ°ããããã§ãã
class Controller { public: virtual bool OnLBttnDown(CellID cell, Point p) = 0; virtual bool OnLBttnUp(CellID cell, Point p) = 0; ... };
ã¬ã³ããªã³ã°ãšåæ§ã«ãããŠã¹ã§äœæ¥ããã«ã¯ã衚瀺ãããŠããã»ã«ã®ã¿ãå¿ èŠã§ãã GridCacheã¯ã©ã¹ã«ããŠã¹åŠçé¢æ°ãè¿œå ããŸãã ããŠã¹ã«ãŒãœã«ã®äœçœ®ã«ãã£ãŠããã®äžã«ããã»ã«ïŒCacheCellïŒã決ãŸããŸãã 次ã«ãããŠã¹ããããããé·æ¹åœ¢ã®ãã¹ãŠã®ãã¥ãŒã®ã»ã«ã§ãã³ã³ãããŒã©ãŒãååŸãã察å¿ããã¡ãœãããåŒã³åºããŸãã ã¡ãœãããtrueãè¿ãå Žå-ãã¥ãŒã®ãã€ãã¹ãåæ¢ããŸãã ãã®ã¹ããŒã ã¯ååã«é«éã§ãã åæã«ãViewã¯ã©ã¹ã§Controllerãžã®åç §ãè¿œå ããå¿ èŠããããŸããã
Modelã¯ã©ã¹ã®åŠçã¯æ®ããŸãã ã¢ããã¿ãã³ãã¬ãŒããšããŠå¿ èŠã§ãã ãã®äž»ãªç®æšã¯ãã䟿å©ãªã圢åŒã§Viewã®ããŒã¿ãæäŸããããšã§ãã äŸãèŠãŠã¿ãŸãããã ããã¹ããæç»ã§ããViewTextããããŸãã ç¹å®ã®ã»ã«ã«æç»ããã«ã¯ããã®ããã¹ããModelTextãªããžã§ã¯ãããã»ã«ã«èŠæ±ããå¿ èŠããããŸããModelTextãªããžã§ã¯ãã¯åãªãã€ã³ã¿ãŒãã§ã€ã¹ã§ããããã®ç¹å®ã®å®è£ ã¯ããã¹ããååŸããå Žæãç¥ã£ãŠããŸãã 次ã«ãViewTextã¯ã©ã¹ã®å®è£ äŸã瀺ããŸãã
class ViewText: public View { public: ViewText(ModelText model): m_model(model) {} void Draw(DrawContext& dc, Rect rect, CellID cell) const override { const String& text = model->GetText(cell); dc.DrawText(text, rect); } private: ModelText m_model; };
ãããã£ãŠãModelTextã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ã¯ç°¡åã«æšæž¬ã§ããŸãã
class ModelText: public Model { public: virtual const String& GetText(CellID cell) const = 0; virtual void SetText(CellID cell, const String& text) = 0; };
ã³ã³ãããŒã©ãŒã䜿çšã§ããããã«ãã»ãã¿ãŒãè¿œå ããããšã«æ³šæããŠãã ããã å®éã«ã¯ãæãäžè¬çã«äœ¿çšãããModelTextCallbackã®å®è£
class ModelTextCallback: public ModelText { public: function<const String&(CellID)> getCallback; function<void(CellID, const String&)> setCallback; const String& GetText(CellID cell) const override { return getCallback(cell); } void SetText(CellID cell, const String& text) override { if (setCallback) setCallback(cell, text); } };
ãã®ã¢ãã«ã«ãããã°ãªããã®åæåäžã«å®éã®ããŒã¿ã«ã¢ã¯ã»ã¹ããã©ã ãé¢æ°ãå²ãåœãŠãããšãã§ããŸãã
ããŠãã¢ãã«ã¯ModelTextãModelIntãModelBoolãªã©ã®ç°ãªãããŒã¿ã«å ±éãããã®ã¯äœã§ããïŒ äžè¬çã«ãäœãããããã«ã€ããŠã®å¯äžã®ããšã¯ãããŒã¿ãå€æŽãããããšããã¹ãŠã®é¢å¿ã®ãããªããžã§ã¯ãã«éç¥ããå¿ èŠããããšèšãããšã¯ã§ããŸããã ãããã£ãŠãåºæ¬ã¯ã©ã¹Modelã¯æ¬¡ã®åœ¢åŒãåããŸãã
class Model { public: virtual ~Model() {} Event_t<void(Model)> changed; };
ãã®çµæãã°ãªããã¯å€ãã®å°ããªã¯ã©ã¹ã«åå²ããããããããæ確ã«å®çŸ©ãããå°ããªã¿ã¹ã¯ãå®è¡ããŸãã äžæ¹ã§ã¯ãã°ãªãããå®è£ ããã«ã¯ã¯ã©ã¹ãå€ãããããã«èŠãããããããŸããã ããããäžæ¹ã§ãã¯ã©ã¹ã¯å°ãããŠã·ã³ãã«ã§ãæ確ãªé¢ä¿ãããããšãå€æããŸãããããã«ãããã³ãŒãã®ç解ãç°¡åã«ãªããè€éãã軜æžãããŸãã åæã«ãRangeãLayoutãViewãControllerãããã³Modelã¯ã©ã¹ã®ç¶æ¿ã¯ã©ã¹ã®ããããçš®é¡ã®çµã¿åããã¯ãéåžžã«å€§ããªå€åæ§ããããããŸãã ModelCallbackã«ã©ã ãé¢æ°ã䜿çšãããšãã°ãªãããããŒã¿ã«ç°¡åãã€è¿ éã«é¢é£ä»ããããšãã§ããŸãã
次ã®ã¡ã¢ã§ã¯ãæšæºã®ã°ãªããæ©èœãå®è£ ããæ¹æ³ã«ã€ããŠèª¬æããŸããéžæã䞊ã¹æ¿ããå/è¡ã®ãµã€ãºå€æŽãå°å·ãããããŒã®è¿œå æ¹æ³ïŒäžéšã®è¡ãšå·ŠåŽã®åãä¿®æ£ïŒã
å°ãç§å¯ããäŒãããŸã-ãã®èšäºã§èª¬æãããŠããããšã¯ãã¹ãŠãäžèšãå®è£ ããã®ã«ååã§ãã ããã€ãã®æ©èœãèŠéããå Žåã¯ãã³ã¡ã³ããæžããŠãã ããã次ã®èšäºã§ãããã®å®è£ ã«ã€ããŠèª¬æããŸãã