Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpc-hc/SubtitleUpDlg.cpp')
-rw-r--r--src/mpc-hc/SubtitleUpDlg.cpp515
1 files changed, 515 insertions, 0 deletions
diff --git a/src/mpc-hc/SubtitleUpDlg.cpp b/src/mpc-hc/SubtitleUpDlg.cpp
new file mode 100644
index 000000000..da69e07d2
--- /dev/null
+++ b/src/mpc-hc/SubtitleUpDlg.cpp
@@ -0,0 +1,515 @@
+/*
+ * (C) 2016 see Authors.txt
+ *
+ * This file is part of MPC-HC.
+ *
+ * MPC-HC is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MPC-HC is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "stdafx.h"
+#include "SubtitleUpDlg.h"
+#include "SubtitlesProvider.h"
+#include "MainFrm.h"
+#include "AuthDlg.h"
+#include "PPageSubMisc.h"
+#include "mplayerc.h"
+
+// User Defined Window Messages
+enum {
+ UWM_UPLOAD = WM_USER + 100,
+ UWM_UPLOADING,
+ UWM_COMPLETED,
+ UWM_FINISHED,
+ UWM_FAILED,
+ UWM_CLEAR
+};
+
+CSubtitleUpDlg::CSubtitleUpDlg(CMainFrame* pParentWnd)
+ : CResizableDialog(IDD, pParentWnd)
+ , m_pMainFrame(pParentWnd)
+{
+}
+
+void CSubtitleUpDlg::DoDataExchange(CDataExchange* pDX)
+{
+ __super::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_LIST1, m_list);
+ DDX_Control(pDX, IDC_PROGRESS1, m_progress);
+ DDX_Control(pDX, IDC_STATUSBAR, m_status);
+}
+
+void CSubtitleUpDlg::SetStatusText(const CString& status, BOOL bPropagate/* = TRUE*/)
+{
+ m_status.SetText(status, 0, 0);
+ if (bPropagate) {
+ m_pMainFrame->SendStatusMessage(status, 5000);
+ }
+}
+
+BOOL CSubtitleUpDlg::OnInitDialog()
+{
+ __super::OnInitDialog();
+
+ m_progress.SetParent(&m_status);
+ m_progress.UpdateWindow();
+
+ int n = 0, curPos = 0;
+ CArray<int> columnWidth;
+
+ CString strColumnWidth(AfxGetApp()->GetProfileString(IDS_R_DLG_SUBTITLEUP, IDS_RS_DLG_SUBTITLEUP_COLWIDTH));
+ CString token(strColumnWidth.Tokenize(_T(","), curPos));
+ while (!token.IsEmpty()) {
+ if (_stscanf_s(token, L"%d", &n) == 1) {
+ columnWidth.Add(n);
+ token = strColumnWidth.Tokenize(_T(","), curPos);
+ } else {
+ throw 1;
+ }
+ }
+
+ m_list.SetExtendedStyle(m_list.GetExtendedStyle()
+ | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT
+ | LVS_EX_CHECKBOXES | LVS_EX_LABELTIP);
+
+ m_list.SetImageList(&m_pMainFrame->m_pSubtitlesProviders->GetImageList(), LVSIL_SMALL);
+
+ if (columnWidth.GetCount() != COL_TOTAL_COLUMNS) {
+ // default sizes
+ columnWidth.RemoveAll();
+ columnWidth.Add(120);
+ columnWidth.Add(75);
+ columnWidth.Add(250);
+ }
+
+ m_list.InsertColumn(COL_PROVIDER, ResStr(IDS_SUBDL_DLG_PROVIDER_COL), LVCFMT_LEFT, columnWidth[COL_PROVIDER]);
+ m_list.InsertColumn(COL_USERNAME, ResStr(IDS_SUBUL_DLG_USERNAME_COL), LVCFMT_LEFT, columnWidth[COL_USERNAME]);
+ m_list.InsertColumn(COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_COL), LVCFMT_LEFT, columnWidth[COL_STATUS]);
+
+ m_list.SetRedraw(FALSE);
+ m_list.DeleteAllItems();
+
+ int i = 0;
+ for (const auto& iter : m_pMainFrame->m_pSubtitlesProviders->Providers()) {
+ if (iter->Flags(SPF_UPLOAD)) {
+ int iItem = m_list.InsertItem((int)i++, CString(iter->Name().c_str()), iter->GetIconIndex());
+ m_list.SetItemText(iItem, COL_USERNAME, UTF8To16(iter->UserName().c_str()));
+ m_list.SetItemText(iItem, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_READY));
+ m_list.SetCheck(iItem, iter->Enabled(SPF_UPLOAD));
+ m_list.SetItemData(iItem, (DWORD_PTR)(iter.get()));
+ }
+ }
+
+ m_list.SetRedraw(TRUE);
+ m_list.Invalidate();
+ m_list.UpdateWindow();
+
+ UpdateData(FALSE);
+
+ AddAnchor(IDC_LIST1, TOP_LEFT, BOTTOM_RIGHT);
+ AddAnchor(IDC_BUTTON1, BOTTOM_RIGHT);
+ AddAnchor(IDC_BUTTON2, BOTTOM_RIGHT);
+ AddAnchor(IDOK, BOTTOM_RIGHT);
+ AddAnchor(IDC_STATUSBAR, BOTTOM_LEFT, BOTTOM_RIGHT);
+
+ const CSize s(500, 250);
+ SetMinTrackSize(s);
+ EnableSaveRestore(IDS_R_DLG_SUBTITLEUP, TRUE);
+
+ return TRUE;
+}
+
+BOOL CSubtitleUpDlg::PreTranslateMessage(MSG* pMsg)
+{
+ // Inhibit default handling for the Enter key when the list has the focus and an item is selected.
+ if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN
+ && pMsg->hwnd == m_list.GetSafeHwnd() && m_list.GetSelectedCount() > 0) {
+ return FALSE;
+ }
+
+ return __super::PreTranslateMessage(pMsg);
+}
+
+void CSubtitleUpDlg::OnOK()
+{
+ m_pMainFrame->m_pSubtitlesProviders->Upload(true);
+}
+
+void CSubtitleUpDlg::OnCancel()
+{
+ // Just hide the dialog, since it's modeless we don't want to call EndDialog
+ ShowWindow(SW_HIDE);
+}
+
+void CSubtitleUpDlg::OnAbort()
+{
+ m_pMainFrame->m_pSubtitlesProviders->Abort(SubtitlesThreadType(STT_UPLOAD));
+}
+
+void CSubtitleUpDlg::OnOptions()
+{
+ m_pMainFrame->ShowOptions(CPPageSubMisc::IDD);
+}
+
+void CSubtitleUpDlg::OnUpdateOk(CCmdUI* pCmdUI)
+{
+ bool fEnable = false;
+ for (int i = 0; !fEnable && i < m_list.GetItemCount(); ++i) {
+ fEnable = (m_list.GetCheck(i) == TRUE);
+ }
+
+ pCmdUI->Enable(fEnable);
+}
+
+void CSubtitleUpDlg::OnUpdateRefresh(CCmdUI* pCmdUI)
+{
+ bool fEnable = true;
+ pCmdUI->Enable(fEnable);
+}
+
+void CSubtitleUpDlg::OnSize(UINT nType, int cx, int cy)
+{
+ __super::OnSize(nType, cx, cy);
+
+ ArrangeLayout();
+
+ if (m_status && m_progress) {
+ // Reposition the progress control correctly!
+ CRect statusRect, buttonRect;
+ m_status.GetClientRect(&statusRect);
+ GetDlgItem(IDOK)->GetWindowRect(&buttonRect);
+ ScreenToClient(&buttonRect);
+ int parts[2] = { buttonRect.left - 2, -1 };
+ m_status.SetParts(2, parts);
+ m_status.GetRect(1, &statusRect);
+ statusRect.DeflateRect(1, 1, 1, 1);
+ m_progress.SetWindowPos(&wndTop, statusRect.left, statusRect.top, statusRect.Width(), statusRect.Height(),
+ SWP_NOACTIVATE | SWP_NOZORDER);
+ }
+}
+
+void CSubtitleUpDlg::OnDestroy()
+{
+ RemoveAllAnchors();
+
+ const CHeaderCtrl& pHC = *m_list.GetHeaderCtrl();
+ CString strColumnWidth;
+
+ for (int i = 0; i < pHC.GetItemCount(); ++i) {
+ int w = m_list.GetColumnWidth(i);
+ strColumnWidth.AppendFormat(L"%d,", w);
+ }
+ AfxGetApp()->WriteProfileString(IDS_R_DLG_SUBTITLEUP, IDS_RS_DLG_SUBTITLEUP_COLWIDTH, strColumnWidth);
+
+ __super::OnDestroy();
+}
+
+BOOL CSubtitleUpDlg::OnEraseBkgnd(CDC* pDC)
+{
+ EraseBackground(pDC);
+
+ return TRUE;
+}
+
+void CSubtitleUpDlg::DownloadSelectedSubtitles()
+{
+ POSITION pos = m_list.GetFirstSelectedItemPosition();
+ while (pos) {
+ int nItem = m_list.GetNextSelectedItem(pos);
+ if (nItem >= 0 && nItem < m_list.GetItemCount()) {
+ ListView_SetCheckState(m_list.GetSafeHwnd(), nItem, TRUE);
+ }
+ }
+ //OnOK();
+}
+
+// ON_UPDATE_COMMAND_UI dows not work for modless dialogs
+BEGIN_MESSAGE_MAP(CSubtitleUpDlg, CResizableDialog)
+ ON_WM_ERASEBKGND()
+ ON_WM_SIZE()
+ ON_COMMAND(IDC_BUTTON1, OnAbort)
+ ON_COMMAND(IDC_BUTTON2, OnOptions)
+ ON_UPDATE_COMMAND_UI(IDOK, OnUpdateOk)
+ ON_WM_DESTROY()
+ ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDoubleClickSubtitle)
+ ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeyPressedSubtitle)
+ ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRightClick)
+ ON_NOTIFY(LVN_ITEMCHANGING, IDC_LIST1, OnItemChanging)
+ ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemChanged)
+
+ ON_MESSAGE(UWM_UPLOAD, OnUpload)
+ ON_MESSAGE(UWM_UPLOADING, OnUploading)
+ ON_MESSAGE(UWM_COMPLETED, OnCompleted)
+ ON_MESSAGE(UWM_FINISHED, OnFinished)
+ ON_MESSAGE(UWM_FAILED, OnFailed)
+ ON_MESSAGE(UWM_CLEAR, OnClear)
+END_MESSAGE_MAP()
+
+void CSubtitleUpDlg::OnDoubleClickSubtitle(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMITEMACTIVATE pItemActivate = (LPNMITEMACTIVATE)(pNMHDR);
+
+ if (pItemActivate->iItem >= 0 && m_list.GetCheck(pItemActivate->iItem) != -1) {
+ //DownloadSelectedSubtitles();
+ }
+}
+
+void CSubtitleUpDlg::OnKeyPressedSubtitle(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
+
+ if (pLVKeyDow->wVKey == VK_RETURN) {
+ //DownloadSelectedSubtitles();
+ *pResult = TRUE;
+ }
+}
+
+void CSubtitleUpDlg::OnRightClick(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
+
+ if (lpnmlv->iItem >= 0 && lpnmlv->iSubItem >= 0) {
+ auto& s = AfxGetAppSettings();
+ SubtitlesProvider& provider = *(SubtitlesProvider*)(m_list.GetItemData(lpnmlv->iItem));
+
+ enum {
+ SET_CREDENTIALS = 0x1000,
+ RESET_CREDENTIALS,
+ MOVE_UP,
+ MOVE_DOWN,
+ OPEN_URL
+ };
+
+ CMenu m;
+ m.CreatePopupMenu();
+ m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) ? MF_ENABLED : MF_DISABLED), SET_CREDENTIALS,
+ ResStr(IDS_SUBMENU_SETUP));
+ m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) && !provider.UserName().empty() ? MF_ENABLED : MF_DISABLED),
+ RESET_CREDENTIALS, ResStr(IDS_SUBMENU_RESET));
+ m.AppendMenu(MF_SEPARATOR);
+ m.AppendMenu(MF_STRING | (lpnmlv->iItem > 0 ? MF_ENABLED : MF_DISABLED), MOVE_UP, ResStr(IDS_SUBMENU_MOVEUP));
+ m.AppendMenu(MF_STRING | (lpnmlv->iItem < m_list.GetItemCount() - 1 ? MF_ENABLED : MF_DISABLED), MOVE_DOWN,
+ ResStr(IDS_SUBMENU_MOVEDOWN));
+ m.AppendMenu(MF_SEPARATOR);
+ m.AppendMenu(MF_STRING | MF_ENABLED, OPEN_URL, ResStr(IDS_SUBMENU_OPENURL));
+
+ CPoint pt = lpnmlv->ptAction;
+ ::MapWindowPoints(lpnmlv->hdr.hwndFrom, HWND_DESKTOP, &pt, 1);
+
+ switch (m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, pt.x, pt.y, this)) {
+ case OPEN_URL:
+ provider.OpenUrl();
+ break;
+ case SET_CREDENTIALS: {
+ CString szUser(UTF8To16(provider.UserName().c_str()));
+ CString szPass(UTF8To16(provider.Password().c_str()));
+ CString szDomain(provider.Name().c_str());
+ if (ERROR_SUCCESS == PromptForCredentials(GetSafeHwnd(),
+ ResStr(IDS_SUB_CREDENTIALS_TITLE),
+ ResStr(IDS_SUB_CREDENTIALS_MSG) + CString(provider.Url().c_str()),
+ szDomain, szUser, szPass, /*&bSave*/nullptr)) {
+ provider.UserName((const char*)UTF16To8(szUser));
+ provider.Password((const char*)UTF16To8(szPass));
+ m_list.SetItemText(lpnmlv->iItem, 1, szUser);
+ s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str());
+ s.SaveSettings();
+ }
+ break;
+ }
+ case RESET_CREDENTIALS:
+ provider.UserName("");
+ provider.Password("");
+ m_list.SetItemText(lpnmlv->iItem, 1, _T(""));
+ s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str());
+ s.SaveSettings();
+ break;
+ case MOVE_UP: {
+ m_pMainFrame->m_pSubtitlesProviders->MoveUp(lpnmlv->iItem);
+ ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd());
+ s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str());
+ s.SaveSettings();
+ break;
+ }
+ case MOVE_DOWN: {
+ m_pMainFrame->m_pSubtitlesProviders->MoveDown(lpnmlv->iItem);
+ ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd());
+ s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str());
+ s.SaveSettings();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+int CALLBACK CSubtitleUpDlg::SortCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+ CListCtrl& list = *(CListCtrl*)CListCtrl::FromHandle((HWND)lParamSort);
+ size_t left = ((SubtitlesProvider*)list.GetItemData((int)lParam1))->Index();
+ size_t right = ((SubtitlesProvider*)list.GetItemData((int)lParam2))->Index();
+ return int(left - right);
+}
+
+void CSubtitleUpDlg::OnItemChanging(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)(pNMHDR);
+
+ if (pNMLV->uOldState == 0 && pNMLV->uNewState == 0x1000 && pNMLV->lParam) {
+ *pResult = TRUE;
+ }
+}
+
+void CSubtitleUpDlg::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)(pNMHDR);
+
+ if (((pNMLV->uOldState | pNMLV->uNewState) == 0x3000) && pNMLV->lParam) {
+ SubtitlesProvider& _provider = *(SubtitlesProvider*)pNMLV->lParam;
+ _provider.Enabled(SPF_UPLOAD, pNMLV->uNewState == 0x2000 ? TRUE : FALSE);
+ auto& s = AfxGetAppSettings();
+ s.strSubtitlesProviders = CString(m_pMainFrame->m_pSubtitlesProviders->WriteSettings().c_str());
+ s.SaveSettings();
+ }
+
+ UpdateDialogControls(this, FALSE);
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnUpload(WPARAM wParam, LPARAM /*lParam*/)
+{
+ INT _nCount = (INT)wParam;
+
+ SetStatusText(ResStr(IDS_SUBUL_DLG_UPLOADING));
+ GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
+
+ m_progress.SetRange32(0, _nCount);
+ m_progress.SetStep(1);
+ m_progress.SetPos(0);
+
+ return S_OK;
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnUploading(WPARAM /*wParam*/, LPARAM lParam)
+{
+ SubtitlesProvider& _provider = *(SubtitlesProvider*)lParam;
+
+ for (int i = 0; i < m_list.GetItemCount(); ++i) {
+ SubtitlesProvider& iter = *(SubtitlesProvider*)m_list.GetItemData(i);
+ if (&iter == &_provider) {
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_UPLOADING));
+ }
+ }
+ UpdateWindow();
+
+ return S_OK;
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnCompleted(WPARAM wParam, LPARAM lParam)
+{
+ SRESULT _result = (SRESULT)wParam;
+ SubtitlesProvider& _provider = *(SubtitlesProvider*)lParam;
+
+ m_progress.StepIt();
+
+ for (int i = 0; i < m_list.GetItemCount(); ++i) {
+ SubtitlesProvider& iter = *(SubtitlesProvider*)m_list.GetItemData(i);
+ if (&iter == &_provider) {
+ switch (_result) {
+ case SR_SUCCEEDED:
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_UPLOADED));
+ break;
+ case SR_FAILED:
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_FAILED));
+ break;
+ case SR_ABORTED:
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_ABORTED));
+ break;
+ case SR_EXISTS:
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_ALREADYEXISTS));
+ break;
+ }
+ }
+ }
+ UpdateWindow();
+
+ return S_OK;
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnFinished(WPARAM wParam, LPARAM /*lParam*/)
+{
+ BOOL _bAborted = (BOOL)wParam;
+
+ if (_bAborted == FALSE) {
+ SetStatusText(StrRes(IDS_SUBUL_DLG_UPLOADED));
+ } else {
+ SetStatusText(StrRes(IDS_SUBUL_DLG_ABORTED));
+ }
+
+ GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
+ UpdateWindow();
+
+ return S_OK;
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnFailed(WPARAM /*wParam*/, LPARAM /*lParam*/)
+{
+ SetStatusText(StrRes(IDS_SUBUL_DLG_FAILED));
+
+ return S_OK;
+}
+
+afx_msg LRESULT CSubtitleUpDlg::OnClear(WPARAM /*wParam*/, LPARAM /*lParam*/)
+{
+ m_progress.SetPos(0);
+ SetStatusText(_T(""));
+
+ for (int i = 0; i < m_list.GetItemCount(); ++i) {
+ SubtitlesProvider& iter = *(SubtitlesProvider*)m_list.GetItemData(i);
+ if (iter.Flags(SPF_UPLOAD)) {
+ m_list.SetItemText(i, COL_STATUS, ResStr(IDS_SUBUL_DLG_STATUS_READY));
+ }
+ }
+
+ GetDlgItem(IDC_BUTTON2)->ShowWindow(FALSE);
+ GetDlgItem(IDC_BUTTON1)->ShowWindow(TRUE);
+ GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
+ UpdateWindow();
+
+ return S_OK;
+}
+
+void CSubtitleUpDlg::DoUpload(INT _nCount)
+{
+ SendMessage(UWM_UPLOAD, (WPARAM)_nCount, (LPARAM)nullptr);
+}
+void CSubtitleUpDlg::DoUploading(std::shared_ptr<SubtitlesProvider> _provider)
+{
+ SendMessage(UWM_UPLOADING, (WPARAM)nullptr, (LPARAM)_provider.get());
+}
+void CSubtitleUpDlg::DoCompleted(SRESULT _result, std::shared_ptr<SubtitlesProvider> _provider)
+{
+ SendMessage(UWM_COMPLETED, (WPARAM)_result, (LPARAM)_provider.get());
+}
+void CSubtitleUpDlg::DoFinished(BOOL _bAborted)
+{
+ SendMessage(UWM_FINISHED, (WPARAM)_bAborted, (LPARAM)nullptr);
+}
+void CSubtitleUpDlg::DoFailed()
+{
+ SendMessage(UWM_FAILED, (WPARAM)nullptr, (LPARAM)nullptr);
+}
+void CSubtitleUpDlg::DoClear()
+{
+ SendMessage(UWM_CLEAR, (WPARAM)nullptr, (LPARAM)nullptr);
+}