mirror of https://github.com/odrling/Aegisub
146 lines
4.8 KiB
C++
146 lines
4.8 KiB
C++
// Copyright (c) 2006, Rodrigo Braz Monteiro
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright notice,
|
|
// this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
// this list of conditions and the following disclaimer in the documentation
|
|
// and/or other materials provided with the distribution.
|
|
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
// may be used to endorse or promote products derived from this software
|
|
// without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
// POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
// Aegisub Project http://www.aegisub.org/
|
|
|
|
#include <libaegisub/signal.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <wx/window.h>
|
|
|
|
namespace agi {
|
|
struct Context;
|
|
class OptionValue;
|
|
}
|
|
class AssDialogue;
|
|
class GridColumn;
|
|
class WidthHelper;
|
|
|
|
class BaseGrid final : public wxWindow {
|
|
std::vector<agi::signal::Connection> connections;
|
|
int lineHeight = 1; ///< Height of a line in pixels in the current font
|
|
bool holding = false; ///< Is a drag selection in process?
|
|
wxFont font; ///< Current grid font
|
|
wxScrollBar *scrollBar; ///< The grid's scrollbar
|
|
bool byFrame = false; ///< Should times be displayed as frame numbers
|
|
|
|
/// Row from which the selection shrinks/grows from when selecting via the
|
|
/// keyboard, shift-clicking or dragging
|
|
int extendRow = -1;
|
|
|
|
/// First row that is visible at the current scroll position
|
|
int yPos = 0;
|
|
|
|
int active_row = -1;
|
|
|
|
std::unique_ptr<WidthHelper> width_helper;
|
|
|
|
/// Rows which are visible on the current video frame
|
|
std::vector<int> visible_rows;
|
|
|
|
agi::Context *context; ///< Associated project context
|
|
|
|
std::vector<std::unique_ptr<GridColumn>> columns;
|
|
std::vector<bool> columns_visible;
|
|
|
|
std::vector<wxRect> text_refresh_rects;
|
|
|
|
/// Cached brushes used for row backgrounds
|
|
struct {
|
|
wxBrush Default;
|
|
wxBrush Header;
|
|
wxBrush Selection;
|
|
wxBrush Comment;
|
|
wxBrush Visible;
|
|
wxBrush SelectedComment;
|
|
wxBrush LeftCol;
|
|
wxBrush FoldOpen;
|
|
wxBrush FoldClosed;
|
|
} row_colors;
|
|
|
|
std::vector<AssDialogue*> index_line_map; ///< Row number -> dialogue line
|
|
std::vector<AssDialogue*> vis_index_line_map; ///< Visible Row number -> dialogue line
|
|
|
|
/// Connection for video seek event. Stored explicitly so that it can be
|
|
/// blocked if the relevant option is disabled
|
|
agi::signal::Connection seek_listener;
|
|
|
|
/// Cached grid body context menu
|
|
std::unique_ptr<wxMenu> context_menu;
|
|
|
|
void OnContextMenu(wxContextMenuEvent &evt);
|
|
void OnHighlightVisibleChange(agi::OptionValue const& opt);
|
|
void OnKeyDown(wxKeyEvent &event);
|
|
void OnCharHook(wxKeyEvent &event);
|
|
void OnMouseEvent(wxMouseEvent &event);
|
|
void OnPaint(wxPaintEvent &event);
|
|
void OnScroll(wxScrollEvent &event);
|
|
void OnShowColMenu(wxCommandEvent &event);
|
|
void OnSize(wxSizeEvent &event);
|
|
void OnSubtitlesCommit(int type);
|
|
void OnActiveLineChanged(AssDialogue *);
|
|
void OnSeek();
|
|
|
|
void AdjustScrollbar();
|
|
void SetColumnWidths();
|
|
|
|
bool IsDisplayed(const AssDialogue *line) const;
|
|
|
|
void UpdateMaps();
|
|
void UpdateStyle();
|
|
|
|
void SelectRow(int row, bool addToSelected = false, bool select=true);
|
|
|
|
int GetRows() const { return index_line_map.size(); }
|
|
int GetVisRows() const { return vis_index_line_map.size(); }
|
|
void MakeRowVisible(int row);
|
|
void MakeVisRowVisible(int row);
|
|
|
|
/// @brief Get dialogue by index
|
|
/// @param n Index to look up
|
|
/// @return Subtitle dialogue line for index, or 0 if invalid index
|
|
AssDialogue *GetDialogue(int n) const;
|
|
|
|
/// @brief Get visible dialogue by the displayed row's index
|
|
/// @param n Displayed ndex to look up
|
|
/// @return Visible ubtitle dialogue line for index, or 0 if invalid index
|
|
AssDialogue *GetVisDialogue(int n) const;
|
|
|
|
int VisRowToRow(int n) const;
|
|
|
|
public:
|
|
BaseGrid(wxWindow* parent, agi::Context *context);
|
|
~BaseGrid();
|
|
|
|
void SetByFrame(bool state);
|
|
void ScrollTo(int y);
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|