FilePane and Close All but this context menu item on tabs

This commit is contained in:
Tim Warren 2015-06-05 16:50:52 -04:00
parent 1fa24545d2
commit 619db418ff
9 changed files with 232 additions and 56 deletions

View File

@ -259,25 +259,19 @@ bool EditPane::FileWritable()
*/
void EditPane::BindEvents()
{
Bind(wxEVT_STC_MARGINCLICK, &EditPane::OnMarginClick, this, wxID_ANY);
Bind(wxEVT_STC_CHARADDED, &EditPane::OnCharAdded, this, wxID_ANY);
}
/**
* Code folding event handler
*
* @param wxStyledTextEvent& event
* @return void
*/
void EditPane::OnMarginClick(wxStyledTextEvent& event)
{
if (event.GetMargin() == MARGIN_FOLD) {
int lineClick = this->LineFromPosition (event.GetPosition());
int levelClick = this->GetFoldLevel (lineClick);
if ((levelClick & wxSTC_FOLDLEVELHEADERFLAG) > 0) {
this->ToggleFold (lineClick);
// Code folding event handler
this->Bind(wxEVT_STC_MARGINCLICK, [=](wxStyledTextEvent& event) {
if (event.GetMargin() == MARGIN_FOLD)
{
int lineClick = this->LineFromPosition (event.GetPosition());
int levelClick = this->GetFoldLevel (lineClick);
if ((levelClick & wxSTC_FOLDLEVELHEADERFLAG) > 0) {
this->ToggleFold (lineClick);
}
}
}
}, wxID_ANY);
this->Bind(wxEVT_STC_CHARADDED, &EditPane::OnCharAdded, this, wxID_ANY);
}
/**

View File

@ -30,7 +30,6 @@ private:
bool FileReadable();
bool FileWritable();
void BindEvents();
void OnMarginClick(wxStyledTextEvent &event);
void OnCharAdded(wxStyledTextEvent &event);
void SetTheme(string theme_name);
void _ApplyTheme(JsonValue &lexer_map);

94
src/widgets/FilePane.cpp Normal file
View File

@ -0,0 +1,94 @@
#include "widget.h"
extern MainFrame *Glob_main_frame;
enum CustomFilePaneEventIds {
myFP_ID_OPEN = (wxID_HIGHEST * 2),
myFP_ID_RENAME,
myFP_ID_DELETE
};
/**
* Constructor
* @param parent
* @param id
* @param dir
* @param pos
* @param size
* @param style
* @param filter
*/
FilePane::FilePane(
wxWindow* parent,
const wxWindowID id,
const wxString &dir,
const wxPoint &pos,
const wxSize &size,
long style,
const wxString &filter
) : wxGenericDirCtrl(parent, id, dir, pos, size, style, filter)
{
this->CreateContextMenu();
this->BindEvents();
this->SetDefaultPath(wxStandardPaths::Get().GetDocumentsDir());
this->SetPath(this->GetDefaultPath());
}
/**
* Destructor
*/
FilePane::~FilePane()
{
delete this->contextMenu;
}
/**
* Bind event handlers
*
* @return void
*/
void FilePane::BindEvents()
{
// Open files on double-click or enter
this->Bind(wxEVT_DIRCTRL_FILEACTIVATED, [=](wxTreeEvent&) {
wxLogDebug("File activated event fired");
this->OpenSelectedFiles();
}, wxID_ANY);
// Context Menu
this->Bind(wxEVT_TREE_ITEM_RIGHT_CLICK, [=](wxTreeEvent&) {
this->PopupMenu(this->contextMenu);
}, wxID_ANY);
// Open file(s)
this->Bind(wxEVT_MENU, [=](wxCommandEvent&) {
this->OpenSelectedFiles();
}, myFP_ID_OPEN);
}
/**
* Create the filePane Context Menu
*
* @return void
*/
void FilePane::CreateContextMenu()
{
this->contextMenu = new wxMenu();
this->contextMenu->Append(myFP_ID_OPEN, "&Open Ctrl+Shift+O", "Open the selected file(s)");
//this->contextMenu->Append(myFP_ID_RENAME, "&Rename Ctrl+Shift+R", "Rename the selected file");
//this->contextMenu->Append(myFP_ID_DELETE, "Delete", "Delete the selected file");
}
/**
* Open the files that are currently selected in the file pane in the current
* editor window
*
* @return void
*/
void FilePane::OpenSelectedFiles()
{
wxArrayString paths;
this->GetPaths(paths);
Glob_main_frame->OpenFiles(paths);
}

24
src/widgets/FilePane.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef TYRO_FILE_PANE_H
#define TYRO_FILE_PANE_H
class FilePane : public wxGenericDirCtrl {
public:
FilePane(
wxWindow *parent,
const wxWindowID id = wxID_ANY,
const wxString &dir = wxDirDialogDefaultFolderStr,
const wxPoint &pos = wxDefaultPosition,
const wxSize &size = wxDefaultSize,
long style = wxDIRCTRL_EDIT_LABELS | wxDIRCTRL_MULTIPLE,
const wxString &filter = wxEmptyString
);
~FilePane();
private:
wxMenu *contextMenu = nullptr;
void BindEvents();
void CreateContextMenu();
void OpenSelectedFiles();
};
#endif /* TYRO_FILE_PANE_H */

View File

@ -8,6 +8,7 @@ extern TyroMenu *Glob_menu_bar;
extern PrefPane *Glob_pref_pane;
extern wxStatusBar *Glob_status_bar;
static TabContainer *notebook = nullptr;
static FilePane *filePane = nullptr;
// Frame icon
#include "../../resources/xpm/tyro.xpm"
@ -21,6 +22,8 @@ MainFrame::MainFrame(wxFrame *frame, const wxString &title)
// Create the tab container
notebook = new TabContainer(this);
filePane = new FilePane(this);
// Set the frame icon
wxIcon app_icon(tyro_icon);
this->SetIcon(app_icon);
@ -45,6 +48,7 @@ MainFrame::~MainFrame()
wxLogDebug("Main Frame Destructor Called.");
delete notebook;
delete toolBar;
delete filePane;
wxDELETE(this->findDlg);
wxDELETE(this->findData);
@ -76,6 +80,16 @@ void MainFrame::DoLayout()
.Resizable(true);
this->manager->AddPane(toolBar, toolBarPaneInfo);
wxAuiPaneInfo filePaneInfo;
filePaneInfo.Left()
.MinSize(225, 550)
.TopDockable(false)
.BottomDockable(false)
.RightDockable(true)
.LeftDockable(true)
.Resizable(true);
this->manager->AddPane(filePane, filePaneInfo);
wxAuiPaneInfo notebookPaneInfo;
notebookPaneInfo.CenterPane();
this->manager->AddPane(notebook, notebookPaneInfo);
@ -162,6 +176,7 @@ void MainFrame::BindEvents()
Bind(wxEVT_MENU, &MainFrame::OnSave, this, wxID_SAVE);
Bind(wxEVT_MENU, &MainFrame::OnSaveAs, this, wxID_SAVEAS);
Bind(wxEVT_MENU, &MainFrame::OnCloseTab, this, wxID_CLOSE);
Bind(wxEVT_MENU, &TabContainer::OnCloseAllButThis, notebook, myID_CLOSE_ALL_BUT_THIS);
Bind(wxEVT_MENU, &TabContainer::OnCloseAll, notebook, myID_CLOSE_ALL);
Bind(wxEVT_MENU, &MainFrame::OnQuit, this, wxID_EXIT);

View File

@ -15,6 +15,13 @@ public:
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
// Font size will have to wait until wxWidgets 3.0.3, where font widgets
// will actually work
/*wxFontPickerCtrl *fontPicker = new wxFontPickerCtrl(this, wxID_ANY);
wxSizer *fontSizer = new wxBoxSizer(wxHORIZONTAL);
fontSizer->Add(fontPicker, wxSizerFlags().Border());
sizer->Add(fontSizer, wxSizerFlags().Border());*/
sizer->Add(showLineNumbers, wxSizerFlags().Border());
sizer->Add(showIndentGuides, wxSizerFlags().Border());
sizer->Add(showCodeFolding, wxSizerFlags().Border());
@ -25,9 +32,24 @@ public:
// On supported platforms
if (wxPreferencesEditor::ShouldApplyChangesImmediately())
{
showLineNumbers->Bind(wxEVT_CHECKBOX, &GeneralPrefPanePage::ToggleShowLineNumbers, this, myID_PREFS_LINE_NUMBERS);
showIndentGuides->Bind(wxEVT_CHECKBOX, &GeneralPrefPanePage::ToggleShowIndentGuides, this, myID_PREFS_IDENT_GUIDES);
showCodeFolding->Bind(wxEVT_CHECKBOX, &GeneralPrefPanePage::ToggleShowCodeFolding, this, myID_PREFS_CODE_FOLDING);
showLineNumbers->Bind(wxEVT_CHECKBOX, [=] (wxCommandEvent &event) {
Glob_config->Write("show_line_numbers", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}, myID_PREFS_LINE_NUMBERS);
showIndentGuides->Bind(wxEVT_CHECKBOX, [=] (wxCommandEvent &event) {
Glob_config->Write("show_indent_guides", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}, myID_PREFS_IDENT_GUIDES);
showCodeFolding->Bind(wxEVT_CHECKBOX, [=] (wxCommandEvent &event) {
Glob_config->Write("show_code_folding", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}, myID_PREFS_CODE_FOLDING);
}
}
@ -74,31 +96,9 @@ public:
private:
MainFrame *frame;
wxCheckBox *showLineNumbers;
wxCheckBox *showIndentGuides;
wxCheckBox *showCodeFolding;
void ToggleShowLineNumbers(wxCommandEvent &event)
{
Glob_config->Write("show_line_numbers", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}
void ToggleShowIndentGuides(wxCommandEvent &event)
{
Glob_config->Write("show_indent_guides", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}
void ToggleShowCodeFolding(wxCommandEvent &event)
{
Glob_config->Write("show_code_folding", event.IsChecked());
this->frame->OnPrefsChanged(event);
Glob_config->Flush();
}
wxCheckBox *showLineNumbers = nullptr;
wxCheckBox *showIndentGuides = nullptr;
wxCheckBox *showCodeFolding = nullptr;
};
class GeneralPrefPane: public wxStockPreferencesPage {

View File

@ -6,6 +6,8 @@
extern TyroMenu *Glob_menu_bar;
extern wxStatusBar *Glob_status_bar;
static vector<EditPane *> editors;
static unsigned long untitled_document_count = 0;
/**
@ -27,10 +29,10 @@ TabContainer::TabContainer(
{
this->parent = (MainFrame *) parent;
Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSE, &TabContainer::OnClose, this, wxID_ANY);
Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSED, &TabContainer::OnClosed, this, wxID_ANY);
Bind(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, &TabContainer::OnTabContextMenu, this, wxID_ANY);
Bind(wxEVT_AUINOTEBOOK_PAGE_CHANGED, &TabContainer::OnTabSwitch, this, wxID_ANY);
this->Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSE, &TabContainer::OnClose, this, wxID_ANY);
this->Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSED, &TabContainer::OnClosed, this, wxID_ANY);
this->Bind(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, &TabContainer::OnTabContextMenu, this, wxID_ANY);
this->Bind(wxEVT_AUINOTEBOOK_PAGE_CHANGED, &TabContainer::OnTabSwitch, this, wxID_ANY);
}
/**
@ -41,6 +43,16 @@ TabContainer::~TabContainer()
wxLogDebug("TabContainer destructor called");
}
/**
* Create a new editor instance for a new tab
*
* @return EditPane*
*/
EditPane* TabContainer::NewEditor()
{
return new EditPane(this);
}
/**
* Add a new blank document
*
@ -54,9 +66,7 @@ void TabContainer::AddTab()
caption.Printf("Untitled %lu", untitled_document_count);
EditPane *editor = new EditPane(this);
this->AddPage(editor, caption, true);
this->AddPage(this->NewEditor(), caption, true);
}
/**
@ -76,7 +86,7 @@ void TabContainer::AddTab(wxString filePath)
}
wxString caption= fileName.GetFullName();
EditPane *editor = new EditPane(this);
EditPane *editor = this->NewEditor();
if (editor->Load(filePath))
{
@ -150,7 +160,7 @@ void TabContainer::OnClose(wxAuiNotebookEvent &event)
return event.Veto();
}
}
};
}
}
/**
@ -180,6 +190,7 @@ void TabContainer::OnTabContextMenu(wxAuiNotebookEvent &WXUNUSED(event))
wxMenu *contextMenu = new wxMenu();
contextMenu->Append(wxID_CLOSE, "&Close\tCtrl+W", "Close the current tab");
contextMenu->Append(myID_CLOSE_ALL, "C&lose All\tShift+Ctrl+W", "Close all open documents.");
contextMenu->Append(myID_CLOSE_ALL_BUT_THIS, "Close All but this\tCtrl+Shift+Alt+W", "Close all open documents, except the one selected");
this->PopupMenu(contextMenu);
}
@ -195,6 +206,40 @@ void TabContainer::OnCloseAll(wxCommandEvent &WXUNUSED(event))
this->parent->EnableEditControls(false);
}
/**
* Close all tabs but the one selected
*
* @param wxCommandEvent& event
* @return void
*/
void TabContainer::OnCloseAllButThis(wxCommandEvent &WXUNUSED(event))
{
auto ind = this->GetSelection();
wxString curr_tooltip = this->GetPageToolTip(ind);
wxString curr_caption = this->GetPageText(ind);
size_t page_count = this->GetPageCount();
this->Freeze();
// Do the loop in this order, as the indices change
// when tabs are removed
size_t i = page_count;
while(i > 0)
{
i--;
// Identify the current tab by the caption and tooltip
// If they don't match, remove the tab
if (
curr_tooltip == this->GetPageToolTip(i) &&
curr_caption == this->GetPageText(i)
) continue;
this->RemovePage(i);
}
this->Thaw();
}
/**
* Update menu state when switching tabs
*

View File

@ -28,8 +28,10 @@ public:
EditPane *GetCurrentEditor();
EditPane *GetEditor(size_t page_idx);
void OnCloseAll(wxCommandEvent &event);
void OnCloseAllButThis(wxCommandEvent &event);
private:
MainFrame *parent = nullptr;
EditPane *NewEditor();
void OnTabSwitch(wxAuiNotebookEvent &event);
void OnClose(wxAuiNotebookEvent &event);
void OnClosed(wxAuiNotebookEvent &event);

View File

@ -13,6 +13,8 @@
#include <wx/aui/aui.h>
#include <wx/stc/stc.h>
#include <wx/preferences.h>
#include <wx/dirctrl.h>
#include <wx/fontpicker.h>
// Tyro includes
#include "TyroMenu.h"
@ -20,6 +22,7 @@
#include "TabContainer.h"
#include "MainFrame.h"
#include "PrefPane.h"
#include "FilePane.h"
#endif /* TYRO_WIDGET_H */