#include <QBrush>
#include <QFont>
#include <QMimeData>
+#include <QLocale>
#include <QList>
TM::EditorWidget::EditorWidget(Settings *settings, Service *service, QWidget *parent)
: QWidget(parent)
- , m_mutex(QMutex::Recursive)
, m_service(service)
, m_settings(settings)
, m_http_port(80)
vlayout->setSpacing(4);
vlayout->setContentsMargins(0, 0, 0, 0);
- m_toolbar = new QToolBar("Editor", this);
+ m_toolbar = new QToolBar("editor", this);
m_edit_mode = new QAction(QIcon(":/edit.png"), "edit", this);
m_edit_mode->setCheckable(true);
m_toolbar->addAction(m_link);
connect(m_link, SIGNAL(triggered(bool)), this, SLOT(onLinkModeTriggered(bool)));
- m_slang = new QAction("&Source", this);
- m_slang->setDisabled(true);
+ m_slang = new QAction("&source", this);
+ //m_slang->setDisabled(true);
m_slang->setMenu(new QMenu(this));
- m_tlang = new QAction("&Target", this);
- m_tlang->setDisabled(true);
+ m_tlang = new QAction("&target", this);
+ //m_tlang->setDisabled(true);
m_tlang->setMenu(new QMenu(this));
m_toolbar->addAction(m_slang);
m_toolbar->addAction(m_tlang);
if(m_socket == socket) return;
if(m_socket) detach(m_socket);
- QMutexLocker lock(&m_mutex);
m_socket = socket;
- connect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
+// connect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
set_link_mode_disabled(true);
+ connect(this, SIGNAL(sourceLanguageChanged()), m_socket, SLOT(changeLanguage()));
+ connect(this, SIGNAL(targetLanguageChanged()), m_socket, SLOT(changeLanguage()));
}
/*!
* \brief ブラウザ上でドキュメントがフォーカスを取得することで、
* 現在のSocketConnectionがフォーカスを失った時に呼び出されます。
*/
-void TM::EditorWidget::detach(SocketConnection *)
+void TM::EditorWidget::detach(SocketConnection *connection)
{
- QMutexLocker lock(&m_mutex);
- disconnect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
+ if(m_socket != connection) return;
+
+// disconnect(this, SIGNAL(editModeChanged(bool)), m_socket, SLOT(changeEditMode(bool)));
+ disconnect(this, SIGNAL(sourceLanguageChanged()), m_socket, SLOT(changeLanguage()));
+ disconnect(this, SIGNAL(targetLanguageChanged()), m_socket, SLOT(changeLanguage()));
m_edit->clear();
m_socket = nullptr;
void TM::EditorWidget::set_http_port(quint16 http_port) { m_http_port = http_port; }
/*!
- * \brief 編集モードを変更します。
- */
-void TM::EditorWidget::set_edit_mode(bool mode)
-{
- QMutexLocker lock(&m_mutex);
- bool old_mode = m_edit_mode->isChecked();
- if(old_mode == mode) return;
-
- m_edit_mode->setChecked(mode);
-}
-
-/*!
* \brief 編集モードの場合trueを返します。
*/
bool TM::EditorWidget::edit_mode()
{
- QMutexLocker lock(&m_mutex);
return m_edit_mode->isChecked();
}
*/
void TM::EditorWidget::set_link_mode(bool mode)
{
- QMutexLocker lock(&m_mutex);
bool old_mode = m_link->isChecked();
if(old_mode == mode) return;
*/
bool TM::EditorWidget::link_mode()
{
- QMutexLocker lock(&m_mutex);
return m_link->isChecked();
}
*/
void TM::EditorWidget::set_link_mode_disabled(bool disable)
{
- QMutexLocker lock(&m_mutex);
m_link->setDisabled(disable);
}
*/
int TM::EditorWidget::source_language()
{
- QMutexLocker lock(&m_mutex);
return m_slang->data().toInt();
}
*/
int TM::EditorWidget::target_language()
{
- QMutexLocker lock(&m_mutex);
return m_tlang->data().toInt();
}
void TM::EditorWidget::set_segment(TextSegment::pointer segment)
{
- QMutexLocker lock(&m_mutex);
m_edit->set_segment(segment);
}
-void TM::EditorWidget::save_sentence(int segment_id, int index)
+/*!
+ * \brief SocketConnectionにセンテンスの保存を要求します。
+ * \param segment_id セグメントのID
+ * \param index センテンスのインデックス
+ *
+ * 結果としてデータベース、サーバ、ブラウザを更新します。
+ */
+void TM::EditorWidget::save_sentence(TextSentence::pointer text_sentence)
{
- m_socket->save_sentence(segment_id, index);
+ m_socket->save_sentence(text_sentence);
+}
+
+/*!
+ * \brief SocketConnectionにセンテンスのクリアを要求します。
+ * \param segment_id セグメントのID
+ * \param index センテンスのインデックス
+ *
+ * 結果としてデータベース、サーバ、ブラウザを更新します。
+ *
+ * チケット #35438 訳文を元に戻せない 対応
+ */
+void TM::EditorWidget::remove_sentence(TextSentence::pointer text_sentence)
+{
+ m_socket->remove_sentence(text_sentence);
+}
+
+void TM::EditorWidget::do_panel_entered(SourcePanel *panel)
+{
+ //assert(m_socket);
+ if(!m_socket) return;
+
+ m_socket->segment_list()->set_current_sentence(panel->text_sentence());
+}
+
+void TM::EditorWidget::do_panel_leaved(SourcePanel *)
+{
+ assert(m_socket);
+ if(!m_socket) return;
+
+ m_socket->segment_list()->set_current_sentence(TextSentence::pointer());
}
/*!
*/
void TM::EditorWidget::onLanguageLoaded(int code, QString name, QIcon icon)
{
- QString dslanguage = m_settings->value("Widget/defaultSourceLanguage", "English").toString();
- QString tslanguage = m_settings->value("Widget/defaultSourceLanguage", "Japanese").toString();
- if(dslanguage == name)
+ if(!m_settings->contains("Widget/default_source_language"))
+ m_settings->setValue("Widget/default_source_language", QLocale::Language::English);
+ if(!m_settings->contains("Widget/default_target_language"))
+ m_settings->setValue("Widget/default_target_language", QLocale::Language::Japanese);
+
+ int scode = m_settings->value("Widget/default_source_language").toInt();
+ int tcode = m_settings->value("Widget/default_target_language").toInt();
+ if(code == scode)
{
m_slang->setIcon(icon);
m_slang->setData(code);
}
- if(tslanguage == name)
+ if(code == tcode)
{
m_tlang->setIcon(icon);
m_tlang->setData(code);
QAction *edit_mode = qobject_cast<QAction*>(sender());
bool checked = edit_mode->isChecked();
m_link->setDisabled(true);
- m_slang->setDisabled(!checked);
- m_tlang->setDisabled(!checked);
- emit editModeChanged(checked);
+ //m_slang->setDisabled(!checked);
+ //m_tlang->setDisabled(!checked);
+ //emit editModeChanged(checked);
+
+ m_service->change_edit_mode(checked);
+ if(!checked) m_edit->clear();
m_edit->set_edit_mode(checked);
}
assert(saction);
m_slang->setIcon(saction->icon());
m_slang->setData(saction->data());
+
+ m_settings->setValue("Widget/default_source_language", saction->data());
+
+ emit sourceLanguageChanged();
}
/*!
assert(taction);
m_tlang->setIcon(taction->icon());
m_tlang->setData(taction->data());
+
+ m_settings->setValue("Widget/default_target_language", taction->data());
+
+ emit targetLanguageChanged();
}
/*!
Text::pointer TM::SourcePanel::source_sentence()
{
- return m_text_sentence->source_sentence();
+ return m_text_sentence->ssentence();
}
Text::pointer TM::SourcePanel::target_sentence()
{
- return m_text_sentence->target_sentence();
+ return m_text_sentence->tsentence();
}
void TM::SourcePanel::set_target_sentence(Text::pointer sentence)
{
- m_text_sentence->set_target_sentence(sentence);
+ m_text_sentence->set_tsentence(sentence);
}
TM::TextSentence::pointer TM::SourcePanel::text_sentence()
assert(tp);
tp->show();
if(can_link_mode()) parent_editor_widget()->set_link_mode_disabled(false);
+
+ // 編集ウィジェットに通知。
+ parent_editor_widget()->do_panel_entered(panel);
}
/*!
set_link_mode(false);
parent_editor_widget()->set_link_mode_disabled(true);
- if(!tp->is_text_saved())
+ TextSentence::pointer text_sentence = panel->text_sentence();
+ // チケット #35438 訳文を元に戻せない
+ bool need_clear_target = (!tp->is_text_saved()) && tp->is_text_dirty() && tp->is_empty();
+ if(need_clear_target)
+ {
+ parent_editor_widget()->remove_sentence(text_sentence);
+ }
+ else if(!tp->is_text_saved())
{
if(tp->is_text_dirty()) divide_target_sentence(panel);
- int index = panel->index();
if(!tp->is_empty())
- parent_editor_widget()->save_sentence(m_segment_id, index);
+ parent_editor_widget()->save_sentence(text_sentence);
tp->set_text_saved(true);
}
+ // 編集ウィジェットに通知。
+ parent_editor_widget()->do_panel_leaved(panel);
}
/*!