Rework handling of copied styles in the style manager a bit

Generate the new name in the style manager rather than the editor so
that the naming scheme of copies is consistent between the Copy buttons
and pasting styles.

Name the second copy of style X "X - Copy (2)" rather than "X - Copy -
Copy", and so on for further copies. (Copies of style "X - Copy" would
still be named "X - Copy - Copy").

Select the new style when a copy is created.

Originally committed to SVN as r6536.
This commit is contained in:
Thomas Goyne 2012-03-07 22:40:15 +00:00
parent 366baff2f8
commit f4e1b28c9f
3 changed files with 52 additions and 22 deletions

View file

@ -78,17 +78,17 @@ static wxTextCtrl *num_text_ctrl(wxWindow *parent, double value, wxSize size = w
return new wxTextCtrl(parent, -1, "", wxDefaultPosition, size, 0, NumValidator(value)); return new wxTextCtrl(parent, -1, "", wxDefaultPosition, size, 0, NumValidator(value));
} }
DialogStyleEditor::DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Context *c, AssStyleStorage *store, bool copy_style) DialogStyleEditor::DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Context *c, AssStyleStorage *store, wxString const& new_name)
: wxDialog (parent, -1, _("Style Editor"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER, "DialogStyleEditor") : wxDialog (parent, -1, _("Style Editor"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, c(c) , c(c)
, is_new(false) , is_new(false)
, style(style) , style(style)
, store(store) , store(store)
{ {
if (copy_style) { if (new_name.size()) {
is_new = true; is_new = true;
style = this->style = new AssStyle(*style); style = this->style = new AssStyle(*style);
style->name = wxString::Format(_("%s - Copy"), style->name); style->name = new_name;
} }
else if (!style) { else if (!style) {
is_new = true; is_new = true;
@ -346,6 +346,10 @@ DialogStyleEditor::~DialogStyleEditor() {
delete style; delete style;
} }
wxString DialogStyleEditor::GetStyleName() const {
return style->name;
}
/// @brief Update appearances of a renamed style in \r tags /// @brief Update appearances of a renamed style in \r tags
static void ReplaceStyle(wxString tag, int, AssOverrideParameter* param, void *userData) { static void ReplaceStyle(wxString tag, int, AssOverrideParameter* param, void *userData) {
wxArrayString strings = *((wxArrayString*)userData); wxArrayString strings = *((wxArrayString*)userData);

View file

@ -155,6 +155,8 @@ class DialogStyleEditor : public wxDialog {
void OnSetColor(int n, wxCommandEvent& evt); void OnSetColor(int n, wxCommandEvent& evt);
public: public:
DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Context *c, AssStyleStorage *store, bool copy_style); DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Context *c, AssStyleStorage *store = 0, wxString const& new_name = "");
~DialogStyleEditor(); ~DialogStyleEditor();
wxString GetStyleName() const;
}; };

View file

@ -66,6 +66,8 @@
#include "standard_paths.h" #include "standard_paths.h"
#include "utils.h" #include "utils.h"
using std::tr1::placeholders::_1;
static wxBitmapButton *add_bitmap_button(wxWindow *parent, wxSizer *sizer, wxBitmap const& img, wxString const& tooltip) { static wxBitmapButton *add_bitmap_button(wxWindow *parent, wxSizer *sizer, wxBitmap const& img, wxString const& tooltip) {
wxBitmapButton *btn = new wxBitmapButton(parent, -1, img); wxBitmapButton *btn = new wxBitmapButton(parent, -1, img);
btn->SetToolTip(tooltip); btn->SetToolTip(tooltip);
@ -372,7 +374,7 @@ void DialogStyleManager::OnStorageEdit() {
int n = StorageList->GetSelections(selections); int n = StorageList->GetSelections(selections);
if (n == 1) { if (n == 1) {
AssStyle *selStyle = styleStorageMap[selections[0]]; AssStyle *selStyle = styleStorageMap[selections[0]];
DialogStyleEditor(this, selStyle, c, &Store, false).ShowModal(); DialogStyleEditor(this, selStyle, c, &Store).ShowModal();
StorageList->SetString(selections[0],selStyle->name); StorageList->SetString(selections[0],selStyle->name);
Store.Save(CatalogList->GetString(CatalogList->GetSelection())); Store.Save(CatalogList->GetString(CatalogList->GetSelection()));
} }
@ -384,7 +386,7 @@ void DialogStyleManager::OnCurrentEdit() {
int n = CurrentList->GetSelections(selections); int n = CurrentList->GetSelections(selections);
if (n == 1) { if (n == 1) {
AssStyle *selStyle = styleMap[selections[0]]; AssStyle *selStyle = styleMap[selections[0]];
DialogStyleEditor(this, selStyle, c, 0, false).ShowModal(); DialogStyleEditor(this, selStyle, c).ShowModal();
CurrentList->SetString(selections[0],selStyle->name); CurrentList->SetString(selections[0],selStyle->name);
} }
UpdateButtons(); UpdateButtons();
@ -452,15 +454,32 @@ void DialogStyleManager::OnCopyToCurrent() {
UpdateButtons(); UpdateButtons();
} }
template<class Func>
static wxString unique_name(Func name_checker, wxString const& source_name) {
if (name_checker(source_name)) {
wxString name = wxString::Format(_("%s - Copy"), source_name);
for (int i = 2; name_checker(name); ++i)
name = wxString::Format(_("%s - Copy (%d)"), source_name, i);
return name;
}
return source_name;
}
void DialogStyleManager::OnStorageCopy() { void DialogStyleManager::OnStorageCopy() {
wxArrayInt selections; wxArrayInt selections;
StorageList->GetSelections(selections); StorageList->GetSelections(selections);
if (selections.empty()) return; if (selections.empty()) return;
DialogStyleEditor(this, styleStorageMap[selections[0]], c, &Store, true).ShowModal(); AssStyle *s = styleStorageMap[selections[0]];
Store.Save(CatalogList->GetString(CatalogList->GetSelection())); DialogStyleEditor editor(this, s, c, &Store,
LoadStorageStyles(); unique_name(bind(&AssStyleStorage::GetStyle, &Store, _1), s->name));
UpdateButtons();
if (editor.ShowModal()) {
Store.Save(CatalogList->GetString(CatalogList->GetSelection()));
LoadStorageStyles();
StorageList->SetStringSelection(editor.GetStyleName());
UpdateButtons();
}
} }
void DialogStyleManager::OnCurrentCopy() { void DialogStyleManager::OnCurrentCopy() {
@ -468,9 +487,15 @@ void DialogStyleManager::OnCurrentCopy() {
CurrentList->GetSelections(selections); CurrentList->GetSelections(selections);
if (selections.empty()) return; if (selections.empty()) return;
DialogStyleEditor(this, styleMap[selections[0]], c, 0, true).ShowModal(); AssStyle *s = styleMap[selections[0]];
LoadCurrentStyles(c->ass); DialogStyleEditor editor(this, s, c, 0,
UpdateButtons(); unique_name(bind(&AssFile::GetStyle, c->ass, _1), s->name));
if (editor.ShowModal()) {
LoadCurrentStyles(c->ass);
CurrentList->SetStringSelection(editor.GetStyleName());
UpdateButtons();
}
} }
void DialogStyleManager::CopyToClipboard(wxListBox *list, std::vector<AssStyle*> v) { void DialogStyleManager::CopyToClipboard(wxListBox *list, std::vector<AssStyle*> v) {
@ -510,8 +535,7 @@ static void add_styles(Func1 name_checker, Func2 style_adder) {
while (st.HasMoreTokens()) { while (st.HasMoreTokens()) {
try { try {
AssStyle *s = new AssStyle(st.GetNextToken().Trim(true)); AssStyle *s = new AssStyle(st.GetNextToken().Trim(true));
while (name_checker(s->name)) s->name = unique_name(name_checker, s->name);
s->name = "Copy of " + s->name;
style_adder(s); style_adder(s);
} }
catch (...) { catch (...) {
@ -522,8 +546,8 @@ static void add_styles(Func1 name_checker, Func2 style_adder) {
void DialogStyleManager::PasteToCurrent() { void DialogStyleManager::PasteToCurrent() {
add_styles( add_styles(
bind(&AssFile::GetStyle, c->ass, std::tr1::placeholders::_1), bind(&AssFile::GetStyle, c->ass, _1),
bind(&AssFile::InsertStyle, c->ass, std::tr1::placeholders::_1)); bind(&AssFile::InsertStyle, c->ass, _1));
LoadCurrentStyles(c->ass); LoadCurrentStyles(c->ass);
c->ass->Commit(_("style paste"), AssFile::COMMIT_STYLES); c->ass->Commit(_("style paste"), AssFile::COMMIT_STYLES);
@ -531,8 +555,8 @@ void DialogStyleManager::PasteToCurrent() {
void DialogStyleManager::PasteToStorage() { void DialogStyleManager::PasteToStorage() {
add_styles( add_styles(
bind(&AssStyleStorage::GetStyle, &Store, std::tr1::placeholders::_1), bind(&AssStyleStorage::GetStyle, &Store, _1),
bind(&std::list<AssStyle*>::push_back, &Store.style, std::tr1::placeholders::_1)); bind(&std::list<AssStyle*>::push_back, &Store.style, _1));
Store.Save(CatalogList->GetString(CatalogList->GetSelection())); Store.Save(CatalogList->GetString(CatalogList->GetSelection()));
LoadStorageStyles(); LoadStorageStyles();
@ -540,14 +564,14 @@ void DialogStyleManager::PasteToStorage() {
} }
void DialogStyleManager::OnStorageNew() { void DialogStyleManager::OnStorageNew() {
DialogStyleEditor(this, 0, c, &Store, false).ShowModal(); DialogStyleEditor(this, 0, c, &Store).ShowModal();
Store.Save(CatalogList->GetString(CatalogList->GetSelection())); Store.Save(CatalogList->GetString(CatalogList->GetSelection()));
LoadStorageStyles(); LoadStorageStyles();
UpdateButtons(); UpdateButtons();
} }
void DialogStyleManager::OnCurrentNew() { void DialogStyleManager::OnCurrentNew() {
DialogStyleEditor(this,0, c, 0, false).ShowModal(); DialogStyleEditor(this, 0, c, 0).ShowModal();
LoadCurrentStyles(c->ass); LoadCurrentStyles(c->ass);
UpdateButtons(); UpdateButtons();
} }