diff --git a/src/base/utils.cpp b/src/base/utils.cpp index d34de607..43a4fbf0 100755 --- a/src/base/utils.cpp +++ b/src/base/utils.cpp @@ -416,6 +416,16 @@ bool Utils::hasSelperSupport() return false; } +bool Utils::hasAppStore() +{ + const QStringList list = getSystemManualList(); + if (list.contains("deepin-app-store")) { + return true; + } else { + return false; + } +} + //p表示桌面专业版,h表示个人版,d表示社区版 //s表示默认服务器版,e表示服务器企业版,eu表示服务器欧拉版,i表示服务器行业版,klu表示KelvinU项目版本,pgv表示PanguV项目版本。 QStringList Utils::systemToOmit(Dtk::Core::DSysInfo::UosEdition type) diff --git a/src/base/utils.h b/src/base/utils.h index adfd0a36..02533610 100755 --- a/src/base/utils.h +++ b/src/base/utils.h @@ -41,6 +41,7 @@ class Utils : public QObject static QStringList getSystemManualDir(); static QList sortAppList(QMultiMap map); static bool hasSelperSupport(); + static bool hasAppStore(); static QStringList systemToOmit(Dtk::Core::DSysInfo::UosEdition); static bool activeWindow(quintptr winId); static QString regexp_label(const QString &strtext, const QString &strpatter); diff --git a/src/view/i18n_proxy.cpp b/src/view/i18n_proxy.cpp index 43412189..0ebb6632 100644 --- a/src/view/i18n_proxy.cpp +++ b/src/view/i18n_proxy.cpp @@ -28,7 +28,8 @@ QVariantHash I18nProxy::getSentences() const {"ResultNumSuffixs", QObject::tr(" results")}, {"ClicktoView", QObject::tr("Click to view ")}, {"ViewAll", QObject::tr("View all")}, - {"Support", QObject::tr("Support")} + {"Support", QObject::tr("Support")}, + {"AppStore", QObject::tr("App Store")} }; return result; diff --git a/src/view/manual_proxy.cpp b/src/view/manual_proxy.cpp index f2be7760..201b727c 100644 --- a/src/view/manual_proxy.cpp +++ b/src/view/manual_proxy.cpp @@ -113,6 +113,12 @@ bool ManualProxy::hasSelperSupport() return b; } +bool ManualProxy::hasAppStore() +{ + bool b = Utils::hasAppStore(); + return b; +} + /** * @brief ManualProxy::finishChannel * 完成channel对象与Qt对象绑定后调用WebWindow中的onChannelFinish方法 @@ -131,6 +137,11 @@ void ManualProxy::supportClick() emit supportBeClick(); } +void ManualProxy::appStoreClick() +{ + emit appStoreBeClick(); +} + bool ManualProxy::bIsLongSon() { return Utils::judgeLoongson(); diff --git a/src/view/manual_proxy.h b/src/view/manual_proxy.h index db54f41d..a081851b 100644 --- a/src/view/manual_proxy.h +++ b/src/view/manual_proxy.h @@ -19,6 +19,7 @@ class ManualProxy : public QObject void channelInit(); void searchEditTextisEmpty(); void supportBeClick(); + void appStoreBeClick(); //发送页面加载完成时间 void startFinish(qint64); void updateLabel(); @@ -32,8 +33,10 @@ public slots: void setApplicationState(const QString &appName); QStringList getUsedAppList(); bool hasSelperSupport(); + bool hasAppStore(); void finishChannel(); void supportClick(); + void appStoreClick(); bool bIsLongSon(); void showUpdateLabel(); QString appToPath(const QString &appName); diff --git a/src/view/web_window.cpp b/src/view/web_window.cpp index be26680f..472c2278 100644 --- a/src/view/web_window.cpp +++ b/src/view/web_window.cpp @@ -286,6 +286,16 @@ void WebWindow::HelpSupportTriggered(bool bActiontrigger) } } +void WebWindow::appStoreTriggered() +{ + if (!Utils::hasAppStore()) + return; + + QProcess process; + process.startDetached("deepin-home-appstore-client"); + process.waitForFinished(); +} + void WebWindow::slotUpdateLabel() { sendMessage(QIcon(":/common/images/ok.svg"), QObject::tr("The content was updated")); @@ -463,7 +473,7 @@ bool WebWindow::eventFilter(QObject *watched, QEvent *event) if (event->type() == QEvent::FontChange && watched == this) { if (this->settings_proxy_) { qDebug() << "eventFilter QEvent::FontChange"; - auto fontInfo = this->fontInfo(); + QFontInfo fontInfo = this->fontInfo(); emit this->settings_proxy_->fontChangeRequested(fontInfo.family(), fontInfo.pixelSize()); } @@ -709,6 +719,7 @@ void WebWindow::initWebView() connect(manual_proxy_, &ManualProxy::WidgetLower, this, &WebWindow::lower); connect(manual_proxy_, &ManualProxy::updateLabel, this, &WebWindow::slotUpdateLabel); connect(manual_proxy_, &ManualProxy::supportBeClick, this, [this] { this->HelpSupportTriggered(); }); + connect(manual_proxy_, &ManualProxy::appStoreBeClick, this, [this] { this->appStoreTriggered(); }); //web主页html路径 const QFileInfo info(kIndexPage); diff --git a/src/view/web_window.h b/src/view/web_window.h index a6c2a3bc..954fbfa0 100644 --- a/src/view/web_window.h +++ b/src/view/web_window.h @@ -82,6 +82,7 @@ public slots: void settingContextMenu(); QRect hasWidgetRect(QWidget *); void HelpSupportTriggered(bool bActiontrigger = false); + void appStoreTriggered(); QString app_name_; QString keyword_; diff --git a/src/web/toManual/js/App.js b/src/web/toManual/js/App.js index 898294c8..07c2caf6 100755 --- a/src/web/toManual/js/App.js +++ b/src/web/toManual/js/App.js @@ -23,6 +23,7 @@ global.lastUrlBeforeSearch = '/'; global.lastHistoryIndex = 0; global.lastAction = 'PUSH'; global.isShowHelperSupport = false; +global.isShowAppStore = false; global.scrollBehavior = 'smooth'; global.bIsReload = false; // global.gHistoryGo = 0; @@ -67,7 +68,36 @@ const Support = ({ text }) => { onMouseLeave={() => setIsHovered(false)} style={{ userSelect: 'none' }} > - + + {isHovered &&
{tooltipText}
} + :
+ ); +}; + +const AppStore = ({ text }) => { + const [isHovered, setIsHovered] = useState(false); + const [tooltipText, setTooltipText] = useState(text); + + useEffect(() => { + if (isHovered) { + setTooltipText(global.i18n['AppStore']); + } + }, [isHovered]); + + useEffect(() => { + if (!isHovered) { + setTooltipText(''); + } + }, [isHovered]); + + return ( + global.isShowAppStore ?
global.qtObjects.manual.appStoreClick()} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + style={{ userSelect: 'none' }} + > + {isHovered &&
{tooltipText}
}
:
); @@ -103,6 +133,9 @@ class App extends React.Component { global.qtObjects.manual.hasSelperSupport(bFlag => { global.isShowHelperSupport = bFlag; }); + global.qtObjects.manual.hasAppStore(bFlag => { + global.isShowAppStore = bFlag; + }); global.qtObjects.manual.bIsLongSon(isLongSon => { if (isLongSon) { @@ -341,6 +374,11 @@ class App extends React.Component { var pathList = pathName.split("/"); var cKeyword = ''; + if (pathName.includes("common-application-libraries")) + document.documentElement.style.setProperty(`--app-store-visibility`, 'visible'); + else + document.documentElement.style.setProperty(`--app-store-visibility`, 'hidden'); + //search页===>/search/:keyword //open页=====>/open/:file/:hash?/:key? if (pathList.length == 3) { @@ -540,6 +578,8 @@ class App extends React.Component { if (toB.length == 1) toB = '0' + toB; toRGB = "#" + toR + toG + toB; document.documentElement.style.setProperty(`--nav-hash-press-color`, toRGB); + // toRGB = "rgba(" + pR + ", " + pG + ", " + pB + ", " + "0.4)"; + // document.documentElement.style.setProperty(`--active-shadow-color`, toRGB); } global.setWordFontfamily = (strFontFamily) => { @@ -642,6 +682,8 @@ class App extends React.Component { console.log('Null'); } + document.documentElement.style.setProperty(`--app-store-visibility`, 'hidden'); + const windowWidth = window.innerWidth; var leftDistance = windowWidth - 70 + 'px'; if (windowWidth > 1630 + 234) { @@ -749,6 +791,8 @@ class App extends React.Component { )} + + ); diff --git a/src/web/toManual/js/main.jsx b/src/web/toManual/js/main.jsx index 00f52fc1..ba3548f5 100755 --- a/src/web/toManual/js/main.jsx +++ b/src/web/toManual/js/main.jsx @@ -30,7 +30,6 @@ export default class Main extends Component { } console.log("main init==>file:", file, " hash:", hash, " key:", key); - global.hash = hash; var filePath = file; diff --git a/src/web/toManual/sass/app.scss b/src/web/toManual/sass/app.scss index 94df8179..8c697436 100644 --- a/src/web/toManual/sass/app.scss +++ b/src/web/toManual/sass/app.scss @@ -131,4 +131,55 @@ div { visibility: visible; } } + + .store-div { + width: 48px; + height: 48px; + border-radius: 48px; + background-color: var(--nav-hash-word-color); + display: inline-block; + position: fixed; + left: var(--support-position); + bottom: 83px; + z-index: 10; + visibility: var(--app-store-visibility); + // box-shadow: 0px 4px 6px var(--active-shadow-color); + + &:hover { + cursor: pointer; + background-color: var(--nav-hash-hover-color); + } + &:active { + // background-color: blue; + background-color: var(--nav-hash-press-color); + } + + .store { + position: absolute; + width: 20px; + height: 21px; + top: 14px; + left: 14px; + } + + .tooltip-wrapper { + position: absolute; + visibility: hidden; + white-space: nowrap; + right: -15px; + bottom: -23px; + background-color: var(--tips-background-color); + color: var(--nav-hove-word-color); + max-width: 500px; + padding: 2px 5px; + border-radius: 8px; + border: 1px solid var(--tips-border-color); + font-family: var(--nav-world-font-family); + box-shadow: 0px 3px 20px var(--tips-shadow-color); + } + + .tooltip-wrapper.show { + visibility: visible; + } + } } \ No newline at end of file diff --git a/src/web_dist/toManual/index.css b/src/web_dist/toManual/index.css index 759e1c7d..ca4451e7 100644 --- a/src/web_dist/toManual/index.css +++ b/src/web_dist/toManual/index.css @@ -68,6 +68,44 @@ div { box-shadow: 0px 3px 20px var(--tips-shadow-color); } div .support-div .tooltip-wrapper.show { visibility: visible; } + div .store-div { + width: 48px; + height: 48px; + border-radius: 48px; + background-color: var(--nav-hash-word-color); + display: inline-block; + position: fixed; + left: var(--support-position); + bottom: 83px; + z-index: 10; + visibility: var(--app-store-visibility); } + div .store-div:hover { + cursor: pointer; + background-color: var(--nav-hash-hover-color); } + div .store-div:active { + background-color: var(--nav-hash-press-color); } + div .store-div .store { + position: absolute; + width: 20px; + height: 21px; + top: 14px; + left: 14px; } + div .store-div .tooltip-wrapper { + position: absolute; + visibility: hidden; + white-space: nowrap; + right: -15px; + bottom: -23px; + background-color: var(--tips-background-color); + color: var(--nav-hove-word-color); + max-width: 500px; + padding: 2px 5px; + border-radius: 8px; + border: 1px solid var(--tips-border-color); + font-family: var(--nav-world-font-family); + box-shadow: 0px 3px 20px var(--tips-shadow-color); } + div .store-div .tooltip-wrapper.show { + visibility: visible; } @charset "UTF-8"; .Triangle, #article .t_center_down::after, #article .t_center_up::after, #article .t_right_down::after, #article .t_right_up::after, #article .t_left_down::after, #article .t_left_up::after { diff --git a/src/web_dist/toManual/index.js b/src/web_dist/toManual/index.js index 4da59f8b..dbf73d98 100644 --- a/src/web_dist/toManual/index.js +++ b/src/web_dist/toManual/index.js @@ -56,6 +56,7 @@ global.lastUrlBeforeSearch = '/'; global.lastHistoryIndex = 0; global.lastAction = 'PUSH'; global.isShowHelperSupport = false; +global.isShowAppStore = false; global.scrollBehavior = 'smooth'; global.bIsReload = false; // global.gHistoryGo = 0; @@ -116,7 +117,55 @@ var Support = function Support(_ref) { }, style: { userSelect: 'none' } }, - _react2.default.createElement('img', { className: 'support', src: './pic.svg' }), + _react2.default.createElement('img', { className: 'support', src: './support.svg' }), + isHovered && _react2.default.createElement( + 'div', + { className: 'tooltip-wrapper ' + (isHovered ? 'show' : '') }, + tooltipText + ) + ) : _react2.default.createElement('div', null); +}; + +var AppStore = function AppStore(_ref2) { + var text = _ref2.text; + + var _useState5 = (0, _react.useState)(false), + _useState6 = _slicedToArray(_useState5, 2), + isHovered = _useState6[0], + setIsHovered = _useState6[1]; + + var _useState7 = (0, _react.useState)(text), + _useState8 = _slicedToArray(_useState7, 2), + tooltipText = _useState8[0], + setTooltipText = _useState8[1]; + + (0, _react.useEffect)(function () { + if (isHovered) { + setTooltipText(global.i18n['AppStore']); + } + }, [isHovered]); + + (0, _react.useEffect)(function () { + if (!isHovered) { + setTooltipText(''); + } + }, [isHovered]); + + return global.isShowAppStore ? _react2.default.createElement( + 'div', + { className: 'store-div', + onClick: function onClick() { + return global.qtObjects.manual.appStoreClick(); + }, + onMouseEnter: function onMouseEnter() { + return setIsHovered(true); + }, + onMouseLeave: function onMouseLeave() { + return setIsHovered(false); + }, + style: { userSelect: 'none' } + }, + _react2.default.createElement('img', { className: 'store', src: './shop.svg' }), isHovered && _react2.default.createElement( 'div', { className: 'tooltip-wrapper ' + (isHovered ? 'show' : '') }, @@ -165,6 +214,9 @@ var App = function (_React$Component) { global.qtObjects.manual.hasSelperSupport(function (bFlag) { global.isShowHelperSupport = bFlag; }); + global.qtObjects.manual.hasAppStore(function (bFlag) { + global.isShowAppStore = bFlag; + }); global.qtObjects.manual.bIsLongSon(function (isLongSon) { if (isLongSon) { @@ -412,6 +464,8 @@ var App = function (_React$Component) { var pathList = pathName.split("/"); var cKeyword = ''; + if (pathName.includes("common-application-libraries")) document.documentElement.style.setProperty('--app-store-visibility', 'visible');else document.documentElement.style.setProperty('--app-store-visibility', 'hidden'); + //search页===>/search/:keyword //open页=====>/open/:file/:hash?/:key? if (pathList.length == 3) { @@ -621,6 +675,8 @@ var App = function (_React$Component) { if (toB.length == 1) toB = '0' + toB; toRGB = "#" + toR + toG + toB; document.documentElement.style.setProperty('--nav-hash-press-color', toRGB); + // toRGB = "rgba(" + pR + ", " + pG + ", " + pB + ", " + "0.4)"; + // document.documentElement.style.setProperty(`--active-shadow-color`, toRGB); }; global.setWordFontfamily = function (strFontFamily) { @@ -722,6 +778,8 @@ var App = function (_React$Component) { console.log('Null'); } + document.documentElement.style.setProperty('--app-store-visibility', 'hidden'); + var windowWidth = window.innerWidth; var leftDistance = windowWidth - 70 + 'px'; if (windowWidth > 1630 + 234) { @@ -827,6 +885,7 @@ var App = function (_React$Component) { _react2.default.createElement(_reactRouterDom.Route, { path: '/open/:file/:hash?/:key?', component: _main2.default }), _react2.default.createElement(_reactRouterDom.Route, { path: '/search/:keyword', component: _search2.default }) ), + _react2.default.createElement(AppStore, { text: ' ' }), _react2.default.createElement(Support, { text: ' ' }) ); } diff --git a/src/web_dist/toManual/shop.svg b/src/web_dist/toManual/shop.svg new file mode 100644 index 00000000..09d5adde --- /dev/null +++ b/src/web_dist/toManual/shop.svg @@ -0,0 +1,13 @@ + + + shop + + + + + + + + + + \ No newline at end of file diff --git a/src/web_dist/toManual/pic.svg b/src/web_dist/toManual/support.svg similarity index 100% rename from src/web_dist/toManual/pic.svg rename to src/web_dist/toManual/support.svg