OSDN Git Service

HTTPリクエストパーサがフィールド値のクォートで遷移を間違えていた問題を修正。
[wordring-tm/wordring-tm.git] / proxy / tmeditorwidget.cpp
index f9489ce..daf44a5 100644 (file)
@@ -25,6 +25,7 @@
 #include <QBrush>
 #include <QFont>
 #include <QMimeData>
+#include <QLocale>
 
 #include <QList>
 
@@ -34,7 +35,6 @@
 
 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)
@@ -44,7 +44,7 @@ TM::EditorWidget::EditorWidget(Settings *settings, Service *service, QWidget *pa
        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);
@@ -57,11 +57,11 @@ TM::EditorWidget::EditorWidget(Settings *settings, Service *service, QWidget *pa
        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);
@@ -90,20 +90,24 @@ void TM::EditorWidget::attach(SocketConnection *socket)
        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;
@@ -112,23 +116,10 @@ void TM::EditorWidget::detach(SocketConnection *)
 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();
 }
 
@@ -137,7 +128,6 @@ bool TM::EditorWidget::edit_mode()
  */
 void TM::EditorWidget::set_link_mode(bool mode)
 {
-       QMutexLocker lock(&m_mutex);
        bool old_mode = m_link->isChecked();
        if(old_mode == mode) return;
 
@@ -149,7 +139,6 @@ void TM::EditorWidget::set_link_mode(bool mode)
  */
 bool TM::EditorWidget::link_mode()
 {
-       QMutexLocker lock(&m_mutex);
        return m_link->isChecked();
 }
 
@@ -158,7 +147,6 @@ bool TM::EditorWidget::link_mode()
  */
 void TM::EditorWidget::set_link_mode_disabled(bool disable)
 {
-       QMutexLocker lock(&m_mutex);
        m_link->setDisabled(disable);
 }
 
@@ -167,7 +155,6 @@ void TM::EditorWidget::set_link_mode_disabled(bool disable)
  */
 int TM::EditorWidget::source_language()
 {
-       QMutexLocker lock(&m_mutex);
        return m_slang->data().toInt();
 }
 
@@ -176,19 +163,54 @@ int TM::EditorWidget::source_language()
  */
 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());
 }
 
 /*!
@@ -199,14 +221,19 @@ void TM::EditorWidget::save_sentence(int segment_id, int index)
  */
 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);
@@ -227,9 +254,12 @@ void TM::EditorWidget::onEditModeTriggered(bool)
        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);
 }
@@ -252,6 +282,10 @@ void TM::EditorWidget::onSourceLanguageTriggered(bool)
        assert(saction);
        m_slang->setIcon(saction->icon());
        m_slang->setData(saction->data());
+
+       m_settings->setValue("Widget/default_source_language", saction->data());
+
+       emit sourceLanguageChanged();
 }
 
 /*!
@@ -263,6 +297,10 @@ void TM::EditorWidget::onTargetLanguageTriggered(bool)
        assert(taction);
        m_tlang->setIcon(taction->icon());
        m_tlang->setData(taction->data());
+
+       m_settings->setValue("Widget/default_target_language", taction->data());
+
+       emit targetLanguageChanged();
 }
 
 /*!
@@ -398,17 +436,17 @@ Text::pointer TM::SourcePanel::sentence() { return source_sentence(); }
 
 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()
@@ -796,6 +834,9 @@ void TM::Editor::do_panel_enter(SourcePanel *panel)
        assert(tp);
        tp->show();
        if(can_link_mode()) parent_editor_widget()->set_link_mode_disabled(false);
+
+       // 編集ウィジェットに通知。
+       parent_editor_widget()->do_panel_entered(panel);
 }
 
 /*!
@@ -810,14 +851,22 @@ void TM::Editor::do_panel_leave(SourcePanel *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);
 }
 
 /*!