peony/0000775000175000017500000000000015167662230010642 5ustar fengfengpeony/peony-qt.pro0000664000175000017500000000073515154271070013137 0ustar fengfengTEMPLATE = subdirs SUBDIRS = src libpeony-qt \ # plugin #libpeony-qt/test \ #plugin-iface #libpeony-qt/model/model-test \ #libpeony-qt/file-operation/file-operation-test \ #peony-qt-plugin-test \ peony-qt-desktop \ stable CONFIG += debug_and_release CONFIG(release,debug|release){ DEFINES += QT_NO_DEBUG_OUTPUT } src.depends = libpeony-qt peony-qt-plugin-test.depends = libpeony-qt peony-qt-desktop.depends = libpeony-qt stable.depends = libpeony-qt peony/src/0000775000175000017500000000000015167662230011431 5ustar fengfengpeony/src/peony-application.cpp0000664000175000017500000005451415154271106015573 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-application.h" #include "menu-plugin-iface.h" #include "main-window-factory-plugin-manager.h" #include "file-info.h" #include "file-info-job.h" #include "file-utils.h" #include #include #include #include #include #include #include #include #include #include #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "directory-view-factory-manager.h" #include "directory-view-plugin-iface.h" #include "directory-view-container.h" #include "path-edit.h" #include "location-bar.h" #include #include #include "tool-bar.h" #include #include "tab-page.h" #include "side-bar.h" #include "navigation-tool-bar.h" #include "navigation-bar.h" #include "fm-window.h" //#include "main-window.h" #include "global-settings.h" #include #include #include "search-vfs-register.h" #include #include "menu-plugin-manager.h" #include "directory-view-menu.h" #include "icon-view.h" #include "side-bar-factory-manager.h" #include "intel/tablet-side-bar-factory.h" #include "plugin-manager.h" #include "list-view.h" #include "basic-properties-page.h" #include "file-count-operation.h" #include #include "properties-window-factory-plugin-manager.h" #include "properties-window.h" #include "complementary-style.h" #include "volume-manager.h" #include "file-enumerator.h" #include "gerror-wrapper.h" #include "image-mount-manager.h" #include "main-window.h" #include "thumbnail-manager.h" #include #include #include #include #include #include #include #include #include #include #include #define KYLIN_USER_GUIDE_PATH "/" #define KYLIN_USER_GUIDE_SERVICE QString("com.kylinUserGuide.hotel_%1").arg(getuid()) #define KYLIN_USER_GUIDE_INTERFACE "com.guide.hotel" //record of peony start time qint64 PeonyApplication::peony_start_time = 0; static bool m_resident = false; PeonyApplication::PeonyApplication(int &argc, char *argv[], const char *applicationName) : SingleApplication (argc, argv, applicationName, true) { // fix #172774 QIcon::setFallbackSearchPaths(QIcon::fallbackSearchPaths()<<"/usr/share/pixmaps"); bool isWayland = QString(qgetenv("XDG_SESSION_DESKTOP")).contains("ukui-wayland"); setProperty("isWayland", isWayland); setApplicationVersion(QString("v%1").arg(VERSION)); //setApplicationDisplayName(tr("Peony-Qt")); // QFile file(":/data/libpeony-qt-styled.qss"); // file.open(QFile::ReadOnly); // setStyleSheet(QString::fromLatin1(file.readAll())); // qDebug()<load("/usr/share/libpeony-qt/libpeony-qt_"+QLocale::system().name()); QApplication::installTranslator(t); QTranslator *t2 = new QTranslator(this); t2->load("/usr/share/peony-qt/peony-qt_"+QLocale::system().name()); QApplication::installTranslator(t2); QTranslator *t3 = new QTranslator(this); t3->load("/usr/share/qt6/translations/qt_"+QLocale::system().name()); QApplication::installTranslator(t3); QTranslator *t4 = new QTranslator(this); t4->load("/usr/share/qt6/translations/qtbase_"+QLocale::system().name()); QApplication::installTranslator(t4); //setStyle(Peony::ComplementaryStyle::getStyle()); QTranslator *sdkTrans = new QTranslator(this); if (sdkTrans->load(":/translations/gui_" + QLocale::system().name() + ".qm")) { QApplication::installTranslator(sdkTrans); } #ifdef KY_UDF_BURN QTranslator *tUdfBrun = new QTranslator(this); auto udfBurnTranslationFilePath = QString("/usr/share/kyudfburn/translations/kyudfburn_%1.qm").arg(QLocale::system().name()); bool ok = tUdfBrun->load(udfBurnTranslationFilePath); if (!ok) { qWarning()<<"can not load kyudfburn translation files, path is"<isSecondary()) { parser.addHelpOption(); parser.addVersionOption(); if (this->arguments().count() == 2 && arguments().last() == ".") { QStringList args; auto dir = g_get_current_dir(); args<<"peony"<isPrimary()) { connect(this, &SingleApplication::receivedMessage, this, &PeonyApplication::parseCmd); Peony::SideBarFactoryManager::getInstance()->registerFactory(new Peony::Intel::TabletSideBarFactory); } else { qCritical()<<"secondary process send message to old primary process failed, try changed this process to primary one"; this->startPrimary(); connect(this, &SingleApplication::receivedMessage, this, &PeonyApplication::parseCmd); } //parse cmd parser.process(arguments()); QStringList allArgs = arguments(); auto message = getUriMessage(allArgs).toUtf8(); parseCmd(this->instanceId(), message); auto testIcon = QIcon::fromTheme("folder"); if (testIcon.isNull()) { QIcon::setThemeName("ukui-icon-theme-default"); if (QStyleFactory::keys().contains("gtk2")) { setStyle("gtk2"); } QMessageBox::warning(nullptr, tr("Warning"), tr("Peony-Qt can not get the system's icon theme. " "There are 2 reasons might lead to this problem:\n\n" "1. Peony-Qt might be running as root, " "that means you have the higher permission " "and can do some things which normally forbidden. " "But, you should learn that if you were in a " "root, the virtual file system will lose some " "featrue such as you can not use \"My Computer\", " "the theme and icons might also went wrong. So, run " "peony-qt in a root is not recommended.\n\n" "2. You are using a non-qt theme for your system but " "you didn't install the platform theme plugin for qt's " "applications. If you are using gtk-theme, try installing " "the qt5-gtk2-platformtheme package to resolve this problem.")); } //Peony::SearchVFSRegister::registSearchVFS(); //QIcon::setThemeName("ukui-icon-theme-one"); //setAttribute(Qt::AA_UseHighDpiPixmaps); //setAttribute(Qt::AA_EnableHighDpiScaling); setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); //setStyle(QStyleFactory::create("windows")); //check if first run //if not send message to server //else // load plgin // read from command line // do with args setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); connect(IMAGE_MOUNT_MANAGER, &Peony::ImageMountManager::deviceMounted, this, [this](const QString &mountPoint) { MainWindow* mainWindow = activedTopMainWindow(); if (mainWindow && QFileInfo(mountPoint).exists()) { QString uri = "file://" + mountPoint; mainWindow->goToUri(uri, true); } }); connect(IMAGE_MOUNT_MANAGER, &Peony::ImageMountManager::mountError, this, [this](const QString &errMsg) { if (!errMsg.isEmpty()) { qDebug() << "iso image unmount or mount error: " << errMsg; } }); } static void unmount_finished(GFile* file, GAsyncResult* result, gpointer udata) { int flags = 0; GError *err = nullptr; if (g_file_unmount_mountable_with_operation_finish (file, result, &err) == TRUE){ flags = 1; char *uri = g_file_get_uri(file); Peony::VolumeManager::getInstance()->fileUnmounted(uri); if (uri) g_free(uri); } if (! m_resident) { qApp->setQuitOnLastWindowClosed(true); } if (err){ qCritical() << "main window unmount_finished error:"<message<topLevelWindows().count() <= 0 && ! m_resident){ qDebug() << "has no new window, exit"; qApp->exit(); } } void PeonyApplication::unmountAllFtpLinks() { qDebug() << "lastWindowClosed unmountAllFtpLinks"; auto allUris = Peony::FileUtils::getChildrenUris("computer:///"); for(auto uri : allUris) { auto targetUri = Peony::FileUtils::getTargetUri(uri); qDebug() << "unmountAllFtpLinks targetUri:" <getValue(RESIDENT_IN_BACKEND).toBool(); qApp->setQuitOnLastWindowClosed(false); GFile *file = g_file_new_for_uri(uri.toUtf8().constData()); g_file_unmount_mountable_with_operation(file, G_MOUNT_UNMOUNT_NONE, nullptr, nullptr, GAsyncReadyCallback(unmount_finished), this); g_object_unref(file); } } QString PeonyApplication::getUriMessage(QStringList& strList) { QStringList args; for (auto uri = strList.constBegin(); uri != strList.constEnd(); ++uri) { if ("peony" == (*uri) || (*uri).startsWith("-") || (*uri).startsWith("--") || (*uri).startsWith("%") || (*uri).startsWith("/usr/") || (*uri).startsWith("/bin/") || (*uri).startsWith("/sbin/")) { args << *uri; } else if ((*uri).startsWith("/")) { args << Peony::FileUtils::urlEncode("file://" + *uri); } else if ((*uri).startsWith("mtp://") || (*uri).startsWith("gphoto2://")) { args << *uri; } else if ((*uri).contains("://")) { args << Peony::FileUtils::urlEncode(*uri); } else { args << Peony::FileUtils::urlEncode(QString("file://%1/%2").arg(g_get_current_dir()).arg(*uri)); } } return args.join(' '); } void PeonyApplication::parseCmd(quint32 id, QByteArray msg) { //story 28077, control start of peony if (! Peony::GlobalSettings::getInstance()->getValue(ENABLE_START_PEONY).toBool()){ qWarning() << "peony is diablsed to start"; Peony::GlobalSettings::getInstance()->sendNotifyMessage(tr("Peony is disabled to start !")); return; } QCommandLineParser parser; if (m_first_parse) { parser.addHelpOption(); parser.addVersionOption(); m_first_parse = false; } parser.addOption(quitOption); parser.addOption(showItemsOption); parser.addOption(showFoldersOption); parser.addOption(showPropertiesOption); //qDebug()<<"parse cmd:"<<"id:"<quit(); }); return; } MainWindowFactoryPluginManager::getInstance()->setVersion(); //FIXME: should I load plugins async? //Peony::PluginManager::init(); if (!parser.optionNames().isEmpty()) { if (parser.isSet(showItemsOption)) { //FIXME: show item parent folder and set selection for item. QHash itemHash; auto uris = Peony::FileUtils::toDisplayUris(parser.positionalArguments()); if (uris.isEmpty()) { return; } for (auto uri : uris) { auto parentUri = Peony::FileUtils::getParentUri(uri); if (itemHash.value(parentUri).isEmpty()) { QStringList l; l<create(parentUri,itemHash.value(parentUri)); // Peony::MainWindowIface* mainWindowIface = dynamic_cast(window); //auto window = new MainWindow(parentUri); //Peony::FMWindow *window = new Peony::FMWindow(parentUri); // connect(mainWindowIface, &Peony::MainWindowIface::locationChangeEnd, [=]() { // QTimer::singleShot(500, [=] { // Peony::FMWindowIface* iface = dynamic_cast(window); // iface->getCurrentPage()->getView()->setSelections(itemHash.value(parentUri)); // iface->getCurrentPage()->getView()->scrollToSelection(itemHash.value(parentUri).first()); // }); // }); window->show(); window->raise(); window->activateWindow(); if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } } } if (parser.isSet(showFoldersOption)) { QStringList uris = Peony::FileUtils::toDisplayUris(parser.positionalArguments()); if (uris.isEmpty()) { return; } QWidget *window = MainWindowFactoryPluginManager::getInstance()->create(uris.first()); //auto window = new MainWindow(uris.first()); //Peony::FMWindow *window = new Peony::FMWindow(uris.first()); uris.removeAt(0); if (!uris.isEmpty()) { Peony::FMWindowIface* iface = dynamic_cast(window); iface->addNewTabs(uris); } window->show(); if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } } if (parser.isSet(showPropertiesOption)) { QStringList uris = Peony::FileUtils::toDisplayUris(parser.positionalArguments()); if (uris.isEmpty()) { return; } qApp->setProperty("showProperties", true); Peony::ThumbnailManager::setPropertiesWindowVisible(true); QMainWindow *window = Peony::PropertiesWindowFactoryPluginManager::getInstance()->create(uris); //Peony::PropertiesWindow *window = new Peony::PropertiesWindow(uris); Peony::PropertiesWindow *w = qobject_cast(window); if (w) { if (Peony::GlobalSettings::getInstance()->isExist(SHOW_SHARE_PROPERTIES) && Peony::GlobalSettings::getInstance()->getValue(SHOW_SHARE_PROPERTIES).toBool()) { w->setOpenTabPage("SharePage"); Peony::GlobalSettings::getInstance()->setValue(SHOW_SHARE_PROPERTIES, false); } } window->setAttribute(Qt::WA_DeleteOnClose); Peony::PropertiesWindowFactoryPluginManager::getInstance()->show(); //window->show(); window->show(); window->activateWindow(); // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } Peony::ThumbnailManager::setPropertiesWindowVisible(false); } } else { if (!parser.positionalArguments().isEmpty()) { auto arguments = parser.positionalArguments(); arguments.removeOne("%U"); arguments.removeOne("%U&"); QStringList uris = Peony::FileUtils::toDisplayUris(arguments); if (!uris.isEmpty()) { QWidget *window = MainWindowFactoryPluginManager::getInstance()->create(uris.first()); Peony::FMWindowIface* iface = dynamic_cast(window); //auto window = new MainWindow(uris.first()); uris.removeAt(0); if (!uris.isEmpty()) { iface->addNewTabs(uris); } window->setAttribute(Qt::WA_DeleteOnClose); window->show(); if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } } else { QWidget *window = MainWindowFactoryPluginManager::getInstance()->create(QString()); // auto window = new MainWindow(); window->setAttribute(Qt::WA_DeleteOnClose); window->show(); if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } } } else { QWidget *window = MainWindowFactoryPluginManager::getInstance()->create(QString()); //auto window = new MainWindow; //auto window = new Peony::FMWindow; window->setAttribute(Qt::WA_DeleteOnClose); window->show(); if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } } } connect(this, &QApplication::paletteChanged, this, [=](const QPalette &pal) { for (auto w : allWidgets()) { w->setPalette(pal); w->update(); } }); } void PeonyApplication::about() { QMessageBox *msgBox = new QMessageBox(); msgBox->setWindowTitle(tr("Peony Qt")); msgBox->setText(tr("Copyright (C): 2020, KylinSoft Co., Ltd.")); msgBox->setModal(false); msgBox->setAttribute(Qt::WA_DeleteOnClose); msgBox->show(); } void PeonyApplication::help() { showGuide(); } bool PeonyApplication::userGuideDaemonRunning() { QDBusConnection conn = QDBusConnection::sessionBus(); if (!conn.isConnected()) return false; QDBusReply reply = conn.interface()->call("GetNameOwner", KYLIN_USER_GUIDE_SERVICE); return reply != ""; } void PeonyApplication::showGuide(const QString &appName) { auto s = KYLIN_USER_GUIDE_SERVICE; qDebug()<topLevelWidgets(); for (QWidget *widget : widgets) { if (widget->objectName() == "_peony_mainwindow") { MainWindow* mainWindow = static_cast(widget); if (mainWindow) { return mainWindow; } } } return nullptr; } peony/src/customIcons.qrc0000664000175000017500000000004415154271070014436 0ustar fengfeng peony/src/windows/0000775000175000017500000000000015154271106013115 5ustar fengfengpeony/src/windows/x11-window-manager.h0000664000175000017500000000740115154271106016616 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef X11WINDOWMANAGER_H #define X11WINDOWMANAGER_H #include #include #include class X11WindowManager : public QObject { Q_OBJECT public: static X11WindowManager *getInstance(); bool eventFilter(QObject *watched, QEvent *event) override; void registerWidget(QWidget *widget); private: explicit X11WindowManager(QObject *parent = nullptr); bool m_is_draging = false; ulong m_prepare_drag_time = 0; QWidget *m_current_widget = nullptr; QPoint m_press_pos; QPoint m_toplevel_offset; }; struct UnityCorners { ulong topLeft = 0; ulong topRight = 0; ulong bottomLeft = 0; ulong bottomRight = 0; }; typedef struct { ulong flags = 0; ulong functions = 0; ulong decorations = 0; long input_mode = 0; ulong status = 0; } MotifWmHints, MwmHints; #define MWM_HINTS_FUNCTIONS (1L << 0) #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_HINTS_INPUT_MODE (1L << 2) #define MWM_HINTS_STATUS (1L << 3) #define MWM_FUNC_ALL (1L << 0) #define MWM_FUNC_RESIZE (1L << 1) #define MWM_FUNC_MOVE (1L << 2) #define MWM_FUNC_MINIMIZE (1L << 3) #define MWM_FUNC_MAXIMIZE (1L << 4) #define MWM_FUNC_CLOSE (1L << 5) #define MWM_DECOR_ALL (1L << 0) #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_RESIZEH (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) #define MWM_INPUT_MODELESS 0 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 #define MWM_INPUT_SYSTEM_MODAL 2 #define MWM_INPUT_FULL_APPLICATION_MODAL 3 #define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL #define MWM_TEAROFF_WINDOW (1L<<0) namespace UKUI { class Decoration; } class XAtomHelper : public QObject { friend class UKUI::Decoration; Q_OBJECT public: static XAtomHelper *getInstance(); static bool isFrameLessWindow(int winId); bool isWindowDecorateBorderOnly(int winId); bool isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint); bool isUKUICsdSupported(); bool isUKUIDecorationWindow(int winId); UnityCorners getWindowBorderRadius(int winId); void setWindowBorderRadius(int winId, const UnityCorners &data); void setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight); void setUKUIDecoraiontHint(int winId, bool set = true); void setWindowMotifHint(int winId, const MotifWmHints &hints); MotifWmHints getWindowMotifHint(int winId); static Display *getDisplay(); static bool isPlatformX11(); private: explicit XAtomHelper(QObject *parent = nullptr); unsigned long registerUKUICsdNetWmSupportAtom(); void unregisterUKUICsdNetWmSupportAtom(); unsigned long m_motifWMHintsAtom = 0l; unsigned long m_unityBorderRadiusAtom = 0l; unsigned long m_ukuiDecorationAtion = 0l; }; #endif // X11WINDOWMANAGER_H peony/src/windows/about-dialog.ui0000664000175000017500000002571615154271070016036 0ustar fengfeng AboutDialog 0 0 420 492 0 0 420 324 420 560 Dialog 0 0 0 0 0 0 32 32 0 0 0 0 16777215 16777215 Qt::NoFocus QFrame::NoFrame <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> Qt::Vertical QSizePolicy::Fixed 20 24 TextLabel Qt::Vertical QSizePolicy::Fixed 20 40 8 4 4 4 4 0 4 4 24 24 24 24 0 28 16777215 24 30 30 30 30 Qt::RightToLeft 0 Qt::Horizontal 118 20 38 96 96 96 96 Qt::AlignBottom|Qt::AlignHCenter Qt::Horizontal 118 20 0 0 0 Qt::Horizontal 88 20 0 16 12 12 0 28 16777215 28 11 Qt::LeftToRight Qt::AlignCenter 0 24 16777215 24 11 Qt::AlignCenter Qt::Horizontal 88 20 peony/src/windows/trash-warn-dialog.h0000664000175000017500000000211515154271070016610 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2021, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Wenfei He * */ #ifndef TRASHWARNDIALOG_H #define TRASHWARNDIALOG_H #include "QDialog" namespace Peony { class TrashWarnDialog : public QDialog { Q_OBJECT public: explicit TrashWarnDialog(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; }; } #endif //TRASHWARNDIALOG_H peony/src/windows/x11-window-manager.cpp0000664000175000017500000003315315154271106017154 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "x11-window-manager.h" #include "navigation-tab-bar.h" #include #include #include #include #include #include #include #include //#include #include #include #include #define START_DRAG_TIME 120 static X11WindowManager *global_instance = nullptr; X11WindowManager *X11WindowManager::getInstance() { if (!global_instance) { global_instance = new X11WindowManager; } return global_instance; } X11WindowManager::X11WindowManager(QObject *parent) : QObject(parent) { } bool X11WindowManager::eventFilter(QObject *watched, QEvent *event) { //qDebug()<type(); switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchCancel: case QEvent::TouchEnd: { qDebug()<type(); break; } case QEvent::MouseButtonPress: { //Make tabbar blank area dragable and do not effect tablabel. if (qobject_cast(watched)) { QMouseEvent *e = static_cast(event); QTabBar *tabBar = qobject_cast(watched); if (tabBar->tabAt(e->pos()) != -1) return false; } QMouseEvent *e = static_cast(event); if (QObject::eventFilter(watched, event)) return true; if (e->button() == Qt::LeftButton) { m_prepare_drag_time = e->timestamp(); //修改页签可以拖拽,记录鼠标位置 //bug#94981 修改页签可以拖拽,记录鼠标位置 m_press_pos = QCursor::pos(); m_is_draging = true; m_current_widget = static_cast(watched); m_toplevel_offset = m_current_widget->topLevelWidget()->mapFromGlobal(m_press_pos); } //qDebug()<type(); break; } case QEvent::MouseMove: { QMouseEvent *e = static_cast(event); //qDebug()<type()<pos(); if (m_is_draging) { bool isPlatformX11 = qGuiApp->nativeInterface(); if (isPlatformX11) { bool isTouchMove = e->source() == Qt::MouseEventSynthesizedByQt; QPoint currentPos = QCursor::pos(); QPoint offset = QCursor::pos() - m_press_pos; bool smallOffset = qAbs(offset.x()) <= 2 && qAbs(offset.y() <= 2); if (smallOffset) break; Display *display = XAtomHelper::getDisplay(); Atom netMoveResize = XInternAtom(XAtomHelper::getDisplay(), "_NET_WM_MOVERESIZE", False); XEvent xEvent; const auto pos = currentPos - offset; memset(&xEvent, 0, sizeof(XEvent)); xEvent.xclient.type = ClientMessage; xEvent.xclient.message_type = netMoveResize; xEvent.xclient.display = display; xEvent.xclient.window = m_current_widget->topLevelWidget()->winId(); xEvent.xclient.format = 32; xEvent.xclient.data.l[0] = pos.x() * qApp->devicePixelRatio(); xEvent.xclient.data.l[1] = pos.y() * qApp->devicePixelRatio(); xEvent.xclient.data.l[2] = 8; xEvent.xclient.data.l[3] = Button1; xEvent.xclient.data.l[4] = 0; XUngrabPointer(display, CurrentTime); Window rootWindow = 0; int screen = 0; if (auto *x11App = qApp->nativeInterface()) { screen = DefaultScreen(display); rootWindow = RootWindow(display, screen); } XSendEvent(display, rootWindow, False, SubstructureNotifyMask | SubstructureRedirectMask, &xEvent); XFlush(display); m_is_draging = false; //NOTE: use x11 move will ungrab the window focus //hide and show will restore the focus and it seems //there is no bad effect for peony main window. if (isTouchMove) { if (!m_current_widget->mouseGrabber()) { m_current_widget->grabMouse(); m_current_widget->releaseMouse(); } } if (qobject_cast(m_current_widget)) { m_current_widget->hide(); m_current_widget->show(); } //balance mouse release event QMouseEvent me(QMouseEvent::MouseButtonRelease, e->pos(), e->windowPos(), e->screenPos(), e->button(), e->buttons(), e->modifiers(), Qt::MouseEventSynthesizedByApplication); qApp->sendEvent(watched, &me); memset(&xEvent, 0, sizeof(XEvent)); xEvent.type = ButtonRelease; xEvent.xbutton.button = Button1; xEvent.xbutton.same_screen = true; xEvent.xbutton.window = m_current_widget->topLevelWidget()->winId(); XSendEvent(display, m_current_widget->topLevelWidget()->winId(), False, 0, &xEvent); return true; } else { #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) auto widget = qobject_cast(watched); auto topLevel = widget->topLevelWidget(); topLevel->windowHandle()->startSystemMove(); m_is_draging = false; #else //auto me = static_cast(event); auto widget = qobject_cast(watched); auto topLevel = widget->topLevelWidget(); auto globalPos = QCursor::pos(); //auto offset = globalPos - m_press_pos; topLevel->move(globalPos - m_toplevel_offset); #endif } } //commit id: 339dbaf18b9555d274e69c0589a755457e3f555b [FIX] 【文件管理器】首页页签未按UI设计稿还原 [LINK]94981 /*else { bool overDragTime = 0 < m_prepare_drag_time && (m_prepare_drag_time + START_DRAG_TIME) < e->timestamp(); bool canDrag = !isTouchMove || overDragTime; if (canDrag) { m_is_draging = true; m_prepare_drag_time = 0; m_press_pos = QCursor::pos(); m_current_widget = static_cast(watched); m_toplevel_offset = m_current_widget->topLevelWidget()->mapFromGlobal(m_press_pos); } }*/ break; } case QEvent::MouseButtonRelease: { auto me = static_cast(event); if (me->source() == Qt::MouseEventSynthesizedByApplication) break; m_prepare_drag_time = 0; m_press_pos = QPoint(); m_is_draging = false; m_current_widget = nullptr; break; } default: return false; } return false; } void X11WindowManager::registerWidget(QWidget *widget) { widget->removeEventFilter(this); widget->installEventFilter(this); } static XAtomHelper *global_instance1 = nullptr; XAtomHelper *XAtomHelper::getInstance() { if (!global_instance1) global_instance1 = new XAtomHelper; return global_instance1; } bool XAtomHelper::isFrameLessWindow(int winId) { auto hints = getInstance()->getWindowMotifHint(winId); if (hints.flags == MWM_HINTS_DECORATIONS && hints.functions == 1) { return true; } return false; } bool XAtomHelper::isWindowDecorateBorderOnly(int winId) { return isWindowMotifHintDecorateBorderOnly(getInstance()->getWindowMotifHint(winId)); } bool XAtomHelper::isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint) { bool isDeco = false; if (hint.flags & MWM_HINTS_DECORATIONS && hint.flags != MWM_HINTS_DECORATIONS) { if (hint.decorations == MWM_DECOR_BORDER) isDeco = true; } return isDeco; } bool XAtomHelper::isUKUICsdSupported() { // fixme: return false; } bool XAtomHelper::isUKUIDecorationWindow(int winId) { if (m_ukuiDecorationAtion == None) return false; Atom type; int format; ulong nitems; ulong bytes_after; uchar *data; bool isUKUIDecoration = false; Display *display = XAtomHelper::getDisplay(); XGetWindowProperty(display, winId, m_ukuiDecorationAtion, 0, LONG_MAX, false, m_ukuiDecorationAtion, &type, &format, &nitems, &bytes_after, &data); if (type == m_ukuiDecorationAtion) { if (nitems == 1) { isUKUIDecoration = data[0]; } } return isUKUIDecoration; } UnityCorners XAtomHelper::getWindowBorderRadius(int winId) { UnityCorners corners; Atom type; int format; ulong nitems; ulong bytes_after; uchar *data; if (m_unityBorderRadiusAtom != None) { XGetWindowProperty(XAtomHelper::getDisplay(), winId, m_unityBorderRadiusAtom, 0, LONG_MAX, false, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &data); if (type == XA_CARDINAL) { if (nitems == 4) { corners.topLeft = static_cast(data[0]); corners.topRight = static_cast(data[1*sizeof (ulong)]); corners.bottomLeft = static_cast(data[2*sizeof (ulong)]); corners.bottomRight = static_cast(data[3*sizeof (ulong)]); } XFree(data); } } return corners; } void XAtomHelper::setWindowBorderRadius(int winId, const UnityCorners &data) { if (m_unityBorderRadiusAtom == None) return; ulong corners[4] = {data.topLeft, data.topRight, data.bottomLeft, data.bottomRight}; XChangeProperty(XAtomHelper::getDisplay(), winId, m_unityBorderRadiusAtom, XA_CARDINAL, 32, PropModeReplace, (const unsigned char *) &corners, sizeof (corners)/sizeof (corners[0])); } void XAtomHelper::setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight) { if (m_unityBorderRadiusAtom == None) return; ulong corners[4] = {(ulong)topLeft, (ulong)topRight, (ulong)bottomLeft, (ulong)bottomRight}; XChangeProperty(XAtomHelper::getDisplay(), winId, m_unityBorderRadiusAtom, XA_CARDINAL, 32, PropModeReplace, (const unsigned char *) &corners, sizeof (corners)/sizeof (corners[0])); } void XAtomHelper::setUKUIDecoraiontHint(int winId, bool set) { if (m_ukuiDecorationAtion == None) return; XChangeProperty(XAtomHelper::getDisplay(), winId, m_ukuiDecorationAtion, m_ukuiDecorationAtion, 32, PropModeReplace, (const unsigned char *) &set, 1); } void XAtomHelper::setWindowMotifHint(int winId, const MotifWmHints &hints) { if (m_unityBorderRadiusAtom == None) return; XChangeProperty(XAtomHelper::getDisplay(), winId, m_motifWMHintsAtom, m_motifWMHintsAtom, 32, PropModeReplace, (const unsigned char *)&hints, sizeof (MotifWmHints)/ sizeof (ulong)); } MotifWmHints XAtomHelper::getWindowMotifHint(int winId) { MotifWmHints hints; if (m_unityBorderRadiusAtom == None) return hints; uchar *data; Atom type; int format; ulong nitems; ulong bytes_after; XGetWindowProperty(XAtomHelper::getDisplay(), winId, m_motifWMHintsAtom, 0, sizeof (MotifWmHints)/sizeof (long), false, AnyPropertyType, &type, &format, &nitems, &bytes_after, &data); if (type == None) { return hints; } else { hints = *(MotifWmHints *)data; XFree(data); } return hints; } XAtomHelper::XAtomHelper(QObject *parent) : QObject(parent) { if (!XAtomHelper::isPlatformX11()) return; m_motifWMHintsAtom = XInternAtom(XAtomHelper::getDisplay(), "_MOTIF_WM_HINTS", true); m_unityBorderRadiusAtom = XInternAtom(XAtomHelper::getDisplay(), "_UNITY_GTK_BORDER_RADIUS", false); m_ukuiDecorationAtion = XInternAtom(XAtomHelper::getDisplay(), "_KWIN_UKUI_DECORAION", false); } Atom XAtomHelper::registerUKUICsdNetWmSupportAtom() { // fixme: return None; } void XAtomHelper::unregisterUKUICsdNetWmSupportAtom() { // fixme: } Display *XAtomHelper::getDisplay() { auto *x11Application = qGuiApp->nativeInterface(); if (!x11Application) { return nullptr; } return x11Application->display(); } bool XAtomHelper::isPlatformX11() { auto *x11Application = qGuiApp->nativeInterface(); if (!x11Application) { return false; } return true; } peony/src/windows/main-window.cpp0000664000175000017500000024244515154271106016065 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "main-window.h" #include "header-bar.h" #include "global-settings.h" #include "border-shadow-effect.h" #include #include //#include #include #include #include #include #include #include "side-bar-proxy-filter-sort-model.h" #include "side-bar-model.h" #include "directory-view-container.h" #include "tab-widget.h" #include "x11-window-manager.h" #include "properties-window-factory-plugin-manager.h" //#include "properties-window.h" #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "navigation-side-bar.h" #include "advance-search-bar.h" #include "status-bar.h" #include "search-widget.h" #include "intel/intel-navigation-side-bar.h" #include "peony-main-window-style.h" #include "file-label-box.h" #include "file-operation-manager.h" #include "file-operation-utils.h" #include "file-utils.h" #include "create-template-operation.h" #include "file-operation-error-dialog.h" #include "clipboard-utils.h" #include "search-vfs-uri-parser.h" #include "file-delete-operation.h" #include "file-untrash-operation.h" #include "directory-view-menu.h" #include "directory-view-widget.h" #include "main-window-factory.h" #include "thumbnail-manager.h" #include "peony-application.h" #include "global-settings.h" #include "audio-play-manager.h" #include "float-pane-widget.h" #include "side-bar-factory-manager.h" #include "file-meta-info.h" #include "sound-effect.h" #include "location-bar.h" #include "file-launch-action.h" #include "file-launch-manager.h" #include "file-utils.h" #include "trash-cleaned-watcher.h" #include "directory-view-factory-manager.h" #include "manager-control.h" #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #include #endif #include #include #include #include #include #include #include "directoryviewhelper.h" #include "plugin-manager.h" // NOTE build failed on Archlinux. Can't detect `QGSettings/QGSettings' header // fixed by replaced `QGSettings/QGSettings' with `QGSettings' #include //#include "xatom-helper.h" #include "trash-warn-dialog.h" #include #ifdef KY_SDK_WAYLANDHELPER #include #include #endif #define FONT_SETTINGS "org.ukui.style" #include #include static MainWindow *last_resize_window = nullptr; static QWidgetList blur_window_list; MainWindow::MainWindow(const QString &uri, QWidget *parent) : QMainWindow(parent) { #ifdef KY_SDK_WAYLANDHELPER m_window_helper = new UkuiWindowHelper(this); #endif QString localeName = QLocale::system().name(); if (localeName.contains("ug") || localeName.contains("kk") || localeName.contains("ky")) { setLayoutDirection(Qt::RightToLeft); } // try fix #162452, filedialog changes peony main windows view type and sort options. setObjectName("_peony_mainwindow"); setAttribute(Qt::WA_AlwaysShowToolTips); setContextMenuPolicy(Qt::CustomContextMenu); installEventFilter(this); //use qApp set window icon, task#29435 qApp->setWindowIcon(QIcon::fromTheme("system-file-manager")); //setWindowTitle(tr("File Manager")); //check all settings and init checkSettings(); //setStyle(PeonyMainWindowStyle::getStyle()); m_effect = new BorderShadowEffect(this); m_effect->setPadding(0); m_effect->setBorderRadius(0); m_effect->setBlurRadius(0); //setGraphicsEffect(m_effect); setAnimated(false); setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_TranslucentBackground); //setAttribute(Qt::WA_OpaquePaintEvent); //fix double window base buttons issue, not effect MinMax button hints //auto flags = windowFlags() &~Qt::WindowMinMaxButtonsHint; //setWindowFlags(flags |Qt::FramelessWindowHint); //setWindowFlags(windowFlags()|Qt::FramelessWindowHint); //setContentsMargins(4, 4, 4, 4); //disable style window manager setProperty("useStyleWindowManager", false); //set minimum width by design request //打开预览框后拉动侧边栏会导致关闭控件被遮盖 //setMinimumWidth(WINDOW_MINIMUM_WIDTH); //short cut settings setShortCuts(); bool isTabletMode = false; m_statusManagerDBus = new QDBusInterface(DBUS_STATUS_MANAGER_IF, "/" ,DBUS_STATUS_MANAGER_IF,QDBusConnection::sessionBus(),this); if (m_statusManagerDBus) { qDebug() << "[PeonyDesktopApplication::initGSettings] init statusManagerDBus" << m_statusManagerDBus->isValid(); if (m_statusManagerDBus->isValid()) { QDBusReply message = m_statusManagerDBus->call("get_current_tabletmode"); if (message.isValid()) { isTabletMode = message.value(); } //平板模式切换 connect(m_statusManagerDBus, SIGNAL(mode_change_signal(bool)), this, SLOT(updateTabletModeValue(bool))); } } //init UI after show auto size = sizeHint(); resize(size); connect(this, &MainWindow::initUIRequest, this, [=]{ QTimer::singleShot(50, this, [=]{ initUI(uri); updateTabletModeValue(isTabletMode); }); }); // set tab order bool isPlatformX11 = qGuiApp->nativeInterface(); if (isPlatformX11) { XAtomHelper::getInstance()->setUKUIDecoraiontHint(this->winId(), true); MotifWmHints hints; hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; hints.functions = MWM_FUNC_ALL; hints.decorations = MWM_DECOR_BORDER; XAtomHelper::getInstance()->setWindowMotifHint(this->winId(), hints); Window rootWindow = 0; int screen = 0; if (auto *x11App = qApp->nativeInterface()) { Display *display = XAtomHelper::getDisplay(); screen = DefaultScreen(display); rootWindow = RootWindow(display, screen); NETWinInfo info(x11App->connection(), this->winId(), rootWindow, NET::Properties(), NET::WM2DesktopFileName); info.setDesktopFileName("peony"); } } else { #ifdef KY_SDK_WAYLANDHELPER m_window_helper->removeTitleBar(); #endif } startMonitorThumbnailForbidStatus(); auto start_cost_time = QDateTime::currentMSecsSinceEpoch()- PeonyApplication::peony_start_time; qDebug() << "peony start end in main-window time:" <setCurrentSortColumn(this->getCurrentSortColumn()); this->setCurrentSortOrder(this->getCurrentSortOrder()); } }); m_is_blur_window = true; #ifdef KY_SDK_WAYLANDHELPER m_window_helper->setBlurEffect(QRegion()); #else KWindowEffects::enableBlurBehind(winId(), true); #endif #ifdef KY_SDK_DATE connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::updateShortDataFormat, this, &MainWindow::updateDateFormat); #endif connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::valueChanged, this, [this](const QString &key){ if (key == SHOW_CREATE_TIME || key == SHOW_RELATIVE_DATE) { this->refresh(); } }); connect(this, &MainWindow::setSelection, [=](QStringList selectionUris){ QTimer::singleShot(500, [=] { getCurrentPage()->getView()->setSelections(selectionUris); getCurrentPage()->getView()->scrollToSelection(selectionUris.first()); }); }); } MainWindow::~MainWindow() { blur_window_list.removeOne(this); //fix bug 40913, when window is maximazed, not update size if (last_resize_window == this && !isMaximized()) { auto settings = Peony::GlobalSettings::getInstance(); settings->setValue(DEFAULT_WINDOW_WIDTH, this->size().width()); settings->setValue(DEFAULT_WINDOW_HEIGHT, this->size().height()); last_resize_window = nullptr; } } void MainWindow::updateDateFormat(QString dateFormat) { //update date and time show format, task #101605 qDebug() << "sdk format signal:"<refresh(); m_date_format = dateFormat; } } void MainWindow::createVirtualTabAndSearch() { QString virtualUri = "idm:///New Intelligent Space"; this->addNewTabs(QStringList() << virtualUri); qDebug() << "=======updateSearchBar"; m_tab->updateCreateVirtualTabShow(); m_header_bar->setSearchBarFocus(); m_last_key.clear(); //m_tab->updateSearchBar(true); } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseMove) { auto me = static_cast(event); auto widget = this->childAt(me->pos()); if (!widget) { // set default sidebar width flag m_should_save_side_bar_width = true; } } if (event->type() == QEvent::MouseButtonRelease) { if (m_should_save_side_bar_width) { // real set default side bar width auto settings = Peony::GlobalSettings::getInstance(); settings->setValue(DEFAULT_SIDEBAR_WIDTH, m_side_bar->width()); qDebug() << "main window set DEFAULT_SIDEBAR_WIDTH:" << m_side_bar->width(); } m_should_save_side_bar_width = false; } #ifdef KY_SDK_WAYLANDHELPER if (event->type() == QEvent::ActivationChange) { bool isActive = this->isActiveWindow(); m_window_helper->setBlurEffect(QRegion(), 0, isActive); } #endif //通过事件过滤拦截器 QMouseEvent中的QEvent::MouseButtonDblClick识别鼠标事件 if (event->type() == QEvent::MouseButtonDblClick && watched == m_tab->tabBar()) { QMouseEvent *mouseEvent = static_cast(event); int index = m_tab->tabBar()->tabAt(mouseEvent->pos()); if (index == -1) { bool tablet = Peony::GlobalSettings::getInstance()->getValue(TABLET_MODE).toBool(); if (!tablet) { if (mouseEvent->button() == Qt::LeftButton) { maximizeOrRestore(); } else { qDebug() << "RightButton or MiddleButton click tabBar"; } } } return false; } return false; } QSize MainWindow::sizeHint() const { auto screenSize = QApplication::primaryScreen()->size(); QSize windowSize; windowSize.setWidth(screenSize.width()*2/3); windowSize.setHeight(screenSize.height()*4/5); QSize defaultSize(Peony::GlobalSettings::getInstance()->getValue(DEFAULT_WINDOW_WIDTH).toInt(), Peony::GlobalSettings::getInstance()->getValue(DEFAULT_WINDOW_HEIGHT).toInt()); if (!defaultSize.isValid()) return windowSize; int width = qMin(defaultSize.width(), screenSize.width()); int height = qMin(defaultSize.height(), screenSize.height()); //return screenSize*2/3; //qreal dpr = qApp->devicePixelRatio(); return QSize(width, height); } Peony::FMWindowIface *MainWindow::create(const QString &uri) { auto window = new MainWindow(uri); connect(window, &MainWindow::locationChanged, this, [=](){ if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); }); return window; } Peony::FMWindowIface *MainWindow::create(const QStringList &uris) { if (uris.isEmpty()) { auto window = new MainWindow; if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); return window; } auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); window->addNewTabs(l); return window; } Peony::FMWindowIface *MainWindow::createWithZoomLevel(const QString &uri, int zoomLevel) { auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); return window; } Peony::FMWindowIface *MainWindow::createWithZoomLevel(const QStringList &uris, int zoomLevel) { if (uris.isEmpty()) { auto window = new MainWindow; if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); return window; } auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); window->addNewTabs(l); return window; } Peony::FMWindowFactory *MainWindow::getFactory() { return nullptr;//MainWindowFactory::getInstance(); } Peony::DirectoryViewContainer *MainWindow::getCurrentPage() { return m_tab->currentPage(); } void MainWindow::checkSettings() { if (QGSettings::isSchemaInstalled("org.ukui.style")) { //font monitor QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key){ qDebug() << "fontSetting changed:" << key; if (key == "systemFont" || key == "systemFontSize") { QFont font = this->font(); for(auto widget : qApp->allWidgets()) widget->setFont(font); } //use qApp set window icon, task#29435 /*else if ("iconThemeName" == key) { setWindowIcon(QIcon::fromTheme("system-file-manager")); }*/ }); } } void MainWindow::setShortCuts() { if (!m_shortcuts_set) { //stop loading action QAction *stopLoadingAction = new QAction(this); stopLoadingAction->setShortcut(QKeySequence(Qt::Key_Escape)); addAction(stopLoadingAction); connect(stopLoadingAction, &QAction::triggered, this, &MainWindow::forceStopLoading); //show hidden action QAction *showHiddenAction = new QAction(this); showHiddenAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_H)); showHiddenAction->setCheckable(true); addAction(showHiddenAction); connect(showHiddenAction, &QAction::triggered, this, [=]() { //qDebug() << "show hidden"; this->setShowHidden(!getWindowShowHidden()); }); auto undoAction = new QAction(QIcon::fromTheme("edit-undo-symbolic"), tr("Undo"), this); undoAction->setShortcut(QKeySequence::Undo); addAction(undoAction); connect(undoAction, &QAction::triggered, [=]() { Peony::FileOperationManager::getInstance()->undo(); }); auto redoAction = new QAction(QIcon::fromTheme("edit-redo-symbolic"), tr("Redo"), this); redoAction->setShortcut(QKeySequence::Redo); addAction(redoAction); connect(redoAction, &QAction::triggered, [=]() { Peony::FileOperationManager::getInstance()->redo(); }); //add CTRL+D for delete operation auto trashAction = new QAction(this); trashAction->setShortcuts(QList()<getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto currentUri = getCurrentUri(); if(currentUri.startsWith("search://")){ currentUri = Peony::FileUtils::getActualDirFromSearchUri(currentUri); } if (currentUri.startsWith("favorite://") || currentUri == "filesafe:///" || currentUri.startsWith("kmre://") || currentUri.startsWith("kydroid://") || currentUri.startsWith("idm://")) return; auto uris = this->getCurrentSelections(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QString documentPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); QString musicPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); QString moviesPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)); QString picturespPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); QString downloadPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); if (currentUri.contains(desktopUri)) { if (MANAGER_CONTROL->containsWhitelistApp(uris)) { return; } } if (!uris.isEmpty() && !uris.contains(desktopUri) && !uris.contains(homeUri) && !uris.contains(documentPath) && !uris.contains(musicPath) && !uris.contains(moviesPath) && !uris.contains(picturespPath) && !uris.contains(downloadPath)) { bool canTrash = true; for (auto uri : uris) { if(Peony::FileUtils::isLongNameFileOfNotDel2Trash(uri)){/* 在家目录/下载/扩展目录下存放的长文件名文件使用永久删除,link bug#188864 */ canTrash = false; break; } } bool isTrash = this->getCurrentUri() == "trash:///"; if (!isTrash && canTrash) { Peony::FileOperationUtils::trash(uris, true, getCurrentUri().startsWith("search://")); } else { Peony::FileOperationUtils::executeRemoveActionWithDialog(uris); } } }); addAction(trashAction); auto deleteAction = new QAction(this); deleteAction->setShortcuts(QList()<getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto currentUri = getCurrentUri(); if(currentUri.startsWith("search://")){ currentUri = Peony::FileUtils::getActualDirFromSearchUri(currentUri); } if (currentUri == "filesafe:///" || currentUri.startsWith("kmre://") || currentUri.startsWith("kydroid://") || currentUri.startsWith("idm://")) return; auto uris = this->getCurrentSelections(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString documentPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); QString musicPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); QString moviesPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)); QString picturespPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); QString downloadPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (currentUri.contains(desktopUri)) { if (MANAGER_CONTROL->containsWhitelistApp(uris)) { return; } } if (! uris.contains(desktopUri) && !uris.contains(homeUri) && !uris.contains(documentPath) && !uris.contains(musicPath) && !uris.contains(moviesPath) && !uris.contains(picturespPath) && !uris.contains(downloadPath)) { Peony::FileOperationUtils::executeRemoveActionWithDialog(uris); } }); auto searchAction = new QAction(this); //UI improve bug#197559, add Ctrl + E to active search status, and not quit when trigger again searchAction->setShortcuts(QList()<startEdit(m_is_search); } }); addAction(searchAction); //F4 or Alt+D, change to address auto locationAction = new QAction(this); locationAction->setShortcuts(QList()<startEdit(); }); addAction(locationAction); auto newWindowAction = new QAction(this); newWindowAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N)); connect(newWindowAction, &QAction::triggered, this, [=]() { MainWindow *newWindow = new MainWindow(getCurrentUri()); newWindow->show(); }); addAction(newWindowAction); auto closeWindowAction = new QAction(this); closeWindowAction->setShortcuts(QList()<close(); }); addAction(closeWindowAction); auto aboutAction = new QAction(this); aboutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F2)); connect(aboutAction, &QAction::triggered, this, [=]() { PeonyApplication::about(); }); addAction(aboutAction); auto newTabAction = new QAction(this); newTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); connect(newTabAction, &QAction::triggered, this, [=]() { this->addNewTabs(QStringList()<getCurrentUri()); }); addAction(newTabAction); auto closeTabAction = new QAction(this); closeTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); connect(closeTabAction, &QAction::triggered, this, [=]() { if (m_tab->count() <= 1) { this->close(); } else { m_tab->removeTab(m_tab->currentIndex()); } }); addAction(closeTabAction); auto nextTabAction = new QAction(this); nextTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Tab)); connect(nextTabAction, &QAction::triggered, this, [=]() { int currentIndex = m_tab->currentIndex(); if (currentIndex + 1 < m_tab->count()) { m_tab->setCurrentIndex(currentIndex + 1); } else { m_tab->setCurrentIndex(0); } }); addAction(nextTabAction); auto previousTabAction = new QAction(this); previousTabAction->setShortcuts(QList()<currentIndex(); if (currentIndex > 0) { m_tab->setCurrentIndex(currentIndex - 1); } else { m_tab->setCurrentIndex(m_tab->count() - 1); } }); addAction(previousTabAction); auto newFolderAction = new QAction(this); newFolderAction->setShortcuts(QList()<setShortcuts(QList()< 0) { uris<create(uris); //Peony::PropertiesWindow *w = new Peony::PropertiesWindow(uris); w->setAttribute(Qt::WA_DeleteOnClose); Peony::PropertiesWindowFactoryPluginManager::getInstance()->show(); //w->show(); }); addAction(propertiesWindowAction); auto helpAction = new QAction(this); helpAction->setShortcut(QKeySequence(Qt::Key_F1)); connect(helpAction, &QAction::triggered, this, [=]() { PeonyApplication::help(); }); addAction(helpAction); auto maxAction = new QAction(this); maxAction->setShortcut(QKeySequence(Qt::Key_F11)); connect(maxAction, &QAction::triggered, this, [=]() { //showFullScreen has some issue, change to showMaximized, fix #20043 m_header_bar->cancelEdit(); maximizeOrRestore(); }); addAction(maxAction); auto previewPageAction = new QAction(this); connect(this,&MainWindow::tabletModeChanged,previewPageAction,[=](bool isTabletMode){ if(isTabletMode){ previewPageAction->setEnabled(false); m_header_bar->updatePreviewStatus(false); }else{ previewPageAction->setEnabled(true); } }); previewPageAction->setShortcuts(QList()<getTriggeredPreviewPage(); m_header_bar->updatePreviewStatus(!triggered); }); addAction(previewPageAction); auto refreshWindowAction = new QAction(this); refreshWindowAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); connect(refreshWindowAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshWindowAction); auto listToIconViewAction = new QAction(this); listToIconViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); connect(listToIconViewAction, &QAction::triggered, this, [=]() { this->beginSwitchView(QString("Icon View")); }); addAction(listToIconViewAction); auto iconToListViewAction = new QAction(this); iconToListViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); connect(iconToListViewAction, &QAction::triggered, this, [=]() { this->beginSwitchView(QString("List View")); }); addAction(iconToListViewAction); auto reverseSelectAction = new QAction(this); reverseSelectAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_L)); connect(reverseSelectAction, &QAction::triggered, this, [=]() { this->getCurrentPage()->getView()->invertSelections(); }); addAction(reverseSelectAction); auto remodelViewAction = new QAction(this); remodelViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); connect(remodelViewAction, &QAction::triggered, this, [=]() { auto view = this->getCurrentPage()->getView(); auto viewFactory = Peony::DirectoryViewFactoryManager2::getInstance(); if (!viewFactory) { qCritical() << "can not get view factory for" << view->viewId(); return; } int defaultZoomLevel = viewFactory->getFactory(view->viewId())->zoom_level_hint(); qDebug() << QString("View Type: %1 defaultZoomLevel: %2").arg(view->viewId()).arg(defaultZoomLevel); this->getCurrentPage()->setZoomLevelRequest(defaultZoomLevel); }); addAction(remodelViewAction); auto enlargViewAction = new QAction(this); enlargViewAction->setShortcut(QKeySequence::ZoomIn); connect(enlargViewAction, &QAction::triggered, this, [=]() { int defaultZoomLevel = this->currentViewZoomLevel(); if(defaultZoomLevel <= 95){ defaultZoomLevel+=5; } for (int i = 0; i < 5; i++) { this->getCurrentPage()->setZoomLevelRequest(defaultZoomLevel); } }); addAction(enlargViewAction); auto shrinkViewAction = new QAction(this); shrinkViewAction->setShortcut(QKeySequence::ZoomOut); connect(shrinkViewAction, &QAction::triggered, this, [=]() { int defaultZoomLevel = this->currentViewZoomLevel(); if (defaultZoomLevel >= 5) { defaultZoomLevel-=5; } else { defaultZoomLevel = 0; } this->getCurrentPage()->setZoomLevelRequest(defaultZoomLevel); }); addAction(shrinkViewAction); auto quitAllAction = new QAction(this); quitAllAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); connect(quitAllAction, &QAction::triggered, this, [=]() { QProcess p(0); p.start("/usr/bin/peony", QStringList()<<"-q"); p.waitForStarted(); p.waitForFinished(); }); addAction(quitAllAction); auto refreshAction = new QAction(this); refreshAction->setShortcut(Qt::Key_F5); connect(refreshAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshAction); //select all files in view, fix bug#115442 auto *selectAllAction = new QAction(this); selectAllAction->setShortcut(QKeySequence::SelectAll); connect(selectAllAction, &QAction::triggered, this, [=]() { if (! Peony::GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (this->getCurrentPage()->getView()) { /// note: 通过getAllFileUris设置的全选效率过低,如果增加接口则会导致二进制兼容性问题 /// 所以这里使用现有的反选接口实现高效的全选,这个方法在mainwindow中也有用到 //auto allFiles = this->getCurrentPage()->getView()->getAllFileUris(); //this->getCurrentPage()->getView()->setSelections(allFiles); this->getCurrentPage()->getView()->setSelections(QStringList()); this->getCurrentPage()->getView()->invertSelections(); } }); addAction(selectAllAction); //file operations auto *copyAction = new QAction(this); copyAction->setShortcut(QKeySequence::Copy); connect(copyAction, &QAction::triggered, [=]() { if (! Peony::GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } bool is_recent = false; QStringList currentSelections = this->getCurrentSelections(); if (!currentSelections.isEmpty()) { // if (currentSelections.first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } if (currentSelections.first().startsWith("recent://", Qt::CaseInsensitive)) { is_recent = true; } if (currentSelections.first().startsWith("favorite://", Qt::CaseInsensitive)) { return ; } } else return; QStringList selections; if (is_recent) { for(auto uri: currentSelections) { uri = Peony::FileUtils::getTargetUri(uri); selections << uri; } } else{ selections = currentSelections; } Peony::ClipboardUtils::setClipboardFiles(selections, false); }); addAction(copyAction); auto *pasteAction = new QAction(this); pasteAction->setShortcut(QKeySequence::Paste); connect(pasteAction, &QAction::triggered, [=]() { if (! Peony::GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto currentUri = getCurrentUri(); if (currentUri.startsWith("trash://") || currentUri.startsWith("recent://") || currentUri.startsWith("computer://") || currentUri.startsWith("favorite://") || currentUri.startsWith("search://") || currentUri == "filesafe:///" || currentUri.startsWith("burn://")) { /* Add hint information,link to bug#107640. */ QMessageBox::warning(this, tr("warn"), tr("This operation is not supported.")); return; } //fix bug#183268, not allow paste in mtp, gphoto2 path or can not write path auto info = Peony::FileInfo::fromUri(currentUri); //comment to fix bug#191108, huawei phone can paste file success if (!info->canWrite()) { QString fileSystem = info.get()->fileSystemType(); if (fileSystem.isEmpty()) { fileSystem = Peony::FileUtils::getFsTypeFromFile(info.get()->uri()); } if (!fileSystem.contains("udf")) { return; } } // if (!info->canWrite() /*|| currentUri.startsWith("mtp://") // || currentUri.startsWith("gphoto2://")*/) { // return; // } if (Peony::ClipboardUtils::isClipboardHasFiles()) { //FIXME: how about duplicated copy? //FIXME: how to deal with a failed move? auto op = Peony::ClipboardUtils::pasteClipboardFiles(this->getCurrentUri()); if (op) { connect(op, &Peony::FileOperation::operationFinished, this, [=](){ auto opInfo = op->getOperationInfo(); auto targetUirs = opInfo->dests(); //fix bug#196528, selection files icon not update issue QTimer::singleShot(300, this, [=](){ setCurrentSelectionUris(targetUirs); }); }, Qt::BlockingQueuedConnection); } else{ //fix paste file in old path not update issue, link to bug#71627 this->getCurrentPage()->getView()->repaintView(); } } }); addAction(pasteAction); auto *cutAction = new QAction(this); cutAction->setShortcut(QKeySequence::Cut); connect(cutAction, &QAction::triggered, [=]() { if (! Peony::GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } QStringList currentSelections = this->getCurrentSelections(); if (!currentSelections.isEmpty()) { // if (currentSelections.first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } if (currentSelections.first().startsWith("recent://", Qt::CaseInsensitive)) { return ; } if (currentSelections.first().startsWith("favorite://", Qt::CaseInsensitive)) { return ; } QString currentUri = getCurrentUri(); if(currentUri.startsWith("search://")){ auto selections = this->getCurrentSelections(); bool canCut = Peony::FileUtils::isSearchFilesParentWriteable(selections, getCurrentUri().startsWith("search://")); if(!canCut){ return; } }else{ auto info = Peony::FileInfo::fromUri(currentUri); if (!info->canWrite()) { return; } } QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (!currentSelections.contains(desktopUri) && !currentSelections.contains(homeUri)) { Peony::ClipboardUtils::setClipboardFiles(currentSelections, true, getCurrentUri().startsWith("search://")); this->getCurrentPage()->getView()->repaintView(); } } }); addAction(cutAction); m_shortcuts_set = true; } } void MainWindow::updateTabPageTitle() { m_tab->updateTabPageTitle(); //FIXME: replace BLOCKING api in ui thread. auto curUri = getCurrentUri(); auto show = Peony::FileUtils::getFileDisplayName(curUri); QString title = show;// + "-" + tr("File Manager"); if (curUri.startsWith("search:///")) title = tr("Search"); if (title.length() <= 0) title = tr("File Manager"); //qDebug() << "updateTabPageTitle:" <hasError()) return; auto opInfo = op->getOperationInfo(); //auto targetUri = opInfo->target(); //set a short time delay, fix bug#86070, select two folders QTimer::singleShot(300, this, [=](){ this->getCurrentPage()->getView()->clearIndexWidget(); this->getCurrentPage()->getView()->setSelections(QStringList()); this->editUri(opInfo->target()); }); }, Qt::BlockingQueuedConnection); // QTimer::singleShot(500, this, [=]() { // this->getCurrentPage()->getView()->scrollToSelection(targetUri); // this->editUri(targetUri); // }); } void MainWindow::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Backspace) { auto uri = Peony::FileUtils::getParentUri(getCurrentUri()); //qDebug() << "goUp Action" << getCurrentUri() << uri; if (uri.isNull()) return; m_tab->goToUri(uri, true, true); } if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { auto selections = this->getCurrentSelections(); //if select only one item, let view to process if (selections.count() > 1) { QString currentUri = this->getCurrentUri(); if(currentUri == "filesafe:///") { return ; } QStringList files; QStringList dirs; for (auto uri : selections) { auto info = Peony::FileInfo::fromUri(uri); if (info->isDir() || info->isVolume()) { dirs<getValue(SHOW_IN_NEW_WINDOW).toBool(); for (auto uri : dirs) { if (check) { auto newWindow = dynamic_cast(create(uri)); newWindow->setAttribute(Qt::WA_DeleteOnClose); newWindow->show(); } else { m_tab->addPage(uri); } } if (!files.isEmpty()) { Peony::FileLaunchManager::openFilesByDefaultApplications(files); } } } return QMainWindow::keyPressEvent(e); } void MainWindow::showEvent(QShowEvent *event) { if (!m_tab) { initUIRequest(); } QMainWindow::showEvent(event); } const QString MainWindow::getCurrentUri() { return m_tab->getCurrentUri(); } const QStringList MainWindow::getCurrentSelections() { return m_tab->getCurrentSelections(); } const QStringList MainWindow::getCurrentAllFileUris() { return m_tab->getAllFileUris(); } Qt::SortOrder MainWindow::getCurrentSortOrder() { return m_tab->getSortOrder(); } int MainWindow::getCurrentSortColumn() { return m_tab->getSortType(); } bool MainWindow::getWindowShowHidden() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(); } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).isValid()? metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).toBool(): false; } else { qDebug()<<"can not get file meta info"<getValue(SHOW_HIDDEN_PREFERENCE).toBool(); } } } bool MainWindow::getWindowUseDefaultNameSortOrder() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SORT_CHINESE_FIRST).isValid()? settings->getValue(SORT_CHINESE_FIRST).toBool(): true; } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SORT_CHINESE_FIRST).isValid()? metaInfo->getMetaInfoVariant(SORT_CHINESE_FIRST).toBool(): true; } else { qDebug()<<"can not get file meta info"<getValue(SORT_CHINESE_FIRST).isValid()? settings->getValue(SORT_CHINESE_FIRST).toBool(): true; } } } bool MainWindow::getWindowSortFolderFirst() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SORT_FOLDER_FIRST).isValid()? settings->getValue(SORT_FOLDER_FIRST).toBool(): true; } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SORT_FOLDER_FIRST).isValid()? metaInfo->getMetaInfoVariant(SORT_FOLDER_FIRST).toBool(): true; } else { qDebug()<<"can not get file meta info"<getValue(SORT_FOLDER_FIRST).isValid()? settings->getValue(SORT_FOLDER_FIRST).toBool(): true; } } } int MainWindow::currentViewZoomLevel() { if (getCurrentPage()) { if (auto view = getCurrentPage()->getView()) { return view->currentZoomLevel(); } } int defaultZoomLevel = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ZOOM_LEVEL).toInt(); if (defaultZoomLevel >= 0 && defaultZoomLevel <= 100) { return defaultZoomLevel; } return m_tab->m_status_bar->m_slider->value(); } bool MainWindow::currentViewSupportZoom() { if (getCurrentPage()) { if (auto view = getCurrentPage()->getView()) { return view->supportZoom(); } } return m_tab->m_status_bar->m_slider->isEnabled(); } void MainWindow::maximizeOrRestore() { if (getCurrentPage()) { if (auto view = getCurrentPage()->getView()) { QStringList uris = view->getSelections(); view->clearIndexWidget(); view->setSelections(uris); } } if (!this->isMaximized()) { this->showMaximized(); } else { this->showNormal(); } //maybe not need update icons? comment to try fix bug#77966 //m_header_bar->updateIcons(); m_header_bar->updateMaximizeState(); } void MainWindow::syncControlsLocation(const QString &uri) { m_tab->goToUri(uri, false, false); } void MainWindow::updateHeaderBar() { m_header_bar->setLocation(getCurrentUri()); m_header_bar->updateIcons(); //fix bug#82685 m_header_bar->updateSortTypeEnable(); //fix bug#66336, 83711 m_header_bar->updateViewTypeEnable(); //m_status_bar->update(); m_header_bar->updatePreviewPageVisible(); } void MainWindow::updateWindowIcon() { auto currentUri = getCurrentUri(); if (currentUri.startsWith("trash://")) { QIcon icon = QIcon::fromTheme("user-trash"); qApp->setWindowIcon(icon); } else if (currentUri.startsWith("computer://")) { QIcon icon = QIcon::fromTheme("computer"); qApp->setWindowIcon(icon); } else { QIcon icon = QIcon::fromTheme("system-file-manager"); qApp->setWindowIcon(icon); } } void MainWindow::goToUri(const QString &uri, bool addHistory, bool force) { if (!getCurrentPage() || !getCurrentPage()->getView()) { return; } auto viewId = this->getCurrentPage()->getView()->viewId(); if (QString::compare(viewId, "Icon View", Qt::CaseSensitive) == 0) { //FIXME: 判空 auto iface2 = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(getCurrentPage()->getView()); if (iface2) { iface2->doMultiSelect(false); } } QUrl url(uri); auto realUri = uri; if (uri == "computer:///ukui-data-volume") { realUri = "file:///data"; } //story 28545, improve data block solution, when has no user file in /data, go to usershare if ((uri == "file:///data" || realUri == "file:///data") && Peony::FileUtils::isFileExsit("file:///data/usershare") && ! Peony::FileUtils::isDataBlockHasUserFile()) { realUri = "file:///data/usershare"; } //process open symbolic link auto info = Peony::FileInfo::fromUri(uri); if (info->isSymbolLink() && info->symlinkTarget().length() >0 && (uri.startsWith("file://") || uri.startsWith("favorite://"))) realUri = "file://" + info->symlinkTarget(); //try to fix bug#174666, part phone mtp mode access wrong issue if (url.scheme().isEmpty() && ! uri.startsWith("mtp://") && ! uri.startsWith("gphoto2://")) { qDebug() << "transform special uri:"<closeSearch(); } if (!m_tab->handleEditConditionSwitchPath()) { return; } m_tab->handleSwitchModeAndShow(realUri); if (getCurrentUri() == realUri) { if (!force) { refresh(); return; } } locationChangeStart(); m_tab->goToUri(realUri, addHistory, force); m_header_bar->setLocation(uri); // m_label_box->clearSelection(); //Q_EMIT m_label_box->leftClickOnBlank(); } void MainWindow::updateSearch(const QString &uri, const QString &key, bool updateKey) { qDebug() << "updateSearch:" <enableSearchBar(key.length() != 0); if (m_last_search_path == "" || ! Peony::FileUtils::isSamePath(uri, m_last_search_path)) { //qDebug() << "updateSearch:" <clearAllMapsCount(); } if (updateKey) { needUpdate = true; m_last_key = key; } if (needUpdate) { //qDebug() << "updateSearch needUpdate:" <m_status_bar->updateSearchProgress(false); m_tab->updateFilterContent(""); m_searching = false; } else { bool isSearchEngine = true; const QByteArray id(UKUI_SEARCH_SCHEMAS); if (QGSettings::isSchemaInstalled(id)) { QGSettings *searchSettings = new QGSettings(id, QByteArray(), this); if (!searchSettings || !searchSettings->keys().contains(SEARCH_METHOD_KEY)) { isSearchEngine = false; } } else { isSearchEngine = false; } if (!m_last_search_path.startsWith("file:///") && !m_last_search_path.startsWith("computer:///")) { isSearchEngine = false; } QString targetUri = m_last_search_path; if (!targetUri.startsWith("search://")) { targetUri = Peony::SearchVFSUriParser::parseSearchKey(m_last_search_path, m_last_key, true, false, "", true); targetUri = Peony::SearchVFSUriParser::addSearchKey(targetUri, isSearchEngine); } //qDebug() << "updateSearch targetUri:" <m_status_bar->updateSearchProgress(true); m_tab->updateFilterContent(m_last_key); m_searching = true; } } } void MainWindow::addNewTabs(const QStringList &uris) { //fix search path add new tab,page title show abnormal issue if (uris.count() == 1) { m_tab->addPage(uris.first(), true); return; } for (auto uri : uris) { m_tab->addPage(uri, false); } } void MainWindow::beginSwitchView(const QString &viewId) { //not allow change to other view when in computer, link to bug#83711 if (getCurrentUri() == "computer:///") return; if (!getCurrentPage() || !getCurrentPage()->getView()) return; auto selection = getCurrentSelections(); // int sortType = getCurrentSortColumn(); // Qt::SortOrder sortOrder = getCurrentSortOrder(); m_tab->switchViewType(viewId); if (m_tab->currentPage()->getView()->supportZoom()) { // save zoom level Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ZOOM_LEVEL, currentViewZoomLevel()); } m_tab->setCurrentSelections(selection); bool supportZoom = m_tab->currentPage()->getView()->supportZoom(); m_tab->m_status_bar->m_slider->setEnabled(supportZoom); // m_tab->m_status_bar->m_slider->setVisible(supportZoom); //fix slider value not update issue int zoomLevel = currentViewZoomLevel(); setCurrentViewZoomLevel(zoomLevel); m_tab->currentPage()->getView()->setCurrentZoomLevel(zoomLevel); } void MainWindow::refresh() { if (getCurrentPage()) { if (getCurrentPage()->getView()) { this->getCurrentPage()->getView()->setDirectoryUri(getCurrentUri()); } } locationChangeStart(); m_tab->refresh(); //fix refresh clear copy files issue, link to bug#109247 if (Peony::ClipboardUtils::isPeonyFilesBeCut()) Peony::ClipboardUtils::clearClipboard();/* Refresh clear cut status */ //goToUri(getCurrentUri(), false, true); } void MainWindow::advanceSearch() { qDebug()<<"advanceSearch clicked"; initAdvancePage(); } void MainWindow::clearRecord() { //qDebug()<<"clearRecord clicked"; // m_search_bar->clearSearchRecord(); // m_clear_record->setDisabled(true); } void MainWindow::searchFilter(QString target_path, QString keyWord, bool search_file_name, bool search_content) { // auto targetUri = SearchVFSUriParser::parseSearchKey(target_path, keyWord, search_file_name, search_content); // //qDebug()<<"targeturi:"<goToUri(targetUri, true); } void MainWindow::filterUpdate(int type_index, int time_index, int size_index) { //qDebug()<<"filterUpdate:"; //m_tab->getActivePage()->setSortFilter(type_index, time_index, size_index); } void MainWindow::setLabelNameFilter(QString name) { if (!getCurrentPage()) { return; } //update filter flag if (name == "") m_filter_working = false; else m_filter_working = true; //m_header_bar->updateHeaderState(); getCurrentPage()->setFilterLabelConditions(name); } void MainWindow::setShowHidden(bool showHidden) { if (!getCurrentPage()) { return; } getCurrentPage()->setShowHidden(showHidden); //显示隐藏文件,更新项目个数 Q_EMIT m_tab->updateItemsNum(); } void MainWindow::setShowFileExtensions(bool checked) { if (!getCurrentPage()) { return; } getCurrentPage()->setShowFileExtensions(checked); } void MainWindow::setUseDefaultNameSortOrder(bool use) { if (!getCurrentPage()) { return; } getCurrentPage()->setUseDefaultNameSortOrder(use); } void MainWindow::setSortFolderFirst(bool set) { if (!getCurrentPage()) { return; } getCurrentPage()->setSortFolderFirst(set); } void MainWindow::forceStopLoading() { m_tab->stopLoading(); //Key_escape also use as cancel if (Peony::ClipboardUtils::isClipboardHasFiles()) { Peony::ClipboardUtils::clearClipboard(); this->getCurrentPage()->getView()->repaintView(); } } void MainWindow::setCurrentSelectionUris(const QStringList &uris) { m_tab->setCurrentSelections(uris); //move scrollToSelection to m_tab to try fix new unzip file show two same icon issue //Fix me, Unknown caused reason // if (uris.isEmpty()) // return; // getCurrentPage()->getView()->scrollToSelection(uris.first()); } void MainWindow::setCurrentSortOrder(Qt::SortOrder order) { m_tab->setSortOrder(order); } void MainWindow::setCurrentSortColumn(int sortColumn) { m_tab->setSortType(sortColumn); } void MainWindow::editUri(const QString &uri) { m_tab->editUri(uri); } void MainWindow::editUris(const QStringList &uris) { m_tab->editUris(uris); } void MainWindow::setCurrentViewZoomLevel(int zoomLevel) { if (currentViewSupportZoom()) m_tab->m_status_bar->m_slider->setValue(zoomLevel); } QString MainWindow::getLastSearchKey() { return m_last_key; } void MainWindow::clearLastSearchPath() { m_last_search_path = ""; } void MainWindow::resizeEvent(QResizeEvent *e) { QMainWindow::resizeEvent(e); //may not need update? comment to try fix bug#77966 //m_header_bar->updateMaximizeState(); //validBorder(); //update(); if (!isMaximized()) { // set save window size flag last_resize_window = this; } } /*! * \note * The window has a noticeable tearing effect due to the drawing of shadow effects. * I should consider do not painting a shadow when resizing. */ void MainWindow::paintEvent(QPaintEvent *e) { if (!m_tab) { QPainter p(this); p.fillRect(this->rect(), this->palette().base().color()); QRect iconRect(0, 0, 96, 96); iconRect.moveCenter(this->rect().center()); qApp->style()->drawItemPixmap(&p, iconRect, Qt::AlignCenter, QIcon::fromTheme("system-file-manager").pixmap(QSize(96, 96))); return; } bool isActive = this->isActiveWindow(); QColor color = qApp->palette().color(isActive? QPalette::Active: QPalette::Inactive, QPalette::Window); if (!qApp->property("kcontain-secondary-normal").isNull()) { if (isActive) { color = qApp->property("kcontain-secondary-normal").value(); } else { color = qApp->property("kcontain-secondary-inactive").value(); } } QColor colorBase =color; auto sidebarOpacity = Peony::GlobalSettings::getInstance()->getValue(SIDEBAR_BG_OPACITY).toInt(); if (m_is_blur_window && isActive) { colorBase.setAlphaF(sidebarOpacity/100.0); } auto pos = m_tab->mapTo(this, QPoint()); auto tmpRect = QRect(pos, m_tab->size()); QPainterPath deletePath; QPainterPath tmpPath; tmpPath.addRect(rect()); QPoint sideBarPos = m_side_bar->mapTo(this, QPoint()); QPainterPath sideBarPath; sideBarPath.setFillRule(Qt::FillRule::WindingFill); sideBarPath.addRect(QRect(sideBarPos, m_side_bar->size())); sideBarPath.addRect(0,0, rect().width(), 48); deletePath = tmpPath - sideBarPath; QPainter p(this); p.setRenderHint(QPainter::Antialiasing); // 抗锯齿 p.fillPath(sideBarPath,colorBase); QPainter painter(this); if(m_is_first_tab) deletePath.addRect(m_tab->x(),48,16,16); deletePath.setFillRule(Qt::FillRule::WindingFill); painter.fillPath(deletePath,this->palette().base()); QMainWindow::paintEvent(e); auto brush = qvariant_cast(qApp->property("button-active")); QPen pen; pen.setColor(brush.color()); pen.setWidth(1); painter.setPen(pen); painter.drawLine(m_side_bar->rect().topRight() + QPoint(3, 0) + sideBarPos, m_side_bar->rect().bottomRight() + QPoint(3, 0) + sideBarPos); } void MainWindow::mousePressEvent(QMouseEvent *e) { //qDebug()<<"mouse pressed"<button() == Qt::LeftButton && !e->isAccepted()) { m_is_draging = true; m_offset = mapFromGlobal(QCursor::pos()); } } void MainWindow::mouseMoveEvent(QMouseEvent *e) { //NOTE: when starting a X11 window move, the mouse move event //will unreachable when draging, and after draging we could not //get the release event correctly. //qDebug()<<"mouse move"; QMainWindow::mouseMoveEvent(e); // if (!m_is_draging) // return; // qreal dpiRatio = qApp->devicePixelRatio(); // if (QX11Info::isPlatformX11()) { // Display *display = QX11Info::display(); // Atom netMoveResize = XInternAtom(display, "_NET_WM_MOVERESIZE", False); // XEvent xEvent; // const auto pos = QCursor::pos(); // memset(&xEvent, 0, sizeof(XEvent)); // xEvent.xclient.type = ClientMessage; // xEvent.xclient.message_type = netMoveResize; // xEvent.xclient.display = display; // xEvent.xclient.window = this->winId(); // xEvent.xclient.format = 32; // xEvent.xclient.data.l[0] = pos.x() * dpiRatio; // xEvent.xclient.data.l[1] = pos.y() * dpiRatio; // xEvent.xclient.data.l[2] = 8; // xEvent.xclient.data.l[3] = Button1; // xEvent.xclient.data.l[4] = 0; // XUngrabPointer(display, CurrentTime); // XSendEvent(display, QX11Info::appRootWindow(QX11Info::appScreen()), // False, SubstructureNotifyMask | SubstructureRedirectMask, // &xEvent); // //XFlush(display); // XEvent xevent; // memset(&xevent, 0, sizeof(XEvent)); // xevent.type = ButtonRelease; // xevent.xbutton.button = Button1; // xevent.xbutton.window = this->winId(); // xevent.xbutton.x = e->pos().x() * dpiRatio; // xevent.xbutton.y = e->pos().y() * dpiRatio; // xevent.xbutton.x_root = pos.x() * dpiRatio; // xevent.xbutton.y_root = pos.y() * dpiRatio; // xevent.xbutton.display = display; // XSendEvent(display, this->effectiveWinId(), False, ButtonReleaseMask, &xevent); // XFlush(display); // if (e->source() == Qt::MouseEventSynthesizedByQt) { // if (!this->mouseGrabber()) { // this->grabMouse(); // this->releaseMouse(); // } // } // m_is_draging = false; // } else { // this->move((QCursor::pos() - m_offset) * dpiRatio); // } } void MainWindow::mouseReleaseEvent(QMouseEvent *e) { /*! * \bug * release event sometimes "disappear" when we request * X11 window manager for movement. */ QMainWindow::mouseReleaseEvent(e); //qDebug()<<"mouse released"; m_is_draging = false; } void MainWindow::validBorder() { return; } #include "file-utils.h" void MainWindow::initUI(const QString &uri) { Peony::PluginManager::init(); m_searching = false; connect(this, &MainWindow::locationChangeStart, this, [=]() { //comment to fix bug 33527 //m_side_bar->blockSignals(true); m_header_bar->blockSignals(true); QCursor c; c.setShape(Qt::BusyCursor); this->setCursor(c); m_tab->setCursor(c); m_side_bar->setCursor(c); //m_status_bar->update(); }); connect(this, &MainWindow::locationChangeEnd, this, [=]() { //comment to fix bug 33527 //m_side_bar->blockSignals(false); m_header_bar->blockSignals(false); QCursor c; c.setShape(Qt::ArrowCursor); this->setCursor(c); m_tab->setCursor(c); m_side_bar->setCursor(c); updateHeaderBar(); //function for UKUI3.1, update window icon //updateWindowIcon(); //m_status_bar->update(); if (m_searching) { m_tab->m_status_bar->updateSearchProgress(false); Q_EMIT m_header_bar->updateSearchProgress(false); m_searching = false; } setShortCuts(); }); //HeaderBar m_tab = new TabWidget; m_header_bar = new HeaderBar(this); m_headerBarContainer = new HeaderBarContainer(this); m_headerBarContainer->addHeaderBar(m_header_bar); m_headerBarContainer->addMenu(this); TopMenuBar *top = new TopMenuBar(m_header_bar, this); m_tab->setMenuBar(top); // m_tab->m_header_bar_layout->insertWidget(0,headerBarContainer); m_tab->addToolBar(m_headerBarContainer); //m_header_bar->setVisible(false); Peony::GlobalSettings::getInstance()->setValue(LABLE_ALIGNMENT, 1); connect(m_header_bar, &HeaderBar::updateLocationRequest, this, &MainWindow::goToUri); connect(m_header_bar, &HeaderBar::viewTypeChangeRequest, this, &MainWindow::beginSwitchView); connect(m_header_bar, &HeaderBar::updateZoomLevelHintRequest, this, [=](int zoomLevelHint) { if (zoomLevelHint >= 0) { m_tab->m_status_bar->m_slider->setEnabled(true); m_tab->m_status_bar->m_slider->setValue(zoomLevelHint); } else { m_tab->m_status_bar->m_slider->setEnabled(false); } }); connect(m_tab, &TabWidget::searchStateChanged, this, [this](bool isSearching, const QString &searchKey) { if (isSearching) { m_header_bar->startEdit(true); // 进入搜索状态 m_header_bar->m_searchWidget->setSearchMode(true); m_header_bar->m_searchWidget->setSearchText(searchKey); } else { m_header_bar->m_searchWidget->clearSearchBox(); } }); //SideBar auto sideBarFactory = Peony::SideBarFactoryManager::getInstance()->getFactoryFromPlatformName(); if (!sideBarFactory) { NavigationSideBarContainer *sidebar = new NavigationSideBarContainer(this); m_side_bar = sidebar; } else { m_side_bar = sideBarFactory->create(this); } m_transparent_area_widget = m_side_bar; connect(m_side_bar, &Peony::SideBar::updateWindowLocationRequest, this, &MainWindow::goToUri); connect(m_side_bar, &Peony::SideBar::updateWindowLocationRequest, m_header_bar, &HeaderBar::cancleSelect); connect(m_side_bar, &Peony::SideBar::createVirtualTabAndSearch, this, &MainWindow::createVirtualTabAndSearch); if (layoutDirection() == Qt::RightToLeft) { m_tab->addDockWidget(Qt::RightDockWidgetArea, m_side_bar); } else { m_tab->addDockWidget(Qt::LeftDockWidgetArea, m_side_bar); } // auto labelDialog = new FileLabelBox(this); // labelDialog->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // labelDialog->hide(); // m_label_box = labelDialog; // connect(labelDialog->selectionModel(), &QItemSelectionModel::selectionChanged, [=]() // { // auto selected = labelDialog->selectionModel()->selectedIndexes(); // //qDebug() << "FileLabelBox selectionChanged:" < 0) // { // auto name = selected.first().data().toString(); // setLabelNameFilter(name); // } // }); //when clicked in blank, currentChanged may not triggered //connect(labelDialog, &FileLabelBox::leftClickOnBlank, [=]() // { // setLabelNameFilter(""); // }); // sidebarContainer->setWidget(navigationSidebarContainer); // addDockWidget(Qt::LeftDockWidgetArea, sidebarContainer); // m_status_bar = new Peony::StatusBar(this, this); // setStatusBar(m_status_bar); // auto views = new TabWidget; if (uri.isNull()) { auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); m_tab->addPage(home, true); } else { m_tab->addPage(uri, true); //m_header_bar->setLocation(uri); } QTimer::singleShot(1, this, [=]() { // FIXME: // it is strange that if we set size hint by qsettings, // the tab bar will "shrink" until we update geometry // after a while (may resize window or move splitter). // we should find out the reason and remove this dirty // code. m_tab->updateTabBarGeometry(); m_tab->updateStatusBarGeometry(); }); connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::valueChanged, this, [=](const QString &key) { if (key == ZOOM_SLIDER_VISIBLE) { m_tab->updateStatusBarGeometry(); } }); m_tab->tabBar()->installEventFilter(this); connect(m_tab,&TabWidget::tabBarIndexUpdate,this,[=](int index){ if(index == 0) m_is_first_tab = true; else m_is_first_tab = false; update(); }); connect(m_tab, &TabWidget::closeWindowRequest, this, &QWidget::close); connect(m_header_bar->m_searchWidget, &Peony::SearchWidget::updateSearchRequest, m_tab, &TabWidget::updateSearchBar); connect(m_header_bar->m_searchWidget, &Peony::SearchWidget::updateSearchRequest, this, [=](bool showSearch){ m_is_search = showSearch; }); //connect(m_header_bar, &HeaderBar::updateSearchRequest, this, &MainWindow::updateSearchStatus); connect(m_header_bar->m_searchWidget, &Peony::SearchWidget::updateSearch, this, &MainWindow::updateSearch); X11WindowManager *tabBarHandler = X11WindowManager::getInstance(); tabBarHandler->registerWidget(m_tab->tabBar()); //tabBarHandler->registerWidget(m_header_bar); setCentralWidget(m_tab); // auto paneAndViews = new FloatPaneWidget(views, labelDialog, this); // connect(m_side_bar, &NavigationSideBar::labelButtonClicked, this, [=](bool checked) // { // bool visible = checked; // //quit label filter, clear conditions // if (visible) // { // setLabelNameFilter(""); // m_label_box->clearSelection(); // } else { // setLabelNameFilter(""); // } // paneAndViews->setFloatWidgetVisible(visible); // }); // setCentralWidget(paneAndViews); // // check slider zoom level // if (currentViewSupportZoom()) // setCurrentViewZoomLevel(currentViewZoomLevel()); //bind signals connect(m_tab, &TabWidget::searchRecursiveChanged, m_header_bar, &HeaderBar::updateSearchRecursive); connect(m_tab, &TabWidget::closeSearch, m_header_bar->m_searchWidget, &Peony::SearchWidget::closeSearch); connect(m_tab, &TabWidget::closeSearch, this, [=](){ this->updateSearchStatus(false); }); connect(m_tab, &TabWidget::viewSelectStatus, m_header_bar, &HeaderBar::switchSelectStatus); connect(m_tab, &TabWidget::updateWindowLocationRequest, m_header_bar, &HeaderBar::cancleSelect); connect(m_tab, &TabWidget::globalSearch, m_header_bar, &HeaderBar::setGlobalFlag); connect(m_tab, &TabWidget::clearTrash, this, &MainWindow::cleanTrash); // connect(this, &MainWindow::trashcleaned, m_tab, [=](){ // m_tab->updateTabPageTitle(); // }); // connect(this, &MainWindow::trashcleaned, m_header_bar, &HeaderBar::clearTrash); connect(m_tab, &TabWidget::recoverFromTrash, this, &MainWindow::recoverFromTrash); connect(m_tab, &TabWidget::updateWindowLocationRequest, this, &MainWindow::goToUri); connect(m_tab, &TabWidget::updateSearch, this, &MainWindow::updateSearch); connect(m_tab, &TabWidget::activePageLocationChanged, this, &MainWindow::locationChangeEnd); connect(m_tab, &TabWidget::activePageViewTypeChanged, this, &MainWindow::updateHeaderBar); connect(m_tab, &TabWidget::activePageChanged, this, &MainWindow::updateHeaderBar); connect(m_tab, &TabWidget::activePageChanged, this, [=](){ // check slider zoom level setCurrentViewZoomLevel(currentViewZoomLevel()); }); connect(m_tab, &TabWidget::signal_itemAdded, this, [=](const QString& uri){ /* 新建文件/文件夹,可编辑文件名,copy时不能编辑 */ if(this->m_uris_to_edit.isEmpty()) return; QString editUri = Peony::FileUtils::urlDecode(this->m_uris_to_edit.first()); QString infoUri = Peony::FileUtils::urlDecode(uri); if (editUri == infoUri ) { this->getCurrentPage()->getView()->scrollToSelection(uri); this->editUri(uri); } this->m_uris_to_edit.clear(); }); connect(m_tab, &TabWidget::menuRequest, this, [=](const QPoint &pos) { //fix bug#162775, show mutiple menu issue if (! m_is_show_menu){ m_is_show_menu = true; Peony::DirectoryViewMenu menu(this, this); /* 菜单执行弹出操作时停止更新,超过1s或者结束菜单都启用更新;linkto bug#205332【文件管理器】选中一万个文本文件后,点击鼠标右键,右键菜单会闪烁 */ m_tab->setUpdatesEnabled(false); QTimer::singleShot(1000, this, [=](){ if(!m_tab->updatesEnabled()){ m_tab->setUpdatesEnabled(true); } }); //fix bug#250273,right menu not show complete issue QScreen *screen=qApp->primaryScreen(); QRect geometry = screen->availableGeometry(); menu.setMaximumHeight(geometry.height()); menu.exec(pos); m_tab->setUpdatesEnabled(true);//end m_uris_to_edit = menu.urisToEdit(); m_is_show_menu = false; } }); connect(m_tab, &TabWidget::updateWindowSelectionRequest, this, [=](const QStringList &uris){ //setCurrentSelectionUris(uris); //fix bug#196528, selection files icon not update issue //修复拖拽拷贝情况下,未更新图标问题 QTimer::singleShot(300, this, [=](){ setCurrentSelectionUris(uris); }); }); connect(m_tab, &TabWidget::currentSelectionChanged, this, [=](){ int num = this->getCurrentPage()->getView()->getSelections().count(); bool isSelect = num > 0 ? true :false; m_header_bar->switchSelectStatus(isSelect); }); connect(Peony::ThumbnailManager::getInstance(), &Peony::ThumbnailManager::updateFileThumbnail, this, [=](){ this->refresh(); }); setTabOrder(m_side_bar, m_tab); m_tab->setWindow(this); // if (QGSettings::isSchemaInstalled("org.ukui.peony.settings")) { // m_thumbnail = new QGSettings("org.ukui.peony.settings", QByteArray(), this); // connect(m_thumbnail, &QGSettings::changed, this, [=](const QString &key) { // if (FORBID_THUMBNAIL_IN_VIEW == key) { // auto settings = Peony::GlobalSettings::getInstance(); // if (m_do_not_thumbnail != settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()) { // m_do_not_thumbnail = settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); // if (true == m_do_not_thumbnail) { // Peony::ThumbnailManager::getInstance()->clearThumbnail(); // } // refresh(); // } // } // }); // } auto iscleaned = Peony::TrashCleanedWatcher::getInstance(); connect(iscleaned,&Peony::TrashCleanedWatcher::updateTrashIcon, m_tab, [=](){ m_tab->updateTabPageTitle(); }); } void MainWindow::updateSearchStatus(bool showSearch) { m_tab->updateSearchBar(showSearch); m_header_bar->setSearchMode(showSearch); m_is_search = showSearch; } void MainWindow::cleanTrash() { auto uris = getCurrentAllFileUris(); Peony::AudioPlayManager::getInstance()->playWarningAudio(); if (uris.count() >0) { if (Peony::GlobalSettings::getInstance()->getProjectName() == V10_SP1_EDU) { Peony::TrashWarnDialog *dialog = new Peony::TrashWarnDialog(nullptr); connect(dialog, &Peony::TrashWarnDialog::accepted, [=]{ Peony::FileOperationUtils::remove(uris); }); dialog->exec(); } else { auto removeop = Peony::FileOperationUtils::clearRecycleBinWithDialog(uris, this); qApp->setProperty("clearTrash",true); // if(removeop){ // removeop->connect(removeop,&Peony::FileDeleteOperation::operationFinished,this,[=](){ // Peony::SoundEffect::getInstance()->recycleBinClearMusic(); // Q_EMIT trashcleaned(); // }); // } } } else { /* 由于QMessageBox的setParent还不支持,暂先注释处理,link to bug#22692 【回收站】清空时,其他工作区的文件管理器会转到当前工作区 */ // QMessageBox::information(nullptr, tr("Tips info"), // tr("Trash has no file need to be cleaned.")); } } void MainWindow::recoverFromTrash() { auto m_selections = getCurrentSelections(); if (m_selections.isEmpty()) m_selections = getCurrentAllFileUris(); if (m_selections.count() == 1) { auto untrashop = Peony::FileOperationUtils::restore(m_selections.first()); if(untrashop){ connect(untrashop,&Peony::FileUntrashOperation::operationFinished,[=](){ Peony::SoundEffect::getInstance()->copyOrMoveSucceedMusic(); }); } } else { auto untrashop = Peony::FileOperationUtils::restore(m_selections); if(untrashop){ connect(untrashop,&Peony::FileUntrashOperation::operationFinished,[=](){ Peony::SoundEffect::getInstance()->copyOrMoveSucceedMusic(); }); } } // qApp->setProperty("restoreFile",true); } void MainWindow::initAdvancePage() { //Fix me: advance search page, need the new design to develop new UI //auto filterBar = new Peony::AdvanceSearchBar(this); } QRect MainWindow::sideBarRect() { auto pos = m_transparent_area_widget->mapTo(this, QPoint()); return QRect(pos, m_transparent_area_widget->size()); } void MainWindow::startMonitorThumbnailForbidStatus() { m_do_not_thumbnail = Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); m_thumbnail_watcher = new QFileSystemWatcher(this); QString peonySettingFile = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/.config/org.ukui/peony-qt-preferences.conf"; m_thumbnail_watcher->addPath(peonySettingFile); connect(m_thumbnail_watcher, &QFileSystemWatcher::fileChanged, [=](const QString &uri){ auto settings = Peony::GlobalSettings::getInstance(); if (m_do_not_thumbnail != settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()) { m_do_not_thumbnail = settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); // fix #213036 if (true == m_do_not_thumbnail) { Peony::ThumbnailManager::getInstance()->clearThumbnail(); if (getCurrentPage()) { if (getCurrentPage()->getView()) { getCurrentPage()->getView()->repaintView(); } } else { refresh(); } } else { if (getCurrentPage()) { getCurrentPage()->updateCurrentFilesThumbnails(); } else { refresh(); } } } //qDebug()<<"peonySettingFile:"<addPath(uri); }); } const QList> MainWindow::getCurrentSelectionFileInfos() { const QStringList uris = getCurrentSelections(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<currentPage() && m_tab->currentPage()->getView()) { iface2 = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(m_tab->currentPage()->getView()); iface2->setItemsVisible(false); qApp->processEvents(); } //task#106007 【文件管理器】文件管理器应用做平板UI适配,切换模式 qApp->setProperty("tabletMode", isTabletMode); if(isTabletMode) { m_headerBarContainer->setFixedHeight(72); m_headerBarContainer->m_topMenu->show(); } else { m_headerBarContainer->setFixedHeight(60); m_headerBarContainer->m_topMenu->hide(); } m_tab->updateTabletModeValue(isTabletMode); m_tab->menuWidget()->setVisible(!isTabletMode); m_header_bar->updateTabletModeValue(isTabletMode); Q_EMIT tabletModeChanged(isTabletMode); if (iface2) { iface2->setItemsVisible(true); } } void MainWindow::setKeepAbove(bool keepAbove) { if (m_keepAbove == keepAbove) { return; } m_keepAbove = keepAbove; if (QApplication::platformName().toLower().contains("wayland")) { #ifdef KY_SDK_WAYLANDHELPER UkuiWindowHelper::States defaultStates = UkuiWindowHelper::States(0xff); if (m_keepAbove) { m_window_helper->setWindowState(defaultStates | UkuiWindowHelper::State::KeepAbove); } else { m_window_helper->setWindowState(static_cast( static_cast(defaultStates) & ~static_cast(UkuiWindowHelper::State::KeepAbove))); } #endif } else { //use kf5 interface to fix set on top has no effect issue // if (m_keepAbove) // KWindowSystem::setState(winId(), NET::KeepAbove); // else // KWindowSystem::clearState(winId(), NET::KeepAbove); setWindowFlag(Qt::WindowStaysOnTopHint, keepAbove); show(); } } bool MainWindow::isKeepAbove() const { return m_keepAbove; } peony/src/windows/main-window-factory.h0000664000175000017500000000331515154271070017166 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef MAINWINDOWFACTORY_H #define MAINWINDOWFACTORY_H #include #include "main-window-factory-iface.h" #include /*! * \brief The MainWindowFactory class * \deprecated */ class PEONYCORESHARED_EXPORT MainWindowFactory : public QObject, public Peony::MainWindowFactoryIface { Q_OBJECT // Q_PLUGIN_METADATA(IID MainWindowFactoryIface_iid) // Q_INTERFACES(Peony::MainWindowFactoryIface) public: const QString name() { return "ukui4.0"; } static Peony::MainWindowFactoryIface *getInstance(); Peony::FMWindowIface *create(const QString &uri); Peony::FMWindowIface *create(const QStringList &uris); QWidget *createWindow(const QString &uri = nullptr); QWidget *createWindow(const QStringList &uris); QWidget *createWindow(const QString &uri, QStringList selectUris); //private: explicit MainWindowFactory(QObject *parent = nullptr); }; #endif // MAINWINDOWFACTORY_H peony/src/windows/about-dialog.cpp0000664000175000017500000001771715154271106016205 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "about-dialog.h" #include "ui_about-dialog.h" #include "xatom-helper.h" #include #include #include #include #include #include #include #ifdef KY_SDK_WAYLANDHELPER #include #include #endif //#include #include "xatom-helper.h" #ifdef KY_SDK_QT_WIDGETS AboutDialog::AboutDialog(QWidget *parent) : kdk::KAboutDialog(parent) { setAppIcon(QIcon::fromTheme("system-file-manager")); setAppName(tr("Peony")); setAppSupport(tr("Service & Support: ") + "support@kylinos.cn
"); setAppVersion(QString(tr("Version number: %1")).arg(getCurrentVersion())); setBodyText(tr("Peony is a graphical software to help users manage system files. " "It provides common file operation functions for users, such as file viewing, " "file copy, paste, cut, delete, rename, file selection, application opening, " "file search, file sorting, file preview, etc. it is convenient for users to " "manage system files intuitively on the interface.")); setBodyTextVisiable(true); } #else AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { this->initUI(); } #endif AboutDialog::~AboutDialog() { #ifndef KY_SDK_QT_WIDGETS delete ui; #endif } void AboutDialog::initUI() { setAutoFillBackground(true); setBackgroundRole(QPalette::Base); setFixedWidth(420); bool isPlatformX11 = qGuiApp->nativeInterface(); if (isPlatformX11) { XAtomHelper::getInstance()->setUKUIDecoraiontHint(this->winId(), true); MotifWmHints hints; hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; hints.functions = MWM_FUNC_ALL; hints.decorations = MWM_DECOR_BORDER; XAtomHelper::getInstance()->setWindowMotifHint(this->winId(), hints); } else { #ifdef KY_SDK_WAYLANDHELPER auto windowHelper = new UkuiWindowHelper(this); windowHelper->removeTitleBar(); #endif } ui = new Ui::AboutDialog; ui->setupUi(this); ui->logoLabel->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(24,24)); ui->titleLabel->setText(tr("Peony")); ui->closeBtn->setFlat(true); ui->closeBtn->setProperty("isIcon", true); ui->closeBtn->setFixedSize(QSize(30, 30)); ui->closeBtn->setProperty("isWindowButton", 2); ui->closeBtn->setProperty("useIconHighlightEffect", 0x8); ui->closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic")); ui->iconLabel->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(96,96)); auto font = qApp->font(); QFont namefont = font; namefont.setBold(true); namefont.setPointSize(font.pointSize()*1.28); ui->nameLabel->setFont(namefont); ui->nameLabel->setText(tr("Peony")); ui->versionLabel->setFont(font); ui->versionLabel->setText(QString(tr("Version number: %1")).arg(getCurrentVersion())); ui->briefTextedit->setReadOnly(true); QTextCursor textCursor; QTextBlockFormat blockFormat; blockFormat.setLineHeight(font.pointSize()+10, QTextBlockFormat::SingleHeight);//font-line-hight textCursor = ui->briefTextedit->textCursor(); //before the setText(). //bug#101112 关于界面自适应大小 QTextDocument* doc = new QTextDocument(ui->briefTextedit); doc->setPlainText(tr("Peony is a graphical software to help users manage system files. " "It provides common file operation functions for users, such as file viewing, " "file copy, paste, cut, delete, rename, file selection, application opening, " "file search, file sorting, file preview, etc. it is convenient for users to " "manage system files intuitively on the interface.")); ui->briefTextedit->setDocument(doc); textCursor.setBlockFormat(blockFormat); ui->briefTextedit->setTextCursor(textCursor); doc->setTextWidth(420-32-32); if (QGSettings::isSchemaInstalled("org.ukui.style")) { m_gSettings = new QGSettings("org.ukui.style", QByteArray(), this); connect(m_gSettings, &QGSettings::changed, this, [=](const QString &key) { if (key == "styleName") { setSupportText(); } else if("systemFontSize" == key) { auto appfont = qApp->font(); QFont namefont = appfont; namefont.setBold(true); namefont.setPointSize(appfont.pointSize()*1.28); ui->nameLabel->setFont(namefont); resetSize(); } else if("iconThemeName" == key) { ui->iconLabel->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(96,96)); ui->logoLabel->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(24,24)); } }); } this->setSupportText(); ui->openlinkLabel->setOpenExternalLinks(true); } void AboutDialog::setSupportText() { QString text = tr("Service & Support: ") + "support@kylinos.cn
"; ui->openlinkLabel->setText(text); } QString AboutDialog::convertRGB16HexStr(const QColor &color) { if (color == Qt::transparent) return "#000000";//透明则显示黑色 QString red = QString("%1").arg(color.red(),2,16,QChar('0')); QString green = QString("%1").arg(color.green(),2,16,QChar('0')); QString blue = QString("%1").arg(color.blue(),2,16,QChar('0')); QString hexStr = "#" + red + green + blue; return hexStr; } QString AboutDialog::getCurrentVersion() { //use self define main version //return VERSION; FILE *pp = NULL; char *line = NULL; size_t len = 0; ssize_t read; char *q = NULL; QString version = VERSION; //fix bug#125289, use dpkg query version instead of self define version pp = popen("dpkg -l peony", "r"); if(NULL == pp) return version; while((read = getline(&line, &len, pp)) != -1){ q = strrchr(line, '\n'); *q = '\0'; QString content = line; QStringList list = content.split(" "); list.removeAll(""); if (list.size() >= 3) version = list.at(2); } free(line); pclose(pp); return version; } void AboutDialog::on_closeBtn_clicked() { close(); } void AboutDialog::resetSize() { int minHeight = 324; int maxHeight = 560; int newHeight = ui->briefTextedit->document()->size().height(); int changeHeight = newHeight - ui->briefTextedit->height(); int finalHeight = this->height() + changeHeight + 10; if( finalHeight > maxHeight) { finalHeight = maxHeight; } else if(finalHeight < minHeight) { finalHeight = minHeight; } this->setFixedHeight(finalHeight); ui->verticalLayout_3->update(); } peony/src/windows/trash-warn-dialog.cpp0000664000175000017500000001074415154271106017152 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2021, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Wenfei He * */ #include "trash-warn-dialog.h" #include #include #include #include using namespace Peony; void TrashWarnDialog::paintEvent(QPaintEvent *event) { const QPalette &palette = this->palette(); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 反锯齿; painter.setBrush(palette.brush(QPalette::Window)); painter.setPen(palette.color(QPalette::Window)); QRect rect = this->rect(); rect.setWidth(rect.width() - 1); rect.setHeight(rect.height() - 1); painter.drawRoundedRect(rect, 16, 16); QWidget::paintEvent(event); } TrashWarnDialog::TrashWarnDialog(QWidget *parent) : QDialog(parent) { //调整大小 this->setFixedSize(320,344); //去掉窗口图标和标题,只显示关闭按钮,模态窗口 this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); this->setWindowModality(Qt::ApplicationModal); this->setAttribute(Qt::WA_TranslucentBackground); this->setAttribute(Qt::WA_DeleteOnClose); QVBoxLayout *dialogLayout = new QVBoxLayout(this); //清除默认边距 dialogLayout->setContentsMargins(0, 0, 0, 0); this->setLayout(dialogLayout); QHBoxLayout *floor1 = new QHBoxLayout(this); floor1->setContentsMargins(0, 16, 16, 0); floor1->setAlignment(Qt::AlignRight); //去掉窗口标题后手动设置一个关闭按钮 QPushButton *closeButton = new QPushButton(this); closeButton->setFixedSize(16, 16); closeButton->setIcon(QIcon::fromTheme("window-close-symbolic")); //设置按钮的悬停事件和点击事件颜色 closeButton->setStyleSheet("QPushButton:hover{background-color: #FF9E9E;border-radius:4px;border:none;}" "QPushButton:pressed{background-color:#FB5050;border-radius:4px;border:none;}"); floor1->addWidget(closeButton); dialogLayout->addLayout(floor1); QHBoxLayout *floor2 = new QHBoxLayout(this); floor2->setContentsMargins(0, 40, 0, 0); floor2->setAlignment(Qt::AlignHCenter); QLabel *iconLabel = new QLabel(this); iconLabel->setContentsMargins(0, 0, 0, 0); iconLabel->setAlignment(Qt::AlignHCenter); QPixmap pixmap = QIcon::fromTheme("user-trash-full").pixmap(64, 64); iconLabel->setPixmap(pixmap); floor2->addWidget(iconLabel); dialogLayout->addLayout(floor2); QHBoxLayout *floor3 = new QHBoxLayout(this); floor3->setContentsMargins(24, 24, 24, 0); QLabel *textLineLabel = new QLabel(this); textLineLabel->setContentsMargins(0, 0, 0, 0); textLineLabel->setWordWrap(true); textLineLabel->setAlignment(Qt::AlignHCenter); textLineLabel->setText(tr("Are you sure that you want to delete these files? Once you start a deletion, " "the files deleting will never be restored again.")); floor3->addWidget(textLineLabel); dialogLayout->addLayout(floor3); QHBoxLayout *floor4 = new QHBoxLayout(this); floor4->setContentsMargins(24, 0, 24, 24); QPushButton *deleteButton = new QPushButton(this); QPushButton *cancelButton = new QPushButton(this); deleteButton->setFixedSize(124, 48); cancelButton->setFixedSize(124, 48); deleteButton->setText(tr("Delete")); cancelButton->setText(tr("Cancel")); floor4->addWidget(cancelButton); floor4->addStretch(1); floor4->addWidget(deleteButton); dialogLayout->addLayout(floor4); connect(closeButton, &QPushButton::clicked, this, [=]{ Q_EMIT rejected(); close(); }); connect(cancelButton, &QPushButton::clicked, this, [=]{ Q_EMIT rejected(); close(); }); connect(deleteButton, &QPushButton::clicked, this, [=]{ Q_EMIT accepted(); close(); }); } peony/src/windows/windows.pri0000664000175000017500000000062115154271070015322 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/trash-warn-dialog.h \ $$PWD/about-dialog.h \ # $$PWD/main-window-factory.h \ # $$PWD/main-window.h \ $$PWD/x11-window-manager.h SOURCES += \ $$PWD/trash-warn-dialog.cpp \ $$PWD/about-dialog.cpp \ # $$PWD/main-window-factory.cpp \ # $$PWD/main-window.cpp \ $$PWD/x11-window-manager.cpp FORMS += \ $$PWD/about-dialog.ui peony/src/windows/about-dialog.h0000664000175000017500000000310415154271070015633 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include #include #include #include #include #ifdef KY_SDK_QT_WIDGETS #include #endif namespace Ui { class AboutDialog; } #ifdef KY_SDK_QT_WIDGETS class AboutDialog : public kdk::KAboutDialog #else class AboutDialog : public QDialog #endif { Q_OBJECT public: explicit AboutDialog(QWidget *parent = nullptr); ~AboutDialog(); void resetSize(); private: void initUI(); QString getCurrentVersion(); private Q_SLOTS: void on_closeBtn_clicked(); private: Ui::AboutDialog *ui; QGSettings *m_gSettings; void setSupportText(); //颜色转换 QString convertRGB16HexStr(const QColor &color); bool m_isFirstLoad = false; }; #endif // ABOUTDIALOG_H peony/src/windows/main-window.h0000664000175000017500000001573715154271106015534 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "FMWindowIface.h" #include "header-bar.h" #include "file-label-box.h" #include #include class MainWindowPrivate; class BorderShadowEffect; class HeaderBar; class NavigationSideBar; class TabWidget; class QWidgetResizeHandler; class QStackedWidget; class QGSettins; class QDBusInterface; class UkuiWindowHelper; namespace Peony { class DirectoryViewContainer; class FileInfo; class StatusBar; class SideBar; } class MainWindow : public QMainWindow, public Peony::FMWindowIface { friend class HeaderBar; friend class TopMenuBar; Q_OBJECT public: explicit MainWindow(const QString &uri = nullptr, QWidget *parent = nullptr); ~MainWindow(); bool eventFilter(QObject *watched, QEvent *event); QSize sizeHint() const; Peony::FMWindowIface *create(const QString &uri); Peony::FMWindowIface *create(const QStringList &uris); Peony::FMWindowIface *createWithZoomLevel(const QString &uri, int zoomLevel); Peony::FMWindowIface *createWithZoomLevel(const QStringList &uris, int zoomLevel); Peony::FMWindowFactory *getFactory(); Peony::DirectoryViewContainer *getCurrentPage(); const QString getCurrentUri(); const QStringList getCurrentSelections(); const QStringList getCurrentAllFileUris(); const QList> getCurrentSelectionFileInfos(); Qt::SortOrder getCurrentSortOrder(); int getCurrentSortColumn(); bool getWindowShowHidden(); bool getWindowUseDefaultNameSortOrder(); bool getWindowSortFolderFirst(); int currentViewZoomLevel(); bool currentViewSupportZoom(); void setKeepAbove(bool keepAbove); bool isKeepAbove() const; Q_SIGNALS: void windowSelectionChanged(); void locationChanged(const QString &uri); void viewLoaded(bool successed = true); void trashcleaned(); /*! * \brief locationChangeStart * \details * This signal is used to tell the window doing a location change. * When a window is excuting a location change, it should not execute another * one util the location change finished. */ void locationChangeStart(); /*! * \brief endLocationChange * \details * This signal is used to tell the window that a location change finished. * Once a location change finished, we can start a new location change. */ void locationChangeEnd(); void signal_itemAdded(const QString& uri);/* 新增文件(夹),item创建完成 */ void tabletModeChanged(bool isTabletMode); void setSelection(QStringList selectionUris); void initUIRequest(); public Q_SLOTS: void maximizeOrRestore(); void syncControlsLocation(const QString &uri); void updateHeaderBar(); void updateWindowIcon(); //void updateSearchStatus(bool showSearch); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void createFolderOperation(); void goToUri(const QString &uri, bool addHistory = false, bool force = false); void addNewTabs(const QStringList &uris); void beginSwitchView(const QString &viewId); void refresh(); void forceStopLoading(); //imigrate from fm-window void advanceSearch(); void clearRecord(); void searchFilter(QString target_path, QString keyWord, bool search_file_name, bool search_content); void filterUpdate(int type_index=0, int time_index=0, int size_index=0); void setShowHidden(bool showHidden); void setShowFileExtensions(bool checked); void setUseDefaultNameSortOrder(bool use); void setSortFolderFirst(bool set); void setShortCuts(); void checkSettings(); void setLabelNameFilter(QString name); void updateTabPageTitle(); //trash quick operations void cleanTrash(); void recoverFromTrash(); bool getFilterWorking(){return m_filter_working;} void setCurrentSelectionUris(const QStringList &uris); void setCurrentSortOrder (Qt::SortOrder order); void setCurrentSortColumn (int sortColumn); void editUri(const QString &uri); void editUris(const QStringList &uris); void setCurrentViewZoomLevel(int zoomLevel); QString getLastSearchKey(); void clearLastSearchPath(); void updateTabletModeValue(bool isTabletMode); void updateSearchStatus(bool isSearching); void updateDateFormat(QString dateFormat); void createVirtualTabAndSearch(); protected: void resizeEvent(QResizeEvent *e); void paintEvent(QPaintEvent *e); void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); void keyPressEvent(QKeyEvent *e); void showEvent(QShowEvent *event); void validBorder(); void initUI(const QString &uri); void initAdvancePage(); QRect sideBarRect(); void startMonitorThumbnailForbidStatus(); private: BorderShadowEffect *m_effect; #ifdef KY_SDK_WAYLANDHELPER UkuiWindowHelper *m_window_helper; #endif HeaderBar *m_header_bar; HeaderBarContainer *m_headerBarContainer; Peony::SideBar *m_side_bar; QWidget *m_transparent_area_widget; QStackedWidget *m_side_bar_container; TabWidget *m_tab = nullptr; Peony::StatusBar *m_status_bar; FileLabelBox *m_label_box; QString m_last_search_path = ""; QString m_last_key = ""; bool m_is_draging = false; bool m_is_search = false; bool m_is_clear_serach = false; bool m_filter_working = false; bool m_should_save_side_bar_width = false; bool m_should_save_window_size = false; bool m_is_first_tab =true; bool m_searching = false; QPoint m_offset; QWidgetList m_focus_list; bool m_shortcuts_set = false; QFileSystemWatcher *m_thumbnail_watcher; bool m_do_not_thumbnail = false; QGSettings* m_thumbnail = nullptr; //change minimum width to avoid bug#90366 const int WINDOW_MINIMUM_WIDTH = 740; QStringList m_uris_to_edit;/* 新建文件/文件夹,可编辑文件名list */ QDBusInterface *m_statusManagerDBus = nullptr; bool m_is_blur_window = false; bool m_is_show_menu = false; QString m_date_format = ""; QDBusInterface *mDbusDateServer; bool m_keepAbove = false; }; #endif // MAINWINDOW_H peony/src/windows/windows-peony.pri0000664000175000017500000000025615154271070016456 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/main-window.h \ $$PWD/main-window-factory.h \ SOURCES += \ $$PWD/main-window.cpp \ $$PWD/main-window-factory.cpp \ peony/src/windows/main-window-factory.cpp0000664000175000017500000000434115154271070017521 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "main-window-factory.h" #include "main-window.h" MainWindowFactory *global_instance = nullptr; Peony::MainWindowFactoryIface *MainWindowFactory::getInstance() { auto g = global_instance; if (!global_instance) global_instance = new MainWindowFactory; return global_instance; } Peony::FMWindowIface *MainWindowFactory::create(const QString &uri) { auto window = new MainWindow(uri); return window; } Peony::FMWindowIface *MainWindowFactory::create(const QStringList &uris) { if (uris.isEmpty()) return new MainWindow; auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); window->addNewTabs(l); return window; } QWidget *MainWindowFactory::createWindow(const QString &uri) { auto window = new MainWindow(uri); return window; } QWidget *MainWindowFactory::createWindow(const QStringList &uris) { if (uris.isEmpty()) return new MainWindow; auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); window->addNewTabs(l); return window; } QWidget *MainWindowFactory::createWindow(const QString &uri, QStringList selectUris) { auto window = new MainWindow(uri); connect(window, &MainWindow::locationChangeEnd, [=]() { Q_EMIT window->setSelection(selectUris); }); return window; } MainWindowFactory::MainWindowFactory(QObject *parent) : Peony::MainWindowFactoryIface() { } peony/src/man/0000775000175000017500000000000015154271070012176 5ustar fengfengpeony/src/man/peony.10000664000175000017500000000141015154271070013406 0ustar fengfeng.\" Man Page for Peony .TH Peony 1 "09 December 2019" "UKUI Desktop Environment" .SH "NAME" Peony \- The default File Manager of UKUI3.0. .SH "SYNOPSIS" .B peony [OPTION] [FILE1, FILE2...] .SH "DESCRIPTION" Peony is default FileManager of UKUI3.0. This program provides several commands for interactions with the program. .TP \fB -q, --quit\fR Close all windows and quit. .TP \fB -i, --show-items\fR Show items in directories and select them. .TP \fB -f, --show-folders\fR Show folders. .TP \fB -p, --show-properties\fR Show files properties. .SH "BUGS" .SS Should you encounter any bugs, they may be reported at: https://github.com/ukui/peony/issues .SH "AUTHORS" .SS This Manual Page has been written for the UKUI Desktop Environment by: Yue Lan (2019) peony/src/custome.qrc0000664000175000017500000000106015154271106013606 0ustar fengfeng icons/child-folder.png icons/child-folder2.png icons/ukui-down-symbolic.svg icons/ukui-end-symbolic.svg icons/ukui-start-symbolic.svg icons/ukui-up-symbolic.svg icons/sign.svg icons/sign.png icons/kylin-data-manager.svg icons/folder-space.svg peony/src/main-window-factory-plugin-manager.h0000664000175000017500000000332115154271070020375 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors:Yan Wei Yang * */ #ifndef FMWINDOWFACTORY_H #define FMWINDOWFACTORY_H #include #include "FMWindowIface.h" #include "main-window-factory-iface.h" #include /*! * \brief The FMWindowFactoryPluginManager class * \deprecated */ class MainWindowFactoryPluginManager : public QObject { public: static MainWindowFactoryPluginManager *getInstance(); QString setVersion(); QWidget *create(const QString &uri = nullptr); QWidget *create(const QStringList &uris); QWidget *create(const QString &uri, QStringList selectUris); const QStringList getPluginIds(); QObject *getPlugin(const QString &pluginId); bool registerPlugin(Peony::MainWindowFactoryIface *plugin); void close(); protected: void loadAsync(); private: explicit MainWindowFactoryPluginManager(QObject *parent = nullptr); QHash m_hash; }; #endif // FMWINDOWFACTORY_H peony/src/icons/0000775000175000017500000000000015154271106012536 5ustar fengfengpeony/src/icons/folder-space.svg0000664000175000017500000003415515154271106015633 0ustar fengfengpeony/src/icons/ukui-start-symbolic.svg0000664000175000017500000000115115154271070017204 0ustar fengfeng peony/src/icons/app-controlsetting2.png0000664000175000017500000000532315154271070017165 0ustar fengfengPNG  IHDR@@iq IDATx^[l\sΜy}$ihI JETjB -RHP R_RUEi ᖈĹ8qb{=jfc'zfv|6Gp_yp#0/ Np^s'>ȯ"d=BH+-)f1it'G x\tt\~R hcMmge dX۟7g>dn*tbPn|MA +!(|K,  2#~(=j\Rf~ s9L>:R3+f2̟u\hX#!# -QHt7l}L M_7sa$Ѹ@ѩf4AU6o Dz7R8XڟifH0MoДO#WLs֎SAGs\̇)6||zK3?݈0wX~EܴO`ȗ7wdE {A,C1dp:M80'L+Fb6V"W7{|MJ"(COʜRv_LNVs䒫B d;|MV9!Pw[m 6׹@f~:Ҁ* Wdll 7hUCS([dd,2Ҫ_ {Fbö xSWR+7sAlQo&4BF~ul'2dBU*BФ Ѭuz.:q N-F,}3@ t}[:AB=N/߄lhT8F\&*H൭mfIY)k (7[X)y8-lh1Fǁe@T. 7NdeF/ʕ` Rm_?'<ɤq LMBP F !a)<쓻IRHR&߁s;+_PC4׎2`K?H&=iI'΁1Hǐb4" 2ɮ}%@fvgAJbĒ?"[l=K=Ϣ>V}#SE%Cń~^c2+x`2CyV{=Q}-`"XW!2-6 _D|p?'+ԟ쒆& 1H(ї"VJg2Iq?}ƣ/+Mq0Bߏ״i5Nf _8<TNEc"⡏߾lDf҈Oݱl($r#^5dZIMGayס/s.aC2!{w+03KLm+B? jE6\_f`Zk@a"@ s"m{Ѱu~BR2h8tݹQ`0`(<$vmDBȜTMh"|َmfw]Pzq~Ly($%َ-60yan쪛! QۘAdj[9V?{y{r*(0U\G"R"S+ C! aRV )x?I5Y `TM:~*gxfvwEܜ jmb'##%鋾. '3:HeI^޿? .k12@y T3J\{»: HP&d؜G&VNE6k @tp2ڤ)En=e"6)sM:}>71":w'`!_;gLz PY0 3T4 tJad7U1MM`8 d܅%| =@yNmbݮ'`qzf8'"ǴF *oXaoCislzEsr`>eSbG<,Whn];:)vrwx/|of2̸\@̳gk}%Mn6Z$;$ܺ0 a3Rq /s+-`*'ςx7y}]MP-N9%Sgh_-.p{KٵG=JZwᑫ`|.X'yXV=} bTy5dvVa<2πj;0gM}HIENDB`peony/src/icons/ukui-down-symbolic.svg0000664000175000017500000000113315154271070017016 0ustar fengfeng peony/src/icons/child-folder2.png0000664000175000017500000000047515154271070015670 0ustar fengfengPNG  IHDR szz pHYs%%IR$IDATXV 0upGopuG.P "iB {i@3Zw qMDo t"ن(m +E'V.qx.p kB6 dknPT`{#1&L|JpJ@D6*:QPXlO&`Y2/w |o;a6miH@x$O;ռ.IENDB`peony/src/icons/ukui-end-symbolic.svg0000664000175000017500000000115215154271070016616 0ustar fengfeng peony/src/icons/child-folder.png0000664000175000017500000000034215154271070015577 0ustar fengfengPNG  IHDRa pHYs  ~IDAT8ݒ 0 "Lй:BE;d9\-lϢtN! gm$_,$WxXH V{Ql.KJ%zz$Jw$=&QVTԥA҈ L[jIENDB`peony/src/icons/sign.svg0000664000175000017500000000133415154271070014220 0ustar fengfeng peony/src/icons/app-controlsetting.png0000664000175000017500000000212515154271070017100 0ustar fengfengPNG  IHDR szzIDATXGKlTU߹BKMGFM\I c4hRYW>6hԅQ71PEaJ mNtf;ByPS{7q;n?K=vhDK җJ>D{y_j%MBp϶9bu6!7G;7!;Q^J*ȯHd0|po@ͳH_ @ Z$ ! Af$̀(/i iv<`*t>/ Hg4B:A *:bP5|4 @PhJHIENDB`peony/src/icons/ukui-up-symbolic.svg0000664000175000017500000000160115154271070016473 0ustar fengfeng peony/src/icons/kylin-data-manager.svg0000775000175000017500000017361515154271106016744 0ustar fengfeng peony/src/peony-application.h0000664000175000017500000000471015154271070015231 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef PEONYAPPLICATION_H #define PEONYAPPLICATION_H /** * @brief A single application use client/server desgin. * @details single application with c/s conmunication mode is a common desgin used for many file manager, like peony, caja, and nautilus. *
 * There are several benefits to this type application:
 *  * Reduce wastes of resources
 *  * Make application(s) easy to manage
 *  * Reduce IPC
 * 
* */ #include "singleapplication.h" #include #include class MainWindow; class PeonyApplication : public SingleApplication { Q_OBJECT public: explicit PeonyApplication(int &argc, char *argv[], const char *applicationName = "peony-qt"); static void about(); static void help(); static bool userGuideDaemonRunning(); static void showGuide(const QString &appName = "system-file-manager"); MainWindow* activedTopMainWindow(); static qint64 peony_start_time; public Q_SLOTS: //unmount all ftp links void unmountAllFtpLinks(); private: QString getUriMessage (QStringList&); protected Q_SLOTS: void parseCmd(quint32 id, QByteArray msg); private: QCommandLineParser parser; QCommandLineOption quitOption = QCommandLineOption(QStringList()<<"q"<<"quit", tr("Close all peony-qt windows and quit")); QCommandLineOption showItemsOption = QCommandLineOption(QStringList()<<"i"<<"show-items", tr("Show items")); QCommandLineOption showFoldersOption = QCommandLineOption(QStringList()<<"f"<<"show-folders", tr("Show folders")); QCommandLineOption showPropertiesOption = QCommandLineOption(QStringList()<<"p"<<"show-properties", tr("Show properties")); bool m_first_parse = true; }; #endif // PEONYAPPLICATION_H peony/src/src.pro0000664000175000017500000000675215154271106012746 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-06-20T09:45:20 # #------------------------------------------------- QT += core gui dbus concurrent gui-private core5compat greaterThan(QT_MAJOR_VERSION, 4): QT += widgets include(../common.pri) TARGET = peony TEMPLATE = app QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized -Werror=unused-label -rdynamic include(../libpeony-qt/libpeony-qt-header.pri) include(../3rd-parties/SingleApplication/singleapplication.pri) include(windows/windows.pri) include(windows/windows-peony.pri) include(control/control.pri) include(../plugin-iface/unstable/window-plugin-iface.pri) #include(view/view.pri) DEFINES += QAPPLICATION_CLASS=QApplication PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 gsettings-qt6 libcanberra libnotify udisks2 openssl dconf polkit-gobject-1 KF6WindowSystem LIBS +=-lgio-2.0 -lglib-2.0 -lX11 -lukui-log4qt CONFIG += c++11 link_pkgconfig no_keywords lrelease contains(DEFINES, KY_SDK_KABASE) { PKGCONFIG += kysdk-kabase } contains(DEFINES, KY_SDK_DATACOLLECT) { PKGCONFIG += kysdk-datacollect } LIBS += -L$$PWD/../libpeony-qt/ -lpeony contains(DEFINES, KY_SDK_QT_WIDGETS) { PKGCONFIG += kysdk-qtwidgets } contains(DEFINES, KY_SDK_WAYLANDHELPER) { PKGCONFIG += kysdk-waylandhelper LIBS += -lkysdk-ukuiwindowhelper } WINDOW_PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/peony-main-window DEFINES += WINDOW_PLUGIN_INSTALL_DIRS='\\"$${WINDOW_PLUGIN_INSTALL_DIRS}\\"' # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 TRANSLATIONS += ../translations/peony-qt/peony-qt_zh_CN.ts \ ../translations/peony-qt/peony-qt_tr.ts \ ../translations/peony-qt/peony-qt_cs.ts \ ../translations/peony-qt/peony-qt_de.ts \ ../translations/peony-qt/peony-qt_es.ts \ ../translations/peony-qt/peony-qt_fr.ts \ ../translations/peony-qt/peony-qt_kk_KZ.ts \ ../translations/peony-qt/peony-qt_ug_CN.ts \ ../translations/peony-qt/peony-qt_ky_KG.ts \ ../translations/peony-qt/peony-qt_bo_CN.ts \ ../translations/peony-qt/peony-qt_mn.ts \ ../translations/peony-qt/peony-qt_zh_HK.ts SOURCES += \ main-window-factory-plugin-manager.cpp \ peony-application.cpp \ peony-main-window-style.cpp \ peony-main.cpp \ HEADERS += \ peony-application.h \ peony-main-window-style.h main-window-factory-plugin-manager.h \ INCLUDEPATH += ../plugin-iface target.path = /usr/bin INSTALLS += target #QM_FILES_RESOURCE_PREFIX = ../translations/peony-qt QM_FILES_INSTALL_PATH = /usr/share/peony-qt data.path = /usr/share/applications data.files += ../data/peony.desktop \ ../data/peony-computer.desktop \ ../data/peony-home.desktop \ ../data/peony-trash.desktop INSTALLS += data RESOURCES += \ custome.qrc peony/src/peony-main-window-style.h0000664000175000017500000000231615154271070016315 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef PEONYMAINWINDOWSTYLE_H #define PEONYMAINWINDOWSTYLE_H #include class PeonyMainWindowStyle : public QProxyStyle { Q_OBJECT public: static PeonyMainWindowStyle *getStyle(); private: explicit PeonyMainWindowStyle(QObject *parent = nullptr); int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; }; #endif // PEONYMAINWINDOWSTYLE_H peony/src/main-window-factory-plugin-manager.cpp0000664000175000017500000001144715154271106020740 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yan Wei Yang * */ #include "main-window-factory-plugin-manager.h" #include "main-window-factory-iface.h" #include "main-window-factory.h" #include "plugin-manager.h" #ifdef KYLIN_COMMON #include #endif #include "global-settings.h" #include #include MainWindowFactoryPluginManager *global_instance1 = nullptr; MainWindowFactoryPluginManager *MainWindowFactoryPluginManager::getInstance() { if (!global_instance1) global_instance1= new MainWindowFactoryPluginManager; return global_instance1; } QString MainWindowFactoryPluginManager::setVersion() { int version = 4; #ifdef KYLIN_COMMON version = Peony::GlobalSettings::getInstance()->getValue(PEONY_VERSION).toInt(); #endif //KYLIN_COMMON QString name = "ukui4.0"; switch(version) { case 3: name = "ukui3.0"; Peony::GlobalSettings::getInstance()->setValue(MULTI_SELECT, false); break; case 4: default: name = "ukui4.0"; Peony::GlobalSettings::getInstance()->setValue(MULTI_SELECT, true); break; }; qApp->setProperty("version", name); return name; } QWidget *MainWindowFactoryPluginManager::create(const QString &uri) { QString name = setVersion(); Peony::MainWindowFactoryIface *iface = m_hash.value(name); QWidget *window = nullptr; if (iface) { window = iface->createWindow(uri); } else { window = m_hash.value("ukui4.0")->createWindow(uri); } return window; } QWidget *MainWindowFactoryPluginManager::create(const QStringList &uris) { if (uris.isEmpty()) { return create(); } QWidget *window = create(uris.first()); return window; } QWidget *MainWindowFactoryPluginManager::create(const QString &uri, QStringList selectUris) { QString name = setVersion(); Peony::MainWindowFactoryIface *iface = m_hash.value(name); QWidget *window = nullptr; if (iface) { window = iface->createWindow(uri, selectUris); } else { window = m_hash.value("ukui4.0")->createWindow(uri, selectUris); } return window; } MainWindowFactoryPluginManager::MainWindowFactoryPluginManager(QObject *parent) : QObject(parent) { registerPlugin(MainWindowFactory::getInstance()); QDir pluginsDir(WINDOW_PLUGIN_INSTALL_DIRS); pluginsDir.setFilter(QDir::Files); //QtConcurrent::run([=]() { qDebug()<(plugin); qWarning() << "load desktop error:" <name(); registerPlugin(piface); } connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::valueChanged, this, [=] (const QString& key) { if (PEONY_VERSION == key) { setVersion(); } }); } bool MainWindowFactoryPluginManager::registerPlugin(Peony::MainWindowFactoryIface *plugin) { if (m_hash.value(plugin->name())) { return false; } m_hash.insert(plugin->name(), plugin); return true; } const QStringList MainWindowFactoryPluginManager::getPluginIds() { return m_hash.keys(); } QObject *MainWindowFactoryPluginManager::getPlugin(const QString &pluginId) { auto iface = m_hash.value(pluginId); auto obj = dynamic_cast(iface); return obj; } peony/src/img.qrc0000664000175000017500000000040615154271070012706 0ustar fengfeng img/go-down-symbolic.png img/go-previous-symbolic.png img/media-eject-symbolic.png peony/src/peony-main.cpp0000664000175000017500000002353615154271106014214 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-application.h" //#include "main-window.h" #include #include #include #include #include #include #include #include #include #include //#include "navigation-tab-bar.h" //#include "tab-widget.h" #include "global-settings.h" #include "xdg-portal-helper.h" #ifdef KY_SDK_KABASE #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include pthread_t threadID = pthread_self(); // 获取当前线程ID QString resolveAddress(void* addr); #define BUFF_SIZE 1024 static void crashHandler(int sig) { signal(sig, SIG_IGN); // 使用纯 C 风格的时间戳记录时间 time_t now = time(nullptr); struct tm* localTime = localtime(&now); // 打开日志文件 char path[BUFF_SIZE] = {0}; snprintf(path, BUFF_SIZE, "%s/.log/peony.log", getenv("HOME")); FILE* fp = fopen(path, "a"); if (!fp) return; // 获取当前线程ID pthread_t threadID = pthread_self(); fprintf(fp, "[PEONY TRACE LOG] %04d-%02d-%02d %02d:%02d:%02d\n", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday, localTime->tm_hour, localTime->tm_min, localTime->tm_sec); fprintf(fp, "PID: %d\nSignal: %d (%s)\n", getpid(), sig, strsignal(sig)); fprintf(fp, "Thread ID: %lu\n", threadID); // 打印线程ID // 写入崩溃信息 fprintf(fp, "[PEONY TRACE LOG] %04d-%02d-%02d %02d:%02d:%02d\n", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday, localTime->tm_hour, localTime->tm_min, localTime->tm_sec); fprintf(fp, "PID: %d\nSignal: %d (%s)\n", getpid(), sig, strsignal(sig)); // 获取堆栈信息 void* array[20]; int size = backtrace(array, 20); char** stackList = backtrace_symbols(array, size); if (stackList) { fprintf(fp, "Stack Trace:\n"); for (int i = 0; i < size; i++) { fprintf(fp, "#%d %s\n", i, stackList[i]); // 调用 resolveAddress 函数解析地址 QString resolved = resolveAddress(array[i]); if (!resolved.isEmpty()) { fprintf(fp, " Resolved: %s\n", resolved.toUtf8().constData()); } else { fprintf(fp, " Resolved: \n"); } } free(stackList); } fclose(fp); // 安全退出程序 _exit(128 + sig); } static void registerSignals() { sigset_t mask; sigemptyset(&mask); // 定义常用崩溃信号 const auto signalList = {SIGSEGV, SIGILL, SIGTERM, SIGHUP, SIGABRT}; for (const auto &signal : signalList) { struct sigaction action; action.sa_handler = crashHandler; // 指定处理函数 action.sa_flags = SA_RESTART; sigemptyset(&action.sa_mask); // 注册信号处理 if (sigaction(signal, &action, nullptr) < 0) { qDebug() << "Failed to register signal handler for signal:" << signal << strerror(errno); } // 添加信号到屏蔽集 if (sigaddset(&mask, signal) < 0) { qDebug() << "Failed to add signal to mask:" << signal << strerror(errno); } } // 解除信号阻塞 if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) < 0) { qDebug() << "Failed to unblock signals:" << strerror(errno); } } QString resolveAddress(void* addr) { // 获取当前程序路径 QString programPath; QFile exeFile("/proc/self/exe"); if (exeFile.exists()) { char exePath[1024] = {0}; ssize_t len = readlink("/proc/self/exe", exePath, sizeof(exePath) - 1); if (len != -1) { exePath[len] = '\0'; // Null-terminate programPath = QString::fromUtf8(exePath); } else { programPath = ""; } } else { programPath = ""; } // 使用 QProcess 调用 addr2line QStringList arguments; arguments << "-e" << programPath << QString::asprintf("%p", addr) << "-f" << "-p" << "-C"; QProcess process; process.start("addr2line", arguments); if (!process.waitForFinished(3000)) { // 3秒超时 qWarning() << "addr2line execution timed out or failed."; return QString("Unresolved address: %1").arg(reinterpret_cast(addr), 0, 16); } // 读取标准输出 QString output = QString::fromUtf8(process.readAllStandardOutput()).trimmed(); if (!output.isEmpty() && !output.contains("??")) { return output; // 返回解析结果 } // 如果 addr2line 解析失败,尝试读取动态库信息 QFile mapsFile("/proc/self/maps"); if (mapsFile.open(QIODevice::ReadOnly | QIODevice::Text)) { while (!mapsFile.atEnd()) { QByteArray line = mapsFile.readLine(); unsigned long start, end; char libPath[512] = {0}; if (sscanf(line.data(), "%lx-%lx %*s %*s %*s %*d %s", &start, &end, libPath) == 3) { if (reinterpret_cast(addr) >= start && reinterpret_cast(addr) < end) { // 计算偏移地址 unsigned long offset = reinterpret_cast(addr) - start; return QString("Address %1 in %2 (offset 0x%3)") .arg(reinterpret_cast(addr), 0, 16) .arg(QString::fromUtf8(libPath)) .arg(offset, 0, 16); } } } } // 如果未找到动态库,直接返回地址 return QString("Unresolved address: %1").arg(reinterpret_cast(addr), 0, 16); } void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); QByteArray currentTime = QTime::currentTime().toString().toLocal8Bit(); bool showDebug = true; QString logFilePath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/peony-qt.log"; //屏蔽代码,自动生成日志,无需手动创建 // if (!QFile::exists(logFilePath)) { // showDebug = false; // } FILE *log_file = nullptr; if (showDebug) { log_file = fopen(logFilePath.toLocal8Bit().constData(), "a+"); } const char *file = context.file ? context.file : ""; const char *function = context.function ? context.function : ""; switch (type) { case QtDebugMsg: if (!log_file) { break; } fprintf(log_file, "Debug: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtInfoMsg: fprintf(log_file? log_file: stdout, "Info: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtWarningMsg: fprintf(log_file? log_file: stderr, "Warning: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtCriticalMsg: fprintf(log_file? log_file: stderr, "Critical: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtFatalMsg: fprintf(log_file? log_file: stderr, "Fatal: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; } if (log_file) fclose(log_file); } int main(int argc, char *argv[]) { Peony::XdgPortalHelper::getInstance()->tryUnusePortal(); PeonyApplication::peony_start_time = QDateTime::currentMSecsSinceEpoch(); // initUkuiLog4qt("peony"); // qInstallMessageHandler(messageOutput); #ifdef KY_SDK_KABASE qInstallMessageHandler(kdk::kabase::Log::logOutput); #else //initUkuiLog4qt("peony"); #endif qDebug() << "peony start in main time:" <= QT_VERSION_CHECK(5, 14, 0)) QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif if (Peony::GlobalSettings::getInstance()->getProjectName() == V10_SP1_EDU) { // hide template file QFile file(QString("%1/.hidden").arg(QStandardPaths::writableLocation(QStandardPaths::HomeLocation))); if (!file.exists()) { file.open(QFile::WriteOnly); QFileInfo templateFileInfo(g_get_user_special_dir(G_USER_DIRECTORY_TEMPLATES)); file.write(templateFileInfo.baseName().toLocal8Bit().constData()); file.close(); } } PeonyApplication app(argc, argv, "peony-qt"); qApp->setProperty("isPeony", true); registerSignals(); Peony::XdgPortalHelper::getInstance()->tryResetPortal(); if (app.isSecondary()) return 0; return app.exec(); } peony/src/peony-main-window-style.cpp0000664000175000017500000000342115154271070016646 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-main-window-style.h" static PeonyMainWindowStyle *global_instance = nullptr; PeonyMainWindowStyle *PeonyMainWindowStyle::getStyle() { if (!global_instance) { global_instance = new PeonyMainWindowStyle; } return global_instance; } PeonyMainWindowStyle::PeonyMainWindowStyle(QObject *parent) : QProxyStyle() { } int PeonyMainWindowStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric) { case PM_LayoutVerticalSpacing: case PM_LayoutTopMargin: case PM_LayoutLeftMargin: case PM_LayoutRightMargin: case PM_LayoutBottomMargin: case PM_LayoutHorizontalSpacing: case PM_DockWidgetFrameWidth: case PM_DockWidgetTitleMargin: case PM_DockWidgetTitleBarButtonMargin: return 0; case PM_DockWidgetHandleExtent: return 2; case PM_DockWidgetSeparatorExtent: return 2; default: return QProxyStyle::pixelMetric(metric, option, widget); } } peony/src/control/0000775000175000017500000000000015154271106013103 5ustar fengfengpeony/src/control/intel/0000775000175000017500000000000015154271106014216 5ustar fengfengpeony/src/control/intel/intel-side-bar-abstract-item.h0000664000175000017500000000475115154271070021732 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARABSTRACTITEM_H #define INTEL_SIDEBARABSTRACTITEM_H #include #include #include "peony-core_global.h" #include namespace Peony { namespace Intel { class SideBarModel; class PEONYCORESHARED_EXPORT SideBarAbstractItem : public QObject { friend class SideBarFileSystemItem; friend class SideBarModel; Q_OBJECT public: enum Type { FavoriteItem, PersonalItem, FileSystemItem, SeparatorItem, VFSItem }; explicit SideBarAbstractItem(SideBarModel* model, QObject *parent = nullptr); virtual ~SideBarAbstractItem(); virtual Type type() = 0; virtual QString uri() = 0; virtual QString displayName() = 0; virtual QString iconName() = 0; virtual bool hasChildren() = 0; virtual bool isRemoveable() = 0; virtual bool isEjectable() = 0; virtual bool isMountable() = 0; virtual bool isMounted() { return false; } virtual QModelIndex firstColumnIndex() = 0; virtual QModelIndex lastColumnIndex() = 0; virtual SideBarAbstractItem *parent() = 0; protected: QVector *m_children = nullptr; SideBarModel *m_model = nullptr; QString m_unix_device; // sdb1, etc... QString m_volume_name; // Windows, Data etc... Q_SIGNALS: void findChildrenFinished(); void updated(); public Q_SLOTS: virtual void onUpdated() = 0; virtual void eject(GMountUnmountFlags ejectFlag) = 0; virtual void unmount() = 0; virtual void format() = 0; virtual void ejectOrUnmount() {} virtual void findChildren() = 0; virtual void findChildrenAsync() = 0; virtual void clearChildren(); }; } } #endif // SIDEBARABSTRACTITEM_H peony/src/control/intel/intel-side-bar-proxy-filter-sort-model.h0000664000175000017500000000272715154271070023723 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARPROXYFILTERSORTMODEL_H #define INTEL_SIDEBARPROXYFILTERSORTMODEL_H #include "peony-core_global.h" #include namespace Peony { namespace Intel { class SideBarAbstractItem; class PEONYCORESHARED_EXPORT SideBarProxyFilterSortModel : public QSortFilterProxyModel { Q_OBJECT public: explicit SideBarProxyFilterSortModel(QObject *parent = nullptr); SideBarAbstractItem *itemFromIndex(const QModelIndex &proxy_index); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; }; } } #endif // SIDEBARPROXYFILTERSORTMODEL_H peony/src/control/intel/intel-side-bar-proxy-filter-sort-model.cpp0000664000175000017500000001006215154271070024245 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-proxy-filter-sort-model.h" #include "intel-side-bar-abstract-item.h" #include "intel-side-bar-model.h" #include "file-utils.h" #include "file-info.h" #include "file-info-job.h" #include using namespace Peony::Intel; SideBarProxyFilterSortModel::SideBarProxyFilterSortModel(QObject *parent) : QSortFilterProxyModel(parent) { } bool SideBarProxyFilterSortModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { auto index = sourceModel()->index(sourceRow, 0, sourceParent); auto item = static_cast(index.internalPointer()); if (item->type() != SideBarAbstractItem::SeparatorItem) { if (item->displayName().isNull()) return false; } if (item) { if (!item->displayName().isEmpty()) { if (QString(item->displayName().at(0)) == ".") { return false; } } } if (item->type() == SideBarAbstractItem::FileSystemItem) { if (sourceParent.data(Qt::UserRole).toString() == "computer:///") { if (item->uri() != "computer:///root.link") { auto gvfsFileInfo = FileInfo::fromUri(item->uri()); if (gvfsFileInfo->displayName().isEmpty()) { FileInfoJob j(gvfsFileInfo); j.querySync(); } QString gvfsDisplayName = gvfsFileInfo->displayName(); QString gvfsUnixDevice = gvfsFileInfo->unixDeviceFile(); if(!gvfsUnixDevice.isNull() && !gvfsDisplayName.contains(":")){ /* 当display name不为空时,但实际display name已变化时,需要再查询一次,link to bug#127334 */ FileInfoJob infoJob(gvfsFileInfo); infoJob.querySync(); if(!gvfsFileInfo->unixDeviceFile().isNull() && !gvfsFileInfo->displayName().contains(":")) return false;//Filter some non-mountable drive items } if (item->isMounted()) return true; if (item->isRemoveable() && item->isMountable()) { return true; } if (!item->isRemoveable() && !item->isEjectable()) return true; return false; } } } return true; } bool SideBarProxyFilterSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { //qDebug()<<"less than"; if (!(left.isValid() && right.isValid())) { return QSortFilterProxyModel::lessThan(left, right); } auto leftItem = static_cast(left.internalPointer()); auto rightItem = static_cast(right.internalPointer()); if (leftItem->type() != SideBarAbstractItem::FileSystemItem || rightItem->type() != SideBarAbstractItem::FileSystemItem) { return false; } //qDebug()<displayName()<displayName(); return leftItem->displayName().compare(rightItem->displayName()) > 0; } SideBarAbstractItem *SideBarProxyFilterSortModel::itemFromIndex(const QModelIndex &proxy_index) { SideBarModel *model = static_cast(sourceModel()); auto index = mapToSource(proxy_index); return model->itemFromIndex(index); } peony/src/control/intel/intel-side-bar-separator-item.cpp0000664000175000017500000000247015154271070022456 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-separator-item.h" #include "intel-side-bar-model.h" using namespace Peony::Intel; SideBarSeparatorItem::SideBarSeparatorItem(Details type, SideBarAbstractItem *parentItem, SideBarModel *model, QObject *parent) : SideBarAbstractItem(model, parent) { m_type = type; m_parent = parentItem; } QModelIndex SideBarSeparatorItem::firstColumnIndex() { return m_model->firstColumnIndex(this); } QModelIndex SideBarSeparatorItem::lastColumnIndex() { return m_model->lastColumnIndex(this); } peony/src/control/intel/intel-side-bar-model.h0000664000175000017500000000700715154271070020270 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARMODEL_H #define INTEL_SIDEBARMODEL_H #include #include #include "peony-core_global.h" namespace Peony { namespace Intel { class SideBarAbstractItem; /*! * \brief The SideBarModel class * \todo * Add dnd support and custom favorite items support. */ class PEONYCORESHARED_EXPORT SideBarModel : public QAbstractItemModel { friend class SideBarFileSystemItem; friend class SideBarAbstractItem; Q_OBJECT public: explicit SideBarModel(QObject *parent = nullptr); ~SideBarModel() override; QModelIndex firstColumnIndex(SideBarAbstractItem *item); QModelIndex lastColumnIndex(SideBarAbstractItem *item); SideBarAbstractItem *itemFromIndex(const QModelIndex &index); // Header: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override; // Basic functionality: QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; // Fetch data dynamically: bool hasChildren(const QModelIndex &parent = QModelIndex()) const override; bool canFetchMore(const QModelIndex &parent) const override; void fetchMore(const QModelIndex &parent) override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; // Editable: bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex& index) const override; // Add data: bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override; // Remove data: bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; Qt::DropActions supportedDropActions() const override; Q_SIGNALS: void indexUpdated(const QModelIndex &index); protected: QVector *m_root_children = nullptr; void onIndexUpdated(const QModelIndex &index); protected: QStringList m_bookmark_uris; }; } } #endif // SIDEBARMODEL_H peony/src/control/intel/intel-side-bar-model.cpp0000664000175000017500000002730515154271070020626 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-model.h" #include "intel-side-bar-favorite-item.h" #include "intel-side-bar-personal-item.h" #include "intel-side-bar-file-system-item.h" #include "intel-side-bar-separator-item.h" #include "intel-side-bar-cloud-item.h" #include "file-info.h" #include "file-info-job.h" #include "bookmark-manager.h" #include "file-operation-utils.h" #include "vfs-plugin-manager.h" #include "intel-side-bar-vfs-item.h" #include #include #include #include using namespace Peony::Intel; SideBarModel::SideBarModel(QObject *parent) : QAbstractItemModel(parent) { beginResetModel(); m_root_children = new QVector(); auto vfsMgr = VFSPluginManager::getInstance(); auto plugins = vfsMgr->registeredPlugins(); for (auto plugin : plugins) { if (plugin->holdInSideBar()) m_root_children->append(new SideBarVFSItem(plugin, this)); } // SideBarSeparatorItem *separator1 = new SideBarSeparatorItem(SideBarSeparatorItem::Large, nullptr, this, this); // m_root_children->append(separator1); SideBarFavoriteItem *favorite_root_item = new SideBarFavoriteItem(nullptr, nullptr, this); m_root_children->append(favorite_root_item); //favorite_root_item->findChildren(); // SideBarSeparatorItem *separator2 = new SideBarSeparatorItem(SideBarSeparatorItem::Small, nullptr, this, this); // m_root_children->append(separator2); SideBarPersonalItem *personal_root_item = new SideBarPersonalItem(nullptr, nullptr, this); m_root_children->append(personal_root_item); //personal_root_item->findChildren(); // SideBarSeparatorItem *separator3 = new SideBarSeparatorItem(SideBarSeparatorItem::Small, nullptr, this, this); // m_root_children->append(separator3); //! \note Temporarily hidden cloud // SideBarCloudItem *cloudItem = new SideBarCloudItem(nullptr, nullptr, this); // m_root_children->append(cloudItem); SideBarFileSystemItem *computerItem = new SideBarFileSystemItem(nullptr, nullptr, this); m_root_children->append(computerItem); //computerItem->findChildren(); endResetModel(); //empty-file separator connect(this, &SideBarModel::indexUpdated, this, &SideBarModel::onIndexUpdated); } SideBarModel::~SideBarModel() { for (auto child : *m_root_children) { delete child; } m_root_children->clear(); delete m_root_children; } QModelIndex SideBarModel::firstColumnIndex(SideBarAbstractItem *item) { if (item->parent() != nullptr) { return createIndex(item->parent()->m_children->indexOf(item), 0, item); } else { return createIndex(m_root_children->indexOf(item), 0, item); } } QModelIndex SideBarModel::lastColumnIndex(SideBarAbstractItem *item) { if (item->parent() != nullptr) { createIndex(item->parent()->m_children->indexOf(item), 1, item); } else { for (auto child : *m_root_children) { if (item->type() == child->type()) { return createIndex(m_root_children->indexOf(child), 1, item); } } } return QModelIndex(); } SideBarAbstractItem *SideBarModel::itemFromIndex(const QModelIndex &index) { return static_cast(index.internalPointer()); } QVariant SideBarModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(section); Q_UNUSED(orientation); Q_UNUSED(role); return QVariant(); } bool SideBarModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) { return false; } QModelIndex SideBarModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { return createIndex(row, column, m_root_children->at(row)); } SideBarAbstractItem *parentItem = static_cast(parent.internalPointer()); if (parentItem->m_children->count() > row) { return createIndex(row, column, parentItem->m_children->at(row)); } return QModelIndex(); } QModelIndex SideBarModel::parent(const QModelIndex &index) const { SideBarAbstractItem *item = static_cast(index.internalPointer()); //qDebug()<uri(); if (!item) return QModelIndex(); if (item->parent()) return item->parent()->firstColumnIndex(); return QModelIndex(); } int SideBarModel::rowCount(const QModelIndex &parent) const { if (!parent.isValid()) return m_root_children->count(); SideBarAbstractItem *parentItem = static_cast(parent.internalPointer()); //qDebug()<uri(); return parentItem->m_children->count(); } int SideBarModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 1; } bool SideBarModel::hasChildren(const QModelIndex &parent) const { if (!parent.isValid()) return true; // to make item in side bar can expand only one time if (parent.parent().isValid()) return false; SideBarAbstractItem *parentItem = static_cast(parent.internalPointer()); return parentItem->hasChildren(); } bool SideBarModel::canFetchMore(const QModelIndex &parent) const { Q_UNUSED(parent); return true; } void SideBarModel::fetchMore(const QModelIndex &parent) { Q_UNUSED(parent); } QVariant SideBarModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); SideBarAbstractItem *item = static_cast(index.internalPointer()); //! Delete the second column to fit the topic // if (index.column() == 1) { // if(role == Qt::DecorationRole){ // bool unmountAble,ejectAble; // unmountAble = item->isMountable(); // ejectAble = item->isEjectable(); // if(unmountAble && ejectAble) // return QVariant(QIcon::fromTheme("media-eject")); // else if(unmountAble){ // if(item->isMounted()) // return QVariant(QIcon::fromTheme("media-eject")); // else // return QVariant(); // }else // return QVariant(); // }else // return QVariant(); // } switch (role) { case Qt::DecorationRole: return QIcon::fromTheme(item->iconName() + "-symbolic", QIcon::fromTheme(item->iconName())); case Qt::DisplayRole: return item->displayName(); case Qt::ToolTipRole: return item->displayName(); case Qt::UserRole: return item->uri(); default: break; } return QVariant(); } bool SideBarModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (data(index, role) != value) { // FIXME: Implement me! Q_EMIT dataChanged(index, index, QVector() << role); return true; } return false; } Qt::ItemFlags SideBarModel::flags(const QModelIndex &index) const { return QAbstractItemModel::flags(index) | Qt::ItemIsDropEnabled; // FIXME: Implement me! } bool SideBarModel::insertRows(int row, int count, const QModelIndex &parent) { beginInsertRows(parent, row, row + count - 1); // FIXME: Implement me! endInsertRows(); return true; } bool SideBarModel::insertColumns(int column, int count, const QModelIndex &parent) { beginInsertColumns(parent, column, column + count - 1); // FIXME: Implement me! endInsertColumns(); return true; } bool SideBarModel::removeRows(int row, int count, const QModelIndex &parent) { beginRemoveRows(parent, row, row + count - 1); // FIXME: Implement me! endRemoveRows(); return true; } bool SideBarModel::removeColumns(int column, int count, const QModelIndex &parent) { beginRemoveColumns(parent, column, column + count - 1); // FIXME: Implement me! endRemoveColumns(); return true; } void SideBarModel::onIndexUpdated(const QModelIndex &index) { auto item = itemFromIndex(index); //qDebug()<m_children->count(); bool isEmpty = true; for (auto child : *item->m_children) { auto info = FileInfo::fromUri(child->uri()); if (!info->displayName().startsWith(".") && (info->isDir() || info->isVolume())) isEmpty = false; if (child->type() == SideBarAbstractItem::SeparatorItem) { removeRows(item->m_children->indexOf(child), 1, index); item->m_children->removeOne(child); qDebug()<<"separator"<m_children->count(); } } if (isEmpty) { auto separator = new SideBarSeparatorItem(SideBarSeparatorItem::EmptyFile, item, this); item->m_children->append(separator); insertRows(item->m_children->count() - 1, 1, index); } } bool SideBarModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (data->urls().isEmpty()) return false; auto item = this->itemFromIndex(parent); qDebug()<<"SideBarModel::dropMimeData:" <isLoaded()) { for (auto url : data->urls()) { auto info = FileInfo::fromUri(url.toDisplayString()); if (info->displayName().isNull()) { FileInfoJob j(info); j.querySync(); } if (info->isDir()) { bookmark->addBookMark(url.url()); } } } return true; } switch (item->type()) { case SideBarAbstractItem::SeparatorItem: case SideBarAbstractItem::FavoriteItem: //drag to sider bar all as file move operation // { // auto bookmark = BookMarkManager::getInstance(); // if (bookmark->isLoaded()) { // for (auto url : data->urls()) { // auto info = FileInfo::fromUri(url.toDisplayString(), false); // if (info->displayName().isNull()) { // FileInfoJob j(info); // j.querySync(); // } // if (info->isDir()) { // bookmark->addBookMark(url.url()); // } // } // } // break; // } case SideBarAbstractItem::PersonalItem: case SideBarAbstractItem::FileSystemItem: { QStringList uris; for (auto url : data->urls()) { uris<uri().startsWith("recent://")) return false; for(auto uri : uris) { if (uri.startsWith("trash://")) return false; //can not drag file from recent if (uri.startsWith("recent://")) return false; } FileOperationUtils::move(uris, item->uri(), true, true); break; } } return true; } Qt::DropActions SideBarModel::supportedDropActions() const { return Qt::MoveAction|Qt::CopyAction|Qt::LinkAction; } peony/src/control/intel/intel-sidebar.pri0000664000175000017500000000202115154271070017447 0ustar fengfengHEADERS += \ $$PWD/intel-navigation-side-bar.h \ $$PWD/intel-side-bar-abstract-item.h \ $$PWD/intel-side-bar-cloud-item.h \ $$PWD/intel-side-bar-favorite-item.h \ $$PWD/intel-side-bar-file-system-item.h \ $$PWD/intel-side-bar-menu.h \ $$PWD/intel-side-bar-model.h \ $$PWD/intel-side-bar-personal-item.h \ $$PWD/intel-side-bar-proxy-filter-sort-model.h \ $$PWD/intel-side-bar-separator-item.h \ $$PWD/intel-side-bar-vfs-item.h \ $$PWD/tablet-side-bar-factory.h SOURCES += \ $$PWD/intel-navigation-side-bar.cpp \ $$PWD/intel-side-bar-abstract-item.cpp \ $$PWD/intel-side-bar-cloud-item.cpp \ $$PWD/intel-side-bar-favorite-item.cpp \ $$PWD/intel-side-bar-file-system-item.cpp \ $$PWD/intel-side-bar-menu.cpp \ $$PWD/intel-side-bar-model.cpp \ $$PWD/intel-side-bar-personal-item.cpp \ $$PWD/intel-side-bar-proxy-filter-sort-model.cpp \ $$PWD/intel-side-bar-separator-item.cpp \ $$PWD/intel-side-bar-vfs-item.cpp \ $$PWD/tablet-side-bar-factory.cpp peony/src/control/intel/intel-side-bar-menu.cpp0000664000175000017500000001673215154271070020474 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-menu.h" #include "intel-side-bar-abstract-item.h" #include "bookmark-manager.h" #include "properties-window.h" #include "menu-plugin-manager.h" #include "file-utils.h" #include "file-info.h" #include "file-info-job.h" #include #include #include #include #include #include using namespace Peony::Intel; SideBarMenu::SideBarMenu(SideBarAbstractItem *item, SideBar *sideBar, QWidget *parent) : QMenu (parent) { m_uri = item->uri(); m_item = item; m_side_bar = sideBar; if (!item) { auto action = addAction(QIcon::fromTheme("preview-file"), tr("Properties")); action->setEnabled(false); return; } switch (item->type()) { case SideBarAbstractItem::FavoriteItem: { constructFavoriteActions(); break; } case SideBarAbstractItem::PersonalItem: { constructPersonalActions(); break; } case SideBarAbstractItem::FileSystemItem: { constructFileSystemItemActions(); break; } default: { auto action = addAction(QIcon::fromTheme("preview-file"), tr("Properties")); action->setEnabled(false); break; } } } const QList SideBarMenu::constructFavoriteActions() { QList l; l<removeBookMark(m_uri); }); if (!m_item->firstColumnIndex().parent().isValid()) { l.last()->setEnabled(false); } else if (m_item->firstColumnIndex().row() < 10) { l.last()->setEnabled(false); } else if (m_uri == "file:///data/usershare" || m_uri == "kmre:///" || m_uri == "kydroid:///") { //fix bug#68431, can not delete option issue l.last()->setEnabled(false); } l<show(); }); if (!m_item->firstColumnIndex().parent().isValid()) { l.last()->setEnabled(false); } return l; } const QList SideBarMenu::constructPersonalActions() { QList l; l<show(); }); return l; } const QList SideBarMenu::constructFileSystemItemActions() { QList l; //FIXME: replace BLOCKING api in ui thread. auto info = FileInfo::fromUri(m_uri); if (info->displayName().isEmpty()) { FileInfoJob j(info); j.querySync(); } if (info->canUnmount() || info->canMount()) { l<unmount(); }); bool isUmountable = FileUtils::isFileUnmountable(m_item->uri()); bool isMounted = isUmountable; auto targetUri = FileUtils::getTargetUri(m_item->uri()); if (!targetUri.isEmpty()) { if (targetUri == "burn:///") { isMounted = false; } else { isMounted = (targetUri != "file:///") || isUmountable; } } l.last()->setEnabled(isMounted); } if(0 != QString::compare(m_uri, "computer:///root.link")) { if (m_item->isRemoveable()) { l<eject(G_MOUNT_UNMOUNT_NONE); }); l.last()->setEnabled(m_item->isMounted()); } } if(0 != QString::compare(m_uri, "filesafe:///")) { auto mgr = MenuPluginManager::getInstance(); auto ids = mgr->getPluginIds(); for (auto id : ids) { auto factory = mgr->getPlugin(id); //qDebug()<menuActions(MenuPluginInterface::SideBar, m_uri, QStringList()<setParent(this); } l<show(); } }); if ((0 != QString::compare(m_uri, "computer:///")) && (0 != QString::compare(m_uri, "filesafe:///"))) { l.last()->setEnabled(m_item->isMounted()); } /* * add format function * provide option for all mountable device * if can not format, will have prompt */ auto targetUri = FileUtils::getTargetUri(m_uri); auto mount = VolumeManager::getMountFromUri(targetUri); QString unixDevice = FileUtils::getUnixDevice(m_uri); //qDebug() << "targetUri:"<isVolume() && info->canUnmount()){ l<show(); }); //no right u-disk should not be formated, fix bug# if (! mount) l.last()->setEnabled(false); } return l; } void SideBarMenu::gotoAboutComputer() { QProcess p; p.setProgram("ukui-control-center"); //-m About para to show about computer infos, related to bug#88258 p.setArguments(QStringList()<<"-m" << "About"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("ukui-control-center", QStringList()<<"-m" << "About"); #endif p.waitForFinished(-1); } const QList SideBarMenu::constructNetWorkItemActions() { QList l; /* 共享文件夹无右键菜单'卸载' */ if (!m_uri.startsWith("file://")) { l<unmount(); }); l.last()->setEnabled(m_item->isMounted()); } //fix network items has Properties option issue, link to bug#78617 if (! m_uri.startsWith("network://")) { l<show(); }); } return l; } peony/src/control/intel/intel-side-bar-personal-item.cpp0000664000175000017500000001256515154271070022307 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-personal-item.h" #include "intel-side-bar-model.h" #include "file-utils.h" #include "file-watcher.h" #include "file-info.h" #include "file-info-job.h" #include using namespace Peony::Intel; SideBarPersonalItem::SideBarPersonalItem(QString uri, SideBarPersonalItem *parentItem, SideBarModel *model, QObject *parent) : SideBarAbstractItem (model, parent) { m_parent = parentItem; m_is_root_child = parentItem == nullptr; if (m_is_root_child) { QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); m_uri = homeUri; m_display_name = tr("Personal"); //m_icon_name = "emblem-personal"; //top dir don't show icon m_icon_name = ""; int count = 0; QString documentUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); if(homeUri != documentUri) { SideBarPersonalItem *documentItem = new SideBarPersonalItem(documentUri, this, m_model); m_children->append(documentItem); count++; } QString pictureUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); if(homeUri != pictureUri) { SideBarPersonalItem *pictureItem = new SideBarPersonalItem(pictureUri, this, m_model); m_children->append(pictureItem); count++; } QString mediaUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::MoviesLocation); if(homeUri != mediaUri) { SideBarPersonalItem *mediaItem = new SideBarPersonalItem(mediaUri, this, m_model); m_children->append(mediaItem); count++; } QString musicUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::MusicLocation); if(homeUri != musicUri) { SideBarPersonalItem *musicItem = new SideBarPersonalItem(musicUri, this, m_model); m_children->append(musicItem); count++; } QString downloadUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); if(homeUri != downloadUri) { SideBarPersonalItem *downloadItem = new SideBarPersonalItem(downloadUri, this, m_model); m_children->append(downloadItem); count++; } m_model->insertRows(0, count, firstColumnIndex()); //! \brief Add monitor dir del this->initWatcher(); m_watcher->startMonitor(); connect(m_watcher.get(), &FileWatcher::fileDeleted, this, [=](const QString& uri) { GFile* file = g_file_new_for_uri(uri.toLatin1().constData()); QString path = g_file_get_path(file); qDebug() << path; QString _uri = "file://" + path; for(SideBarAbstractItem* i : *m_children) { if(i->uri() == _uri ) { m_model->removeRow(m_children->indexOf(i), this->firstColumnIndex()); m_children->removeOne(i); } } g_object_unref(file); }); //! \todo monitor file creat // connect(m_watcher.get(), &FileWatcher::fileCreated, this, [=](const QString& uri) { // }); return; } m_uri = uri; m_info = FileInfo::fromUri(uri); FileInfoJob j(m_info); j.querySync(); //FIXME: replace BLOCKING api in ui thread. m_display_name = FileUtils::getFileDisplayName(uri); m_icon_name = FileUtils::getFileIconName(uri); } QModelIndex SideBarPersonalItem::firstColumnIndex() { return m_model->firstColumnIndex(this); } QModelIndex SideBarPersonalItem::lastColumnIndex() { return m_model->lastColumnIndex(this); } void SideBarPersonalItem::initWatcher() { if (!m_watcher) { m_watcher = std::make_shared(m_uri); } } peony/src/control/intel/intel-side-bar-menu.h0000664000175000017500000000300715154271070020130 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARMENU_H #define INTEL_SIDEBARMENU_H #include #include "peony-core_global.h" namespace Peony { class SideBar; namespace Intel { class SideBarAbstractItem; class PEONYCORESHARED_EXPORT SideBarMenu : public QMenu { Q_OBJECT public: explicit SideBarMenu(SideBarAbstractItem *item, SideBar *sideBar, QWidget *parent = nullptr); void gotoAboutComputer(); protected: const QList constructFavoriteActions(); const QList constructPersonalActions(); const QList constructFileSystemItemActions(); const QList constructNetWorkItemActions(); private: SideBarAbstractItem *m_item; SideBar *m_side_bar; QString m_uri; }; } } #endif // SIDEBARMENU_H peony/src/control/intel/intel-side-bar-favorite-item.h0000664000175000017500000000461115154271070021741 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARFAVORITEITEM_H #define INTEL_SIDEBARFAVORITEITEM_H #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" #include namespace Peony { class FileInfo; namespace Intel { class PEONYCORESHARED_EXPORT SideBarFavoriteItem : public SideBarAbstractItem { Q_OBJECT public: explicit SideBarFavoriteItem(QString uri, SideBarFavoriteItem *parentItem, SideBarModel *model, QObject *parent = nullptr); Type type() override; QString uri() override; QString displayName() override; QString iconName() override; bool hasChildren() override; bool isRemoveable() override { return false; } bool isEjectable() override { return false; } bool isMountable() override { return false; } QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return m_parent; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void onUpdated() override {} void findChildren() override {} void findChildrenAsync() override {} void clearChildren() override {} private: void syncBookMark(); SideBarFavoriteItem *m_parent = nullptr; bool m_is_root_child = false; QString m_uri = nullptr; QString m_display_name = nullptr; QString m_icon_name = nullptr; std::shared_ptr m_info = nullptr; }; } } #endif // SIDEBARFAVORITEITEM_H peony/src/control/intel/intel-side-bar-favorite-item.cpp0000664000175000017500000001072615154271070022300 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-favorite-item.h" #include "intel-side-bar-model.h" #include "file-utils.h" #include "bookmark-manager.h" #include "file-info.h" #include "file-info-job.h" #include #include using namespace Peony::Intel; SideBarFavoriteItem::SideBarFavoriteItem(QString uri, SideBarFavoriteItem *parentItem, SideBarModel *model, QObject *parent) : SideBarAbstractItem (model, parent) { m_parent = parentItem; m_is_root_child = m_parent == nullptr; if (m_is_root_child) { m_uri = "favorite:///"; m_display_name = tr("Favorites"); //m_icon_name = "emblem-favorite"; //top dir don't show icon m_icon_name = ""; SideBarFavoriteItem *recentItem = new SideBarFavoriteItem("recent:///", this, m_model); QString desktopUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); SideBarFavoriteItem *desktopItem = new SideBarFavoriteItem(desktopUri, this, m_model); SideBarFavoriteItem *trashItem = new SideBarFavoriteItem("trash:///", this, m_model); m_children->append(recentItem); m_children->append(desktopItem); m_children->append(trashItem); m_model->insertRows(0, m_children->count(), firstColumnIndex()); //TODO: support custom bookmarks. auto bookmark = BookMarkManager::getInstance(); if (bookmark->isLoaded()) { syncBookMark(); } else { connect(bookmark, &BookMarkManager::urisLoaded, this, [=]() { syncBookMark(); disconnect(bookmark, &BookMarkManager::urisLoaded, this, nullptr); }); } return; } m_uri = uri; m_info = FileInfo::fromUri(uri); FileInfoJob j(m_info); j.querySync(); //FIXME: replace BLOCKING api in ui thread. m_display_name = FileUtils::getFileDisplayName(uri); m_icon_name = FileUtils::getFileIconName(uri); } SideBarAbstractItem::Type SideBarFavoriteItem::type() { return SideBarAbstractItem::FavoriteItem; } QString SideBarFavoriteItem::uri() { return m_uri; } QString SideBarFavoriteItem::displayName() { return m_display_name; } QString SideBarFavoriteItem::iconName() { return m_icon_name; } bool SideBarFavoriteItem::hasChildren() { return m_is_root_child; } QModelIndex SideBarFavoriteItem::firstColumnIndex() { //TODO: bind with model return m_model->firstColumnIndex(this); } QModelIndex SideBarFavoriteItem::lastColumnIndex() { //TODO: bind with model return m_model->lastColumnIndex(this); } void SideBarFavoriteItem::syncBookMark() { qDebug()<<"sync book mark=================="<displayName(); auto bookmark = BookMarkManager::getInstance(); auto uris = bookmark->getCurrentUris(); for (auto uri : uris) { auto item = new SideBarFavoriteItem(uri, this, m_model); *m_children<insertRows(m_children->count() - 1, 1, this->firstColumnIndex()); } connect(bookmark, &BookMarkManager::bookMarkAdded, this, [=](const QString &uri, bool successed) { if (successed) { auto item = new SideBarFavoriteItem(uri, this, m_model); *m_children<insertRows(m_children->count() - 1, 1, this->firstColumnIndex()); } }); connect(bookmark, &BookMarkManager::bookMarkRemoved, this, [=](const QString &uri, bool successed) { if (successed) { for (auto item : *m_children) { if (item->uri() == uri) { m_model->removeRow(m_children->indexOf(item), this->firstColumnIndex()); m_children->removeOne(item); } } } }); } peony/src/control/intel/intel-side-bar-cloud-item.h0000664000175000017500000000473515154271070021237 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wang Weinan * */ #ifndef INTEL_SIEDBARCLOUDITEM_H #define INTEL_SIEDBARCLOUDITEM_H #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" namespace Peony { namespace Intel { class SideBarModel; class PEONYCORESHARED_EXPORT SideBarCloudItem : public SideBarAbstractItem { Q_OBJECT public: explicit SideBarCloudItem(QString uri, SideBarCloudItem *parentItem, SideBarModel *model, QObject *parent = nullptr); Type type() override { return SideBarAbstractItem::PersonalItem; } QString uri() override { return m_uri; } QString displayName() override { return m_display_name; } QString iconName() override { return m_icon_name; } bool hasChildren() override { return m_is_root_child; } bool isRemoveable() override { return false; } bool isEjectable() override { return false; } bool isMountable() override { return false; } QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return m_parent; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void onUpdated() override {} void findChildren() override {} void findChildrenAsync() override {} void clearChildren() override {} private: SideBarCloudItem *m_parent = nullptr; bool m_is_root_child = false; QString m_uri = nullptr; QString m_display_name = nullptr; QString m_icon_name = nullptr; }; } } #endif // SIEDBARCLOUDITEM_H peony/src/control/intel/intel-side-bar-abstract-item.cpp0000664000175000017500000000310615154271070022256 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-abstract-item.h" #include "intel-side-bar-model.h" #include using namespace Peony::Intel; SideBarAbstractItem::SideBarAbstractItem(SideBarModel *model, QObject *parent) : QObject(parent) { m_model = model; m_children = new QVector(); } SideBarAbstractItem::~SideBarAbstractItem() { //qDebug()<<"~SideBarAbstractItem"; for (auto child : *m_children) { delete child; } delete m_children; } void SideBarAbstractItem::clearChildren() { m_model->removeRows(0, m_children->count(), firstColumnIndex()); for (auto child : *m_children) { m_children->removeOne(child); child->deleteLater(); } m_children->clear(); //qDebug()<<"clear children has children"<hasChildren(firstColumnIndex()); } peony/src/control/intel/intel-side-bar-separator-item.h0000664000175000017500000000577715154271070022140 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARSEPARATORITEM_H #define INTEL_SIDEBARSEPARATORITEM_H #include #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" namespace Peony { namespace Intel { /*! * \brief The SideBarSeparatorItem class * \details * This class is used to help side bar layout. * It also provide 3 types of separator, large, small and empty-file. * The large separator is used to make a space for top of sidebar. * The small separator is used to make a space for different type root item (favorite, personal and computer). * The empty-file separator is used as a indicator of a side bar file system item directory without any child item. */ class PEONYCORESHARED_EXPORT SideBarSeparatorItem : public SideBarAbstractItem { Q_OBJECT public: enum Details { Large, EmptyFile, Small }; explicit SideBarSeparatorItem(Details type, SideBarAbstractItem *parentItem, SideBarModel *model, QObject *parent = nullptr); Details separatorType() { return m_type; } Type type() override { return SideBarAbstractItem::SeparatorItem; } QString uri() override { return nullptr; } QString displayName() override { return m_type==EmptyFile?tr("(No Sub Directory)"):nullptr; } QString iconName() override { return nullptr; } bool hasChildren() override { return false; } bool isRemoveable() override { return false; } bool isEjectable() override { return false; } bool isMountable() override { return false; } QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return m_parent; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void onUpdated() override {} void findChildren() override {} void findChildrenAsync() override {} void clearChildren() override {} private: SideBarAbstractItem *m_parent = nullptr; Details m_type; }; } } #endif // SIDEBARSEPARATORITEM_H peony/src/control/intel/intel-navigation-side-bar.cpp0000664000175000017500000004701315154271106021663 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "intel-navigation-side-bar.h" #include "intel-side-bar-model.h" #include "intel-side-bar-proxy-filter-sort-model.h" #include "intel-side-bar-abstract-item.h" #include "volume-manager.h" #include "intel-side-bar-menu.h" #include "intel-side-bar-abstract-item.h" #include "bookmark-manager.h" #include "file-info.h" #include "file-info-job.h" #include "main-window.h" #include "global-settings.h" #include "file-enumerator.h" #include "gerror-wrapper.h" #include "file-utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Peony; namespace Intel { NavigationSideBar::NavigationSideBar(QWidget *parent) : QTreeView(parent) { setIconSize(QSize(16, 16)); setProperty("useIconHighlightEffect", true); //both default and highlight. setProperty("iconHighlightEffectMode", 1); this->verticalScrollBar()->setProperty("drawScrollBarGroove", false); setDragDropMode(QTreeView::DropOnly); setProperty("doNotBlur", true); viewport()->setProperty("doNotBlur", true); auto delegate = new NavigationSideBarItemDelegate(this); setItemDelegate(delegate); installEventFilter(this); setStyleSheet(".Intel--NavigationSideBar{border: 0px solid transparent}"); setAttribute(Qt::WA_TranslucentBackground); viewport()->setAttribute(Qt::WA_TranslucentBackground); viewport()->setAttribute(Qt::WA_Disabled, false); header()->setSectionResizeMode(QHeaderView::Custom); header()->hide(); setStyle(NavigationSideBarStyle::getStyle()); setContextMenuPolicy(Qt::CustomContextMenu); setExpandsOnDoubleClick(false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_model = new Peony::Intel::SideBarModel(this); m_proxy_model = new Peony::Intel::SideBarProxyFilterSortModel(this); m_proxy_model->setSourceModel(m_model); this->setModel(m_proxy_model); // To hide the expend button of side bar this->setRootIsDecorated(false); // this->setIndentation(0); // this->setRootIsDecorated(false); // this->setLayoutDirection(Qt::RightToLeft); // this->resetIndentation(); VolumeManager *volumeManager = VolumeManager::getInstance(); connect(volumeManager,&Peony::VolumeManager::volumeAdded,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//display DVD device in real time. }); connect(volumeManager,&Peony::VolumeManager::volumeRemoved,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//The drive does not display when the DVD device is removed. }); connect(volumeManager,&Peony::VolumeManager::driveDisconnected,this,[=](const std::shared_ptr &drive){ m_proxy_model->invalidate();//Multiple udisk eject display problem }); connect(volumeManager,&Peony::VolumeManager::mountAdded,this,[=](const std::shared_ptr &mount){ m_proxy_model->invalidate();//display udisk in real time after format it. }); connect(this, &QTreeView::expanded, [=](const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); qDebug()<uri(); /*! \bug can not expanded? enumerator can not get prepared signal, why? */ item->findChildrenAsync(); }); connect(this, &QTreeView::collapsed, [=](const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); item->clearChildren(); }); // connect(this, &QTreeView::clicked, [=](const QModelIndex &index) { //! Delete the second column to fit the topic // switch (index.column()) { // case 0: { // auto item = m_proxy_model->itemFromIndex(index); // //some side bar item doesn't have a uri. // //do not emit signal with a null uri to window. // if (!item->uri().isNull()) // Q_EMIT this->updateWindowLocationRequest(item->uri()); // break; // } // case 1: { // auto item = m_proxy_model->itemFromIndex(index); // if (item->isMounted() || item->isEjectable()) { // auto leftIndex = m_proxy_model->index(index.row(), 0, index.parent()); // this->collapse(leftIndex); // item->ejectOrUnmount(); // } // break; // } // default: // break; // } // }); connect(this, &QTreeView::customContextMenuRequested, this, [=](const QPoint &pos) { auto index = indexAt(pos); auto item = m_proxy_model->itemFromIndex(index); if (item) { if (item->type() != Peony::Intel::SideBarAbstractItem::SeparatorItem) { Peony::Intel::SideBarMenu menu(item, nullptr, this); MainWindow *window = dynamic_cast(this->topLevelWidget()); menu.addAction(QIcon::fromTheme("window-new-symbolic"), tr("Open In &New Window"), [=](){ auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(item->uri()); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ auto targetUri = Peony::FileUtils::getTargetUri(item->uri()); if (!targetUri.isEmpty()) { auto newWindow = window->create(targetUri); dynamic_cast(newWindow)->show(); } else if (!err.get() && !critical) { auto newWindow = window->create(item->uri()); dynamic_cast(newWindow)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); if (!qApp->property("tabletMode").toBool()) { menu.addAction(QIcon::fromTheme("tab-new-symbolic"), tr("Open In New &Tab"), [=](){ auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(item->uri()); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ auto targetUri = Peony::FileUtils::getTargetUri(item->uri()); if (!targetUri.isEmpty()) { window->addNewTabs(QStringList()<(window)->show(); } else if (!err.get() && !critical) { window->addNewTabs(QStringList()<uri()); dynamic_cast(window)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); } menu.exec(mapToGlobal(pos)); } } }); connect(m_model, &QAbstractItemModel::dataChanged, this, [=](){ this->viewport()->update(); }); //! \bug if annotated it, favorite in side bar will have a empty line, why? expandAll(); } bool NavigationSideBar::eventFilter(QObject *obj, QEvent *e) { return false; } void NavigationSideBar::updateGeometries() { setViewportMargins(4, 0, 4, 0); QTreeView::updateGeometries(); } void NavigationSideBar::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint) { //skip unmount indicator index if (index.isValid()) { if (index.column() == 0) { QTreeView::scrollTo(index, hint); } } } void NavigationSideBar::paintEvent(QPaintEvent *event) { QTreeView::paintEvent(event); } void NavigationSideBar::resizeEvent(QResizeEvent *e) { QTreeView::resizeEvent(e); if (header()->count() > 0) header()->resizeSection(0, this->viewport()->width() - 30); } void NavigationSideBar::dropEvent(QDropEvent *e) { if (dropIndicatorPosition() == QAbstractItemView::AboveItem || dropIndicatorPosition() == QAbstractItemView::BelowItem) { // add to bookmark e->setAccepted(true); auto data = e->mimeData(); auto bookmark = Peony::BookMarkManager::getInstance(); if (bookmark->isLoaded()) { for (auto url : data->urls()) { auto info = Peony::FileInfo::fromUri(url.toDisplayString()); if (info->displayName().isNull()) { Peony::FileInfoJob j(info); j.querySync(); } if (info->isDir()) { bookmark->addBookMark(url.url()); } } } } QTreeView::dropEvent(e); } QSize NavigationSideBar::sizeHint() const { auto size = QTreeView::sizeHint(); auto width = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_SIDEBAR_WIDTH).toInt(); qDebug() << "sizeHint set DEFAULT_SIDEBAR_WIDTH:"<key() == Qt::Key_Return) { if (!selectedIndexes().isEmpty()) { auto index = selectedIndexes().first(); auto uri = index.data(Qt::UserRole).toString(); Q_EMIT this->updateWindowLocationRequest(uri, true); } } } void NavigationSideBar::mousePressEvent(QMouseEvent *event) { if (event->button() != Qt::LeftButton) return; QModelIndex index = indexAt(event->pos()); if (!index.isValid()) return; auto item = m_proxy_model->itemFromIndex(index); //bug#116016 收起计算机目录后展开计算机下方无显示 if (!index.parent().isValid() && event->x() < rect().right() - 25 && event->x() > rect().right() - 80) { // if click expend rect QPoint point(event->x(), event->y()); if (!isExpanded(indexAt(point))) expand(indexAt(point)); else collapse(indexAt(point)); } else if (event->x() < rect().right() - 15 && event->x() > rect().right() - 45 && (item->isEjectable() || item->isMountable())) { // if click umount rect auto leftIndex = m_proxy_model->index(index.row(), 0, index.parent()); this->collapse(leftIndex); item->ejectOrUnmount(); } else { item = m_proxy_model->itemFromIndex(index); QString uri = item->uri(); auto info = FileInfo::fromUri(uri); if (info.get()->isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } auto targetUri = FileUtils::getTargetUri(uri); if (!targetUri.isEmpty()) { Q_EMIT this->updateWindowLocationRequest(targetUri); QTreeView::mousePressEvent(event); return; } if (!uri.isNull()) Q_EMIT this->updateWindowLocationRequest(uri); QTreeView::mousePressEvent(event); } } bool NavigationSideBar::isRemoveable(const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); if (item != nullptr) return item->isRemoveable(); else return false; } bool NavigationSideBar::isMounted(const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); if (item != nullptr) return item->isMounted(); else return false; } NavigationSideBarItemDelegate::NavigationSideBarItemDelegate(QObject *parent) : QStyledItemDelegate(parent) { } QSize NavigationSideBarItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { bool is_intel = (QString::compare("V10SP1-edu", GlobalSettings::getInstance()->getProjectName(), Qt::CaseInsensitive) == 0); if (is_intel) { auto size = QStyledItemDelegate::sizeHint(option, index); size.setHeight(56); return size; } return QStyledItemDelegate::sizeHint(option, index); } void NavigationSideBarItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!index.isValid() || option.state == QStyle::State_None) return; QStyleOptionViewItem opt = option; //! \brief Temporarily replace drawPrimitive if (opt.state.testFlag(QStyle::State_MouseOver) && !opt.state.testFlag(QStyle::State_Selected)) opt.state = QStyle::State_Enabled; painter->setRenderHint(QPainter::Antialiasing, true); QStyledItemDelegate::paint(painter, opt, index); NavigationSideBar* view = qobject_cast(this->parent()); if (view == nullptr) return; //! \brief print mount icon if (view->isRemoveable(index) && view->isMounted(index)) { QRect rect = option.rect; rect.setY(rect.top() + sizeHint(option, index).height()/3); rect.setX(rect.right() - 30); rect.setSize(QSize(16, 16)); painter->drawPixmap(rect, QPixmap(":/img/media-eject")); } if (!index.model()->hasChildren(index)) return; if (view->isExpanded(index)) { QRect rect = option.rect; rect.setY(rect.top() + sizeHint(option, index).height()/3); rect.setX(rect.right() - 45); rect.setSize(QSize(16, 16)); painter->drawPixmap(rect, QPixmap(":/img/branches2")); } else { QRect rect = option.rect; rect.setTop(rect.top() + sizeHint(option, index).height()/3); rect.setX(rect.right() - 45); rect.setSize(QSize(16, 16)); painter->drawPixmap(rect, QPixmap(":/img/branches1")); } } NavigationSideBarContainer::NavigationSideBarContainer(QWidget *parent) : Peony::SideBar(parent) { setAttribute(Qt::WA_TranslucentBackground); m_layout = new QVBoxLayout; m_layout->setContentsMargins(0, 4, 0, 0); m_layout->setSpacing(0); auto sideBar = new NavigationSideBar(this); QWidget *widget = new QWidget; m_layout->addWidget(new TitleLabel(this)); m_layout->addWidget(sideBar); widget->setLayout(m_layout); setWidget(widget); //addSideBar(sideBar); connect(sideBar, &NavigationSideBar::updateWindowLocationRequest, this, &NavigationSideBarContainer::updateWindowLocationRequest); } void NavigationSideBarContainer::addSideBar(NavigationSideBar *sidebar) { if (m_sidebar) return; m_sidebar = sidebar; m_layout->addWidget(sidebar); // QWidget *w = new QWidget(this); // QVBoxLayout *l = new QVBoxLayout; // l->setContentsMargins(4, 4, 2, 4); // m_label_button = new QPushButton(QIcon::fromTheme("emblem-important-symbolic"), tr("All tags..."), this); // m_label_button->setProperty("useIconHighlightEffect", true); // m_label_button->setProperty("iconHighlightEffectMode", 1); // m_label_button->setProperty("fillIconSymbolicColor", true); // m_label_button->setCheckable(true); // l->addWidget(m_label_button); // connect(m_label_button, &QPushButton::clicked, m_sidebar, &NavigationSideBar::labelButtonClicked); // w->setLayout(l); // m_layout->addWidget(w); setLayout(m_layout); } QSize NavigationSideBarContainer::sizeHint() const { return SideBar::sizeHint(); } TitleLabel::TitleLabel(QWidget *parent):QWidget(parent) { this->setFixedHeight(50); m_pix_label = new QLabel(this); m_pix_label->setPixmap(QIcon(":/custom/icons/app-controlsetting").pixmap(32,32)); m_text_label = new QLabel(tr("Files"),this); QHBoxLayout *l = new QHBoxLayout(this); l->setContentsMargins(16, 16, 16, 16); l->addWidget(m_pix_label); l->addSpacing(16); l->addWidget(m_text_label); l->addStretch(); } static NavigationSideBarStyle *global_instance = nullptr; NavigationSideBarStyle::NavigationSideBarStyle(QStyle *style) : QProxyStyle(style) {} NavigationSideBarStyle* NavigationSideBarStyle::getStyle() { if (!global_instance) global_instance = new NavigationSideBarStyle; return global_instance; } //! \brief replace polish, delete hover state void NavigationSideBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case PE_PanelItemViewItem: { //! \bug never in here in qt5-ukui-platformtheme-tablet-1205 if (option->state.testFlag(QStyle::State_MouseOver) && !option->state.testFlag(QStyle::State_Selected)) { return; } else { QProxyStyle::drawPrimitive(element, option, painter, widget); return; } } case PE_PanelItemViewRow: { const QStyleOptionViewItem *tmp = qstyleoption_cast(option); QStyleOptionViewItem opt = *tmp; opt.rect.adjust(0, 1, 0, 0); QProxyStyle::drawPrimitive(element, &opt, painter, widget); return; } case PE_IndicatorBranch: { const QStyleOptionViewItem *tmp = qstyleoption_cast(option); QStyleOptionViewItem opt = *tmp; opt.rect.adjust(0, 1, 0, 0); if (option->state.testFlag(QStyle::State_MouseOver) && !option->state.testFlag(QStyle::State_Selected)) { return; } else { QProxyStyle::drawPrimitive(element, &opt, painter, widget); return; } } case QStyle::PE_Frame: case QStyle::PE_FrameWindow: { return; } default: QProxyStyle::drawPrimitive(element, option, painter, widget); } } void NavigationSideBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case CE_ItemViewItem: { const QStyleOptionViewItem *tmp = qstyleoption_cast(option); QStyleOptionViewItem opt = *tmp; opt.rect.adjust(0, 1, 0, 0); QProxyStyle::drawControl(element, &opt, painter, widget); return; } default: QProxyStyle::drawControl(element, option, painter, widget); } } } peony/src/control/intel/intel-side-bar-cloud-item.cpp0000664000175000017500000000400615154271070021561 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wang Weinan * */ #include "intel-side-bar-cloud-item.h" #include "intel-side-bar-model.h" #include "file-utils.h" #include using namespace Peony::Intel; SideBarCloudItem::SideBarCloudItem(QString uri, SideBarCloudItem *parentItem, SideBarModel *model, QObject *parent) : SideBarAbstractItem (model, parent) { m_parent = parentItem; m_is_root_child = parentItem == nullptr; if (m_is_root_child) { QString homeUri = "cloud:///"; m_uri = homeUri; m_display_name = tr("CloudStorage"); //m_icon_name = "emblem-personal"; //top dir don't show icon m_icon_name = ""; QString documentUri = "file:///home/"; SideBarCloudItem *documentItem = new SideBarCloudItem(documentUri, this, m_model); m_children->append(documentItem); m_model->insertRows(0, 5, firstColumnIndex()); return; } m_uri = uri; m_display_name = tr("CloudFile"); m_icon_name = "ukui-cloud-file";// FileUtils::getFileIconName(uri); } QModelIndex SideBarCloudItem::firstColumnIndex() { return m_model->firstColumnIndex(this); } QModelIndex SideBarCloudItem::lastColumnIndex() { return m_model->lastColumnIndex(this); } peony/src/control/intel/intel-side-bar-file-system-item.h0000664000175000017500000001042415154271070022362 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARFILESYSTEMITEM_H #define INTEL_SIDEBARFILESYSTEMITEM_H #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" #include #include namespace Peony { class FileWatcher; class FileInfo; namespace Intel { class PEONYCORESHARED_EXPORT SideBarFileSystemItem : public SideBarAbstractItem { Q_OBJECT public: explicit SideBarFileSystemItem(QString uri, SideBarFileSystemItem *parentItem, SideBarModel *model, QObject *parent = nullptr); Type type() override { return SideBarAbstractItem::FileSystemItem; } QString uri() override { return m_uri; } QString displayName() override; QString iconName() override { return m_icon_name; } bool hasChildren() override { return true; } bool isRemoveable() override; bool isEjectable() override; bool isMountable() override; //TODO: monitoring the mount state bool isMounted() override; QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return m_parent; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override; void realEject(GMountUnmountFlags ejectFlag); void unmount() override; void realUnmount(); void format() override {} void ejectOrUnmount() override; void onUpdated() override {} void findChildren() override; void findChildrenAsync() override; void clearChildren() override; protected: void initWatcher(); void startWatcher(); void stopWatcher(); static GAsyncReadyCallback eject_cb(GFile *file, GAsyncResult *res, SideBarFileSystemItem *p_this); void updateFileInfo(SideBarFileSystemItem *pThis); static void ejectDevicebyDrive(GObject* object,GAsyncResult* res,SideBarFileSystemItem *pThis); private: SideBarFileSystemItem *m_parent = nullptr; bool m_is_root_child = false; QString m_uri = nullptr; QString m_display_name = nullptr; QString m_icon_name = nullptr; bool m_is_removeable = false; bool m_is_ejectable = false; bool m_is_mountable = false; bool m_is_mounted = false; std::shared_ptr m_watcher = nullptr; std::shared_ptr m_info = nullptr; }; class SideBarUserDiskItem : public SideBarFileSystemItem { Q_OBJECT public: explicit SideBarUserDiskItem(SideBarFileSystemItem *item, SideBarModel *model, QObject *parent = nullptr); Type type() override { return SideBarAbstractItem::FileSystemItem; } QString uri() override; QString displayName() override; QString iconName(); bool hasChildren() override { return true; } bool isRemoveable() {return false;} bool isEjectable() {return false;} bool isMountable() {return false;} //TODO: monitoring the mount state bool isMounted() override {return true;} SideBarAbstractItem *parent() override; public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void ejectOrUnmount() override {} void onUpdated() override {} void findChildren() override; void findChildrenAsync() override; void clearChildren() override; private: SideBarAbstractItem *m_parent = nullptr; }; } } #endif // SIDEBARFILESYSTEMITEM_H peony/src/control/intel/intel-side-bar-vfs-item.h0000664000175000017500000000451215154271070020720 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARVFSITEM_H #define INTEL_SIDEBARVFSITEM_H #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" namespace Peony { class VFSPluginIface; namespace Intel { class SideBarModel; class PEONYCORESHARED_EXPORT SideBarVFSItem : public SideBarAbstractItem { Q_OBJECT public: explicit SideBarVFSItem(VFSPluginIface *plugin, SideBarModel *model, QObject *parent = nullptr); Type type() override { return SideBarAbstractItem::FileSystemItem; } QString uri() override; QString displayName() override; QString iconName() override; bool hasChildren() override { return false; } bool isRemoveable() override { return false; } bool isEjectable() override { return false; } bool isMountable() override { return false; } //TODO: monitoring the mount state bool isMounted() override { return false; } QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return nullptr; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void ejectOrUnmount() override {} void onUpdated() override {} void findChildren() override {} void findChildrenAsync() override {} void clearChildren() override {} private: VFSPluginIface *m_plugin; QString m_uri; QString m_display_name; SideBarModel *m_model; }; } } #endif // SIDEBARVFSITEM_H peony/src/control/intel/intel-navigation-side-bar.h0000664000175000017500000000710515154271070021326 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef INTEL_NAVIGATIONSIDEBAR_H #define INTEL_NAVIGATIONSIDEBAR_H #include #include #include #include #include #include #include "side-bar.h" namespace Peony { namespace Intel { class SideBarModel; class SideBarProxyFilterSortModel; } } class QPushButton; class QVBoxLayout; namespace Intel { class NavigationSideBar : public QTreeView { Q_OBJECT public: explicit NavigationSideBar(QWidget *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); void updateGeometries(); void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible); void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *e); void dropEvent(QDropEvent *e); QSize sizeHint() const; void mousePressEvent(QMouseEvent *event); //! \brief to determine if you need to draw a pop-up button bool isRemoveable(const QModelIndex& index); bool isMounted(const QModelIndex& index); Q_SIGNALS: void updateWindowLocationRequest(const QString &uri, bool addHistory = true, bool force = false); void labelButtonClicked(bool checked); protected: void keyPressEvent(QKeyEvent *event); private: Peony::Intel::SideBarProxyFilterSortModel *m_proxy_model; Peony::Intel::SideBarModel *m_model; }; class NavigationSideBarContainer : public Peony::SideBar { Q_OBJECT public: explicit NavigationSideBarContainer(QWidget *parent = nullptr); void addSideBar(NavigationSideBar *sidebar); QSize sizeHint() const override; private: NavigationSideBar *m_sidebar = nullptr; QVBoxLayout *m_layout = nullptr; QPushButton *m_label_button; }; class NavigationSideBarItemDelegate : public QStyledItemDelegate { Q_OBJECT friend class NavigationSideBar; explicit NavigationSideBarItemDelegate(QObject *parent = nullptr); QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; /*! * \brief print a new expand button in right of side bar */ void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; class TitleLabel : public QWidget { Q_OBJECT public: explicit TitleLabel(QWidget *parent); private: QLabel *m_pix_label; QLabel *m_text_label; }; class NavigationSideBarStyle : public QProxyStyle { public: static NavigationSideBarStyle* getStyle(); void drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; private: NavigationSideBarStyle(QStyle *style = nullptr); ~NavigationSideBarStyle() override {} }; } #endif // NAVIGATIONSIDEBAR_H peony/src/control/intel/intel-side-bar-vfs-item.cpp0000664000175000017500000000372515154271070021260 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-vfs-item.h" #include "vfs-plugin-iface.h" #include "vfs-plugin-manager.h" #include "file-utils.h" #include "intel-side-bar-model.h" using namespace Peony::Intel; SideBarVFSItem::SideBarVFSItem(VFSPluginIface *plugin, SideBarModel *model, QObject *parent) : SideBarAbstractItem(model, parent) { m_plugin = plugin; m_model = model; } QString SideBarVFSItem::uri() { if (m_uri.isEmpty()) { m_uri = m_plugin->uriScheme() + "/"; } return m_uri; } QString SideBarVFSItem::displayName() { if (m_display_name.isEmpty()) { auto vfsFile = VFSPluginManager::getInstance()->newVFSFile(uri()); auto info = g_file_query_info(vfsFile, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); m_display_name = g_file_info_get_display_name(info); g_object_unref(info); g_object_unref(vfsFile); } return m_display_name; } QString SideBarVFSItem::iconName() { return m_plugin->icon().name(); } QModelIndex SideBarVFSItem::firstColumnIndex() { return m_model->firstColumnIndex(this); } QModelIndex SideBarVFSItem::lastColumnIndex() { return m_model->lastColumnIndex(this); } peony/src/control/intel/intel-side-bar-file-system-item.cpp0000664000175000017500000006314515154271070022725 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "intel-side-bar-file-system-item.h" #include "sync-thread.h" #include "file-info.h" #include "file-utils.h" #include "file-watcher.h" #include "file-info-job.h" #include "volume-manager.h" #include "volumeManager.h" #include "intel-side-bar-model.h" #include "file-enumerator.h" #include "gobject-template.h" #include "linux-pwd-helper.h" #include "intel-side-bar-separator-item.h" #include #include #include #include #include #include #include using namespace Peony::Intel; using namespace Peony; void notifyUser(QString notifyContent); SideBarFileSystemItem::SideBarFileSystemItem(QString uri, SideBarFileSystemItem *parentItem, SideBarModel *model, QObject *parent) : SideBarAbstractItem (model, parent) { m_parent = parentItem; if (parentItem == nullptr) { m_is_root_child = true; m_uri = "computer:///"; m_display_name = tr("Computer"); //m_icon_name = "computer"; //top dir don't show icon m_icon_name = ""; //m_watcher->setMonitorChildrenChange(); //connect(m_watcher.get(), &FileWatcher::fileChanged, [=]()) } else { m_uri = uri; m_info = FileInfo::fromUri(uri); //FIXME: replace BLOCKING api in ui thread. if (m_info.get()->isEmptyInfo()) { FileInfoJob j(m_info); j.querySync(); } m_display_name = FileUtils::getFileDisplayName(uri); m_icon_name = FileUtils::getFileIconName(uri); // display name is a read only attribute, so i change it here if (m_display_name == tr("文件系统")) { m_display_name = tr("System Disk"); } else { FileUtils::queryVolumeInfo(m_uri, m_volume_name, m_unix_device, m_display_name); } } } QString SideBarFileSystemItem::displayName() { QString displayName; if (!m_volume_name.isEmpty()) { displayName += m_volume_name; } if (!m_unix_device.isEmpty() && !m_uri.contains("root.link")) { displayName += QString(" (%1)").arg(m_unix_device); } if (!displayName.isEmpty()) return displayName; return m_display_name; } QModelIndex SideBarFileSystemItem::firstColumnIndex() { return m_model->firstColumnIndex(this); } QModelIndex SideBarFileSystemItem::lastColumnIndex() { return m_model->lastColumnIndex(this); } void SideBarFileSystemItem::clearChildren() { stopWatcher(); SideBarAbstractItem::clearChildren(); } /*! * \brief SideBarFileSystemItem::findChildren * \bug root doesn't support gvfs, so computer:/// cannot be enumerated. * to avoid the bug, I forbided find filesystem item children in root. * I should use another way to display the devices/volumes. */ void SideBarFileSystemItem::findChildren() { auto pwdItem = LinuxPWDHelper::getCurrentUser(); if (pwdItem.userId() == 0) { return; } clearChildren(); FileEnumerator *e = new FileEnumerator; e->setEnumerateDirectory(m_uri); connect(e, &FileEnumerator::prepared, this, [=](const GErrorWrapperPtr &err, const QString &targetUri) { if (targetUri != nullptr) { if (targetUri != this->uri()) { e->setEnumerateDirectory(targetUri); } } e->enumerateSync(); //bug#116016 收起计算机目录后展开计算机下方只显示一个盘 auto parentItem = qobject_cast(m_parent); if (!parentItem) { auto userDiskItem = new SideBarUserDiskItem(this, m_model); m_children->append(userDiskItem); } auto infos = e->getChildren(); bool isEmpty = true; int real_children_count = infos.count(); if (infos.isEmpty()) { auto separator = new SideBarSeparatorItem(SideBarSeparatorItem::EmptyFile, this, m_model); this->m_children->prepend(separator); m_model->insertRows(0, 1, this->firstColumnIndex()); goto end; } for (auto info: infos) { FileInfoJob j(info); j.querySync(); if (!info->displayName().startsWith(".") && (info->isDir() || info->isVolume())) { isEmpty = false; } //skip the independent files if (!(info->isDir() || info->isVolume())) { real_children_count--; continue; } SideBarFileSystemItem *item = new SideBarFileSystemItem(info->uri(), this, m_model, this); // skip local device if (!item->isEjectable() && !item->isRemoveable() && item->uri() != "computer:///root.link") { real_children_count--; delete item; continue; } //check is mounted. //FIXME: replace BLOCKING api in ui thread. auto targetUri = FileUtils::getTargetUri(info->uri()); bool isUmountable = FileUtils::isFileUnmountable(info->uri()); item->m_is_mounted = (!targetUri.isEmpty() && (targetUri != "file:///")) || isUmountable; m_children->append(item); //qDebug()<uri(); } m_model->insertRows(0, m_children->count(), firstColumnIndex()); if (isEmpty) { auto separator = new SideBarSeparatorItem(SideBarSeparatorItem::EmptyFile, this, m_model); this->m_children->prepend(separator); m_model->insertRows(0, 1, this->firstColumnIndex()); } end: Q_EMIT this->findChildrenFinished(); if (err != nullptr) { //qDebug()<<"prepared:"<message(); } delete e; //NOTE: init watcher after prepared. this->initWatcher(); this->m_watcher->setMonitorChildrenChange(); /* if (this->uri() == "computer:///") { this->m_watcher->setMonitorChildrenChange(); } */ //start listening. connect(m_watcher.get(), &FileWatcher::fileCreated, this, [=](const QString &uri) { //qDebug()<<"created:"<uri() == uri) { return; } } SideBarFileSystemItem *item = new SideBarFileSystemItem(uri, this, m_model); m_model->beginInsertRows(this->firstColumnIndex(), m_children->count(), m_children->count()); m_children->append(item); m_model->endInsertRows(); m_model->indexUpdated(this->firstColumnIndex()); m_model->dataChanged(item->firstColumnIndex(), item->lastColumnIndex()); }); connect(m_watcher.get(), &FileWatcher::fileDeleted, this, [=](const QString &uri) { //qDebug()<<"deleted:"<uri() == uri) { int index = m_children->indexOf(child); m_model->beginRemoveRows(firstColumnIndex(), index, index); m_children->removeOne(child); m_model->endRemoveRows(); child->deleteLater(); break; } } m_model->indexUpdated(this->firstColumnIndex()); }); connect(m_watcher.get(), &FileWatcher::fileChanged, this, [=](const QString &uri) { //FIXME: maybe i have to remove this changed item then add it again to avoid //qt's view expander cannot show correctly after the volume item unmounted. //qDebug()<<"side bar fs item changed:"<uri() == uri) { SideBarFileSystemItem *changedItem = static_cast(child); updateFileInfo(changedItem); //FIXME: replace BLOCKING api in ui thread. if (FileUtils::getTargetUri(uri).isEmpty()) { changedItem->m_is_mounted = false; changedItem->clearChildren(); } else { changedItem->m_is_mounted = true; } //why it would failed when send changed signal for newly mounted item? //m_model->dataChanged(changedItem->firstColumnIndex(), changedItem->firstColumnIndex()); m_model->dataChanged(changedItem->firstColumnIndex(), changedItem->lastColumnIndex()); break; } } }); this->startWatcher(); //m_model->setData(lastColumnIndex(), QVariant(QIcon::fromTheme("media-eject")), Qt::DecorationRole); connect(Peony::VolumeManager::getInstance(), &VolumeManager::volumeChanged, this, [=](const std::shared_ptr &volume){ qDebug()<<__func__<<__LINE__<<"volume changed"<getGVolume(); if(!gvolume) return; char* gdevice = g_volume_get_identifier(gvolume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); char* gname = g_volume_get_name(gvolume); QString device = gdevice; QString name = gname; g_free(gdevice); g_free(gname); qDebug()<<__func__<<__LINE__<<"volume changed"<m_unix_device<m_volume_name<m_unix_device == device && child->m_volume_name != name) { SideBarFileSystemItem *changedItem = static_cast(child); updateFileInfo(changedItem); qDebug()<<__func__<<__LINE__<<"volume changed"<m_unix_device<m_volume_name<dataChanged(changedItem->firstColumnIndex(), changedItem->lastColumnIndex()); break; } } }); }); e->prepare(); Q_EMIT findChildrenFinished(); } void SideBarFileSystemItem::findChildrenAsync() { //TODO add async method. findChildren(); } bool SideBarFileSystemItem::isRemoveable() { if (m_uri.contains("computer:///") && m_uri != "computer:///") { auto info = FileInfo::fromUri(m_uri); if (info->displayName().isEmpty()) { FileInfoJob j(info); j.querySync(); } return info->canEject() || info->canStop(); } return false; } bool SideBarFileSystemItem::isEjectable() { if (m_uri.contains("computer:///") && m_uri != "computer:///") { auto info = FileInfo::fromUri(m_uri); if (info->displayName().isEmpty()) { FileInfoJob j(info); j.querySync(); } return info->canEject(); } return false; } bool SideBarFileSystemItem::isMountable() { if (m_uri.contains("computer:///") && m_uri != "computer:///") { //some mountable item can be unmounted but can't be mounted. //the most of them is remote servers and shared directories. //they should be seemed as mountable items. auto info = FileInfo::fromUri(m_uri); if (info->displayName().isEmpty()) { FileInfoJob j(info); j.querySync(); } return info->canMount() || info->canUnmount(); } return false; } bool SideBarFileSystemItem::isMounted() { QString targetUri; if (m_uri.contains("computer:///") && m_uri != "computer:///") { auto info = FileInfo::fromUri(m_uri); if(info.get()){ if (info->targetUri().isEmpty()) { FileInfoJob j(info); j.querySync(); } targetUri = info->targetUri(); } }else{ targetUri = FileUtils::getTargetUri(m_uri); } if(!targetUri.isEmpty()) m_is_mounted = true; return m_is_mounted; } void SideBarFileSystemItem::unmount() { Peony::SyncThread *syncThread = new Peony::SyncThread(uri()); QThread* currentThread = new QThread(); syncThread->moveToThread(currentThread); connect(currentThread,&QThread::started,syncThread,&Peony::SyncThread::parentStartedSlot); connect(syncThread,&Peony::SyncThread::syncFinished,this,[=](){ realUnmount(); syncThread->disconnect(this); syncThread->deleteLater(); currentThread->disconnect(SIGNAL(started())); //currentThread->deleteLater(); }); currentThread->start(); } void SideBarFileSystemItem::eject(GMountUnmountFlags ejectFlag) { Peony::SyncThread *syncThread = new Peony::SyncThread(uri()); QThread* currentThread = new QThread(); syncThread->moveToThread(currentThread); connect(currentThread,&QThread::started,syncThread,&Peony::SyncThread::parentStartedSlot); connect(syncThread,&Peony::SyncThread::syncFinished,this,[=](){ realEject(ejectFlag); syncThread->disconnect(this); syncThread->deleteLater(); currentThread->disconnect(SIGNAL(started())); //currentThread->deleteLater(); }); currentThread->start(); } void SideBarFileSystemItem::realEject(GMountUnmountFlags ejectFlag) { //FIXME: replace BLOCKING api in ui thread. VolumeManager *volumeManager; std::shared_ptr drive; GDrive *gdrive; auto file = wrapGFile(g_file_new_for_uri(this->uri().toUtf8().constData())); auto target = FileUtils::getTargetUri(m_uri); volumeManager = VolumeManager::getInstance(); drive = volumeManager->getDriveFromUri(target); if(!drive) drive = volumeManager->getDriveFromSystemByPath(m_unix_device); if(!drive) return; gdrive = drive->getGDrive(); /* hotfix bug#118518 【文件管理器】弹出u盘后,文件管理器侧边栏仍显示u盘(必现),所以U盘使用g_drive_stop弹出 */ if(g_drive_can_eject(gdrive) && !m_unix_device.startsWith("/dev/sd")){//for DVD. g_file_eject_mountable_with_operation(file.get()->get(), ejectFlag, nullptr, nullptr, GAsyncReadyCallback(eject_cb), this); }else if(g_drive_can_stop(gdrive) || g_drive_is_removable(gdrive)){//for udisk or mobile harddisk. g_drive_stop(gdrive,ejectFlag,NULL,NULL, GAsyncReadyCallback(ejectDevicebyDrive), this); } } static void unmount_force_cb(GFile* file, GAsyncResult* result, gpointer udata) { auto targetUri = static_cast(udata); QString unmountNotify; GError *err = nullptr; g_file_unmount_mountable_with_operation_finish (file, result, &err); if (err) { QMessageBox::warning(nullptr, QObject::tr("Force unmount failed"), QObject::tr("Error: %1\n").arg(err->message)); g_error_free(err); } else { VolumeManager::getInstance()->fileUnmounted(*targetUri); unmountNotify = QObject::tr("Data synchronization is complete,the device has been unmount successfully!"); notifyUser(unmountNotify); } delete targetUri; } static void unmount_finished(GFile* file, GAsyncResult* result, gpointer udata) { auto targetUri = static_cast(udata); GError *err = nullptr; QString unmountNotify; g_file_unmount_mountable_with_operation_finish (file, result, &err); if (err) { if(!strcmp(err->message,"Not authorized to perform operation")){//umount /data need permissions. g_error_free(err); return; } if(strstr(err->message,"umount: ")){ QMessageBox::warning(nullptr,QObject::tr("Unmount failed"),QObject::tr("Unable to unmount it, you may need to close some programs, such as: GParted etc."),QMessageBox::Yes); g_error_free(err); return; } auto button = QMessageBox::warning(nullptr, QObject::tr("Unmount failed"), QObject::tr("Error: %1\n" "Do you want to unmount forcely?").arg(err->message), QMessageBox::Yes, QMessageBox::No); if (button == QMessageBox::Yes) { QString *string = new QString; *string = *targetUri; g_file_unmount_mountable_with_operation(file, G_MOUNT_UNMOUNT_FORCE, nullptr, nullptr, GAsyncReadyCallback(unmount_force_cb), string); } g_error_free(err); } else { VolumeManager::getInstance()->fileUnmounted(*targetUri); unmountNotify = QObject::tr("Data synchronization is complete,the device has been unmount successfully!"); notifyUser(unmountNotify); } delete targetUri; /*! \note the user data repesent current sidebar item in callback function here is unsafe. because once the item unmounted, the item itself will be deleted automaticly, too. so, never try using it, especially when unmount operation successed. */ // dangerous data, it might be delete while unmounting, do not use it. //SideBarFileSystemItem* th = (SideBarFileSystemItem*)udata; // if (FileUtils::isMountPoint(FileUtils::getTargetUri(th->uri()))) { // QMessageBox::warning(nullptr, QObject::tr("eject device failed"), // QObject::tr("Please check whether the device is occupied and then eject the device again"), // QMessageBox::Ok); // } } static UDisksObject *get_object_from_block_device (UDisksClient *client,const gchar *block_device) { struct stat statbuf; const gchar *crypto_backing_device; UDisksObject *object, *crypto_backing_object; UDisksBlock *block; object = NULL; if (stat (block_device, &statbuf) != 0) { return object; } block = udisks_client_get_block_for_dev (client, statbuf.st_rdev); if (block == NULL) { return object; } object = UDISKS_OBJECT (g_dbus_interface_dup_object (G_DBUS_INTERFACE (block))); g_object_unref (block); crypto_backing_device = udisks_block_get_crypto_backing_device ((udisks_object_peek_block (object))); crypto_backing_object = udisks_client_get_object (client, crypto_backing_device); if (crypto_backing_object != NULL) { g_object_unref (object); object = crypto_backing_object; } return object; } void SideBarFileSystemItem::realUnmount() { /*! \note unmount operation of gio will handle both native and remote mount point. so we must not use udisk's api directly, because it will lead to crash while unmounting a remote directory. */ // UDisksObject *object; // UDisksClient *client; // UDisksBlock *block; // client = udisks_client_new_sync(NULL,NULL); // object = get_object_from_block_device(client,m_unix_device.toUtf8().constData()); // block = udisks_object_get_block(object); // // if device type is disc , Eject optical drive // if(g_strcmp0(udisks_block_get_id_type(block),"iso9660")==0 || strlen(udisks_block_get_id_type(block))==0){ // // if can eject ,eject it // if(isEjectable()){ // this->eject(); // } // return; // } auto file = wrapGFile(g_file_new_for_uri(this->uri().toUtf8().constData())); QString *targetUri = new QString; *targetUri = FileUtils::getTargetUri(m_uri); g_file_unmount_mountable_with_operation(file.get()->get(), G_MOUNT_UNMOUNT_NONE, nullptr, nullptr, GAsyncReadyCallback(unmount_finished), targetUri); } void SideBarFileSystemItem::ejectOrUnmount() { if (isRemoveable()) eject(G_MOUNT_UNMOUNT_NONE); else if (isMountable()) unmount(); } void SideBarFileSystemItem::initWatcher() { if (!m_watcher) { m_watcher = std::make_shared(m_uri); } } void SideBarFileSystemItem::startWatcher() { initWatcher(); m_watcher->startMonitor(); } void SideBarFileSystemItem::stopWatcher() { initWatcher(); m_watcher->stopMonitor(); } GAsyncReadyCallback SideBarFileSystemItem::eject_cb(GFile *file, GAsyncResult *res, SideBarFileSystemItem *p_this) { GError *err = nullptr; QString ejectNotify; bool successed = g_file_eject_mountable_with_operation_finish(file, res, &err); qDebug()<message; /*fix #18957*/ QMessageBox warningBox(QMessageBox::Warning,QObject::tr("Eject failed"),QString(err->message)); QPushButton *cancelBtn = (warningBox.addButton(QObject::tr("Cancel"),QMessageBox::RejectRole)); QPushButton *ensureBtn = (warningBox.addButton(QObject::tr("Eject Anyway"),QMessageBox::YesRole)); warningBox.exec(); if(warningBox.clickedButton() == ensureBtn) p_this->realEject(G_MOUNT_UNMOUNT_FORCE); g_error_free(err); } else { char *uri = g_file_get_uri(file); VolumeManager::getInstance()->fileUnmounted(uri); if (uri) g_free(uri); ejectNotify = QObject::tr("Data synchronization is complete and the device can be safely unplugged!"); notifyUser(ejectNotify); // remove item anyway /*int index = p_this->parent()->m_children->indexOf(p_this); p_this->m_model->beginRemoveRows(p_this->parent()->firstColumnIndex(), index, index); p_this->parent()->m_children->removeOne(p_this); p_this->m_model->endRemoveRows(); p_this->deleteLater();*/ } return nullptr; } //update udisk file info void SideBarFileSystemItem::updateFileInfo(SideBarFileSystemItem *pThis){ auto fileInfo = FileInfo::fromUri(pThis->m_uri); FileInfoJob fileJob(fileInfo); fileJob.querySync(); QString tmpName = FileUtils::getFileDisplayName(pThis->m_uri); //old's drive name -> now's volume name. fix #17968 FileUtils::queryVolumeInfo(pThis->m_uri,pThis->m_volume_name,pThis->m_unix_device,tmpName); //icon name. pThis->m_icon_name = FileUtils::getFileIconName(pThis->m_uri); qDebug()<<"update file info"<m_uri<m_volume_name<m_unix_device<displayName()<code)){ errorMsg = QObject::tr("Unable to eject %1").arg(pThis->m_display_name); QMessageBox warningBox(QMessageBox::Warning,QObject::tr("Eject failed"),errorMsg); QPushButton *cancelBtn = (warningBox.addButton(QObject::tr("Cancel"),QMessageBox::RejectRole)); QPushButton *ensureBtn = (warningBox.addButton(QObject::tr("Eject Anyway"),QMessageBox::YesRole)); warningBox.exec(); if(warningBox.clickedButton() == ensureBtn) pThis->eject(G_MOUNT_UNMOUNT_FORCE); g_error_free(error); } } } void notifyUser(QString notifyContent) { NotifyNotification* notify; notify_init(QObject::tr("PeonyNotify").toUtf8().constData()); notify = notify_notification_new(QObject::tr("File Manager").toUtf8().constData(), notifyContent.toUtf8().constData(), "system-file-manager"); notify_notification_show(notify,nullptr); notify_uninit(); g_object_unref(G_OBJECT(notify)); } SideBarUserDiskItem::SideBarUserDiskItem(SideBarFileSystemItem *item, SideBarModel *model, QObject *parent) : SideBarFileSystemItem(nullptr, item, model, parent) { m_parent = item; } QString SideBarUserDiskItem::uri() { return "file:///home"; } QString SideBarUserDiskItem::displayName() { return tr("User Disk"); } QString SideBarUserDiskItem::iconName() { return "drive-harddisk"; } SideBarAbstractItem *SideBarUserDiskItem::parent() { return m_parent; } void SideBarUserDiskItem::findChildren() { } void SideBarUserDiskItem::findChildrenAsync() { findChildren(); } void SideBarUserDiskItem::clearChildren() { SideBarAbstractItem::clearChildren(); } peony/src/control/intel/intel-side-bar-personal-item.h0000664000175000017500000000525515154271070021752 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef INTEL_SIDEBARPERSONALITEM_H #define INTEL_SIDEBARPERSONALITEM_H #include "peony-core_global.h" #include "intel-side-bar-abstract-item.h" #include namespace Peony { class FileWatcher; class FileInfo; namespace Intel { class SideBarModel; class PEONYCORESHARED_EXPORT SideBarPersonalItem : public SideBarAbstractItem { Q_OBJECT public: explicit SideBarPersonalItem(QString uri, SideBarPersonalItem *parentItem, SideBarModel *model, QObject *parent = nullptr); Type type() override { return SideBarAbstractItem::PersonalItem; } QString uri() override { return m_uri; } QString displayName() override { return m_display_name; } QString iconName() override { return m_icon_name; } bool hasChildren() override { return m_is_root_child; } bool isRemoveable() override { return false; } bool isEjectable() override { return false; } bool isMountable() override { return false; } QModelIndex firstColumnIndex() override; QModelIndex lastColumnIndex() override; SideBarAbstractItem *parent() override { return m_parent; } public Q_SLOTS: void eject(GMountUnmountFlags ejectFlag) override {} void unmount() override {} void format() override {} void onUpdated() override {} void findChildren() override {} void findChildrenAsync() override {} void clearChildren() override {} private: void initWatcher(); SideBarPersonalItem *m_parent = nullptr; bool m_is_root_child = false; QString m_uri = nullptr; QString m_display_name = nullptr; QString m_icon_name = nullptr; std::shared_ptr m_watcher = nullptr; std::shared_ptr m_info = nullptr; }; } } #endif // SIDEBARPERSONALITEM_H peony/src/control/intel/tablet-side-bar-factory.cpp0000664000175000017500000000330315154271070021325 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "tablet-side-bar-factory.h" #include "intel-navigation-side-bar.h" using namespace Peony::Intel; using namespace Intel; TabletSideBarFactory::TabletSideBarFactory(QObject *parent) : QObject(parent) { } const QStringList TabletSideBarFactory::keys() { QStringList keys; keys.append("V10SP1-edu"); keys.append("Intel"); return keys; } Peony::SideBar *TabletSideBarFactory::create(QWidget *parent) { return new NavigationSideBarContainer(parent); } Peony::PluginInterface::PluginType TabletSideBarFactory::pluginType() { return SideBarPlugin; } const QString TabletSideBarFactory::name() { return "Intel"; } const QString TabletSideBarFactory::description() { return tr("Intel Side Bar"); } const QIcon TabletSideBarFactory::icon() { return QIcon::fromTheme("file-manager"); } void TabletSideBarFactory::setEnable(bool enable) { } bool TabletSideBarFactory::isEnable() { return true; } peony/src/control/intel/tablet-side-bar-factory.h0000664000175000017500000000252315154271070020775 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef TABLETSIDEBARFACTORY_H #define TABLETSIDEBARFACTORY_H #include "side-bar-plugin-iface.h" namespace Peony { namespace Intel { class TabletSideBarFactory : public QObject, public SideBarPluginInterface { Q_OBJECT public: explicit TabletSideBarFactory(QObject *parent = nullptr); const QStringList keys(); SideBar *create(QWidget *parent); PluginType pluginType(); const QString name(); const QString description(); const QIcon icon(); void setEnable(bool enable); bool isEnable(); }; } } #endif // TABLETSIDEBARFACTORY_H peony/src/control/search-widget.h0000664000175000017500000000411715154271106016005 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef SEARCHWIDGET_H #define SEARCHWIDGET_H #include class QToolButton; namespace Peony { class AdvancedLocationBar; class SearchWidget : public QWidget { Q_OBJECT public: explicit SearchWidget(QWidget *parent = nullptr); void searchButtonClicked(); void setSearchMode(bool mode); bool isSearchMode(); void setSearchText(const QString &text); Q_SIGNALS: void updateLocationRequest(const QString &uri, bool addHistory = true, bool force = true); void updateSearchRequest(bool showSearch); void refreshRequest(); void updateFileTypeFilter(const int &index); void updateLocation(const QString &uri); void cancelEdit(); void finishEdit(); void clearSearchBox(); void changeSearchMode(bool mode); void updateSearch(const QString &uri, const QString &key = "", bool updateKey = false); void setSearchBarFocus(); public Q_SLOTS: void startEdit(bool bSearch = false); void updateSearchRecursive(bool recursive); void closeSearch(); void setGlobalFlag(bool isGlobal); void updateTabletModeValue(bool isTabletMode); void updateSearchProgress(bool isSearching); private: AdvancedLocationBar *m_locationBar; bool m_searchMode = false; bool m_searchGlobal = false; bool m_searchRecursive = true; }; } #endif // SEARCHWIDGET_H peony/src/control/search-widget.cpp0000664000175000017500000001245115154271106016340 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "search-widget.h" #include "advanced-location-bar.h" #include "search-vfs-uri-parser.h" #include #include #include #include #include #include #include #include #include #include using namespace Peony; static const int SEARCH_BUTTON_SIZE =36; SearchWidget::SearchWidget(QWidget *parent) : QWidget(parent) { QHBoxLayout *layout = new QHBoxLayout(this); m_locationBar = new AdvancedLocationBar(this); connect(m_locationBar, &AdvancedLocationBar::refreshRequest, this, &SearchWidget::refreshRequest); connect(m_locationBar, &AdvancedLocationBar::updateFileTypeFilter, this, &SearchWidget::updateFileTypeFilter); connect(m_locationBar, &AdvancedLocationBar::searchRequest, [=](const QString &path, const QString &key){ //key is null, clean search content, show all files bool searchMode = m_locationBar->getSearchMode(); if (key == "" || key.isNull()) { Q_EMIT this->updateSearchRequest(searchMode); Q_EMIT this->updateLocationRequest(path, false); this->updateSearch(path, key, true); if (!searchMode) { m_searchGlobal = false; } } else { if (m_searchGlobal) { Q_EMIT this->updateSearchRequest(searchMode); QString homePath = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); auto targetUri = Peony::SearchVFSUriParser::parseSearchKey(homePath, key, true, false, "", m_searchRecursive); targetUri = targetUri.replace("&recursive=0", "&recursive=1"); this->updateSearch(homePath, key, true); this->updateLocation(targetUri); } else { Q_EMIT this->updateSearchRequest(searchMode); auto targetUri = Peony::SearchVFSUriParser::parseSearchKey(path, key, true, false, "", m_searchRecursive); targetUri = targetUri.replace("&recursive=1", "&recursive=0"); this->updateSearch(path, key, true); this->updateLocation(targetUri); } } }); connect(m_locationBar, &AdvancedLocationBar::updateWindowLocationRequest, this, &SearchWidget::updateLocationRequest); connect(this, &SearchWidget::updateLocation, m_locationBar, &AdvancedLocationBar::updateLocation); connect(this, &SearchWidget::cancelEdit, m_locationBar, &AdvancedLocationBar::cancelEdit); connect(this, &SearchWidget::finishEdit, m_locationBar, &AdvancedLocationBar::finishEdit); connect(this, &SearchWidget::clearSearchBox, m_locationBar, &AdvancedLocationBar::clearSearchBox); connect(this,&SearchWidget::setSearchBarFocus, m_locationBar, &AdvancedLocationBar::setSearchBarFocus); layout->addWidget(m_locationBar); layout->setSpacing(102); } void SearchWidget::searchButtonClicked() { m_searchMode = ! m_searchMode; qDebug() << "searchButtonClicked" <updateSearchRequest(m_searchMode); setSearchMode(m_searchMode); } void SearchWidget::setSearchMode(bool mode) { m_locationBar->switchEditMode(mode); } void SearchWidget::closeSearch() { m_searchMode = false; setSearchMode(false); } void SearchWidget::startEdit(bool bSearch) { //qDebug() << "bSearch" <setSearchBarFocus(); return; } if (bSearch) { searchButtonClicked(); } else { m_locationBar->startEdit(); m_locationBar->switchEditMode(false); if (m_searchMode) { Q_EMIT updateSearchRequest(false); } m_searchMode = false; } } void SearchWidget::setGlobalFlag(bool isGlobal) { m_searchGlobal = isGlobal; m_locationBar->deselectSearchBox(); } void SearchWidget::updateSearchRecursive(bool recursive) { m_searchRecursive = recursive; } bool SearchWidget::isSearchMode() { return m_searchMode; } void SearchWidget::setSearchText(const QString &text) { if (m_locationBar) { m_locationBar->setSearchText(text); } } void SearchWidget::updateTabletModeValue(bool isTabletMode) { //task#106007 【文件管理器】文件管理器应用做平板UI适配,去掉搜索 int height = isTabletMode? 48:36; m_locationBar->setFixedHeight(height); } void SearchWidget::updateSearchProgress(bool isSearching) { m_locationBar->updateSearchProgress(isSearching); } peony/src/control/control.pri0000664000175000017500000000145515154271070015304 0ustar fengfengINCLUDEPATH += $$PWD include(intel/intel-sidebar.pri) HEADERS += \ $$PWD/file-label-box.h \ $$PWD/header-bar.h \ $$PWD/label-box-delegate.h \ $$PWD/navigation-side-bar.h \ $$PWD/navigation-tab-bar.h \ $$PWD/operation-menu.h \ $$PWD/search-widget.h \ $$PWD/sort-type-menu.h \ $$PWD/tab-status-bar.h \ $$PWD/tab-widget.h \ $$PWD/view-type-menu.h \ $$PWD/float-pane-widget.h SOURCES += \ $$PWD/file-label-box.cpp \ $$PWD/header-bar.cpp \ $$PWD/label-box-delegate.cpp \ $$PWD/navigation-side-bar.cpp \ $$PWD/navigation-tab-bar.cpp \ $$PWD/operation-menu.cpp \ $$PWD/search-widget.cpp \ $$PWD/sort-type-menu.cpp \ $$PWD/tab-status-bar.cpp \ $$PWD/tab-widget.cpp \ $$PWD/view-type-menu.cpp \ $$PWD/float-pane-widget.cpp peony/src/control/navigation-tab-bar.h0000664000175000017500000000676315154271106016735 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef NAVIGATIONTABBAR_H #define NAVIGATIONTABBAR_H #include #include #include #include class QToolButton; class QDrag; class QParallelAnimationGroup; class QVariantAnimation; namespace Peony { class FileInfo; } class NavigationTabBar : public QTabBar { friend class TabBarStyle; friend class TabWidget; Q_OBJECT public: explicit NavigationTabBar(QWidget *parent = nullptr); QStringList getCurrentUris(); bool event(QEvent *ev) override; Q_SIGNALS: void pageAdded(const QString &uri); void pageRemoved(); void closeWindowRequest(); void addPageRequest(const QString &uri, bool jumpTo); void locationUpdated(const QString &uri); public Q_SLOTS: void addPage(const QString &uri = nullptr, bool jumpToNewTab = false); void addPages(const QStringList &uri); void updateLocation(int index, const QString &uri); protected: void tabRemoved(int index) override; void tabInserted(int index) override; void dragEnterEvent(QDragEnterEvent *e) override; void dragMoveEvent(QDragMoveEvent *e) override; void dragLeaveEvent(QDragLeaveEvent *e) override; void dropEvent(QDropEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; QSize tabSizeHint(int index) const; private: QTimer m_drag_timer; bool m_start_drag = false; QPoint m_press_pos; QDrag *m_drag = nullptr; bool m_should_trigger_drop = false; QStringList m_has_uris; const int ELIDE_TEXT_LENGTH = 16; QParallelAnimationGroup *m_animations = nullptr; QVariantAnimation *m_opacity_animation = nullptr; QVariantAnimation *m_slide_animation = nullptr; QVariantAnimation *m_zoom_animation = nullptr; }; class TabBarStyle : public QProxyStyle { friend class NavigationTabBar; friend class TabWidget; static TabBarStyle *getStyle(); TabBarStyle(); void polish(QWidget *widget) override; int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; private: bool m_need_adjust = false; }; #endif // NAVIGATIONTABBAR_H peony/src/control/operation-menu.cpp0000664000175000017500000006151215154271106016556 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-application.h" #include "main-window.h" #include "operation-menu.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "global-settings.h" #include "clipboard-utils.h" #include "thumbnail-manager.h" #include "file-operation-utils.h" #include "file-operation-manager.h" #include "directory-view-widget.h" #include "directory-view-container.h" #include "file-meta-info.h" #include "file-utils.h" #include "extensions-manager-widget.h" #include "connect-to-server-dialog.h" #include "manager-control.h" OperationMenu::OperationMenu(MainWindow *window, QWidget *parent) : QMenu(parent) { m_window = window; connect(this, &QMenu::aboutToShow, this, &OperationMenu::updateMenu); //FIXME: implement all actions. m_editWidgetContainer = new QWidgetAction(this); auto editWidget = new OperationMenuEditWidget(window, this); m_edit_widget = editWidget; m_editWidgetContainer->setDefaultWidget(editWidget); addAction(m_editWidgetContainer); connect(m_edit_widget, &OperationMenuEditWidget::operationAccepted, this, &QMenu::hide); addSeparator(); //addAction(tr("Conditional Filter")); // auto advanceSearch = addAction(tr("Advance Search"), this, [=]() // { // m_window->advanceSearch(); // }); // addSeparator(); auto keepAllow = addAction(tr("Keep Allow"), this, [=](bool checked) { m_window->setKeepAbove(checked); }); keepAllow->setCheckable(true); auto showHidden = addAction(tr("Show Hidden"), this, [=](bool checked) { //window set show hidden m_window->setShowHidden(checked); }); m_show_hidden = showHidden; showHidden->setCheckable(true); m_showFileExtension = addAction(tr("Show File Extension"), this, [=](bool checked) { m_window->setShowFileExtensions(checked); }); m_showFileExtension->setCheckable(true); m_showCreateTime = addAction(tr("Show Create Time"), this, [](bool checked){ Peony::GlobalSettings::getInstance()->setGSettingValue(SHOW_CREATE_TIME, checked); }); m_showCreateTime->setCheckable(true); m_showCreateTime->setChecked(Peony::GlobalSettings::getInstance()->getValue(SHOW_CREATE_TIME).toBool()); m_showRelativeTime = addAction(tr("Show Relative Time"), this, [](bool checked){ Peony::GlobalSettings::getInstance()->setGSettingValue(SHOW_RELATIVE_DATE, checked); }); m_showRelativeTime->setCheckable(true); m_showRelativeTime->setChecked(Peony::GlobalSettings::getInstance()->getValue(SHOW_RELATIVE_DATE).toBool()); //显示相对时间,只在中文或者繁体语言生效 if ("zh_CN" == QLocale::system().name() || "zh_HK" == QLocale::system().name()) { m_showRelativeTime->setDisabled(false); } else { //fix bug#303823, other language set option unchecked then disabled m_showRelativeTime->setChecked(false); m_showRelativeTime->setCheckable(false); m_showRelativeTime->setDisabled(true); } auto forbidThumbnailing = addAction(tr("Forbid thumbnailing"), this, [=](bool checked) { //FIXME: Peony::GlobalSettings::getInstance()->setValue(FORBID_THUMBNAIL_IN_VIEW, checked); // fix #213036 // m_window->refresh(); }); m_forbid_thumbnailing = forbidThumbnailing; forbidThumbnailing->setCheckable(true); forbidThumbnailing->setChecked(Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()); auto residentInBackend = addAction(tr("Resident in Backend"), this, [=](bool checked) { //FIXME: Peony::GlobalSettings::getInstance()->setValue(RESIDENT_IN_BACKEND, checked); qApp->setQuitOnLastWindowClosed(!checked); }); m_resident_in_backend = residentInBackend; residentInBackend->setCheckable(true); residentInBackend->setChecked(Peony::GlobalSettings::getInstance()->getValue(RESIDENT_IN_BACKEND).toBool()); auto allowFileOpParallel = addAction(tr("Parallel Operations"), this, [=](bool checked){ Peony::FileOperationManager::getInstance()->setAllowParallel(checked); }); allowFileOpParallel->setCheckable(true); allowFileOpParallel->setChecked(Peony::FileOperationManager::getInstance()->isAllowParallel()); m_setSambaPassword = addAction(tr("Set samba password"), this, [=]() { g_autoptr(GError) error = NULL; PolkitAuthority* mAuth = polkit_authority_get_sync(NULL, &error); if (error) { qWarning() << error->message; return; } int pid = getpid(); int uid = getuid(); QString username = g_get_user_name(); PolkitSubject* proj = polkit_unix_process_new_for_owner (pid, 0, uid); PolkitAuthorizationResult* res = polkit_authority_check_authorization_sync (mAuth, proj, "org.ukui.samba.share.config.authorization", NULL, POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION, nullptr, &error); if (error) { qWarning() << error->message; if (proj) { g_object_unref (proj); } if (res) { g_object_unref (res); } return; } if (!polkit_authorization_result_get_is_authorized(res)) { return; } QDBusInterface *interFace = new QDBusInterface("org.ukui.samba.share.config", "/org/ukui/samba/share", "org.ukui.samba.share.config", QDBusConnection::systemBus()); QDBusReply initReply = interFace->call("init", username, pid, uid); if (initReply.isValid()) { if (initReply.value()) { QDBusReply hasPasswdReply = interFace->call("hasPasswd"); if (hasPasswdReply.isValid()) { if (hasPasswdReply.value()) { auto result = QMessageBox::question(m_window, tr("Tips"), tr("The user already has a samba password, do you need to reset the samba password?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (result == QMessageBox::Yes) { goto setPasswd; } } else { setPasswd: bool ok = false; QInputDialog dlg(m_window); dlg.setLabelText(tr("Samba password:")); dlg.setTextEchoMode(QLineEdit::Password); dlg.setWindowTitle(tr("Samba set user password")); dlg.setFixedSize(470,150); ok = dlg.exec(); QString text = dlg.textValue(); if (ok && !text.isNull() && !text.isEmpty()) { QDBusReply setPasswdReply = interFace->call("setPasswd", text); if (setPasswdReply.isValid()) { if (!setPasswdReply.value()) { QMessageBox::warning(m_window, tr("Warning"), tr("Samba set password failed, Please re-enter!")); } } else { qDebug() << "setPasswd call failed!"; } } } } else { qDebug() << "hasPasswd call failed!"; } } else { QMessageBox::warning(nullptr, tr("Warning"), tr("Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share!"), QMessageBox::Ok); } } else { qDebug() << "init call failed!"; } interFace->call("finished"); }); m_setSambaPassword->setVisible(MANAGER_CONTROL->checkSmbSharePermission()); //task#147390 设置是否新建窗口打开文件夹 m_showFoldersInNewWindow = addAction(tr("Open each folder in a new window"), this, [=](bool checked) { Peony::GlobalSettings::getInstance()->setValue(SHOW_IN_NEW_WINDOW, checked); }); m_showFoldersInNewWindow->setCheckable(true); m_showFoldersInNewWindow->setChecked(Peony::GlobalSettings::getInstance()->getValue(SHOW_IN_NEW_WINDOW).toBool()); addAction(tr("Plugin manager Settings"), this, [=](){ Peony::ExtensionsManagerWidget *widget = Peony::ExtensionsManagerWidget::getInstance(); widget->activateWindow(); widget->raise(); widget->show(); }); m_showNetwork = addAction(tr("Show Network"), this, [=](bool checked){ Peony::GlobalSettings::getInstance()->setValue(SHOW_NETWORK, checked); }); m_showNetwork->setCheckable(true); m_showNetwork->setVisible(MANAGER_CONTROL->checkSmbSharePermission()); if (!MANAGER_CONTROL->checkSmbSharePermission()) { Peony::GlobalSettings::getInstance()->setValue(SHOW_NETWORK, false); } m_connecttoServer = addAction(tr("Connect to Server"), this, [=](){ Peony::ConnectServerDialog dlg; if (dlg.exec()) { if (!dlg.uri().isEmpty()) { m_window->goToUri(dlg.uri(), true); } } }); m_connecttoServer->setVisible(MANAGER_CONTROL->checkSmbSharePermission()); addSeparator(); //comment icon to design request addAction(/*QIcon::fromTheme("gtk-help"),*/ tr("Help"), this, [=]() { PeonyApplication::help(); }); addAction(/*QIcon::fromTheme("gtk-about"),*/ tr("About"), this, [=]() { //PeonyApplication::about(); AboutDialog dlg(m_window); dlg.setWindowModality(Qt::WindowModal); dlg.exec(); }); connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::valueChanged, this, [=] (const QString& key) { if (key == ENABLE_SMB_SHARE) { bool allowSmbShare = MANAGER_CONTROL->checkSmbSharePermission(); m_showNetwork->setVisible(allowSmbShare); m_connecttoServer->setVisible(allowSmbShare); m_setSambaPassword->setVisible(allowSmbShare); Peony::GlobalSettings::getInstance()->setValue(SHOW_NETWORK, allowSmbShare); } }); #ifdef BUILD_WITH_FEEDBACK_ACTION //task#335022, add feedback button in menu kdk::KMenuButton* menubutton = new kdk::KMenuButton(); addAction(menubutton->feedbackAction()); #endif } void OperationMenu::updateMenu() { // note: wlcom下通过鼠标点击选项菜单时,选项菜单对应的mainwindow没有收到激活事件 // 导致窗口绘制异常,这里手动设置激活窗口规避此问题,避免窗口按钮的绘制问题 qDebug() << "operation menu about to show"; qApp->setActiveWindow(m_window); if (Peony::GlobalSettings::getInstance()->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { m_show_hidden->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_HIDDEN_PREFERENCE)? Peony::GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool(): false); } else { auto uri = m_window->getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { bool checked = metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).isValid()? metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).toBool(): false; m_show_hidden->setChecked(checked); } else { m_show_hidden->setChecked(false); } } m_showFileExtension->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_FILE_EXTENSION)? Peony::GlobalSettings::getInstance()->getValue(SHOW_FILE_EXTENSION).toBool(): true); m_forbid_thumbnailing->setChecked(Peony::GlobalSettings::getInstance()->isExist(FORBID_THUMBNAIL_IN_VIEW)? Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(): false); m_resident_in_backend->setChecked(Peony::GlobalSettings::getInstance()->isExist(RESIDENT_IN_BACKEND)? Peony::GlobalSettings::getInstance()->getValue(RESIDENT_IN_BACKEND).toBool(): false); m_showFoldersInNewWindow->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_IN_NEW_WINDOW)? Peony::GlobalSettings::getInstance()->getValue(SHOW_IN_NEW_WINDOW).toBool(): false); //fix bug#200297, menu status update issue m_showCreateTime->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_CREATE_TIME)? Peony::GlobalSettings::getInstance()->getValue(SHOW_CREATE_TIME).toBool(): false); m_showNetwork->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_NETWORK) ? Peony::GlobalSettings::getInstance()->getValue(SHOW_NETWORK).toBool() : true); //get window current directory and selections, then update ohter actions. m_edit_widget->updateActions(m_window->getCurrentUri(), m_window->getCurrentSelections()); bool tablet = qApp->property("tabletMode").toBool(); m_editWidgetContainer->setVisible(!tablet); if (tablet) { m_edit_widget->hide(); } else { m_edit_widget->show(); } } OperationMenuEditWidget::OperationMenuEditWidget(MainWindow *window, QWidget *parent) : QWidget(parent) { auto vbox = new QVBoxLayout; setLayout(vbox); auto title = new QLabel(this); title->setText(tr("Edit")); title->setAlignment(Qt::AlignCenter); vbox->addWidget(title); auto hbox = new QHBoxLayout; auto copy = new QToolButton(this); m_copy = copy; copy->setFixedSize(QSize(40, 40)); copy->setIcon(QIcon::fromTheme("edit-copy-symbolic")); copy->setIconSize(QSize(16, 16)); copy->setAutoRaise(false); copy->setToolTip(tr("copy")); hbox->addWidget(copy); auto paste = new QToolButton(this); m_paste = paste; paste->setFixedSize(QSize(40, 40)); paste->setIcon(QIcon::fromTheme("edit-paste-symbolic")); paste->setIconSize(QSize(16, 16)); paste->setAutoRaise(false); paste->setToolTip(tr("paste")); hbox->addWidget(paste); auto cut = new QToolButton(this); m_cut = cut; cut->setFixedSize(QSize(40, 40)); cut->setIcon(QIcon::fromTheme("edit-cut-symbolic")); cut->setIconSize(QSize(16, 16)); cut->setAutoRaise(false); cut->setToolTip(tr("cut")); hbox->addWidget(cut); auto trash = new QToolButton(this); m_trash = trash; trash->setFixedSize(QSize(40, 40)); trash->setIcon(QIcon::fromTheme("edit-delete-symbolic")); trash->setIconSize(QSize(16, 16)); trash->setAutoRaise(false); trash->setToolTip(tr("trash")); hbox->addWidget(trash); vbox->addLayout(hbox); connect(m_copy, &QToolButton::clicked, this, [=]() { if (!window->getCurrentSelections().isEmpty()) { // if (window->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } Peony::ClipboardUtils::setClipboardFiles(window->getCurrentSelections(), false); Q_EMIT operationAccepted(); } }); connect(m_cut, &QToolButton::clicked, this, [=]() { if (!window->getCurrentSelections().isEmpty()) { // if (window->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } Peony::ClipboardUtils::setClipboardFiles(window->getCurrentSelections(), true, window->getCurrentUri().startsWith("search://")); window->getCurrentPage()->getView()->repaintView(); Q_EMIT operationAccepted(); } }); connect(m_paste, &QToolButton::clicked, this, [=]() { auto op = Peony::ClipboardUtils::pasteClipboardFiles(window->getCurrentUri()); if (op) { connect(op, &Peony::FileOperation::operationFinished, window, [=](){ auto opInfo = op->getOperationInfo(); auto targetUirs = opInfo->dests(); //fix bug#196528, selection files icon not update issue QTimer::singleShot(300, window, [=](){ window->setCurrentSelectionUris(targetUirs); }); }, Qt::BlockingQueuedConnection); } Q_EMIT operationAccepted(); }); connect(m_trash, &QToolButton::clicked, this, [=]() { if (window->getCurrentUri() == "trash:///") { Peony::FileOperationUtils::executeRemoveActionWithDialog(window->getCurrentSelections()); } else { Peony::FileOperationUtils::trash(window->getCurrentSelections(), true, window->getCurrentUri().startsWith("search://")); } Q_EMIT operationAccepted(); }); copy->setProperty("useIconHighlightEffect", true); copy->setProperty("iconHighlightEffectMode", 1); copy->setProperty("fillIconSymbolicColor", true); paste->setProperty("useIconHighlightEffect", true); paste->setProperty("iconHighlightEffectMode", 1); paste->setProperty("fillIconSymbolicColor", true); cut->setProperty("useIconHighlightEffect", true); cut->setProperty("iconHighlightEffectMode", 1); cut->setProperty("fillIconSymbolicColor", true); trash->setProperty("useIconHighlightEffect", true); trash->setProperty("iconHighlightEffectMode", 1); trash->setProperty("fillIconSymbolicColor", true); // Install event filters for tooltip handling on operation buttons installTooltipFilter(copy); installTooltipFilter(paste); installTooltipFilter(cut); installTooltipFilter(trash); } void OperationMenuEditWidget::updateActions(const QString ¤tDirUri, const QStringList &selections) { //FIXME: bool isSelectionEmpty = selections.isEmpty(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); bool isDesktop = selections.contains(desktopUri); bool isHome = selections.contains(homeUri); bool isSearch = currentDirUri.startsWith("search://"); bool isRecent = currentDirUri.startsWith("recent://"); bool isTrash = currentDirUri.startsWith("trash://"); bool isComputer = currentDirUri.startsWith("computer:///"); bool isFileBox = currentDirUri == "filesafe:///"; bool hasLongFileName = false; bool isLongFileSavePath = false; bool containsWhitelistApp = false; if (currentDirUri == desktopPath || currentDirUri == desktopUri) { containsWhitelistApp = MANAGER_CONTROL->containsWhitelistApp(selections); } for (auto uri : selections) { if(Peony::FileUtils::isLongNameFileOfNotDel2Trash(uri)){/* 在家目录/下载/扩展目录下存放的长文件名文件使用永久删除,所以该菜单置灰,link bug#188864 */ hasLongFileName = true; break; } } //fix bug#183268, not allow paste in mtp, gphoto2 path or can not write path bool isDirectoryCanWrite = true; auto info = Peony::FileInfo::fromUri(currentDirUri); if (!info->isEmptyInfo()) { isDirectoryCanWrite = info->canWrite(); if (!isDirectoryCanWrite) { QString fileSystem = info.get()->fileSystemType(); if (fileSystem.isEmpty()) { fileSystem = Peony::FileUtils::getFsTypeFromFile(info.get()->uri()); qDebug() << "file system :" << fileSystem; } if (fileSystem.contains("udf")) { qDebug() << "file system contains:" << fileSystem; isDirectoryCanWrite = true; } } } //comment to fix bug#191108, huawei phone can paste file success // if (currentDirUri.startsWith("mtp://") || currentDirUri.startsWith("gphoto2://")){ // isDirectoryCanWrite = false; // } if(isSearch && selections.size()){/* hotfix bug#222786 */ isDirectoryCanWrite = Peony::FileUtils::isSearchFilesParentWriteable(selections, isSearch); } m_copy->setEnabled(!isSelectionEmpty && !isRecent && !isTrash && !isComputer); m_cut->setEnabled(!isSelectionEmpty && !isDesktop && !isHome && !isRecent && !isTrash && !isComputer && isDirectoryCanWrite && !isLongFileSavePath); m_trash->setEnabled(!isSelectionEmpty && !isDesktop && !isHome && !isComputer && isDirectoryCanWrite && !hasLongFileName && !isLongFileSavePath && !containsWhitelistApp); bool isClipboradHasFile = Peony::ClipboardUtils::isClipboardHasFiles(); m_paste->setEnabled(isClipboradHasFile && !isSearch && !isRecent && !isTrash && !isComputer && !isFileBox && isDirectoryCanWrite); } /** * @bug #288997: [File Manager] Mouse hover option bar for copy and paste operations, hover tips are displayed outside of the file manager. * * Handles tooltip events by: * - Calculating appropriate tooltip position relative to mouse cursor * - Ensuring tooltip remains within screen boundaries * - Adjusting position if tooltip would overlap screen edges * - Providing debug information about tooltip positioning * * Normally, just call setToolTip is ok. * TODO: need to troubleshoot the underlying qt calculation of the position under wayland to solve this problem completely. * @author: Renyg * @date: 2024-11-29 */ bool OperationMenuEditWidget::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::ToolTip) { QToolButton *btn = qobject_cast(watched); if (btn) { QHelpEvent *he = static_cast(event); QPoint globalPos = he->globalPos(); // Default offset values for tooltip positioning const int VERTICAL_OFFSET = 5; const int HORIZONTAL_OFFSET = 2; // Position tooltip slightly below and to the right of cursor globalPos += QPoint(HORIZONTAL_OFFSET, VERTICAL_OFFSET); // Calculate tooltip dimensions QFontMetrics fm(QToolTip::font()); QSize tooltipSize = fm.size(Qt::TextSingleLine, btn->toolTip()) + QSize(10, 6); // Adjust position to keep tooltip within screen boundaries QScreen *screen = QGuiApplication::screenAt(globalPos); if (screen) { QRect screenGeometry = screen->geometry(); // Prevent tooltip from extending beyond right edge if (globalPos.x() + tooltipSize.width() > screenGeometry.right()) { // If it will go beyond the right border, offset it to the left globalPos.setX(screenGeometry.right() - tooltipSize.width() - HORIZONTAL_OFFSET); } // Prevent tooltip from extending beyond bottom edge if (globalPos.y() + tooltipSize.height() > screenGeometry.bottom()) { // If it will go beyond the lower border, display it above the mouse globalPos.setY(he->globalPos().y() - tooltipSize.height() - VERTICAL_OFFSET); } } QToolTip::showText(globalPos, btn->toolTip()); // Output debug information qDebug() << "btn Tooltip:" << btn->toolTip(); qDebug() << "Mouse pos:" << he->globalPos(); qDebug() << "Tooltip pos:" << globalPos; qDebug() << "Tooltip size:" << tooltipSize; return true; } } return QWidget::eventFilter(watched, event); } void OperationMenuEditWidget::installTooltipFilter(QToolButton *btn) { btn->installEventFilter(this); } peony/src/control/view-type-menu.cpp0000664000175000017500000000661515154271070016512 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "view-type-menu.h" #include "view-factory-sort-filter-model.h" #include "directory-view-factory-manager.h" #include "directory-view-plugin-iface2.h" #include #include ViewTypeMenu::ViewTypeMenu(QWidget *parent) : QMenu(parent) { m_model = new Peony::ViewFactorySortFilterModel2(this); m_view_actions = new QActionGroup(this); m_view_actions->setExclusive(true); connect(m_view_actions, &QActionGroup::triggered, this, [=](QAction *action) { auto viewId = action->data().toString(); setCurrentView(viewId); }); connect(this, &QMenu::aboutToShow, this, [=]() { qDebug()<<"show menu"; updateMenuActions(); }); setCurrentDirectory("file:///"); } void ViewTypeMenu::setCurrentView(const QString &viewId, bool blockSignal) { if (viewId == m_current_view_id) return; // Fixme: switch view in cloud page if (m_current_uri == "cloud:///") { m_current_view_id = "Cloud View"; return; } if (isViewIdValid(viewId)) { m_current_view_id = viewId; } for (auto action : m_view_actions->actions()) { if (action->text() == viewId) { action->setChecked(true); } } Q_EMIT this->switchViewRequest(viewId, m_model->iconFromViewId(viewId)); if (!blockSignal) { auto factoryManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto factory = factoryManager->getFactory(viewId); int zoomLevelHint = factory->zoom_level_hint(); Q_EMIT this->updateZoomLevelHintRequest(zoomLevelHint); } } void ViewTypeMenu::setCurrentDirectory(const QString &uri) { m_current_uri = uri; m_model->setDirectoryUri(uri); } bool ViewTypeMenu::isViewIdValid(const QString &viewId) { return m_model->supportViewIds().contains(viewId); } void ViewTypeMenu::updateMenuActions() { auto supportViews = m_model->supportViewIds(); for (auto action : m_view_actions->actions()) { removeAction(action); m_view_actions->removeAction(action); action->deleteLater(); } for (auto id : supportViews) { auto action = new QAction(this); auto text = m_model->getViewDisplayNameFromId(id); action->setText(text); action->setData(id); action->setIcon(m_model->iconFromViewId(id)); m_view_actions->addAction(action); addAction(action); action->setCheckable(true); if (m_current_view_id == id) { action->setChecked(true); } } } const QIcon ViewTypeMenu::getCurrentIconFromViewId() { return m_model->iconFromViewId(m_current_view_id); } peony/src/control/header-bar.cpp0000664000175000017500000014707215154271106015614 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "header-bar.h" #include "main-window.h" #include #include "view-type-menu.h" #include "sort-type-menu.h" #include "operation-menu.h" #include "directory-view-container.h" #include "directory-view-widget.h" #include "advanced-location-bar.h" #include "directory-view-factory-manager.h" #include "directory-view-plugin-iface2.h" #include "search-vfs-uri-parser.h" #include "file-info.h" #include "file-info-job.h" #include "file-utils.h" #include "tab-widget.h" #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "clipboard-utils.h" #include "file-operation-utils.h" #include "directoryviewhelper.h" #include #include #include #include #include #include #include #include #include #include #include #include "global-settings.h" #ifdef KYLIN_COMMON #include #endif #include #include //#include #include #include #include #include #include #include #include #include #include #include "search-widget.h" #ifdef KY_SDK_WAYLANDHELPER #include #endif #define DBUS_STATUS_MANAGER_IF "com.kylin.statusmanager.interface" static HeaderBarStyle *global_instance = nullptr; static QString terminal_cmd = nullptr; static QDBusInterface *g_statusManagerDBus = nullptr; HeaderBar::HeaderBar(MainWindow *parent) : QToolBar(parent) { setAttribute(Qt::WA_AcceptTouchEvents); setMouseTracking(true); setStyle(HeaderBarStyle::getStyle()); setFocusPolicy(Qt::TabFocus); m_window = parent; //disable default menu setContextMenuPolicy(Qt::CustomContextMenu); //setAttribute(Qt::WA_OpaquePaintEvent); setStyleSheet(".HeaderBar{" "background-color: transparent;" "border: 0px solid transparent;" "margin: 4px 5px 4px 5px;" "}"); setMovable(false); // auto a = addAction(QIcon::fromTheme("folder-new-symbolic"), tr("Create Folder"), [=]() { // //use the same function // m_window->createFolderOperation(); // }); // auto createFolder = qobject_cast(widgetForAction(a)); // createFolder->setAutoRaise(false); // createFolder->setFixedSize(QSize(40, 40)); // createFolder->setIconSize(QSize(16, 16)); // addSpacing(2); //find a terminal when init // findDefaultTerminal(); // a = addAction(QIcon::fromTheme("terminal-app-symbolic"), tr("Open Terminal"), [=]() { // //open the default terminal // openDefaultTerminal(); // }); // auto openTerminal = qobject_cast(widgetForAction(a)); // openTerminal->setAutoRaise(false); // openTerminal->setFixedSize(QSize(40, 40)); // openTerminal->setIconSize(QSize(16, 16)); auto goBack = new QToolButton(this); m_go_back = goBack; goBack->setEnabled(false); goBack->setToolTip(tr("Go Back")); goBack->setIcon(QIcon::fromTheme("go-previous-symbolic")); auto a = addWidget(goBack); m_actions.insert(HeaderBarAction::GoBack, a); auto goForward = new QToolButton(this); m_go_forward = goForward; goForward->setEnabled(false); goForward->setToolTip(tr("Go Forward")); goForward->setIcon(QIcon::fromTheme("go-next-symbolic")); a = addWidget(goForward); m_actions.insert(HeaderBarAction::GoForward, a); connect(goForward, &QPushButton::clicked, m_window, [=]() { m_window->getCurrentPage()->goForward(); }); #ifdef KYLIN_COMMON m_is_intel = (QString::compare("V10SP1-edu", QString::fromStdString(KDKGetPrjCodeName()), Qt::CaseInsensitive) == 0); #else m_is_intel = false; #endif // KYLIN_COMMON if (! m_is_intel) { //non intel project, show go up button auto goUp = new QToolButton(this); m_go_up = goUp; goUp->setEnabled(true); goUp->setToolTip(tr("Go Up")); goUp->setIcon(QIcon::fromTheme("go-up-symbolic")); a = addWidget(goUp); m_actions.insert(HeaderBarAction::GoForward, a); connect(goUp, &QPushButton::clicked, m_window, [=]() { m_window->getCurrentPage()->cdUp(); }); } addSpacing(9); //task#10993 实现文档管理器路径模式与搜索模式切换动画 m_searchWidget = new Peony::SearchWidget(this); a = addWidget(m_searchWidget); m_actions.insert(HeaderBarAction::LocationBar, a); connect(this, &HeaderBar::updateSearchProgress, m_searchWidget, &Peony::SearchWidget::updateSearchProgress); connect(goBack, &QPushButton::clicked, m_window, [=]() { m_window->getCurrentPage()->goBack(); Q_EMIT m_searchWidget->clearSearchBox(); }); connect(m_searchWidget, &Peony::SearchWidget::refreshRequest, [=]() { m_window->updateTabPageTitle(); }); connect(m_searchWidget, &Peony::SearchWidget::updateFileTypeFilter, [=](const int &index) { m_window->getCurrentPage()->setSortFilter(index); }); connect(this, &HeaderBar::setGlobalFlag, m_searchWidget, &Peony::SearchWidget::setGlobalFlag ); connect(this, &HeaderBar::updateSearchRecursive, m_searchWidget, &Peony::SearchWidget::updateSearchRecursive); connect(this, &HeaderBar::setLocation, m_searchWidget, &Peony::SearchWidget::updateLocation); connect(this, &HeaderBar::cancelEdit, m_searchWidget, &Peony::SearchWidget::cancelEdit); connect(this, &HeaderBar::startEdit, m_searchWidget, &Peony::SearchWidget::startEdit); connect(this, &HeaderBar::finishEdit, m_searchWidget, &Peony::SearchWidget::finishEdit); //connect(m_searchWidget, &Peony::SearchWidget::updateSearchRequest, this, &HeaderBar::updateSearchRequest); connect(m_searchWidget, &Peony::SearchWidget::updateLocationRequest, this, &HeaderBar::updateLocationRequest); connect(this, &HeaderBar::setLocation, this, &HeaderBar::quitMultiSelect); connect(this, &HeaderBar::setSearchBarFocus, m_searchWidget,&Peony::SearchWidget::setSearchBarFocus); addSpacing(2); //task#106007 【文件管理器】文件管理器应用做平板UI适配,增加多选模式 addTabletMenu(); addSpacing(2); auto iconView = addAction(QIcon::fromTheme("view-grid-symbolic"), tr("Icon View")); iconView->setData("Icon View"); m_actions.insert(HeaderBarAction::IconView, iconView); iconView->setCheckable(true); auto iconViewButton = qobject_cast(widgetForAction(iconView)); iconViewButton->setIconSize(QSize(16, 16)); iconViewButton->setProperty("isWindowButton", 1); iconViewButton->setProperty("fillIconSymbolicColor", true); iconViewButton->setFocusPolicy(Qt::StrongFocus); auto listView = addAction(QIcon::fromTheme("view-list-symbolic"), tr("List View")); listView->setData("List View"); m_actions.insert(HeaderBarAction::ListView, listView); listView->setCheckable(true); auto listViewButton = qobject_cast(widgetForAction(listView)); listViewButton->setIconSize(QSize(16, 16)); listViewButton->setProperty("isWindowButton", 1); listViewButton->setProperty("fillIconSymbolicColor", true); listViewButton->setFocusPolicy(Qt::StrongFocus); m_view_actions = new QActionGroup(this); m_view_actions->setExclusive(true); m_view_actions->addAction(iconView); m_view_actions->addAction(listView); connect(m_view_actions, &QActionGroup::triggered, this, [=](QAction *action) { auto viewId = action->data().toString(); m_window->beginSwitchView(viewId); }); a = addAction(QIcon::fromTheme("view-grid-symbolic"), tr("View Type")); m_actions.insert(HeaderBarAction::ViewType, a); auto viewType = qobject_cast(widgetForAction(a)); viewType->setAutoRaise(false); viewType->setFixedWidth(57); viewType->setIconSize(QSize(16, 16)); viewType->setPopupMode(QToolButton::InstantPopup); viewType->setFocusPolicy(Qt::StrongFocus); m_view_type_menu = new ViewTypeMenu(viewType); //fix bug#128963, QToolButton not update status issue connect(m_view_type_menu, &QMenu::aboutToHide, this, [=](){ viewType->setAttribute(Qt::WA_UnderMouse, false); viewType->setDown(false); viewType->releaseMouse(); viewType->update(); }); a->setMenu(m_view_type_menu); connect(m_view_type_menu, &ViewTypeMenu::switchViewRequest, this, [=](const QString &id, const QIcon &icon, bool resetToZoomLevel) { viewType->setText(id); viewType->setIcon(icon); this->viewTypeChangeRequest(id); if (resetToZoomLevel) { auto viewId = m_window->getCurrentPage()->getView()->viewId(); auto factoryManger = Peony::DirectoryViewFactoryManager2::getInstance(); auto factory = factoryManger->getFactory(viewId); int zoomLevelHint = factory->zoom_level_hint(); m_window->getCurrentPage()->setZoomLevelRequest(zoomLevelHint); } }); connect(m_view_type_menu, &ViewTypeMenu::updateZoomLevelHintRequest, this, &HeaderBar::updateZoomLevelHintRequest); addSpacing(2); a = addAction(QIcon::fromTheme("view-sort-ascending-symbolic"), tr("Sort Type")); m_actions.insert(HeaderBarAction::SortType, a); auto sortType = qobject_cast(widgetForAction(a)); //sortType->setAutoRaise(false); sortType->setFixedWidth(167); sortType->setIconSize(QSize(16, 16)); sortType->setPopupMode(QToolButton::InstantPopup); sortType->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); sortType->setFocusPolicy(Qt::StrongFocus); m_sort_type_menu = new SortTypeMenu(this); a->setMenu(m_sort_type_menu); QString sortTypeName = m_sort_type_menu->getSortTypeName(m_window->getCurrentSortColumn()); m_sort_type_menu->updateSortOrderName(m_window->getCurrentSortColumn()); a->setText(sortTypeName); connect(m_sort_type_menu, &SortTypeMenu::switchSortTypeRequest, m_window, &MainWindow::setCurrentSortColumn); connect(m_sort_type_menu, &SortTypeMenu::switchSortOrderRequest, m_window, [=](Qt::SortOrder order) { if (order == Qt::AscendingOrder) { sortType->setIcon(QIcon::fromTheme("view-sort-ascending-symbolic")); } else { sortType->setIcon(QIcon::fromTheme("view-sort-descending-symbolic")); } m_window->setCurrentSortOrder(order); }); connect(m_sort_type_menu, &QMenu::aboutToShow, m_sort_type_menu, [=]() { bool originPathVisible = m_window->getCurrentUri() == "trash:///"; m_sort_type_menu->setOriginPathVisible(originPathVisible); bool isSearchTab = m_window->getCurrentUri().startsWith("search:///"); m_sort_type_menu->setFilePathVisible(isSearchTab); bool isIDMTab = m_window->getCurrentUri().startsWith("idm:///"); m_sort_type_menu->setUserAddedEnable(isIDMTab); if (!isIDMTab && m_sort_type_menu->isAutoModeType(m_window->getCurrentSortColumn())) { m_window->setCurrentSortColumn(0); } m_sort_type_menu->setSortType(m_window->getCurrentSortColumn()); m_sort_type_menu->setSortOrder(m_window->getCurrentSortOrder()); }); //fix bug#128963, QToolButton not update status issue connect(m_sort_type_menu, &QMenu::aboutToHide, this, [=](){ sortType->setAttribute(Qt::WA_UnderMouse, false); sortType->setDown(false); sortType->releaseMouse(); sortType->update(); }); connect(Peony::GlobalSettings::getInstance(), &Peony::GlobalSettings::valueChanged, this, [=](const QString &key){ if (SORT_COLUMN == key || key == USE_GLOBAL_DEFAULT_SORTING) { QString sortTypeName = m_sort_type_menu->getSortTypeName(m_window->getCurrentSortColumn()); m_sort_type_menu->updateSortOrderName(m_window->getCurrentSortColumn()); QString fullText = sortTypeName; QFontMetrics fm(sortType->font()); int availableWidth = sortType->width() - sortType->iconSize().width() - 50; QString elidedText = fm.elidedText(fullText, Qt::ElideRight, availableWidth); a->setText(elidedText); a->setToolTip(fullText); } }); if (QGSettings::isSchemaInstalled("org.ukui.style")) { //font monitor QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key){ qDebug() << "fontSetting changed:" << key; if (key == "systemFont" || key == "systemFontSize") { QString sortTypeName = m_sort_type_menu->getSortTypeName(m_window->getCurrentSortColumn()); m_sort_type_menu->updateSortOrderName(m_window->getCurrentSortColumn()); QString fullText = sortTypeName; QFontMetrics fm(sortType->font()); int availableWidth = sortType->width() - sortType->iconSize().width() - 50; QString elidedText = fm.elidedText(fullText, Qt::ElideRight, availableWidth); a->setText(elidedText); a->setToolTip(fullText); } }); } auto manager = Peony::PreviewPageFactoryManager::getInstance(); auto pluginNames = manager->getPluginNames(); for (auto name : pluginNames) { auto factory = manager->getPlugin(name); m_preview_action = addAction(factory->icon(), factory->name()); break; } m_preview_action->setCheckable(true); auto previewBtnt = qobject_cast(widgetForAction(m_preview_action)); previewBtnt->setFocusPolicy(Qt::TabFocus); connect(m_preview_action,&QAction::triggered,[=](bool checked){ m_window->m_tab->setTriggeredPreviewPage(checked); for (auto name : pluginNames) { if (checked) { auto plugin = Peony::PreviewPageFactoryManager::getInstance()->getPlugin(name); m_window->m_tab->setPreviewPage(plugin->createPreviewPage()); } else { m_window->m_tab->setPreviewPage(nullptr); } } }); auto check = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_DETAIL).toBool(); m_window->m_tab->setTriggeredPreviewPage(check); m_preview_action->setChecked(check); connect(m_sort_type_menu, &SortTypeMenu::switchSortTypeRequest, this, [=](int type){ QString fullText = m_sort_type_menu->getSortTypeName(type); QFontMetrics fm(sortType->font()); int availableWidth = sortType->width() - sortType->iconSize().width() - 50; QString elidedText = fm.elidedText(fullText, Qt::ElideRight, availableWidth); a->setText(elidedText); a->setToolTip(fullText); m_sort_type_menu->updateSortOrderName(type); }); addSpacing(3); a = addAction(QIcon::fromTheme("open-menu-symbolic"), tr("Option")); m_actions.insert(HeaderBarAction::Option, a); QToolButton *optionButton = qobject_cast(widgetForAction(a)); optionButton->setAutoRaise(false); optionButton->setIconSize(QSize(16, 16)); optionButton->setPopupMode(QToolButton::InstantPopup); optionButton->setProperty("isOptionButton", true); optionButton->setProperty("isWindowButton", 1); OperationMenu *operationMenu = new OperationMenu(m_window,m_window); a->setMenu(operationMenu); // Add by wnn, add tool button when select item a = addAction(QIcon::fromTheme("edit-copy-symbolic"), tr("&Copy")); m_actions.insert(HeaderBarAction::Copy, a); a->setVisible(false); a->setToolTip(tr("Copy")); auto copy = qobject_cast(widgetForAction(a)); connect(a, &QAction::triggered, [=]() { if (!m_window->getCurrentSelections().isEmpty()) { if (m_window->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { return ; } Peony::ClipboardUtils::setClipboardFiles(m_window->getCurrentSelections(), false); } }); a = addAction(QIcon::fromTheme("edit-cut-symbolic"), tr("&Cut")); m_actions.insert(HeaderBarAction::Cut, a); a->setVisible(false); a->setToolTip(tr("Cut")); auto cut = qobject_cast(widgetForAction(a)); connect(a, &QAction::triggered, [=]() { Peony::ClipboardUtils::setClipboardFiles(m_window->getCurrentSelections(), true); }); a = addAction(tr("&Select All")); a->setIcon(QIcon::fromTheme("edit-select-all-symbolic")); m_actions.insert(HeaderBarAction::SeletcAll, a); a->setVisible(false); a->setToolTip(tr("Select All")); auto select = qobject_cast(widgetForAction(a)); connect(a, &QAction::triggered, [=]() { if (m_window->getCurrentPage()->getView()) { /// note: 通过getAllFileUris设置的全选效率过低,如果增加接口则会导致二进制兼容性问题 /// 所以这里使用现有的反选接口实现高效的全选,这个方法在mainwindow中也有用到 //auto allFiles = this->getCurrentPage()->getView()->getAllFileUris(); //this->getCurrentPage()->getView()->setSelections(allFiles); if (m_isSelectAll) { m_window->getCurrentPage()->getView()->invertSelections(); m_isSelectAll = false; select->setText(tr("Select All")); } else { m_window->getCurrentPage()->getView()->setSelections(QStringList()); m_window->getCurrentPage()->getView()->invertSelections(); m_isSelectAll = true; select->setText(tr("Deselect All")); } } }); a = addAction(QIcon::fromTheme("edit-delete-symbolic"), tr("&Delete to trash")); m_actions.insert(HeaderBarAction::Delete, a); a->setVisible(false); a->setToolTip(tr("Delete to trash")); auto trash = qobject_cast(widgetForAction(a)); connect(a, &QAction::triggered, [=]() { if (m_window->getCurrentUri() == "trash:///") { Peony::FileOperationUtils::executeRemoveActionWithDialog(m_window->getCurrentSelections()); } else { Peony::FileOperationUtils::trash(m_window->getCurrentSelections(), true); } }); for (auto action : actions()) { auto w = widgetForAction(action); w->setProperty("iconHighlightEffectMode", 1); w->setProperty("useIconHighlightEffect", true); } } HeaderBar::~HeaderBar() { bool check = m_preview_action->isChecked(); Peony::GlobalSettings::getInstance()->setValue(DEFAULT_DETAIL, check); } void HeaderBar::findDefaultTerminal() { QtConcurrent::run([](){ GList *infos = g_app_info_get_all(); GList *l = infos; while (l) { const char *cmd = g_app_info_get_executable(static_cast(l->data)); QString tmp = cmd; if (tmp.contains("terminal")) { terminal_cmd = tmp; if (tmp == "mate-terminal") { terminal_cmd = "/usr/bin/mate-terminal"; break; } } l = l->next; } g_list_free_full(infos, g_object_unref); }); } void HeaderBar::openDefaultTerminal() { //don't find any terminal if (terminal_cmd == nullptr) { QMessageBox *msgBox = new QMessageBox(this); msgBox->setWindowTitle(tr("Operate Tips")); msgBox->setText(tr("Don't find any terminal, please install at least one terminal!")); msgBox->exec(); return; } QUrl url = m_window->getCurrentUri(); auto directory = url.path().toUtf8().constData(); gchar **argv = nullptr; g_shell_parse_argv (terminal_cmd.toUtf8().constData(), nullptr, &argv, nullptr); GError *err = nullptr; g_spawn_async (directory, argv, nullptr, G_SPAWN_SEARCH_PATH, nullptr, nullptr, nullptr, &err); if (err) { qDebug()<message; g_error_free(err); err = nullptr; tryOpenAgain(); } g_strfreev (argv); } void HeaderBar::tryOpenAgain() { QUrl url = m_window->getCurrentUri(); auto absPath = url.path(); qDebug() << "tryOpenAgain url" <setVisible(false); m_actions.find(HeaderBarAction::ViewType).value()->setVisible(false); m_actions.find(HeaderBarAction::Copy).value()->setVisible(true); m_actions.find(HeaderBarAction::Cut).value()->setVisible(true); m_actions.find(HeaderBarAction::SeletcAll).value()->setVisible(true); m_actions.find(HeaderBarAction::Delete).value()->setVisible(true); } else { m_actions.find(HeaderBarAction::SortType).value()->setVisible(true); m_actions.find(HeaderBarAction::ViewType).value()->setVisible(false); m_actions.find(HeaderBarAction::Copy).value()->setVisible(false); m_actions.find(HeaderBarAction::Cut).value()->setVisible(false); m_actions.find(HeaderBarAction::SeletcAll).value()->setVisible(false); m_actions.find(HeaderBarAction::Delete).value()->setVisible(false); } //fix bug#100105 After the selected status changes, the view type is grayed out. updateViewTypeEnable(); updateSortTypeEnable(); } void HeaderBar::addSpacing(int pixel) { for (int i = 0; i < pixel; i++) { addSeparator(); } } void HeaderBar::mouseMoveEvent(QMouseEvent *e) { QToolBar::mouseMoveEvent(e); QCursor c; c.setShape(Qt::ArrowCursor); this->topLevelWidget()->setCursor(c); } //fix Right click in the blank space on the right side of the tab to quickly maximize and restore the window. link bug102455 void HeaderBar::mouseDoubleClickEvent(QMouseEvent *e) { QToolBar::mouseDoubleClickEvent(e); //fix bug#196512, RightButton double click in buttons can also maximizeOrRestore window issue if(e->button() == Qt::LeftButton/* || e->button() == Qt::RightButton*/){ m_window->maximizeOrRestore(); } } void HeaderBar::updatePreviewPageVisible() { auto currentUri = m_window->getCurrentUri(); if (currentUri == "computer:///") { m_preview_action->setVisible(false); } else { m_preview_action->setVisible(true); } auto manager = Peony::PreviewPageFactoryManager::getInstance(); auto pluginNames = manager->getPluginNames(); for (auto name : pluginNames) { if (!m_tablet_mode && m_preview_action->isChecked() && m_preview_action->isVisible()) { auto plugin = Peony::PreviewPageFactoryManager::getInstance()->getPlugin(name); m_window->m_tab->setPreviewPage(plugin->createPreviewPage()); } else { m_window->m_tab->setPreviewPage(nullptr); } } } void HeaderBar::finishEdit() { m_searchWidget->finishEdit(); } void HeaderBar::quitSerachMode() { if (m_searchWidget->isSearchMode()) m_searchWidget->clearSearchBox(); } void HeaderBar::updateIcons() { if(!m_window) return; if (!m_window->getCurrentPage()) return; if (!m_window->getCurrentPage()->getView()) return; qDebug()<<"updateIcons:" <getCurrentUri(); qDebug()<<"updateIcons:" <getCurrentSortColumn(); qDebug()<<"updateIcons:" <getCurrentSortOrder(); m_view_type_menu->setCurrentDirectory(m_window->getCurrentUri()); m_view_type_menu->setCurrentView(m_window->getCurrentPage()->getView()->viewId(), true); int count = 0; if(m_window->getCurrentPage() && m_window->getCurrentPage()->getView()){ auto iface = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(m_window->getCurrentPage()->getView()); if(iface) count = iface->getAllDisplayFileCount(); } if(!(m_window->getCurrentUri().startsWith("search:///") && count>30000)){/* 取消搜索时数量超过阈值不排序 */ m_sort_type_menu->switchSortTypeRequest(m_window->getCurrentSortColumn()); m_sort_type_menu->switchSortOrderRequest(m_window->getCurrentSortOrder()); } //use fixed icon mark-location-symbolic in close search button //m_searchWidget->updateCloseSearch(Peony::FileUtils::getFileIconName(m_window->getCurrentUri())); //go back & go forward if (m_window->getCurrentPage()) { m_go_back->setEnabled(m_window->getCurrentPage()->canGoBack()); m_go_forward->setEnabled(m_window->getCurrentPage()->canGoForward()); if (! m_is_intel) { m_go_up->setEnabled(m_window->getCurrentPage()->canCdUp()); m_go_up->setProperty("useIconHighlightEffect", 0x2); m_go_up->setProperty("isWindowButton", 1); } } //fix create folder fail issue in special path // auto curUri = m_window->getCurrentUri(); // auto info = Peony::FileInfo::fromUri(curUri, false); // Peony::FileInfoJob job(info); // job.querySync(); // if (info->canWrite()) // m_create_folder->setEnabled(true); // else // m_create_folder->setEnabled(false); m_go_back->setProperty("useIconHighlightEffect", 0x2); m_go_back->setProperty("isWindowButton", 1); m_go_forward->setProperty("useIconHighlightEffect", 0x2); m_go_forward->setProperty("isWindowButton", 1); //maximize & restore //updateMaximizeState(); QString viewId = m_window->getCurrentPage()->getView()->viewId(); for (auto action : m_view_actions->actions()) { if (action->data().toString() == viewId) { action->setChecked(true); } } } void HeaderBar::updateViewTypeEnable() { auto url = m_window->getCurrentUri(); if (url == "computer:///") { m_actions.find(HeaderBarAction::IconView).value()->setVisible(false); m_actions.find(HeaderBarAction::ListView).value()->setVisible(false); } else { m_actions.find(HeaderBarAction::IconView).value()->setVisible(true); m_actions.find(HeaderBarAction::ListView).value()->setVisible(true); } m_view_type_menu->setEnabled(false); m_view_type_menu->menuAction()->setVisible(false); // auto url = m_window->getCurrentUri(); // //qDebug() << "updateViewTypeEnable url:" << url; // if(url == "computer:///"){ // m_view_type_menu->setEnabled(false); // m_view_type_menu->menuAction()->setVisible(false); // }else{ // m_view_type_menu->setEnabled(true); // m_view_type_menu->menuAction()->setVisible(true); // //bug#118439 修改切换成列表视图后,图标仍然是图标视图 // m_actions.find(HeaderBarAction::ViewType).value()->setIcon(m_view_type_menu->getCurrentIconFromViewId()); // } } void HeaderBar::updateSortTypeEnable() { auto url = m_window->getCurrentUri(); qDebug() << "url:" << url; if(url == "computer:///"){ m_sort_type_menu->setEnabled(false); m_sort_type_menu->menuAction()->setVisible(false); }else{ m_sort_type_menu->setEnabled(true); m_sort_type_menu->menuAction()->setVisible(true); } } void HeaderBar::updateMaximizeState() { //maximize & restore bool maximized = m_window->isMaximized(); if (maximized) { m_maximize_restore_button->setIcon(QIcon::fromTheme("window-restore-symbolic")); m_maximize_restore_button->setToolTip(tr("Restore")); } else { m_maximize_restore_button->setIcon(QIcon::fromTheme("window-maximize-symbolic")); m_maximize_restore_button->setToolTip(tr("Maximize")); } } void HeaderBar::cancleSelect() { switchSelectStatus(false); } void HeaderBar::addTabletMenu() { //task#106007 【文件管理器】文件管理器应用做平板UI适配,增加多选模式 QAction *tabletAction = addAction(tr("Select All Item")); m_actions.insert(HeaderBarAction::TabletSelectAll, tabletAction); auto select = qobject_cast(widgetForAction(tabletAction)); select->setProperty("textColor", 0x01); tabletAction->setVisible(false); connect(tabletAction, &QAction::triggered, [=]() { updateSelectStatus(false); }); tabletAction = addAction(tr("Select")); m_actions.insert(HeaderBarAction::TabletSelectDone, tabletAction); auto selectDone = qobject_cast(widgetForAction(tabletAction)); selectDone->setProperty("textColor", 0x01); connect(tabletAction, &QAction::triggered, this, [=]() { auto view = m_window->getCurrentPage()->getView(); auto iface2 = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(view); if (iface2) { if (iface2->isEnableMultiSelect()) { quitMultiSelect(); } else { iface2->doMultiSelect(true); updateSelectStatus(true); } } m_window->getCurrentPage()->getView()->repaintView(); }); connect(Peony::DirectoryViewHelper::globalInstance(), &Peony::DirectoryViewHelper::updateSelectStatus, this, [=](bool status){ if (m_tablet_mode) { updateSelectStatus(true); } }); addSpacing(2); tabletAction = addAction(tr("MoveTo")); m_actions.insert(HeaderBarAction::TabletMoveTo, tabletAction); tabletAction->setVisible(false); connect(tabletAction, &QAction::triggered, [=]() { if (CopyOrMoveTo(true)) { quitMultiSelect(); } }); tabletAction = addAction(tr("CopyTo")); m_actions.insert(HeaderBarAction::TabletCopyTo, tabletAction); tabletAction->setVisible(false); connect(tabletAction, &QAction::triggered, [=]() { if (CopyOrMoveTo(false)) { quitMultiSelect(); } }); tabletAction = addAction(tr("Delete")); m_actions.insert(HeaderBarAction::TabletDelete, tabletAction); tabletAction->setVisible(false); auto trash = qobject_cast(widgetForAction(tabletAction)); trash->setProperty("textColor", 0x02); connect(tabletAction, &QAction::triggered, [=]() { if (m_window->getCurrentUri() == "trash:///") { Peony::FileOperationUtils::executeRemoveActionWithDialog(m_window->getCurrentSelections()); } else { Peony::FileOperationUtils::trash(m_window->getCurrentSelections(), true); } updateSelectStatus(true); }); } void HeaderBar::updateTabletModeValue(bool isTabletMode) { setStyle(HeaderBarStyle::getStyle()); m_searchWidget->closeSearch(); m_searchWidget->updateSearchRequest(false); m_searchWidget->updateTabletModeValue(isTabletMode); m_tablet_mode = isTabletMode; bool noComputer = false; auto url = m_window->getCurrentUri(); if(url != "computer:///"){ noComputer = true; } m_view_type_menu->menuAction()->setVisible(false); m_actions.find(HeaderBarAction::SortType).value()->setVisible(noComputer); m_actions.find(HeaderBarAction::ViewType).value()->setVisible(noComputer); if (isTabletMode) { m_actions.find(HeaderBarAction::TabletSelectDone).value()->setVisible(noComputer); m_actions.find(HeaderBarAction::Copy).value()->setVisible(false); m_actions.find(HeaderBarAction::Cut).value()->setVisible(false); m_actions.find(HeaderBarAction::SeletcAll).value()->setVisible(false); m_actions.find(HeaderBarAction::Delete).value()->setVisible(false); m_actions.find(HeaderBarAction::Option).value()->setVisible(true); if (! m_is_intel) { m_actions.find(HeaderBarAction::GoForward).value()->setVisible(false); } updateSelectStatus(true); } else { m_actions.find(HeaderBarAction::TabletSelectDone).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletSelectAll).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletMoveTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletCopyTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletDelete).value()->setVisible(false); m_actions.find(HeaderBarAction::Option).value()->setVisible(false); if (! m_is_intel) { m_actions.find(HeaderBarAction::GoForward).value()->setVisible(true); } } m_preview_action->setVisible(!isTabletMode); } bool HeaderBar::CopyOrMoveTo(bool isCut) { auto currentUri = m_window->getCurrentSelections(); if (currentUri.startsWith("trash://") || currentUri.startsWith("recent://") || currentUri.startsWith("computer://") || currentUri.startsWith("favorite://") || currentUri.startsWith("search://")) { return false; } QString targetPath = QFileDialog::getExistingDirectory(this, tr("Select path"), "computer://", QFileDialog::ShowDirsOnly); if (targetPath.isEmpty()) { return false; } Peony::ClipboardUtils::setClipboardFiles(currentUri, isCut); if (! targetPath.contains("file://") && targetPath != "") { targetPath = "file://" + targetPath; } if (Peony::ClipboardUtils::isClipboardHasFiles()) { Peony::ClipboardUtils::pasteClipboardFiles(targetPath); } return true; } void HeaderBar::quitMultiSelect() { if (m_tablet_mode) { m_isSelectAll = false; auto view = m_window->getCurrentPage()->getView(); view->setSelections(QStringList()); QAction *action = m_actions.find(HeaderBarAction::TabletSelectDone).value(); auto select = qobject_cast(widgetForAction(action)); select->setText(tr("Select")); bool status = view->getAllFileUris().count() > 0 ? true : false; action->setVisible(status); auto iface2 = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(view); if (iface2 && iface2->isEnableMultiSelect()) { iface2->doMultiSelect(false); } m_actions.find(HeaderBarAction::TabletSelectAll).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletMoveTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletCopyTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletDelete).value()->setVisible(false); } } void HeaderBar::setSearchMode(bool isSearching) { m_searchWidget->setSearchMode(isSearching); } void HeaderBar::updateSelectStatus(bool autoUpdate) { QAction *action = m_actions.find(HeaderBarAction::TabletSelectDone).value(); auto selectDone = qobject_cast(widgetForAction(action)); if(!m_window->getCurrentPage()) return; auto view = m_window->getCurrentPage()->getView(); auto iface2 = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(view); if (!iface2) return ; if (!iface2->isEnableMultiSelect()) { m_actions.find(HeaderBarAction::TabletSelectAll).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletMoveTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletCopyTo).value()->setVisible(false); m_actions.find(HeaderBarAction::TabletDelete).value()->setVisible(false); bool status = view->getAllFileUris().count() > 0? true : false; m_actions.find(HeaderBarAction::TabletSelectDone).value()->setVisible(status); selectDone->setText(tr("Select")); return; } selectDone->setText(tr("Select Done")); action = m_actions.find(HeaderBarAction::TabletSelectAll).value(); action->setVisible(true); auto selectAll = qobject_cast(widgetForAction(action)); if (autoUpdate) { int num = view->getSelections().count(); int totalNum = view->getAllFileUris().count(); if (num == totalNum) { m_isSelectAll = true; selectAll->setText(tr("Deselect All")); } else { m_isSelectAll = false; selectAll->setText(tr("Select All Item")); } bool status = num > 0? true : false; m_actions.find(HeaderBarAction::TabletMoveTo).value()->setVisible(status); m_actions.find(HeaderBarAction::TabletCopyTo).value()->setVisible(status); m_actions.find(HeaderBarAction::TabletDelete).value()->setVisible(status); } else { if (m_isSelectAll) { view->invertSelections(); m_isSelectAll = false; selectAll->setText(tr("Select All Item")); } else { view->setSelections(QStringList()); view->invertSelections(); m_isSelectAll = true; selectAll->setText(tr("Deselect All")); } } } void HeaderBar::updatePreviewStatus(bool check) { m_preview_action->setChecked(check); m_preview_action->triggered(check); } //HeaderBarToolButton HeaderBarToolButton::HeaderBarToolButton(QWidget *parent) : QToolButton(parent) { setAutoRaise(false); setIconSize(QSize(16, 16)); } //HeadBarPushButton HeadBarPushButton::HeadBarPushButton(QWidget *parent) : QPushButton(parent) { setIconSize(QSize(16, 16)); } //HeaderBarStyle HeaderBarStyle *HeaderBarStyle::getStyle() { if (!global_instance) { global_instance = new HeaderBarStyle; } return global_instance; } int HeaderBarStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { if (qobject_cast(widget)) return 0; switch (metric) { case PM_ToolBarIconSize: return 16; case PM_ToolBarSeparatorExtent: return 1; case PM_ToolBarItemSpacing: { return 1; } default: return QProxyStyle::pixelMetric(metric, option, widget); } } void HeaderBarStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { //This is a "lie". We want to use instant popup menu for tool button, and we aslo //want use popup menu style with this tool button, so we change the related flags //to draw in our expected. if (control == CC_ToolButton) { QStyleOptionToolButton button = *qstyleoption_cast(option); if (button.features.testFlag(QStyleOptionToolButton::HasMenu)) { button.features = QStyleOptionToolButton::None; if (!widget->property("isOptionButton").toBool()) { button.features |= QStyleOptionToolButton::HasMenu; button.features |= QStyleOptionToolButton::MenuButtonPopup; button.subControls |= QStyle::SC_ToolButtonMenu; } button.palette.setColor(QPalette::Button,Qt::transparent); return qApp->style()->drawComplexControl(control, &button, painter, widget); } else { if (0x01 == widget->property("textColor").toInt()) { button.palette.setColor(QPalette::Text, QColor(55, 144, 250)); } else if (0x02 == widget->property("textColor").toInt()) { button.palette.setColor(QPalette::Text, QColor(243, 34, 45)); } return qApp->style()->drawComplexControl(control, &button, painter, widget); } } return qApp->style()->drawComplexControl(control, option, painter, widget); } void HeaderBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == PE_IndicatorToolBarSeparator) { return; } return qApp->style()->drawPrimitive(element, option, painter, widget); } TopMenuBar::TopMenuBar(HeaderBar *headerBar, MainWindow *parent) : QMenuBar(parent) { m_window = parent; m_header_bar = headerBar; setContextMenuPolicy(Qt::CustomContextMenu); setStyleSheet(".TopMenuBar" "{" "background-color: transparent;" "border: 0px solid transparent" "}"); setFixedHeight(40); m_top_menu_layout = new QHBoxLayout(this); m_top_menu_layout->setSpacing(0); m_top_menu_layout->setContentsMargins(0, 0, 0, 0); m_top_menu_internal_widget = new QWidget(this); m_top_menu_internal_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); addWindowButtons(); m_window->installEventFilter(this); } bool TopMenuBar::eventFilter(QObject *obj, QEvent *e) { Q_UNUSED(obj) if (m_window) { #ifdef KY_SDK_WAYLANDHELPER if (obj == m_max_or_restore) { if (e->type() == QEvent::ToolTip) { e->setAccepted(true); e->accept(); //auto helpevent = static_cast(e); QRect rect = m_max_or_restore->geometry(); auto pos = m_max_or_restore->mapTo(m_window, QPoint(rect.width()/2, 0)); rect.translate(pos.x() - 84, 0); m_window->m_window_helper->showTileFlyout(rect); return true; } } #endif //use updateMaximizeState function, comment those code if (e->type() == QEvent::Resize || QEvent::WindowStateChange == e->type()) { //fix bug#95419, drag change window to restore not change state issue m_header_bar->updateMaximizeState(); } //fix double click space window has no change issue, bug#38499 // if (e->type() == QEvent::MouseButtonDblClick) // { // m_header_bar->m_window->maximizeOrRestore(); // } return false; } else { if (e->type() == QEvent::MouseMove) { //auto w = qobject_cast(obj); QCursor c; c.setShape(Qt::ArrowCursor); //this->setCursor(c); //w->setCursor(c); this->topLevelWidget()->setCursor(c); } } return false; } void TopMenuBar::addWindowButtons() { m_window->installEventFilter(this); auto layout = new QHBoxLayout; layout->setContentsMargins(0, 0, 6, 0); layout->setSpacing(4); auto optionButton = new QToolButton(m_top_menu_internal_widget); optionButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); optionButton->setToolTip(tr("Option")); optionButton->setAutoRaise(true); optionButton->setPopupMode(QToolButton::InstantPopup); optionButton->setProperty("isOptionButton", true); optionButton->setProperty("isWindowButton", 1); optionButton->setFixedSize(30, 30); OperationMenu *operationMenu = new OperationMenu(m_window, optionButton); optionButton->setMenu(operationMenu); //minimize, maximize and close // 最小化,最大化,关闭 auto minimize = new QToolButton(m_top_menu_internal_widget); minimize->setIcon(QIcon::fromTheme("window-minimize-symbolic")); minimize->setToolTip(tr("Minimize")); minimize->setAutoRaise(true); minimize->setFixedSize(30, 30); connect(minimize, &QToolButton::clicked, this, [=]() { //KWindowSystem::minimizeWindow(m_window->winId()); m_window->showMinimized(); }); //window-maximize-symbolic //window-restore-symbolic auto maximizeAndRestore = new QToolButton(m_top_menu_internal_widget); m_header_bar->m_maximize_restore_button = maximizeAndRestore; //switch tips with button status, fix bug#77604 m_header_bar->updateMaximizeState(); maximizeAndRestore->setAutoRaise(true); maximizeAndRestore->setFixedSize(30, 30); connect(maximizeAndRestore, &QToolButton::clicked, this, [=]() { m_window->maximizeOrRestore(); }); m_max_or_restore = maximizeAndRestore; auto close = new QToolButton(m_top_menu_internal_widget); close->setIcon(QIcon::fromTheme("window-close-symbolic")); close->setToolTip(tr("Close")); close->setAutoRaise(true); close->setFixedSize(30, 30); connect(close, &QToolButton::clicked, this, [=]() { m_window->close(); }); auto palette = qApp->palette(); palette.setColor(QPalette::Highlight, QColor("#E54A50")); close->setPalette(palette); m_minimize = minimize; m_close = close; if (QDBusConnection::connectToBus(0,QString("com.kylin.statusmanager.interface")).isConnected()) { if (!g_statusManagerDBus) { g_statusManagerDBus = new QDBusInterface(DBUS_STATUS_MANAGER_IF, "/" ,DBUS_STATUS_MANAGER_IF,QDBusConnection::sessionBus(),this); } QDBusReply message_a = g_statusManagerDBus->call("get_current_tabletmode"); if (message_a.isValid()) { m_tablet_mode = message_a.value(); } updateTabletMode(m_tablet_mode); connect(g_statusManagerDBus, SIGNAL(mode_change_signal(bool)), this, SLOT(updateTabletMode(bool))); } layout->addWidget(optionButton); layout->addWidget(minimize); layout->addWidget(maximizeAndRestore); layout->addWidget(close); m_top_menu_internal_widget->setLayout(layout); QSpacerItem *spacer = new QSpacerItem(4000, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); m_top_menu_layout->addSpacerItem(spacer); m_top_menu_layout->addWidget(m_top_menu_internal_widget); optionButton->setMouseTracking(true); optionButton->installEventFilter(this); minimize->setMouseTracking(true); minimize->installEventFilter(this); maximizeAndRestore->setMouseTracking(true); maximizeAndRestore->installEventFilter(this); close->setMouseTracking(true); close->installEventFilter(this); optionButton->setFocusPolicy(Qt::FocusPolicy(optionButton->focusPolicy() /*& ~Qt::TabFocus*/)); minimize->setFocusPolicy(Qt::FocusPolicy(minimize->focusPolicy() /*& ~Qt::TabFocus*/)); maximizeAndRestore->setFocusPolicy(Qt::FocusPolicy(maximizeAndRestore->focusPolicy() /*& ~Qt::TabFocus*/)); close->setFocusPolicy(Qt::FocusPolicy(close->focusPolicy() /*& ~Qt::TabFocus*/)); for (int i = 0; i < layout->count(); i++) { auto w = layout->itemAt(i)->widget(); w->setProperty("isWindowButton", 1); w->setProperty("useIconHighlightEffect", 0x2); } close->setProperty("isWindowButton", 2); close->setProperty("useIconHighlightEffect", 0x8); optionButton->setVisible((Peony::GlobalSettings::getInstance()->getProjectName() != V10_SP1_EDU)); } void TopMenuBar::updateTabletMode(bool isTabletMode) { m_tablet_mode = isTabletMode; if(m_tablet_mode) { m_minimize->hide(); m_max_or_restore->hide(); m_close->hide(); } else { m_minimize->setVisible(true); m_max_or_restore->setVisible(true); m_close->setVisible(true); } QTimer::singleShot(100, this, [=](){ auto palette = qApp->palette(); palette.setColor(QPalette::Highlight, QColor("#E54A50")); m_close->setPalette(palette); }); qApp->setProperty("tabletMode", isTabletMode); } HeaderBarContainer::HeaderBarContainer(QWidget *parent) : QToolBar(parent) { setStyle(HeaderBarStyle::getStyle()); setContextMenuPolicy(Qt::CustomContextMenu); // setStyleSheet(".HeaderBarContainer" // "{" // "background-color: transparent;" // "border: 0px solid transparent" // "}"); setMovable(false); m_layout = new QHBoxLayout; m_layout->setSpacing(0); m_layout->setContentsMargins(0, 0, 0, 0); m_internal_widget = new QWidget(this); m_internal_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } bool HeaderBarContainer::eventFilter(QObject *obj, QEvent *e) { Q_UNUSED(obj) auto window = qobject_cast(obj); if (window) { //use updateMaximizeState function, comment those code if (e->type() == QEvent::Resize || QEvent::WindowStateChange == e->type()) { //fix bug#95419, drag change window to restore not change state issue m_header_bar->updateMaximizeState(); } //fix double click space window has no change issue, bug#38499 //fix Right click in the blank space on the right side of the tab to quickly maximize and restore the window. link bug102455 // if (e->type() == QEvent::MouseButtonDblClick) // { // m_header_bar->m_window->maximizeOrRestore(); // } return false; } else { if (e->type() == QEvent::MouseMove) { //auto w = qobject_cast(obj); QCursor c; c.setShape(Qt::ArrowCursor); //this->setCursor(c); //w->setCursor(c); this->topLevelWidget()->setCursor(c); } } return false; } void HeaderBarContainer::addHeaderBar(HeaderBar *headerBar) { if (m_header_bar) return; m_header_bar = headerBar; headerBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_layout->addWidget(headerBar); m_internal_widget->setLayout(m_layout); addWidget(m_internal_widget); // m_header_bar->m_window->installEventFilter(this); } void HeaderBarContainer::addMenu(MainWindow *m_window) { m_topMenu = new QWidget(this); QHBoxLayout *layout = new QHBoxLayout(m_topMenu); QToolButton *minimize = new QToolButton(this); minimize->setIcon(QIcon::fromTheme("window-minimize-symbolic")); minimize->setToolTip(tr("Minimize")); minimize->setAutoRaise(true); minimize->setFixedSize(QSize(48, 48)); minimize->setIconSize(QSize(16, 16)); minimize->setProperty("isWindowButton", 1); connect(minimize, &QToolButton::clicked, this, [=]() { //KWindowSystem::minimizeWindow(m_window->winId()); m_window->showMinimized(); }); QToolButton *close = new QToolButton(this); close->setIcon(QIcon::fromTheme("window-close-symbolic")); close->setToolTip(tr("Close")); close->setAutoRaise(true); close->setFixedSize(QSize(48, 48)); close->setIconSize(QSize(16, 16)); //fix bug#143507, button color is not red issue close->setProperty("isWindowButton", 2); close->setProperty("useIconHighlightEffect", 0x8); connect(close, &QToolButton::clicked, this, [=]() { m_window->close(); }); layout->addWidget(minimize); layout->addWidget(close); m_topMenu->setLayout(layout); m_topMenu->hide(); m_layout->addWidget(m_topMenu); } void HeaderBarContainer::paintEvent(QPaintEvent *e) { QPainter p(this); QStyleOptionToolBar opt; initStyleOption(&opt); bool isEnable = opt.state & QStyle::State_Enabled; bool isActive = opt.state & QStyle::State_Active; auto color = qApp->palette().color(isEnable? isActive? QPalette::Active: QPalette::Inactive: QPalette::Disabled, QPalette::Base); p.fillRect(this->rect(), color); auto brush = qvariant_cast(qApp->property("button-active")); p.setPen(brush.color()); p.drawLine(this->rect().bottomLeft(), this->rect().bottomRight()); } peony/src/control/navigation-tab-bar.cpp0000664000175000017500000005075515154271106017270 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "navigation-tab-bar.h" #include "x11-window-manager.h" #include "file-utils.h" #include "search-vfs-uri-parser.h" #include "global-settings.h" #include "file-label-model.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include "FMWindowIface.h" #include "main-window.h" #include "file-info.h" #include "file-info-job.h" #include "file-utils.h" static TabBarStyle *global_instance = nullptr; NavigationTabBar::NavigationTabBar(QWidget *parent) : QTabBar(parent) { setProperty("isWindowButton", 0x1); setProperty("useIconHighlightEffect", 0x2); m_animations = new QParallelAnimationGroup(this); m_opacity_animation = new QVariantAnimation; m_slide_animation = new QVariantAnimation; m_zoom_animation = new QVariantAnimation; m_opacity_animation->setDuration(200); m_opacity_animation->setStartValue(qreal(0.0)); m_opacity_animation->setEndValue(qreal(1.0)); m_opacity_animation->setEasingCurve(QEasingCurve::InOutQuart); m_slide_animation->setDuration(200); m_slide_animation->setStartValue(qreal(0.0)); m_slide_animation->setEndValue(qreal(1.0)); m_slide_animation->setEasingCurve(QEasingCurve::InOutQuart); m_zoom_animation->setDuration(200); m_zoom_animation->setStartValue(qreal(0.0)); m_zoom_animation->setEndValue(qreal(1.0)); m_zoom_animation->setEasingCurve(QEasingCurve::InOutQuart); m_animations->addAnimation(m_opacity_animation); m_animations->addAnimation(m_slide_animation); m_animations->addAnimation(m_zoom_animation); setAcceptDrops(true); m_drag_timer.setInterval(750); m_drag_timer.setSingleShot(true); setStyle(TabBarStyle::getStyle()); setContentsMargins(0, 0, 0, 0); setFixedHeight(40); setProperty("useStyleWindowManager", false); setMovable(true); setExpanding(false); setTabsClosable(true); setUsesScrollButtons(true); X11WindowManager::getInstance()->registerWidget(this); connect(this, &QTabBar::currentChanged, this, [=](int index) { //qDebug()<<"current changed"<update(); }); setDrawBase(false); } void NavigationTabBar::addPages(const QStringList &uri) { } QSize NavigationTabBar::tabSizeHint(int index) const { QSize size = QTabBar::tabSizeHint(index); int extraWidth = 20; size.setWidth(size.width() - extraWidth); return size; } QStringList NavigationTabBar::getCurrentUris() { return m_has_uris; } bool NavigationTabBar::event(QEvent *ev) { return QTabBar::event(ev); } void NavigationTabBar::updateLocation(int index, const QString &uri) { auto info = Peony::FileInfo::fromUri(uri); auto infoJob = new Peony::FileInfoJob(info); //infoJob->setAutoDelete(); setTabData(index, uri); if (index < m_has_uris.count() && count() > 0) m_has_uris.replace(index, uri); connect(infoJob, &Peony::FileInfoJob::queryAsyncFinished, this, [=](){ infoJob->deleteLater(); if (uri != tabData(index).toString()) return; auto iconName = Peony::FileUtils::getFileIconName(uri); auto displayName = Peony::FileUtils::getFileDisplayName(uri); //qDebug() << "updateLocation text:" < ELIDE_TEXT_LENGTH) // { // int charWidth = fontMetrics().averageCharWidth(); // displayName = fontMetrics().elidedText(displayName, Qt::ElideRight, ELIDE_TEXT_LENGTH * charWidth); // } setElideMode(Qt::ElideRight); setTabText(index, Peony::FileUtils::handleSpecialSymbols(displayName)); if (uri.startsWith("label://")) { QString labelIdStr = uri.section("label:///", -1,-1); QString name = FileLabelModel::getGlobalModel()->getLabelNameFromLabelId(labelIdStr.toInt()); QColor color = FileLabelModel::getGlobalModel()->getLableColorFromLabelName(name); QPixmap pix(iconSize()); pix.fill(Qt::transparent); QPainter p(&pix); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); QRect tmpRect = QRect(iconSize().width()/2 - 6, iconSize().height()/2 - 6, 12, 12); p.setPen(QPen(Qt::gray, 0.5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); p.setBrush(color); p.drawEllipse(tmpRect); QIcon icon(pix); setTabIcon(index, icon); } else { setTabIcon(index, QIcon::fromTheme(iconName)); } setTabData(index, uri); QFont font = this->font(); auto realDisplayName = Peony::FileUtils::wrapTextForTooltip(displayName,QCursor::pos(),font); setTabToolTip(index, realDisplayName); Q_EMIT this->locationUpdated(uri); }); infoJob->queryAsync(); } void NavigationTabBar::addPage(const QString &uri, bool jumpToNewTab) { if (m_animations->state() != QAbstractAnimation::Stopped) { m_animations->stop(); } m_animations->start(); //setFocus(); if (uri.isEmpty()) return; //m_info = Peony::FileInfo::fromUri(uri); if (!uri.isNull()) { //FIXME: replace BLOCKING api in ui thread. auto displayName = Peony::FileUtils::getFileDisplayName(uri); auto iconName = Peony::FileUtils::getFileIconName(uri); if (displayName.contains("&")) { displayName = Peony::FileUtils::handleSpecialSymbols(displayName); } addTab(QIcon::fromTheme(iconName), displayName); setTabData(count() - 1, uri); m_has_uris.append(uri); if (jumpToNewTab) setCurrentIndex(count() - 1); Q_EMIT this->pageAdded(uri); } else { if (currentIndex() == -1) { addPage("file:///", true); } else { QString uri = tabData(currentIndex()).toString(); addPage(uri, jumpToNewTab); } } auto closeButton = tabButton(currentIndex(), QTabBar::RightSide); if (closeButton) { closeButton->setStyle(TabBarStyle::getStyle()); } } void NavigationTabBar::tabRemoved(int index) { //qDebug()<<"tab removed"<source() != this) { QPoint pos = e->pos(); int index = tabAt(pos); if (index >= 0) { setCurrentIndex(index); } } e->accept(); return; } void NavigationTabBar::dragMoveEvent(QDragMoveEvent *e) { if (e->source() == this) { m_should_trigger_drop = false; m_drag->cancel(); grabMouse(); } e->accept(); return; } void NavigationTabBar::dragLeaveEvent(QDragLeaveEvent *e) { QTabBar::dragLeaveEvent(e); } void NavigationTabBar::dropEvent(QDropEvent *e) { m_start_drag = false; if (e->source() != this) { if (e->mimeData()->hasUrls()) { for (auto url : e->mimeData()->urls()) { if (Peony::FileUtils::isFileDirectory(url.url())) { addPageRequest(url.url(), true); } } } else if (e->mimeData()->hasFormat("peony/tab-index")) { auto uri = e->mimeData()->data("peony/tab-index"); if (Peony::FileUtils::isFileDirectory(uri)) { addPageRequest(uri, true); } } //finish the drag, remove old tab page from old tab. if (auto oldTab = qobject_cast(e->source())) { oldTab->removeTab(oldTab->currentIndex()); } } releaseMouse(); } void NavigationTabBar::mousePressEvent(QMouseEvent *e) { QTabBar::mousePressEvent(e); m_press_pos = e->pos(); if (tabAt(e->pos()) >= 0) m_start_drag = true; else m_start_drag = false; } void NavigationTabBar::mouseMoveEvent(QMouseEvent *e) { QTabBar::mouseMoveEvent(e); if (e->source() != Qt::MouseEventNotSynthesized) { return; } auto offset = e->pos() - m_press_pos; auto offsetX = qAbs(offset.x()); auto offsetY = qAbs(offset.y()); if (e->pos().y() >= 0 && e->pos().y() <= this->height()) { return; } if (!m_start_drag) return; //start a drag //note that we should remove this tab from the window //at other tab's drop event. auto pixmap = this->topLevelWidget()->grab().scaledToWidth(this->topLevelWidget()->width()/2, Qt::SmoothTransformation); auto thisWindow = this->topLevelWidget(); //KWindowSystem::lowerWindow(this->topLevelWidget()->winId()); for (auto win : qApp->allWidgets()) { if (auto mainWin = qobject_cast(win)) { if (thisWindow != mainWin && win->isVisible()) { QWindow *window = win->windowHandle(); if (window) { window->raise(); } } //KWindowSystem::raiseWindow(win->winId()); } } QDrag *d = new QDrag(this); m_drag = d; QMimeData *data = new QMimeData(); auto uri = tabData(currentIndex()).toString(); //data->setText(uri); data->setData("peony/tab-index", uri.toUtf8()); d->setMimeData(data); d->setPixmap(pixmap); d->setHotSpot(pixmap.rect().center()); m_should_trigger_drop = true; d->exec(); qApp->restoreOverrideCursor(); m_drag = nullptr; if (m_should_trigger_drop) { if (auto tab = qobject_cast(d->target())) { //do nothing for target tab bar helped us handling yet. } else { #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData startData; startData.setHostname(); startData.addPid(QCoreApplication::applicationPid()); QRect rect(-1, -1, -1, -1); startData.setIconGeometry(rect); //startData.setLaunchedBy(QCoreApplication::applicationPid()); KStartupInfo::sendStartup(startInfoId, startData); #endif auto window = dynamic_cast(this->topLevelWidget()); auto newWindow = dynamic_cast(window->create(this->tabData(currentIndex()).toString())); newWindow->show(); newWindow->activateWindow(); //KWindowSystem::activateWindow(newWindow->winId()); //KWindowSystem::raiseWindow(newWindow->winId()); // Ensures the window is positioned within the visible area int moveX = qMax(QCursor::pos().x() - newWindow->rect().center().x(), -10); int moveY = qMax(QCursor::pos().y() - newWindow->rect().center().y(), -10); newWindow->move(moveX, moveY); removeTab(currentIndex()); } delete d; releaseMouse(); m_start_drag = false; } else { d->deleteLater(); } } void NavigationTabBar::mouseReleaseEvent(QMouseEvent *e) { QTabBar::mouseReleaseEvent(e); m_start_drag = false; releaseMouse(); } void NavigationTabBar::resizeEvent(QResizeEvent *e) { QTabBar::resizeEvent(e); } TabBarStyle *TabBarStyle::getStyle() { if (!global_instance) { global_instance = new TabBarStyle; } return global_instance; } TabBarStyle::TabBarStyle() { m_need_adjust = Peony::GlobalSettings::getInstance()->getProjectName() == V10_SP1_EDU; } void TabBarStyle::polish(QWidget *widget) { QProxyStyle::polish(widget); if (widget && qobject_cast(widget)) { widget->setProperty("isWindowButton", 0x1); //bug#167146 useIconHighlightEffect=2 导致打开预览框的图标不反白 //widget->setProperty("useIconHighlightEffect", 0x2); } } int TabBarStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { if (!m_need_adjust) { return QProxyStyle::pixelMetric(metric, option, widget); } else { switch (metric) { case PM_TabBarScrollButtonWidth: return 48; default: return QProxyStyle::pixelMetric(metric, option, widget); } } } void TabBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (!m_need_adjust) { if (element == PE_IndicatorTabClose) { if (option->styleObject && option->styleObject->inherits("CloseButton")) { auto tabbar = qobject_cast(option->styleObject->parent()); if (tabbar->m_animations->state() == QAbstractAnimation::Running && tabbar->currentIndex() > 0) { if (tabbar->tabButton(tabbar->currentIndex(), QTabBar::RightSide) == option->styleObject) { painter->save(); painter->setOpacity(tabbar->m_opacity_animation->currentValue().toReal()); painter->translate(option->rect.center()); painter->scale(tabbar->m_zoom_animation->currentValue().toReal(), tabbar->m_zoom_animation->currentValue().toReal()); painter->translate(-option->rect.center()); qApp->style()->drawPrimitive(element, option, painter, widget); painter->restore(); return; } } qApp->style()->drawPrimitive(element, option, painter, widget); return; } } return QProxyStyle::drawPrimitive(element, option, painter, widget); } else { switch (element) { case PE_PanelButtonTool:{ QPainterPath path; painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); path.addRoundedRect(widget->rect(), 16, 16); painter->setClipPath(path); return qApp->style()->drawPrimitive(element, option, painter, widget); } case PE_IndicatorArrowLeft: case PE_IndicatorArrowRight: { QStyleOption tmp = *option; tmp.palette.setColor(QPalette::HighlightedText, qApp->palette().buttonText().color()); return qApp->style()->drawPrimitive(element, &tmp, painter, widget); } case PE_IndicatorTabClose: { if (option->styleObject && option->styleObject->inherits("CloseButton")) { auto tabbar = qobject_cast(option->styleObject->parent()); if (tabbar->m_animations->state() == QAbstractAnimation::Running && tabbar->currentIndex() > 0) { if (tabbar->tabButton(tabbar->currentIndex(), QTabBar::RightSide) == option->styleObject) { painter->save(); painter->setOpacity(tabbar->m_opacity_animation->currentValue().toReal()); painter->scale(tabbar->m_zoom_animation->currentValue().toReal(), tabbar->m_zoom_animation->currentValue().toReal()); qApp->style()->drawPrimitive(element, option, painter, widget); painter->restore(); return; } } qApp->style()->drawPrimitive(element, option, painter, widget); return; } } default: return qApp->style()->drawPrimitive(element, option, painter, widget); } } } void TabBarStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { if (widget && (widget->objectName() == "addPageButton" || widget->objectName() == "toolButton")) { painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); QPainterPath path; if (!m_need_adjust) { path.addEllipse(QRect(option->rect.adjusted(4, 4, -4, -4))); painter->setClipPath(path); } else { path.addRoundedRect(widget->rect(), 16, 16); painter->setClipPath(path); } qApp->style()->drawComplexControl(control, option, painter, widget); painter->restore(); } else { qApp->style()->drawComplexControl(control, option, painter, widget); } } void TabBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (widget && widget->objectName() == "previewButtons") { return; } else if (element == CE_TabBarTab && widget && qobject_cast(widget)) { auto tabbar = qobject_cast(widget); if (tabbar->m_animations->state() == QAbstractAnimation::Running) { const QStyleOptionTab *tab = qstyleoption_cast(option); if (tab->position == QStyleOptionTab::End && tabbar->currentIndex() > 0) { QStyleOptionTab tmpTab = *tab; tmpTab.text = ""; painter->save(); painter->setClipRect(tab->rect.adjusted(-2, -2, 2, 2)); painter->setOpacity(tabbar->m_opacity_animation->currentValue().toReal()); painter->translate(-int(tab->rect.width() * (1 - tabbar->m_slide_animation->currentValue().toReal())), 0); qApp->style()->drawControl(element, &tmpTab, painter, widget); painter->restore(); auto textRect = qApp->style()->subElementRect(QStyle::SE_TabBarTabText, option, widget); painter->save(); painter->translate(textRect.topLeft()); textRect.moveTo(0, 0); painter->setOpacity(tabbar->m_opacity_animation->currentValue().toReal()); QTransform transform; transform.translate(0, textRect.center().y()); transform.scale(tabbar->m_zoom_animation->currentValue().toReal(), tabbar->m_zoom_animation->currentValue().toReal()); transform.translate(0, -textRect.center().y()); painter->setTransform(transform, true); qApp->style()->drawItemText(painter, textRect, Qt::AlignLeft|Qt::AlignVCenter, qApp->palette(), true, tab->text); painter->restore(); return; } } } qApp->style()->drawControl(element, option, painter, widget); } peony/src/control/float-pane-widget.h0000664000175000017500000000277215154271070016573 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef FLOATPANEWIDGET_H #define FLOATPANEWIDGET_H #include class QVariantAnimation; class FloatPaneWidget : public QWidget { Q_OBJECT public: explicit FloatPaneWidget(QWidget *mainWidget, QWidget *floatWidget, QWidget *parent = nullptr); void setFloatWidgetWidthHint(int widthHint); QSize sizeHint() const override; public Q_SLOTS: void setFloatWidgetVisible(bool visible); protected: void resizeEvent(QResizeEvent *event) override; private: QWidget *m_mainWidget = nullptr; QWidget *m_floatWidget = nullptr; QVariantAnimation *m_floatWidgetWidthAnimation = nullptr; int m_floatWidgetWidthHint = 200; const int FLOAT_WIDGET_MIN_WIDTH = 596/*296*/; }; #endif // FLOATPANEWIDGET_H peony/src/control/navigation-side-bar.h0000664000175000017500000001142615154271106017103 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef NAVIGATIONSIDEBAR_H #define NAVIGATIONSIDEBAR_H #include "side-bar.h" #include "file-label-box.h" #include #include #include #include namespace Peony { class SideBarModel; class SideBarProxyFilterSortModel; class SideBarAbstractItem; } class QPushButton; class QVBoxLayout; class QHBoxLayout; class QLabel; class NavigationSideBar : public QTreeView { Q_OBJECT public: explicit NavigationSideBar(QWidget *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); void updateGeometries(); void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible); void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *e); void dropEvent(QDropEvent *e); QSize sizeHint() const; void JumpDirectory(const QString& uri);/* 跳转目录 */ void sendKdkDataAsync(); //异步上传数据埋点信息 void doExpand(const QModelIndex &index); void doCollapse(const QModelIndex &index); Q_SIGNALS: void updateWindowLocationRequest(const QString &uri, bool addHistory = true, bool force = false); void labelButtonClicked(bool checked); void createVirtualTabAndSearch(); protected: void keyPressEvent(QKeyEvent *event); void focusInEvent(QFocusEvent *event); void wheelEvent(QWheelEvent *event); void dragEnterEvent(QDragEnterEvent *event) override; int sizeHintForColumn(int column) const override; //QStyleOptionViewItem viewOptions() const override; void initViewItemOption(QStyleOptionViewItem *option) const override; bool viewportEvent(QEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private: Peony::SideBarProxyFilterSortModel *m_proxy_model = nullptr; Peony::SideBarModel *m_model = nullptr; Peony::SideBarAbstractItem* m_currSelectedItem = nullptr; bool m_notAllowHorizontalMove = false;/* 按下左右键不可使侧边栏内容左右平移显示 */ }; class NavigationSideBarContainer : public Peony::SideBar { Q_OBJECT public: explicit NavigationSideBarContainer(QWidget *parent = nullptr); void addSideBar(NavigationSideBar *sidebar); QSize sizeHint() const override; protected: void paintEvent(QPaintEvent *event); private: NavigationSideBar *m_sidebar = nullptr; QVBoxLayout *m_layout = nullptr; FileLabelBox *m_labelDialog = nullptr; }; class NavigationSideBarItemDelegate : public QStyledItemDelegate { friend class NavigationSideBar; explicit NavigationSideBarItemDelegate(QObject *parent = nullptr); QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class NavigationSideBarStyle : public QProxyStyle { public: explicit NavigationSideBarStyle(); void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; }; class TitleLabel : public QWidget { Q_OBJECT public: explicit TitleLabel(QWidget *parent); private: QLabel *m_pix_label; QLabel *m_text_label; QGSettings *m_gSettings; }; #include class LabelButton : public QPushButton { Q_OBJECT public: explicit LabelButton(QWidget *parent = nullptr); void setLastIcon(const QString &symbolic); void setFirstIcon(const QString &symbolic); void setText(QString text); void setShow(bool isShow); bool getShow(); Q_SIGNALS: void clicked (bool show); protected: // void mousePressEvent(QMouseEvent *event) override; // void mouseReleaseEvent(QMouseEvent *event) override; private: QLabel *m_firstSymbolic = nullptr; QLabel *m_lastSymbolic = nullptr; QLabel *m_text = nullptr; QHBoxLayout *m_mainLayout = nullptr; bool m_isPress = false; bool m_show = false; }; #endif // NAVIGATIONSIDEBAR_H peony/src/control/file-label-box.cpp0000664000175000017500000002050315154271106016371 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "file-label-box.h" #include "file-label-model.h" #include "label-box-delegate.h" #include "fm-window.h" #include #include #include #include #include #include #include #include #include #include static LabelBoxStyle *global_instance = nullptr; static QMap color_icons; FileLabelBox::FileLabelBox(QWidget *parent) : QListView(parent) { setItemDelegate(new LabelBoxDelegate(this)); setStyle(LabelBoxStyle::getStyle()); viewport()->setStyle(LabelBoxStyle::getStyle()); viewport()->setAutoFillBackground(true); viewport()->setBackgroundRole(QPalette::AlternateBase); setResizeMode(QListView::Adjust); FileLableProxyFilterSortModel *proxyModel = new FileLableProxyFilterSortModel(this); setModel(proxyModel); proxyModel->setSourceModel(FileLabelModel::getGlobalModel()); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QWidget::customContextMenuRequested, this, [=](const QPoint &pos) { auto index = indexAt(pos); //bool labelRemovable = false; QMenu menu(this); if (index.isValid()) { auto item = FileLabelModel::getGlobalModel()->itemFormIndex(index); int id = item->id(); // if (id > TOTAL_DEFAULT_COLOR) // labelRemovable = true; Peony::FMWindowIface *windowIface = dynamic_cast(this->topLevelWidget()); menu.addAction(QIcon::fromTheme("window-new-symbolic"), tr("Open In New Window"), [=](){ int id = index.data(Qt::UserRole).toInt(); if (id) { QString uri = "label:///" + QString::number(id); auto newWindow = windowIface->create(uri); dynamic_cast(newWindow)->show(); } }); menu.addAction(QIcon::fromTheme("tab-new-symbolic"), tr("Open In New Tab"), [=](){ int id = index.data(Qt::UserRole).toInt(); if (id) { QString uri = "label:///" + QString::number(id); windowIface->addNewTabs(QStringList()<setLabelColor(item->id(), color); } }); // auto a = menu.addAction(tr("Delete"), [=]() { // FileLabelModel::getGlobalModel()->removeLabel(id); // Q_EMIT removeLabel(id); // }); //a->setEnabled(labelRemovable); } /*else { menu.addAction(tr("Create New Label"), [=]() { QColorDialog dialog; dialog.setStyleSheet("QSpinBox{" "min-width: 2em;" "}"); if (dialog.exec()) { auto color = dialog.selectedColor(); auto name = color.name(); FileLabelModel::getGlobalModel()->addLabel(name, color); Q_EMIT addLabel(name, color); } }); }*/ menu.exec(mapToGlobal(pos)); }); m_labelHeightAnimation = new QPropertyAnimation(this, "geometry"); m_labelHeightAnimation->setDuration(250); m_labelHeightAnimation->setEasingCurve(QEasingCurve::OutCubic); connect(m_labelHeightAnimation, &QVariantAnimation::finished, this, [=](){ Q_EMIT fileLabelVisible(m_isShow); }); } QSize FileLabelBox::sizeHint() const { // auto w = this->topLevelWidget()->width(); // auto size = QListView::sizeHint(); // size.setWidth(w/5); return QListView::sizeHint(); } void FileLabelBox::mousePressEvent(QMouseEvent *e) { // issues#IB1SEG remove the effect of right mouse clicks on selected color labels if (e->button() == Qt::RightButton) { return; } QModelIndex index = indexAt(e->pos()); //qDebug() << "mousePressEvent:"<pos() <type(); if (!index.isValid() && e->button() == Qt::LeftButton) { this->clearSelection(); Q_EMIT leftClickOnBlank(); } else { QListView::mousePressEvent(e); } } void FileLabelBox::paintEvent(QPaintEvent *e) { QListView::paintEvent(e); } void FileLabelBox::setFloatWidgetVisible(bool visible) { if (m_labelHeightAnimation->state() != QVariantAnimation::Running) { if (visible) { setVisible(visible); } m_isShow = visible; int width = this->width(); int height = this->height(); m_labelHeightAnimation->setStartValue(QRect(mapToParent(QPoint(0, height)), QSize(width, 0))); m_labelHeightAnimation->setEndValue(QRect(mapToParent(QPoint(0, 0)), QSize(width, height))); m_labelHeightAnimation->setDirection(visible? QVariantAnimation::Forward: QVariantAnimation::Backward); m_labelHeightAnimation->start(); } } LabelBoxStyle *LabelBoxStyle::getStyle() { if (!global_instance) { global_instance = new LabelBoxStyle; } return global_instance; } void LabelBoxStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == QStyle::PE_Frame) return; return QApplication::style()->drawPrimitive(element, option, painter, widget); } void LabelBoxStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == CE_ItemViewItem) { if (auto tmp = qstyleoption_cast(option)) { QStyleOptionViewItem opt = *tmp; auto color = qvariant_cast(opt.index.data(Qt::DecorationRole)); auto icon = color_icons.value(color.name()); if (icon.isNull()) { QPixmap pic(QSize(12, 12)); pic.fill(Qt::transparent); QPainter p(&pic); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); p.setPen(QPen(Qt::gray, 0.5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); p.setBrush(color); p.drawEllipse(QRect(0, 0, 12, 12)); p.end(); icon.addPixmap(pic); color_icons.insert(color.name(), icon); } opt.icon = icon; return QApplication::style()->drawControl(element, &opt, painter, widget); } } return QApplication::style()->drawControl(element, option, painter, widget); } QSize LabelBoxStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const { if (type == CT_ItemViewItem) { QSize tmpsize = QApplication::style()->sizeFromContents(type, option, size, widget); tmpsize += QSize(0, 8); return tmpsize; } return QApplication::style()->sizeFromContents(type, option, size, widget); } peony/src/control/float-pane-widget.cpp0000664000175000017500000000704615154271070017125 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "float-pane-widget.h" #include FloatPaneWidget::FloatPaneWidget(QWidget *mainWidget, QWidget *floatWidget, QWidget *parent) : QWidget(parent) { m_mainWidget = mainWidget; mainWidget->setParent(this); m_floatWidget = floatWidget; floatWidget->setParent(this); floatWidget->setVisible(false); m_floatWidgetWidthAnimation = new QVariantAnimation(this); m_floatWidgetWidthAnimation->setStartValue(qreal(0.0)); m_floatWidgetWidthAnimation->setEndValue(qreal(1.0)); m_floatWidgetWidthAnimation->setDuration(500); m_floatWidgetWidthAnimation->setEasingCurve(QEasingCurve::OutCubic); connect(m_floatWidgetWidthAnimation, &QVariantAnimation::valueChanged, this, [=](){ if (m_floatWidgetWidthAnimation->state() == QVariantAnimation::Running) { qreal currentValue = m_floatWidgetWidthAnimation->currentValue().toReal(); int floatWidgetWidth = m_floatWidgetWidthHint * currentValue; m_floatWidget->move(0, 0); m_floatWidget->resize(floatWidgetWidth, this->height()); } }); connect(m_floatWidgetWidthAnimation, &QVariantAnimation::finished, this, [=](){ if (m_floatWidgetWidthAnimation->currentValue().toReal() == 0) { m_floatWidget->setVisible(false); m_mainWidget->setGeometry(this->rect()); } else { m_floatWidget->setVisible(true); } }); setMinimumWidth(FLOAT_WIDGET_MIN_WIDTH); } void FloatPaneWidget::setFloatWidgetWidthHint(int widthHint) { m_floatWidgetWidthHint = widthHint; } QSize FloatPaneWidget::sizeHint() const { if (m_floatWidget->isVisible()) { return QSize(m_mainWidget->sizeHint().width() + m_floatWidgetWidthHint, m_mainWidget->sizeHint().height()); } else { return QSize(m_mainWidget->sizeHint()); } } void FloatPaneWidget::setFloatWidgetVisible(bool visible) { if (visible) { m_floatWidget->setVisible(true); // resize(this->width() + m_floatWidgetWidthHint, this->height()); m_mainWidget->move(m_floatWidgetWidthHint, 0); m_mainWidget->resize(size().width() - m_floatWidgetWidthHint, size().height()); } m_floatWidgetWidthAnimation->setDirection(visible? QVariantAnimation::Forward: QVariantAnimation::Backward); m_floatWidgetWidthAnimation->start(); } void FloatPaneWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); if (m_floatWidget->isVisible()) { m_mainWidget->move(m_floatWidgetWidthHint, 0); m_mainWidget->resize(this->width() - m_floatWidgetWidthHint, this->height()); m_floatWidget->move(0, 0); m_floatWidget->resize(m_floatWidget->width(), this->height()); } else { m_mainWidget->move(0, 0); m_mainWidget->resize(this->size()); } } peony/src/control/sort-type-menu.cpp0000664000175000017500000001460015154271106016520 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "sort-type-menu.h" #include "global-settings.h" #include SortTypeMenu::SortTypeMenu(QWidget *parent) : QMenu(parent) { auto sortTypeGroup = new QActionGroup(this); m_sort_types = sortTypeGroup; sortTypeGroup->setExclusive(true); auto fileName = addAction(tr("Name")); fileName->setCheckable(true); sortTypeGroup->addAction(fileName); auto modifiedDate = addAction(tr("Time Modified")); modifiedDate->setCheckable(true); sortTypeGroup->addAction(modifiedDate); auto fileType = addAction(tr("File Type")); fileType->setCheckable(true); sortTypeGroup->addAction(fileType); auto fileSize = addAction(tr("File Size")); fileSize->setCheckable(true); sortTypeGroup->addAction(fileSize); auto originalPath = addAction(tr("Original Path")); m_origin_path = originalPath; originalPath->setCheckable(true); sortTypeGroup->addAction(originalPath); m_file_path = addAction(tr("Path")); originalPath->setCheckable(true); sortTypeGroup->addAction(m_file_path); addSeparator(); auto mostUsed = addAction(tr("Intelligent sort")); m_mostUsed = mostUsed; mostUsed->setCheckable(true); sortTypeGroup->addAction(mostUsed); auto addMode = addMenu(tr("Add Mode")); m_addMode = addMode; auto userAdded = addMode->addAction(tr("Manual Add Priority")); m_userAdded = userAdded; userAdded->setCheckable(true); sortTypeGroup->addAction(userAdded); auto autoAdded = addMode->addAction(tr("Conditional Screening Priority")); m_autoAdded = autoAdded; autoAdded->setCheckable(true); sortTypeGroup->addAction(autoAdded); auto onlyUserAdded = addMode->addAction(tr("Manually added only")); m_onlyUserAdded = onlyUserAdded; onlyUserAdded->setCheckable(true); sortTypeGroup->addAction(onlyUserAdded); auto onlyAutoAdded = addMode->addAction(tr("Conditional additions only")); m_onlyAutoAdded = onlyAutoAdded; onlyAutoAdded->setCheckable(true); sortTypeGroup->addAction(onlyAutoAdded); connect(sortTypeGroup, &QActionGroup::triggered, this, [=](QAction *action) { int index = sortTypeGroup->actions().indexOf(action); switchSortTypeRequest(index); }); addSeparator(); auto sortOrderGroup = new QActionGroup(this); m_sort_orders = sortOrderGroup; sortOrderGroup->setExclusive(true); auto descending = addAction(tr("Descending Order")); descending->setCheckable(true); sortOrderGroup->addAction(descending); //switch defautl Descending Ascending order, fix bug#99924 auto ascending = addAction(tr("Ascending Order")); ascending->setCheckable(true); sortOrderGroup->addAction(ascending); connect(sortOrderGroup, &QActionGroup::triggered, this, [=](QAction *action) { int index = sortOrderGroup->actions().indexOf(action); switchSortOrderRequest(Qt::SortOrder(index)); }); addSeparator(); auto useGlobalSortAction = new QAction(tr("Use current sorting for all folders"), this); useGlobalSortAction->setCheckable(true); useGlobalSortAction->setChecked(Peony::GlobalSettings::getInstance()->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()); connect(useGlobalSortAction, &QAction::triggered, this, [=](bool checked){ Peony::GlobalSettings::getInstance()->setGSettingValue(USE_GLOBAL_DEFAULT_SORTING, checked); Q_EMIT globalSortingPolicyChanged(); }); addAction(useGlobalSortAction); } void SortTypeMenu::setOriginPathVisible(bool visible) { m_origin_path->setVisible(visible); } void SortTypeMenu::setFilePathVisible(bool visible) { m_file_path->setVisible(visible); } QString SortTypeMenu::getSortTypeName(int type) { QString sortTypeName = ""; // 检查 type 是否在有效范围内 if (type >= 0 && type < m_sort_types->actions().count()) { sortTypeName = QString(tr("By %1")).arg(m_sort_types->actions().at(type)->text()); } return sortTypeName; } void SortTypeMenu::updateSortOrderName(int type) { QStringList names; if (type == 1) { names.append(tr("Newest to oldest")); names.append(tr("Oldest to newest")); } else if (type == 3) { names.append(tr("Files from large to small")); names.append(tr("Files from small to large")); } else { names.append(tr("Descending Order")); names.append(tr("Ascending Order")); } if (m_sort_orders->actions().count() >= 2) { m_sort_orders->actions().at(0)->setText(names.at(0)); m_sort_orders->actions().at(1)->setText(names.at(1)); } } void SortTypeMenu::setUserAddedEnable(bool visiable) { m_addMode->setEnabled(visiable); } bool SortTypeMenu::isAutoModeType(int type) { if (type >= 0 && type < m_sort_types->actions().count()) { auto action = m_sort_types->actions().at(type); if (m_addMode->actions().contains(action)) { return true; } } return false; } void SortTypeMenu::setSortType(int type) { // 检查 type 是否在有效范围内 if (type >= 0 && type < m_sort_types->actions().count()) { m_sort_types->actions().at(type)->setChecked(true); qDebug() << "Setting sort type:" << type; if (m_sort_type != type) { m_sort_type = type; } } else { qWarning() << "Invalid sort type index:" << type << "Valid range is [0, " << m_sort_types->actions().count() - 1 << "]"; } } void SortTypeMenu::setSortOrder(Qt::SortOrder order) { qDebug()<actions().at(order)->setChecked(true); if (m_sort_order != order) { m_sort_order = order; } } peony/src/control/tab-status-bar.cpp0000664000175000017500000002316315154271070016445 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: MeihongHe * */ #include "tab-status-bar.h" #include "file-info.h" #include "file-utils.h" #include "search-vfs-uri-parser.h" #include "tab-widget.h" #include "file-info.h" #include "global-settings.h" #include #include #include #include #include #include #include #include #include #include TabStatusBar::TabStatusBar(TabWidget *tab, QWidget *parent) : QStatusBar(parent) { setAttribute(Qt::WA_TranslucentBackground); m_styled_toolbar = new QToolBar; setContentsMargins(0, 0, 0, 0); setStyleSheet("padding: 0;"); setSizeGripEnabled(false); setMinimumHeight(30); m_tab = tab; m_label = new ElidedLabel(this); m_label->setContentsMargins(25, 0, 0, 0); addWidget(m_label, 1); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setFocusPolicy(Qt::FocusPolicy(Qt::WheelFocus & ~Qt::TabFocus)); m_slider->setRange(0, 100); //设置状态栏下的搜索进度 m_animation = new QVariantAnimation(this); m_animation->setDuration(1000); m_animation->setStartValue(0.0); m_animation->setEndValue(360.0); connect(m_animation,&QVariantAnimation::valueChanged, m_label, [=](){ m_label->setValue(m_animation->currentValue().toDouble()); }); connect(m_animation, &QVariantAnimation::finished, this, [=](){ if(m_searching) { m_animation->start(); } }); auto mainWindow = qobject_cast(this->topLevelWidget()); auto settings = Peony::GlobalSettings::getInstance(); int defaultZoomLevel = settings->getValue(DEFAULT_VIEW_ID).toInt(); if (mainWindow) { defaultZoomLevel = mainWindow->currentViewZoomLevel(); } m_slider->setValue(defaultZoomLevel); connect(m_slider, &QSlider::valueChanged, this, &TabStatusBar::zoomLevelChangedRequest); connect(qApp, &QApplication::paletteChanged, this, [=]() { this->update(); }); } TabStatusBar::~TabStatusBar() { m_styled_toolbar->deleteLater(); } int TabStatusBar::currentZoomLevel() { if (m_slider->isEnabled()) { m_slider->value(); } return -1; } void TabStatusBar::update() { if (!m_tab) return; if (m_searching) { m_label->setText(tr("Searching for files ...")); return; } //qDebug() << "TabStatusBar::update"; auto seletionUris = m_tab->getCurrentSelections(); //show current path files count if (seletionUris.count() ==0) { auto allDisplayFileCount = m_tab->getAllDisplayFileCount(); if (allDisplayFileCount == 0) m_label->setText(""); else m_label->setText(tr(" \%1 items ").arg(allDisplayFileCount)); return; } //fix select special item issue if (seletionUris.count() == 1 && (seletionUris.first().isNull() || (seletionUris.first() == "network:///" || seletionUris.first() == "computer:///"))) { m_label->setText(""); return; } int specialCount = 0; goffset size = 0; for (auto selectionUri : seletionUris) { //not count special path if (selectionUri == "network:///" || selectionUri == "computer:///") { specialCount++; continue; } auto selectionInfo = Peony::FileInfo::fromUri(selectionUri); if(! selectionInfo->isDir() && ! selectionInfo->isVolume()){ size += selectionInfo->size(); } } //Calculated by 1024 bytes auto format_size_GIB = g_format_size_full(size, G_FORMAT_SIZE_IEC_UNITS); QString format_size(format_size_GIB); //状态栏以GB为显示单位 format_size.replace("iB", "B"); if (size > 0) m_label->setText(tr(" selected \%1 items \%2").arg(seletionUris.count()).arg(format_size)); else m_label->setText(tr(" selected \%1 items").arg(seletionUris.count()- specialCount)); g_free(format_size_GIB); } void TabStatusBar::update(const QString &message) { m_label->setText(message); } void TabStatusBar::updateZoomLevelState(int zoomLevel) { m_slider->setValue(zoomLevel); } void TabStatusBar::onZoomRequest(bool zoomIn) { int value = m_slider->value(); if (zoomIn) { value++; } else { value--; } m_slider->setValue(value); } //显示隐藏文件,更新项目个数 void TabStatusBar::updateItemsNum() { this->update(); } void TabStatusBar::paintEvent(QPaintEvent *e) { return; } void TabStatusBar::mousePressEvent(QMouseEvent *e) { return; } void TabStatusBar::resizeEvent(QResizeEvent *e) { QStatusBar::resizeEvent(e); auto pos = this->rect().topRight(); auto size = m_slider->size(); int x = pos.x() - size.width() - 20; if (layoutDirection() == Qt::RightToLeft) { x = 0; } m_slider->move(x, this->size().height()/2 - size.height()/2); } void TabStatusBar::updateSearchProgress(bool searching) { m_searching = searching; if(m_searching) { if(m_animation->state() != QAbstractAnimation::Running) { m_animation->start(); } m_label->setText(tr("Searching for files ...")); } else { m_animation->stop(); update(); } m_label->setSearch(searching); } ElidedLabel::ElidedLabel(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_TranslucentBackground); setContentsMargins(30, 0, 120, 0); QIcon icon = QIcon::fromTheme("ukui-loading-2.symbolic"); m_disc = icon.pixmap(QSize(16,16)); } void ElidedLabel::setText(const QString &text) { m_text = text; this->update(); } void ElidedLabel::setValue(double value) { m_val = value; this->update(); } void ElidedLabel::setSearch(bool searching) { m_searching = searching; } void ElidedLabel::paintEvent(QPaintEvent *event) { /*! * \note * paint status bar background and text. * * designer want to layout status bar into the view, however the status bar belongs to main window now. * that means status bar will be layout over the view. it is not possible to archive the ui desginer goals untils we * destroy the current directory view frameworks. * * it is a complex problem, not an easy one. so do not think about changing the layout here to solve the problem easily. */ QStyleOption opt; opt.initFrom(this); bool active = opt.state &QStyle::State_Active; QColor base = active? qApp->palette().color(QPalette::Active, QPalette::Base): qApp->palette().color(QPalette::Inactive, QPalette::Base); QFontMetrics fm(this->font()); auto elidedText = fm.elidedText(m_text, Qt::TextElideMode::ElideRight, this->size().width() - 150); QPainter p(this); // //p.setCompositionMode(QPainter::CompositionMode_SourceIn); // QLinearGradient linearGradient; // linearGradient.setStart(QPoint(10, this->height())); // linearGradient.setFinalStop(QPoint(10, 0)); // linearGradient.setColorAt(0, base); // linearGradient.setColorAt(0.75, base); // linearGradient.setColorAt(1, Qt::transparent); int overlap = qApp->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap); int layoutWidth = qApp->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); int adjustedY2 = qMin(0, overlap - layoutWidth); QPainterPath path; path.addRect(this->rect().adjusted(0, 0, adjustedY2 - this->height() + 14, 0)); p.fillPath(path, base); if (m_searching) { p.save(); QRect rect = this->rect().adjusted(0, 0, adjustedY2 - this->height() + 14, 0); QRect adjustedRect = rect.adjusted(30, 0, -120, 0); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); p.translate(adjustedRect.topLeft().x(), this->rect().height()/2 - m_disc.height()/2); p.translate(m_disc.width()/2,m_disc.height()/2); /* 旋转的角度 */ p.rotate(m_val); /* 恢复中心点 */ p.translate(-m_disc.width()/2,-m_disc.height()/2); /* 画图操作 */ p.drawPixmap(0,0 ,m_disc.width(),m_disc.height(), m_disc); p.restore(); p.translate(m_disc.width()+5 , 0); } // QPainterPath path2; // int radius = this->height(); // QPoint pos = QPoint(this->width() + adjustedY2 - this->height(), this->height()); // QRect targetRect = QRect(pos.x() - radius, pos.y() - radius, radius*2, radius*2); // path2.moveTo(pos); // path2.arcTo(targetRect, 0, 90); // QRadialGradient radialGradient; // radialGradient.setCenter(pos); // radialGradient.setFocalPoint(pos); // radialGradient.setRadius(radius); // radialGradient.setColorAt(0, base); // radialGradient.setColorAt(0.75, base); // radialGradient.setColorAt(1, Qt::transparent); // p.fillPath(path2, radialGradient); style()->drawItemText(&p, this->rect().adjusted(30, 0, -120, 0), Qt::AlignLeft | Qt::AlignVCenter, qApp->palette(), this->isEnabled(), elidedText, QPalette::WindowText); } peony/src/control/tab-widget.h0000664000175000017500000003322315154271106015306 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef TABWIDGET_H #define TABWIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "navigation-tab-bar.h" #include "file-info.h" #include "tab-status-bar.h" #include "multi-select-combobox.h" #include "flowlayout.h" #include "file-label-model.h" class NavigationTabBar; class QStackedWidget; class PreviewPageButtonGroups; class QHBoxLayout; class QVBoxLayout; class QSplitter; namespace Peony { class PreviewPageIface; class DirectoryViewContainer; class FileInfo; class MultiSelectComboBox; } /*! * \brief The TabWidget class * \details * TabWidget is different with QTabWidget, it contains 4 parts. * 1. tabbar * 2. stackwidget * 3. preview button group * 4. preview page *
* Tabbar and statck is simmilar to QTabWidget's. Preview page is a docked page * which can be added or removed by preview button group. */ class TabWidget : public QMainWindow { friend class MainWindow; Q_OBJECT public: enum Type { FileType = 1, FileSize, DateRange, FileName, FileLabel, ConditionMatchRule, Other }; enum Mode { Create, Edit, Search, General, Invaild }; explicit TabWidget(QWidget *parent = nullptr); QTabBar *tabBar() { return m_tab_bar; } Peony::DirectoryViewContainer *currentPage(); const QString getCurrentUri(); const QStringList getCurrentSelections(); const int getCurrentRowcount(); const QStringList getAllFileUris(); const int getAllDisplayFileCount(); const QList> getCurrentSelectionFileInfos(); /* Function:Get all file information under the current path */ const QList> getCurrentAllFileInfos(); const QStringList getBackList(); const QStringList getForwardList(); bool canGoBack(); bool canGoForward(); bool canCdUp(); int getSortType(); Qt::SortOrder getSortOrder(); bool eventFilter(QObject *obj, QEvent *e); void setWindow(QWidget *parent) { m_parent = parent; } Q_SIGNALS: void currentIndexChanged(int index); void tabMoved(int from, int to); void tabInserted(int index); void tabRemoved(int index); void searchRecursiveChanged(bool recursive); void activePageSelectionChanged(); void activePageChanged(); void activePageLocationChanged(); void activePageViewTypeChanged(); void activePageViewSortTypeChanged(); void viewDoubleClicked(const QString &uri); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void updateWindowLocationRequest(const QString &uri, bool addHistory, bool forceUpdate = false); void updateWindowSelectionRequest(const QStringList &uris); void menuRequest(const QPoint &pos); void zoomRequest(bool zoomIn); void closeWindowRequest(); void clearTrash(); void closeSearch(); void recoverFromTrash(); void currentSelectionChanged(); void tabBarIndexUpdate(int index); void viewSelectStatus(bool isSelected); void globalSearch(bool isGlobal); void signal_itemAdded(const QString& uri);/* 新增文件(夹),item创建完成 */ void updateItemsNum(); /*显示隐藏文件,更新项目个数*/ // add new signals to notify changes in search status void searchStateChanged(bool isSearching, const QString &searchKey); public Q_SLOTS: void setCurrentIndex(int index); void setPreviewPage(Peony::PreviewPageIface *previewPage = nullptr); void addPage(const QString &uri, bool jumpTo = false); void goToUri(const QString &uri, bool addHistory, bool forceUpdate = false); void switchViewType(const QString &viewId); void updateTabPageTitle(); void goBack(); void goForward(); void cdUp(); void refresh(); void stopLoading(); void tryJump(int index); void clearHistory(); void setSortType(int type); void setSortOrder(Qt::SortOrder order); void setSortFilter(int FileTypeIndex, int FileMTimeIndex, int FileSizeIndex); void setShowHidden(bool showHidden = false); void setUseDefaultNameSortOrder(bool use); void setSortFolderFirst(bool folderFirst); //multiple filter conditions for new advance search void addFilterCondition(int option, int classify, bool updateNow = false); void removeFilterCondition(int option, int classify, bool updateNow = false); void clearConditions(); void updateFilter(); void updateAdvanceConditions(); void setCurrentSelections(const QStringList &uris); void editUri(const QString &uri); void editUris(const QStringList &uris); void onViewDoubleClicked(const QString &uri); bool getTriggeredPreviewPage() { return m_triggered_preview_page; } void setTriggeredPreviewPage(bool trigger) { m_triggered_preview_page = trigger; } int count(); int currentIndex(); void removeTab(int index); void updateTrashBarVisible(const QString &uri = ""); void updateSearchPathButton(const QString &uri = ""); void updateSearchBar(bool showSearch); void searchUpdate(); void searchChildUpdate(); void browsePath(); void handleZoomLevel(int zoomLevel); void updateCurrentSearchPath(); void switchSearchPath (bool isCurrent); /* 设备卸载、弹出后,其所在标签页跳转到计算机页(保护箱标签除外),其余标签页均关闭 */ void slot_responseUnmounted(const QString &destUri, const QString &sourceUri); void updateTabletModeValue(bool isTabletMode); void updateSearchTypeShow(); void updateFilterContent(const QString& key); bool isSearchIndex(); void setMutipleLabelConditions(QStringList names, QList colors); void updateMultiComboBoxCount(); void clearAllMapsCount(); void addCondition(const QJsonObject &rootObject = QJsonObject(), const QJsonObject &object = QJsonObject()); void updatebtnstatus(); void switchType(const Type conditionType, const QJsonObject &rootObject = QJsonObject(), const QJsonObject &object = QJsonObject(), QWidget *widget = nullptr); QString getConditions(const bool isDefaultCondition = true) const; void updateConditionFormJson(); void updateCreateVirtualTabShow(); protected: void changeCurrentIndex(int index); void moveTab(int from, int to); void bindContainerSignal(Peony::DirectoryViewContainer *container); void updatePreviewPage(); void resizeEvent(QResizeEvent *e); void updateTabBarGeometry(); void updateStatusBarGeometry(); void initAdvanceSearch(); void updatePreviewPageVisible(); void updateStatusBarSliderState(); void updatePreviewButtonStatus(bool status); void updateTabAllPages(); void paintEvent(QPaintEvent *e); bool isMultFile(std::shared_ptr info); void setCondWidthWithFont(QComboBox *conditionCombox, int fontSize); void setClassifyWidthWithFont(QComboBox *classifyCombox, int fontSize); void updateSearchFilterHeight(); void updateAdvanceShow(bool isVisible); void removeCondition(); void clearFileContentConditions(); void handleSwitchModeAndShow(const QString &uri); QString getSearchKey() const; void handleEditConditionCancel(); bool handleEditConditionSwitchPath(); void clearFilterMode(); QString elideTextAndToolTip(QFont font, int width, QString strInfo, Qt::TextElideMode mode, QWidget *widgt); bool isDefaultSpaceCondition(const QString &defaultCondition); private: NavigationTabBar *m_tab_bar; QToolButton *m_add_page_button; QToolButton *m_show_page_button; QTreeView *m_treeView; QMenu *m_menu; QStandardItemModel *m_model; QStackedWidget *m_stack; Peony::PreviewPageIface *m_preview_page = nullptr; QStackedWidget *m_preview_page_container; QToolBar *m_trash_bar; QToolBar *m_search_bar; QVBoxLayout *m_top_layout; QHBoxLayout *m_trash_bar_layout; QHBoxLayout *m_search_bar_layout; QLabel *m_trash_label; QPushButton *m_clear_button; QPushButton *m_recover_button; // QPushButton *m_search_path; // QPushButton *m_search_close; // QPushButton *m_search_child; // QPushButton *m_search_more; QLabel *m_search_title; // QString m_current_uri; QPushButton *m_current_search; QPushButton *m_home_search; QPushButton *m_add_filter_button; QPushButton *m_saveas_space_button; QSplitter *m_preview_splitter; QPushButton *m_space_cancel_button; QPushButton *m_space_ok_button; QPushButton *m_space_edit_button; //use qlist for dynamic generated search conditions list //QList m_layout_list; QList m_classify_list; QList m_conditions_list; QComboBox *m_fitall_box; // Peony::MultiSelectComboBox *m_file_type_box; // Peony::MultiSelectComboBox *m_file_mtime_box; // Peony::MultiSelectComboBox *m_file_size_box; //Peony::MultiSelectComboBox *m_file_label_box; //QLineEdit *m_input_edit; QLabel *m_condition_label; QVBoxLayout *m_search_filter_layout; QWidget *m_filter_container; //QPushButton *m_conditions_clear_btn; FileLabelModel *m_file_label_model; int m_search_bar_count = 0; const int ELIDE_TEXT_LENGTH = 6; TabStatusBar *m_status_bar = nullptr; bool m_triggered_preview_page = false; bool m_search_child_flag = true; bool m_isTabletMode = false; bool m_jumpToComputer = false; bool m_isVirtualTab = false; //Button size macro definition //change height to 36 to ensure max size font can show complete, link to bug#58824 const int TRASH_BUTTON_HEIGHT = 36; const int TRASH_BUTTON_WIDTH = 65; //advance search filter options QStringList m_option_list = {tr("type"), tr("file size"), tr("modify time"), tr("name")}; QStringList m_file_type_list = {tr("all"), tr("file folder"), tr("image"), tr("video"), tr("text file"), tr("audio"), tr("wps file"), tr("others")}; QStringList m_file_mtime_list = {tr("all"), tr("today"), tr("yesterday"), tr("this week"), tr("last week"), tr("this month"), tr("last month"), tr("this year"), tr("last year"),tr("before last year")}; QStringList m_file_size_list = {tr("all"),tr("empty(0K)"), tr("tiny(0-16K)"), tr("small(16k-1M)"), tr("medium(1M-128M)"), tr("big(128M-1G)"),tr("large(1-4G)"),tr("great(>4G)")}; QStringList m_search_type_list = {tr("file name and content"), tr("file name")}; QStringList m_option_types = {tr("File Type"), tr("File Size"), tr("Modify Time"), tr("File Name"), tr("File Label"), tr("Condition Match Rule")}; QWidget* m_parent = nullptr; QStringList m_input_edit_keyList; int m_search_rules_currentIndex; Mode m_mode = General; }; class PreviewPageContainer : public QStackedWidget { friend class TabWidget; Q_OBJECT explicit PreviewPageContainer(QWidget *parent = nullptr); //QSize sizeHint() const {return QSize(200, QStackedWidget::sizeHint().height());} }; class PreviewPageButtonGroups : public QButtonGroup { Q_OBJECT public: explicit PreviewPageButtonGroups(QWidget *parent = nullptr); Q_SIGNALS: void previewPageButtonTrigger(bool trigger, const QString &pluginId); }; class PushButtonStyle : public QProxyStyle { Q_OBJECT public: static PushButtonStyle *getStyle(); PushButtonStyle() : QProxyStyle() {} void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const; int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget = nullptr) const; }; class FilterComboBox : public QComboBox { Q_OBJECT public: using QComboBox::QComboBox; // 重写showPopup来在显示时更新tooltip void showPopup() override { updateTooltips(); QComboBox::showPopup(); } private: void updateTooltips() { QFontMetrics fm(font()); int indicator = style()->pixelMetric(QStyle::PM_MenuButtonIndicator); int margin = 40; int textWidth = this->width() - indicator - margin; // 预估下拉框宽度 for (int i = 0; i < count(); ++i) { QString text = itemText(i); if (fm.horizontalAdvance(text) > textWidth) { setItemData(i, text, Qt::ToolTipRole); } else { setItemData(i, "", Qt::ToolTipRole); } } } }; #endif // TABWIDGET_H peony/src/control/tab-widget.cpp0000664000175000017500000033357715154271106015660 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "tab-widget.h" //#include "navigation-tab-bar.h" #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "directory-view-widget.h" #include "file-info.h" #include "file-utils.h" #include "file-info-job.h" #include "file-launch-manager.h" #include "search-vfs-uri-parser.h" //#include "properties-window.h" #include "properties-window-factory-plugin-manager.h" #include "file-enumerator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "directory-view-container.h" #include "file-utils.h" #include "peony-main-window-style.h" #include "directory-view-factory-manager.h" #include "global-settings.h" #include "main-window.h" #include "file-enumerator.h" #include "file-info-job.h" #include "file-info.h" #include "volume-manager.h" #include "directoryviewhelper.h" #include "image-mount-manager.h" #include "file-info-manager.h" #include "file-info-job.h" #include "file-meta-info.h" #include "global-settings.h" #include "space-save-dialog.h" #include "idm-dbus-manager.h" #include "file-utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #define PUSH_BUTTON_TOTAL_PADDING 14 static PushButtonStyle *global_instance = nullptr; PushButtonStyle *PushButtonStyle::getStyle() { if (!global_instance) { global_instance = new PushButtonStyle; } return global_instance; } void PushButtonStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case CE_PushButton: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { proxy()->drawControl(CE_PushButtonBevel, option, painter, widget); QStyleOptionButton subopt = *button; subopt.rect = proxy()->subElementRect(SE_PushButtonContents, option, widget); proxy()->drawControl(CE_PushButtonLabel, &subopt, painter, widget); return; } break; } default: break; } qApp->style()->drawControl(element, option, painter, widget); } int PushButtonStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric) { case PM_ButtonMargin: { return 0; } default: return QProxyStyle::pixelMetric(metric, option, widget); } } QRect PushButtonStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_PushButtonContents: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { const bool icon = !button->icon.isNull(); const bool text = !button->text.isEmpty(); QRect rect = option->rect; int Margin_Height = 2; int ToolButton_MarginWidth = 10; int Button_MarginWidth = proxy()->pixelMetric(PM_ButtonMargin, option, widget); if (text && !icon && !(button->features & QStyleOptionButton::HasMenu)) { rect.adjust(Button_MarginWidth, 0, -Button_MarginWidth, 0); } else if (!text && icon && !(button->features & QStyleOptionButton::HasMenu)) { } else { rect.adjust(ToolButton_MarginWidth, Margin_Height, -ToolButton_MarginWidth, -Margin_Height); } if (button->features & (QStyleOptionButton::AutoDefaultButton | QStyleOptionButton::DefaultButton)) { int dbw = proxy()->pixelMetric(PM_ButtonDefaultIndicator, option, widget); rect.adjust(dbw, dbw, -dbw, -dbw); } return rect; } break; } default: break; } return QProxyStyle::subElementRect(element, option, widget); } TabWidget::TabWidget(QWidget *parent) : QMainWindow(parent) { QString localeName = QLocale::system().name(); if (localeName.contains("ug") || localeName.contains("kk") || localeName.contains("ky")) { setLayoutDirection(Qt::RightToLeft); } setStyle(PeonyMainWindowStyle::getStyle()); setAttribute(Qt::WA_TranslucentBackground); m_parent = parent; m_tab_bar = new NavigationTabBar(this); m_tab_bar->setFocusPolicy(Qt::TabFocus); m_tab_bar->setLayoutDirection(layoutDirection()); m_tab_bar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_stack = new QStackedWidget(this); m_stack->setContentsMargins(8, 0, 0, 0); // m_buttons = new PreviewPageButtonGroups(this); m_preview_page_container = new QStackedWidget(this); m_preview_page_container->setContentsMargins(0, 2, 0, 0); m_preview_page_container->setMinimumWidth(300); //status bar m_status_bar = new TabStatusBar(this, this); connect(this, &TabWidget::updateItemsNum, m_status_bar, &TabStatusBar::updateItemsNum); connect(this, &TabWidget::zoomRequest, m_status_bar, &TabStatusBar::onZoomRequest); connect(m_status_bar, &TabStatusBar::zoomLevelChangedRequest, this, &TabWidget::handleZoomLevel); //setStatusBar(m_status_bar); connect(m_tab_bar, &QTabBar::currentChanged, this, &TabWidget::changeCurrentIndex); connect(m_tab_bar, &QTabBar::tabMoved, this, &TabWidget::moveTab); connect(m_tab_bar, &QTabBar::tabCloseRequested, this, &TabWidget::removeTab); connect(m_tab_bar, &NavigationTabBar::pageRemoved, this, [this]{ updateTabAllPages(); updateTabBarGeometry(); }); connect(m_tab_bar->m_slide_animation, &QVariantAnimation::valueChanged, this, &TabWidget::updateTabBarGeometry); connect(m_tab_bar, &NavigationTabBar::addPageRequest, this, &TabWidget::addPage); connect(m_tab_bar, &NavigationTabBar::locationUpdated, this, &TabWidget::updateSearchPathButton); connect(m_tab_bar, &NavigationTabBar::locationUpdated, this, [this]{ updateTabAllPages(); updateTabBarGeometry(); }); connect(m_tab_bar, &NavigationTabBar::closeWindowRequest, this, &TabWidget::closeWindowRequest); connect(m_tab_bar, &QTabBar::currentChanged, [=](int index){ Q_EMIT tabBarIndexUpdate(index); }); // QActionGroup *group = new QActionGroup(this); // group->setExclusive(true); //bug#94981 修改添加控件的位置和形状 m_add_page_button = new QToolButton(this); m_add_page_button->setFocusPolicy(Qt::TabFocus); m_add_page_button->setFixedSize(QSize(30, 30)); m_add_page_button->setIconSize(QSize(16, 16)); m_add_page_button->setIcon(QIcon::fromTheme("list-add-symbolic")); m_add_page_button->setPopupMode(QToolButton::DelayedPopup); m_add_page_button->setAutoRaise(true); m_add_page_button->setStyle(TabBarStyle::getStyle()); // m_add_page_button->setStyleSheet("background-color: transparent; border: none;"); connect(m_add_page_button, &QToolButton::clicked, this, [=](){ QString str = m_tab_bar->tabData(m_tab_bar->currentIndex()).toString(); m_tab_bar->addPageRequest(str, true); }); m_show_page_button = new QToolButton(this); m_show_page_button->setPopupMode(QToolButton::DelayedPopup); m_show_page_button->setFixedSize(QSize(30, 30)); m_show_page_button->setIconSize(QSize(16, 16)); m_show_page_button->setIcon(QIcon::fromTheme("ukui-all-tabs-symbolic")); m_show_page_button->setAutoRaise(true); // m_show_page_button->setObjectName("toolButton"); m_show_page_button->setStyle(TabBarStyle::getStyle()); m_model = new QStandardItemModel; m_treeView = new QTreeView(this); m_menu = new QMenu(this); connect(m_show_page_button, &QToolButton::clicked, this, [=](){ updateTabAllPages(); if (m_menu) { delete m_menu; } m_menu = new QMenu(this); m_menu->setAttribute(Qt::WA_TranslucentBackground); auto action = new QWidgetAction(this); action->setDefaultWidget(m_treeView); m_menu->addAction(action); connect(m_treeView, &QTreeView::clicked, this, [=](const QModelIndex &index) { switch (index.column()) { case 0: { changeCurrentIndex(index.row()); m_menu->hide(); break; } case 1: { removeTab(index.row()); m_menu->hide(); break; } default: break; } }); auto pTabBar = m_tab_bar->mapToGlobal(m_tab_bar->pos()); QPoint pos(pTabBar.x() + m_show_page_button->x(), pTabBar.y() + m_tab_bar->sizeHint().height() - 8); if (layoutDirection() == Qt::RightToLeft) { pos = m_show_page_button->mapToGlobal(QPoint(m_show_page_button->width() - m_menu->sizeHint().width(), m_show_page_button->height())); } m_menu->setContentsMargins(0,0,0,0); m_menu->exec(pos); }); updateTabBarGeometry(); //trash quick operate buttons QHBoxLayout *trash = new QHBoxLayout(); m_trash_bar_layout = trash; QToolBar *trashButtons = new QToolBar(this); m_trash_bar = trashButtons; QLabel *Label = new QLabel(tr("Trash"), trashButtons); // Label->setFixedHeight(TRASH_BUTTON_HEIGHT); // Label->setFixedWidth(TRASH_BUTTON_WIDTH); m_trash_label = Label; QPushButton *clearAll = new QPushButton(tr("Clear"), trashButtons); // clearAll->setFixedWidth(TRASH_BUTTON_WIDTH); // clearAll->setFixedHeight(TRASH_BUTTON_HEIGHT);/* Fix the bug:62841,the font of the clear button is not displayed completely */ clearAll->setStyle(PushButtonStyle::getStyle()); m_clear_button = clearAll; QPushButton *recover = new QPushButton(tr("Recover"), trashButtons); // recover->setFixedWidth(TRASH_BUTTON_WIDTH); // recover->setFixedHeight(TRASH_BUTTON_HEIGHT); recover->setStyle(PushButtonStyle::getStyle()); m_recover_button = recover; //hide trash button to fix bug 31322, according to designer advice m_recover_button->hide(); //trash->addSpacing(10); trash->addWidget(Label, Qt::AlignLeft); trash->setContentsMargins(10, 0, 10, 0); trash->addWidget(trashButtons); trash->addStretch(); trash->addWidget(recover); trash->addSpacing(10); trash->addWidget(clearAll); updateTrashBarVisible(); connect(clearAll, &QPushButton::clicked, this, [=]() { Q_EMIT this->clearTrash(); }); connect(recover, &QPushButton::clicked, this, [=]() { Q_EMIT this->recoverFromTrash(); }); //advance search ui init initAdvanceSearch(); QWidget *w = new QWidget(); w->setAttribute(Qt::WA_TranslucentBackground); w->setStyleSheet( "QWidget#w {background-color: transparent;" "border: 0px solid transparent;}"); auto vbox = new QVBoxLayout(); m_top_layout = vbox; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); vbox->addLayout(trash); vbox->addSpacing(6); vbox->addLayout(m_search_bar_layout); vbox->addSpacing(6); //vbox->addLayout(m_search_filter_layout); vbox->setAlignment(Qt::AlignTop); vbox->addWidget(m_filter_container,0, Qt::AlignTop); m_preview_splitter = new QSplitter(this); m_preview_splitter->setChildrenCollapsible(false); m_preview_splitter->setContentsMargins(0, 0, 0, 0); m_preview_splitter->setHandleWidth(1); m_preview_splitter->addWidget(m_stack); m_stack->installEventFilter(this); m_preview_splitter->setStretchFactor(0, 3); m_preview_splitter->setStretchFactor(1, 2); m_preview_splitter->addWidget(m_preview_page_container); m_preview_page_container->hide(); vbox->addWidget(m_preview_splitter,1); w->setLayout(vbox); setCentralWidget(w); connect(FileLabelModel::getGlobalModel(), &FileLabelModel::labelColorChanged, this, [=](const QString& uri){ for(int index = 0; index < m_stack->count(); index++){ if(uri.startsWith("label:///") && uri == m_tab_bar->tabData(index).toString()){ m_tab_bar->updateLocation(index, uri.toLocal8Bit()); } } }); //bind preview page connect(this, &TabWidget::activePageSelectionChanged, this, [=]() { updatePreviewPage(); m_status_bar->update(); Q_EMIT this->currentSelectionChanged(); }); connect(this, &TabWidget::activePageChanged, this, [=]() { QTimer::singleShot(100, this, [=]() { m_status_bar->update(); this->updatePreviewPage(); }); }); connect(this, &TabWidget::activePageLocationChanged, m_status_bar, [=]() { m_status_bar->update(); updateTabBarGeometry(); }); connect(this, &TabWidget::activePageLocationChanged, this, [=]{ auto settings = Peony::GlobalSettings::getInstance(); if (!settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (!metaInfo) { qCritical()<<"can not get meta info"<getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; auto sortOrder = metaInfo->getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; if (uri.startsWith("idm://")) { QString spaceName = uri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); sortType = Peony::IDMDBusManager::getInstance()->getSpacesSortType(spaceName); sortOrder = Peony::IDMDBusManager::getInstance()->getSpacesSortOrder(spaceName); } currentPage()->setSortType(Peony::FileItemModel::ColumnType(sortType)); currentPage()->setSortOrder(Qt::SortOrder(sortOrder)); } } }); //fix bug#166060, 将监听字体变化的处理放在构造函数中,避免重复调用或者闪退等问题 //监听字体大小改变 if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key) { double fontSize = fontSetting->get("systemFontSize").toDouble(); for(int index=0;indexisVisible()) { // m_file_type_box->updateWidth(); // m_file_mtime_box->updateWidth(); // m_file_size_box->updateWidth(); // m_file_label_box->updateWidth(); // } //fix #185743 auto realDisplayName = m_current_search->property("realDisplayName").toString(); auto elidedDisplayName = fontMetrics().elidedText(realDisplayName, Qt::ElideMiddle, /*m_current_search->width()*/200 - m_search_bar->iconSize().width() - PUSH_BUTTON_TOTAL_PADDING); m_current_search->setText(elidedDisplayName); m_current_search->adjustSize(); QFont font = m_current_search->font(); realDisplayName = Peony::FileUtils::wrapTextForTooltip(realDisplayName,QCursor::pos(),font); if (elidedDisplayName != realDisplayName) { m_current_search->setToolTip(realDisplayName); } else { m_current_search->setToolTip(""); } }); } connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spaceFileLoadFinished, this, [=](const QString &spaceName){ QString updateUri = "idm:///" + QString(QUrl::toPercentEncoding(spaceName)); if (currentPage()->getCurrentUri() == updateUri || currentPage()->getCurrentUri() == "idm:///New Intelligent Space") { handleSwitchModeAndShow(updateUri); goToUri(updateUri, true, true); } }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::editSpaceConditionSignal, this, [=](const QString &uri){ if (currentPage()->getCurrentUri() != uri && !uri.isEmpty()) { goToUri(uri, true, true); } m_space_edit_button->click(); }); // connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::createSpaceSignal, this, [=](const QString &uri){ // handleSwitchModeAndShow(uri); // goToUri(uri, true, true); // }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::deleteSpaceSignal, this, [=](){ QString idmUri = "idm:///"; if (currentPage()->getCurrentUri() != idmUri) { goToUri(idmUri, true, true); } }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spaceCreateFinished, this, [=](const QString &spaceName, const QStringList &files){ QString updateUri = "idm:///" + QString(QUrl::toPercentEncoding(spaceName)); if (currentPage()->getCurrentUri() != updateUri) { handleSwitchModeAndShow(updateUri); goToUri(updateUri, true, true); } }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spaceAddFilesToSpaced, this, [=](const QString &spaceName){ QString updateUri = "idm:///" + QString(QUrl::toPercentEncoding(spaceName)); goToUri(updateUri, true, true); }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spacesFilesAutoInserted, this, [=](const QString &spaceName, const QStringList &files, const bool isGotoUri = false){ QString idmUri = "idm:///" + QString(QUrl::toPercentEncoding(spaceName)); if (currentPage()->getCurrentUri() == idmUri && isGotoUri) { goToUri(idmUri, true, true); } }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spacesFilesAutoDeleted, this, [=](const QMap &deleteMap){ QStringList changeSpaceNames = deleteMap.keys(); for (auto spaceName : changeSpaceNames) { auto idmUri = "idm:///" + QString(QUrl::toPercentEncoding(spaceName)); if (currentPage()->getCurrentUri() == idmUri) { goToUri(idmUri, true, true); } } }); connect(Peony::IDMDBusManager::getInstance(), &Peony::IDMDBusManager::spaceRenamed, this, [=](const QString &oldName, const QString &newName){ auto idmUri = "idm:///" + QString(QUrl::toPercentEncoding(oldName)); if (currentPage()->getCurrentUri() == idmUri) { auto newUri = "idm:///" + QString(QUrl::toPercentEncoding(newName)); goToUri(newUri, true, true); } }); } bool TabWidget::isMultFile(std::shared_ptr info) { if (!info) { qDebug() << "file info not valid"; return false; } QString uri = info->uri(); if (uri.startsWith("mult:///") && (!info->isDir())) { return true; } return false; } void TabWidget::setCondWidthWithFont(QComboBox *conditionCombox, int fontSize) { QString language = QLocale::system().name(); if(fontSize < 12){ conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2); //fix bug#166969, Tibetan language not show complete issue if ("bo_CN" == language){ conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 20); } }else { if ("en_US" == language){ conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 45); }else if ("bo_CN" == language){ conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *3); }else{ conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2); } } } void TabWidget::setClassifyWidthWithFont(QComboBox *classifyCombox, int fontSize) { QString language = QLocale::system().name(); if(fontSize < 12){ classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2); if ("en_US" == language) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 45); if ("bo_CN" == language) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 20); }else{ //最大字体最长字符串所需宽度 classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *3 + 10); if ("en_US" == language) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *3 + 50); if ("zh_HK" == language) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *3 + 25); } } void TabWidget::updateSearchFilterHeight() { // m_filter_container->setMaximumHeight(m_search_filter_layout->getMaxinumHeight(m_filter_container->width())); // m_conditions_clear_btn->move(m_filter_container->geometry().right() - 46, m_filter_container->geometry().top() + 120); // m_conditions_clear_btn->raise(); } void TabWidget::updateAdvanceShow(bool isVisible) { m_filter_container->setVisible(isVisible); // m_file_type_box->setVisible(isVisible); // m_file_mtime_box->setVisible(isVisible); // m_file_size_box->setVisible(isVisible); // m_file_label_box->setVisible(isVisible); //m_input_edit->setVisible(isVisible); //m_conditions_clear_btn->setVisible(isVisible); } void TabWidget::removeCondition() { int count = m_search_filter_layout->count(); for (int i = count - 1; i >= 1; i--) { QLayoutItem *item = m_search_filter_layout->takeAt(i); if (item) { QWidget *widget = item->widget(); if (widget) { delete widget; } } delete item; } } void TabWidget::handleSwitchModeAndShow(const QString &uri) { //没有切换目录 if (getCurrentUri() == uri) { return; } //默认创建空间 if (uri == "idm:///New Intelligent Space") { m_mode = Create; return; } //进入普通模式或者空间 if (!uri.startsWith("search:///") && uri != getCurrentUri() && !getCurrentUri().isEmpty()) { m_mode = General; m_search_title->hide(); m_home_search->hide(); m_current_search->hide(); m_space_edit_button->hide(); m_add_filter_button->hide(); m_space_cancel_button->hide(); m_space_ok_button->hide(); m_filter_container->hide(); m_saveas_space_button->hide(); removeCondition(); clearConditions(); clearFileContentConditions(); //进入空间中 if (uri.startsWith("idm:///") && uri != "idm:///") { m_space_edit_button->show(); //默认会updateSearchBar } } //进入搜索模式 if (uri.startsWith("search:///") && Create != m_mode) { m_mode = Search; //默认会updateSearchBar } } QString TabWidget::getSearchKey() const { MainWindow *mainWindow = dynamic_cast(this->topLevelWidget()); QString key = mainWindow->getLastSearchKey(); return key; } void TabWidget::handleEditConditionCancel() { QMessageBox messageBox; messageBox.setIcon(QMessageBox::Question); messageBox.setText(tr("Need to save changes to current space conditions?")); QPushButton *notSave = messageBox.addButton(tr("Not Save"), QMessageBox::RejectRole); QPushButton *save = messageBox.addButton(tr("Save"), QMessageBox::AcceptRole); messageBox.setDefaultButton(save); messageBox.exec(); if (messageBox.clickedButton() == save) { m_space_ok_button->click(); } else if (messageBox.clickedButton() == notSave){ clearFilterMode(); } else { m_mode = General; } } bool TabWidget::handleEditConditionSwitchPath() { bool isSwitch = true; QString currentUri = getCurrentUri(); if (m_mode != Edit || !currentUri.startsWith("idm://")) { return isSwitch; } QString spaceName = currentUri.remove("idm:///").split('/').first(); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); if (!spaceName.isEmpty()) { QString conditions = getConditions(); QString defaultConditions = Peony::IDMDBusManager::getInstance()->getConditionsBySpaces(spaceName); if (conditions != defaultConditions) { isSwitch = false; handleEditConditionCancel(); } qDebug() << __func__ << m_mode << (conditions == defaultConditions); } return isSwitch; } void TabWidget::clearFilterMode() { m_mode = General; m_search_title->hide(); m_home_search->hide(); m_current_search->hide(); m_add_filter_button->hide(); m_space_cancel_button->hide(); m_space_ok_button->hide(); m_space_edit_button->show(); removeCondition(); clearConditions(); updateAdvanceShow(false); } QString TabWidget::elideTextAndToolTip(QFont font, int width, QString strInfo, Qt::TextElideMode mode, QWidget *widgt) { QFontMetrics fontMetrics(font); if (fontMetrics.horizontalAdvance(strInfo) > width) { widgt->setToolTip(strInfo); strInfo = QFontMetrics(font).elidedText(strInfo, mode, width); } return strInfo; } bool TabWidget::isDefaultSpaceCondition(const QString &defaultCondition) { QJsonDocument jsonDocument = QJsonDocument::fromJson(defaultCondition.toLocal8Bit().data()); QJsonObject rootObject = jsonDocument.object(); int conditionCount = rootObject["conditions count"].toInt(); QJsonArray labelsArray = rootObject["labels"].toArray(); qDebug() << __func__ << conditionCount << labelsArray; if (conditionCount == 0 && labelsArray.isEmpty()) { return true; } return false; } //void TabWidget void TabWidget::initAdvanceSearch() { //advance search bar QHBoxLayout *search = new QHBoxLayout(); m_search_bar_layout = search; // Maybe it is unused QToolBar *searchButtons = new QToolBar(this); m_search_bar = searchButtons; QLabel *title = new QLabel(tr("Location:"), this); m_search_title = title; title->setFixedWidth(TRASH_BUTTON_WIDTH); title->setFixedHeight(TRASH_BUTTON_HEIGHT); m_current_search = new QPushButton(this); // m_current_search->setFixedWidth(TRASH_BUTTON_WIDTH + 50); m_current_search->setFixedHeight(TRASH_BUTTON_HEIGHT); // QComboBox *searchTypeCommobox = new QComboBox(searchButtons); // m_search_type_box = searchTypeCommobox; // searchTypeCommobox->setFixedHeight(TRASH_BUTTON_HEIGHT); // searchTypeCommobox->setFixedWidth(TRASH_BUTTON_WIDTH * 3 + 15); // auto searchTypeModel = new QStringListModel(searchButtons); // searchTypeModel->setStringList(m_search_type_list); // searchTypeCommobox->setModel(searchTypeModel); // connect(searchTypeCommobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ // if (index > 0) { // //设置过滤关键字 // MainWindow *mainWindow = dynamic_cast(this->topLevelWidget()); // QString key = mainWindow->getLastSearchKey(); // qDebug() << __func__ << "key: " << key; // this->updateFilterContent(key); // } else { // bool searchIndex = isSearchIndex(); // if (!searchIndex) { // int ret = QMessageBox::question(nullptr, tr("Search Settings"), tr("After the creation of the index, " // "the next search can get the results of the document content containing the search term, " // "during which you can exit the page at any time, " // "we will continue to complete the creation in the background.")); // if (QMessageBox::Yes == ret) { // const QByteArray id(UKUI_SEARCH_SCHEMAS); // if (QGSettings::isSchemaInstalled(id)) { // QGSettings *searchSettings = new QGSettings(id, QByteArray(), this); // if (searchSettings && searchSettings->keys().contains(SEARCH_METHOD_KEY)) { // searchSettings->set(SEARCH_METHOD_KEY, true); // searchSettings->set("contentIndexEnable", true); // searchSettings->set("contentIndexEnableOcr", true); // } // } // } // m_search_type_box->setCurrentIndex(1); // } // //清除过滤关键字 // currentPage()->clearFileContentConditions(); // updateFilter(); // } // }); m_home_search = new QPushButton(tr("Computer"), this); // m_home_search->setFixedWidth(TRASH_BUTTON_WIDTH + 50); m_home_search->setFixedHeight(TRASH_BUTTON_HEIGHT); // m_home_search->setStyleSheet("border: 1px solid transparent;"); QString filterDisplay = tr("Filter"); m_add_filter_button = new QPushButton(QIcon::fromTheme("list-add-symbolic"), filterDisplay, this); m_add_filter_button->setCheckable(true); m_add_filter_button->setFixedHeight(TRASH_BUTTON_HEIGHT); m_add_filter_button->setFixedWidth(TRASH_BUTTON_WIDTH + 15); filterDisplay = this->elideTextAndToolTip(m_add_filter_button->font(), m_add_filter_button->width() - m_add_filter_button->iconSize().width() - PUSH_BUTTON_TOTAL_PADDING - 2, filterDisplay, Qt::ElideRight, m_add_filter_button); m_add_filter_button->setText(filterDisplay); connect(m_add_filter_button, &QPushButton::toggled, this, [=](bool checked){ if (checked) { if (m_search_filter_layout->count() == 1) { addCondition(); } updateAdvanceShow(true); //updateSearchFilterHeight(); } else { updateAdvanceShow(false); } }); m_saveas_space_button = new QPushButton(tr("Save as Space"), this); m_saveas_space_button->setProperty("isImportant", true); m_saveas_space_button->setChecked(true); m_saveas_space_button->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(m_saveas_space_button, &QPushButton::clicked, this, [=](){ QStringList allUris = currentPage()->getAllFileUris(); QStringList allPaths; for (auto uri : allUris) { QString decodeUri = Peony::FileUtils::urlDecode(uri); allPaths.append(decodeUri.remove("file://")); } allPaths.removeDuplicates(); MainWindow *mainWindow = dynamic_cast(this->topLevelWidget()); QString keyWord = mainWindow->getLastSearchKey(); QString conditions = getConditions(); qDebug() << "============" << conditions; QWidget *widget = QApplication::topLevelAt(QCursor::pos()); SpaceSaveDialog *dialog = new SpaceSaveDialog(allPaths, conditions, keyWord,widget); dialog->show(); }); m_space_cancel_button = new QPushButton(tr("Cancel"), this); m_space_cancel_button->setChecked(true); m_space_cancel_button->setFixedHeight(TRASH_BUTTON_HEIGHT); m_space_ok_button = new QPushButton(tr("Save"), this); m_space_ok_button->setChecked(true); m_space_ok_button->setFixedHeight(TRASH_BUTTON_HEIGHT); m_space_edit_button = new QPushButton(tr("Edit Conditiones"), this); m_space_edit_button->setProperty("isImportant", true); m_space_edit_button->setFixedHeight(TRASH_BUTTON_HEIGHT); //QWidget *m_filter_widget = new QWidget(this); m_filter_container = new QWidget(this); m_filter_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_filter_container->setContentsMargins(0, 0, 0, 6); //m_filter_widget->setFixedHeight(1000); // QHBoxLayout *filter_layout = new QHBoxLayout(m_filter_widget); // filter_layout->addWidget(m_filter_container); //m_filter_widget->setStyleSheet("background-color: #FF0000;"); m_file_label_model = FileLabelModel::getGlobalModel(); QList allLabels = m_file_label_model->getAllFileLabelItems(); m_search_filter_layout = new QVBoxLayout(this); m_search_filter_layout->setSpacing(2); m_search_filter_layout->setContentsMargins(0, 0, 0, 0); m_fitall_box = new QComboBox(); QStringList m_fit_all_list = {tr("Satisfy All Conditions")}; m_fitall_box->addItems(m_fit_all_list); m_fitall_box->setCurrentIndex(0); QWidget *rowWidget = new QWidget(this); QGridLayout *rowLayout = new QGridLayout(rowWidget); rowLayout->addWidget(m_fitall_box, 0, 0); rowWidget->setFixedHeight(TRASH_BUTTON_HEIGHT + 8); rowLayout->setAlignment(Qt::AlignTop); m_fitall_box->setMaximumWidth(200); m_fitall_box->setFixedHeight(TRASH_BUTTON_HEIGHT); // m_condition_label = new QLabel(tr("Condition")); // m_file_type_box = new Peony::MultiSelectComboBox(); // m_file_type_box->addItems(m_file_type_list); // m_file_type_box->setPlaceholderText(tr("File Type")); // m_file_mtime_box = new Peony::MultiSelectComboBox(); // m_file_mtime_box->addItems(m_file_mtime_list); // m_file_mtime_box->setPlaceholderText(tr("Modify time")); // m_file_size_box = new Peony::MultiSelectComboBox(); // m_file_size_box->addItems(m_file_size_list); // m_file_size_box->setPlaceholderText(tr("File Size")); // m_file_label_box = new Peony::MultiSelectComboBox(); // m_file_label_box->setPlaceholderText(tr("File Label")); // for (int i = 0; i < allLabels.size(); ++i) { // m_file_label_box->addItem(allLabels.at(i)->name(), false, 0, allLabels.at(i)->color()); // } // m_input_edit = new QLineEdit(); // m_input_edit->setFixedHeight(TRASH_BUTTON_HEIGHT); // m_input_edit->setFixedWidth(TRASH_BUTTON_WIDTH *4); // m_input_edit->setPlaceholderText(tr("Please input key words...")); // m_input_edit->setText(""); //m_input_edit->setTextMargins(0, 0, 20, 0); // m_conditions_clear_btn = new QPushButton(this); // m_conditions_clear_btn->setIcon(QIcon::fromTheme("edit-delete-symbolic")); // m_conditions_clear_btn->setFixedSize(TRASH_BUTTON_HEIGHT, TRASH_BUTTON_HEIGHT); // m_search_filter_layout->addWidget(m_condition_label); m_search_filter_layout->addWidget(rowWidget,0, Qt::AlignTop); // m_search_filter_layout->addWidget(m_file_type_box); // m_search_filter_layout->addWidget(m_file_mtime_box); // m_search_filter_layout->addWidget(m_file_size_box); // m_search_filter_layout->addWidget(m_file_label_box); // m_search_filter_layout->addWidget(m_input_edit); m_filter_container->setLayout(m_search_filter_layout); // connect(m_file_type_box, &Peony::MultiSelectComboBox::hidingPopup, this, &TabWidget::updateAdvanceConditions); // connect(m_file_mtime_box, &Peony::MultiSelectComboBox::hidingPopup, this, &TabWidget::updateAdvanceConditions); // connect(m_file_size_box, &Peony::MultiSelectComboBox::hidingPopup, this, &TabWidget::updateAdvanceConditions); // connect(m_file_label_box, &Peony::MultiSelectComboBox::hidingPopup, this, &TabWidget::updateAdvanceConditions); // connect(m_file_type_box, &Peony::MultiSelectComboBox::showingPopup, this, &TabWidget::updateMultiComboBoxCount); // connect(m_file_mtime_box, &Peony::MultiSelectComboBox::showingPopup, this, &TabWidget::updateMultiComboBoxCount); // connect(m_file_size_box, &Peony::MultiSelectComboBox::showingPopup, this, &TabWidget::updateMultiComboBoxCount); // connect(m_file_label_box, &Peony::MultiSelectComboBox::showingPopup, this, &TabWidget::updateMultiComboBoxCount); // connect(m_input_edit, &QLineEdit::textChanged, this, &TabWidget::updateAdvanceConditions); // connect(m_conditions_clear_btn, &QPushButton::clicked, this, [=](){ // for (int i = 0; i < m_conditions_list.size(); ++i) { // m_conditions_list.at(i)->uncheckAllItem(); // } // //m_file_label_box->uncheckAllItem(); // //m_input_edit->setText(""); // updateAdvanceConditions(); // }); // m_conditions_list.append(m_file_type_box); // m_conditions_list.append(m_file_size_box); // m_conditions_list.append(m_file_mtime_box); connect(m_home_search, &QPushButton::clicked, m_home_search, [=]() { qDebug() << "m_jumpToComputer m_home_search" << m_jumpToComputer; m_jumpToComputer = true; switchSearchPath(false); }); connect(m_current_search, &QPushButton::clicked, m_current_search, [=]() { m_jumpToComputer = false; switchSearchPath(true); qDebug() << "m_jumpToComputer" << m_jumpToComputer; if (!m_jumpToComputer) { browsePath(); } else { m_jumpToComputer = false; } }); connect(m_space_cancel_button, &QPushButton::clicked, this, [=](){ QString currentUri = getCurrentUri(); if (currentUri.startsWith("idm://") && currentUri != "idm:///") { QString spaceName = currentUri.remove("idm:///").split('/').first(); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); if (!spaceName.isEmpty()) { QString conditions = getConditions(); QString defaultConditions = Peony::IDMDBusManager::getInstance()->getConditionsBySpaces(spaceName); if (conditions != defaultConditions && !isDefaultSpaceCondition(defaultConditions)) { handleEditConditionCancel(); } qDebug() << __func__ << m_mode << (conditions == defaultConditions); } clearFilterMode(); } }); connect(m_space_ok_button, &QPushButton::clicked, this, [=](){ QString currentUri = getCurrentUri(); if (currentUri.startsWith("idm://") && currentUri != "idm:///") { QString spaceName = currentUri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); Peony::IDMDBusManager::getInstance()->editSpaceCondition(spaceName, getConditions(false)); clearFilterMode(); } }); connect(m_space_edit_button, &QPushButton::clicked, this, [=](){ m_mode = Edit; m_search_title->show(); m_home_search->setChecked(true); m_current_search->show(); m_space_edit_button->hide(); m_add_filter_button->setChecked(true); m_add_filter_button->show(); m_space_cancel_button->show(); m_space_ok_button->show(); m_filter_container->show(); updateConditionFormJson(); }); search->addWidget(title, 0, Qt::AlignLeft); search->addSpacing(2); search->addWidget(m_home_search, 0, Qt::AlignLeft); search->addSpacing(10); search->addWidget(m_current_search, 0, Qt::AlignLeft); search->addSpacing(10); search->addStretch(1); search->addWidget(searchButtons); search->addWidget(m_add_filter_button, 0, Qt::AlignRight); search->addSpacing(10); search->addWidget(m_space_edit_button, 0, Qt::AlignRight); search->addWidget(m_saveas_space_button, 0, Qt::AlignRight); search->addWidget(m_space_cancel_button, 0, Qt::AlignRight); search->addSpacing(10); search->addWidget(m_space_ok_button, 0, Qt::AlignRight); search->setContentsMargins(10, 0, 16, 0); searchButtons->setVisible(false); title->setVisible(false); m_current_search->setVisible(false); m_home_search->setVisible(false); m_add_filter_button->setVisible(false); m_saveas_space_button->setVisible(false); m_space_cancel_button->setVisible(false); m_space_ok_button->setVisible(false); m_space_edit_button->setVisible(false); addCondition(); updateAdvanceShow(false); } //search conditions changed, update filter void TabWidget::searchUpdate() { qDebug() <<"searchUpdate:" <searchRecursiveChanged(m_search_child_flag); } void TabWidget::browsePath() { // use window modal dialog, fix #56549 QFileDialog f(this->topLevelWidget()); f.setStyle(nullptr); f.setWindowTitle(tr("Select Path")); f.setDirectoryUrl(QUrl("")); f.setWindowModality(Qt::WindowModal); f.setAcceptMode(QFileDialog::AcceptOpen); f.setOption(QFileDialog::ShowDirsOnly); f.setFileMode(QFileDialog::Directory); f.setFilter(QDir::System|QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); auto result = f.exec(); if (result != QDialog::Accepted) { return; } //Gets the URI of the selected directory. link bug#92521 QList urls = f.selectedUrls(); if(urls.isEmpty()){ return; } QString target_path = urls.at(0).toString(); // QString target_path = f.directoryUrl().toString(); // QString target_path = QFileDialog::getExistingDirectory(this, tr("Select path"), getCurrentUri(), QFileDialog::ShowDirsOnly); qDebug()<<"browsePath Opened:"<(this->topLevelWidget()); QString key=mainWindow->getLastSearchKey(); Q_EMIT this->updateSearch(target_path,key); } } void TabWidget::updateStatusBarSliderState() { if (currentPage() && currentPage()->getView()) { if (m_isTabletMode) { m_status_bar->m_slider->setVisible(false); } else { bool enable = currentPage()->getView()->supportZoom(); m_status_bar->m_slider->setEnabled(enable); m_status_bar->m_slider->setVisible(enable); } } } void TabWidget::updateTrashBarVisible(const QString &uri) { bool visible = false; m_trash_bar_layout->setContentsMargins(10, 0, 10, 0); if (uri.indexOf("trash:///") >= 0) { visible = true; m_trash_bar_layout->setContentsMargins(10, 5, 10, 5); } m_trash_bar->setVisible(visible); m_trash_label->setVisible(visible); m_clear_button->setVisible(visible); m_recover_button->setVisible(visible); } void TabWidget::handleZoomLevel(int zoomLevel) { if (!currentPage()) { return; } if (!currentPage()->getView()) { return; } currentPage()->getView()->clearIndexWidget(); int currentViewZoomLevel = currentPage()->getView()->currentZoomLevel(); int currentViewMimZoomLevel = currentPage()->getView()->minimumZoomLevel(); int currentViewMaxZoomLevel = currentPage()->getView()->maximumZoomLevel(); if (zoomLevel == currentViewZoomLevel) { return; } // save default zoom level Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ZOOM_LEVEL, zoomLevel); if (zoomLevel <= currentViewMaxZoomLevel && zoomLevel >= currentViewMimZoomLevel) { currentPage()->getView()->setCurrentZoomLevel(zoomLevel); } else { //check which view to switch. auto directoryViewManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto viewId = directoryViewManager->getDefaultViewId(zoomLevel, getCurrentUri()); switchViewType(viewId); currentPage()->getView()->setCurrentZoomLevel(zoomLevel); } } #include"windows/FMWindowIface.h" #include void TabWidget::slot_responseUnmounted(const QString &destUri, const QString &sourceUri) { for(int index = 0; index < m_stack->count(); index++) { int currentIndex = this->currentIndex(); QString decodedSrcUri = Peony::FileUtils::urlDecode(sourceUri); QString uri = qobject_cast(m_stack->widget(index))->getCurrentUri(); uri = Peony::FileUtils::urlDecode(uri); qDebug()<<"decodedSrcUri:"<count()<<" index:"<getValue("LAST_FOCUS_PEONY_WINID") == dynamic_cast(this->topLevelWidget())->winId() // ||KWindowSystem::hasWId(dynamic_cast(this->topLevelWidget())->winId()) ||QApplication::topLevelWidgets().contains(this->topLevelWidget())) && index == currentIndex){ qDebug()<<"sourceUri:"<goToUri("filesafe:///", true, true); /* 跳转到文件保护箱路径 */ else this->goToUri(destUri, true, true);/* 跳转到计算机页 */ } else{/* 其余tab页关闭 */ qDebug()<<"remove tab uri:"<setCurrentIndex(0); // } else { // m_search_type_box->setCurrentIndex(1); // } } void TabWidget::updateFilterContent(const QString &key) { if(!currentPage()) return; currentPage()->clearFileContentConditions(); if (m_search_rules_currentIndex) { currentPage()->addFileContentFilter(key); } updateFilter(); } bool TabWidget::isSearchIndex() { bool isSearchIndex = false; const QByteArray id(UKUI_SEARCH_SCHEMAS); if (QGSettings::isSchemaInstalled(id)) { QGSettings *searchSettings = new QGSettings(id, QByteArray(), this); if (searchSettings && searchSettings->keys().contains(SEARCH_METHOD_KEY)) { isSearchIndex = searchSettings->get(SEARCH_METHOD_KEY).toBool(); } } return isSearchIndex; } void TabWidget::setMutipleLabelConditions(QStringList names, QList colors) { if(!currentPage()) return; currentPage()->setMutipleLabelConditions(names, colors); } void TabWidget::updateMultiComboBoxCount() { if (!currentPage()) return; currentPage()->recalculateAllCounts(); // QMap fileTypeMap = currentPage()->getFileTypeCount(); // for (int i = 0; i < m_file_type_box->count(); ++i) { // m_file_type_box->setCountFromItemIndex(i, fileTypeMap.value(i + 1)); // } // QMap fileModifyTimeMap = currentPage()->getFileModifyTimeCount(); // for (int i = 0; i < m_file_mtime_box->count(); ++i) { // m_file_mtime_box->setCountFromItemIndex(i, fileModifyTimeMap.value(i + 1)); // } // QMap fileSizeMap = currentPage()->getFileSizeCount(); // for (int i = 0; i < m_file_size_box->count(); ++i) { // m_file_size_box->setCountFromItemIndex(i, fileSizeMap.value(i + 1)); // } // QMap fileLabelMap = currentPage()->getFileLabelCount(); // for (int i = 0; i < m_file_label_box->count(); ++i) { // m_file_label_box->setCountFromItemIndex(i, fileLabelMap.value(i)); // } } void TabWidget::clearAllMapsCount() { if(!currentPage()) return; currentPage()->clearAllMapsCount(); updateFilter(); } void TabWidget::clearFileContentConditions() { if(!currentPage()) return; currentPage()->clearFileContentConditions(); } void TabWidget::updateSearchBar(bool showSearch) { qDebug() << "updateSearchBar:" <property("tabletMode").toBool()) { m_search_title->show(); m_search_bar->show(); m_current_search->show(); m_home_search->show(); m_add_filter_button->show(); m_saveas_space_button->show(); m_space_edit_button->hide(); m_space_cancel_button->hide(); m_space_ok_button->hide(); m_search_bar_layout->setContentsMargins(10, 5, 10, 5); updateSearchPathButton(getCurrentUri()); if (m_jumpToComputer) { switchSearchPath(false); } else { switchSearchPath(true); } //m_search_type_box->show(); updateSearchTypeShow(); // if (m_search_filter_layout->count() == 1) { // addCondition(); // } } else { m_search_title->hide(); m_search_bar->hide(); m_current_search->hide(); m_home_search->hide(); m_saveas_space_button->hide(); m_space_edit_button->hide(); m_space_cancel_button->hide(); m_space_ok_button->hide(); m_add_filter_button->setChecked(false); m_add_filter_button->hide(); m_jumpToComputer = false; m_search_bar_layout->setContentsMargins(10, 0, 10, 0); updateAdvanceShow(false); } if (! showSearch) { //exit advance search, clear search conditions clearConditions(); clearFileContentConditions(); updateFilter(); /** * @bug #242210: [File Manager] Enter the folder and click search, switch the search directory, * repeat the second time you can not switch the search directory. * * Closing the search without resetting MainWindow's m_last_search_path * to null prevents the search from being performed * * @author: Renyg * @date: %{CurrentDate::yyyy-MM-dd} */ MainWindow *mainWindow = dynamic_cast(this->topLevelWidget()); if(mainWindow) { mainWindow->clearLastSearchPath(); } } //9X0 changes, set default as true, fix bug#70916 //enableSearchBar(true); } void TabWidget::updateCurrentSearchPath() { QString currentUri = getCurrentUri(); if (!currentUri.endsWith("///")) { GFile* file = g_file_new_for_uri(currentUri.toStdString().c_str()); currentUri = g_file_peek_path (file); QString displayName = currentUri.right(currentUri.count() - currentUri.lastIndexOf("/") - 1); m_current_search->setText(displayName); m_current_search->adjustSize(); g_object_unref(file); } else { QString displayName = currentUri.left(currentUri.indexOf(":")); m_current_search->setText(displayName); m_current_search->adjustSize(); } } void TabWidget::switchSearchPath(bool isCurrent) { if (isCurrent) { m_home_search->setFlat(true); m_current_search->setFlat(false); // m_home_search->setStyleSheet("border: 1px solid transparent;"); // m_current_search->setStyleSheet("border: 1px solid transparent;" // "border-bottom: 1px solid gray;"); Q_EMIT this->globalSearch(false); // searchChildUpdate(false); } else { m_home_search->setFlat(false); m_current_search->setFlat(true); //m_current_search->setStyleSheet("border: 1px solid transparent;"); // m_home_search->setStyleSheet("border: 1px solid transparent;" // "border-bottom: 1px solid gray;"); Q_EMIT this->globalSearch(true); // searchChildUpdate(true); } } void TabWidget::updateSearchPathButton(const QString &uri) { QString curUri = uri; if (uri.startsWith("search:///")) { // Extract the actual path from the search URI curUri = Peony::SearchVFSUriParser::getSearchUriPath(uri); } else if (uri.isEmpty()) { curUri = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (!getCurrentUri().isNull()) { curUri = getCurrentUri(); } } // Update file information auto info = Peony::FileInfo::fromUri(curUri); //m_search_button_info = info; if (info.get()->isEmptyInfo()) { Peony::FileInfoJob j(info); j.querySync(); } // Get the current display name auto displayName = Peony::FileUtils::getFileDisplayName(curUri); if (displayName.contains("&")) { displayName = Peony::FileUtils::handleSpecialSymbols(displayName); } // Check if updates are needed QString currentRealDisplayName = m_current_search->property("realDisplayName").toString(); qDebug() << "curUri: " << curUri << " displayName: " << displayName << " currentRealDisplayName: " << currentRealDisplayName; if (currentRealDisplayName == displayName) { // If the display name has not changed, return directly return; } //elide text if it is too long, Use ElideMiddle mode to design //related bug#155126, #185743 m_current_search->setProperty("realDisplayName", displayName); // if (curUri.startsWith("idm://") && curUri != "idm:///") { // if (!m_jumpToComputer) { // QString spaceName = curUri.remove("idm:///"); // displayName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); // } // } QString elidedDisplayName = fontMetrics().elidedText(displayName, Qt::ElideMiddle, /*m_current_search->width()*/200 - m_search_bar->iconSize().width() - PUSH_BUTTON_TOTAL_PADDING); m_current_search->setText(elidedDisplayName); m_current_search->adjustSize(); if (elidedDisplayName != displayName) { QFont font = m_current_search->font(); displayName = Peony::FileUtils::wrapTextForTooltip(displayName,QCursor::pos(),font); m_current_search->setToolTip(displayName); } else { m_current_search->setToolTip(""); } } Peony::DirectoryViewContainer *TabWidget::currentPage() { return qobject_cast(m_stack->currentWidget()); } const QString TabWidget::getCurrentUri() { if (!currentPage()) return nullptr; return currentPage()->getCurrentUri(); } const QStringList TabWidget::getCurrentSelections() { if (!currentPage()) return QStringList(); return currentPage()->getCurrentSelections(); } const int TabWidget::getCurrentRowcount() { return currentPage()->getCurrentRowcount(); } const QStringList TabWidget::getAllFileUris() { if (!currentPage()) return QStringList(); return currentPage()->getAllFileUris(); } const int TabWidget::getAllDisplayFileCount() { if (!currentPage() || !currentPage()->getView()) return 0; int count = 0; auto iface = Peony::DirectoryViewHelper::globalInstance()->getViewIface2ByDirectoryViewWidget(currentPage()->getView()); if(iface) count = iface->getAllDisplayFileCount(); return count; } const QStringList TabWidget::getBackList() { if (!currentPage()) return QStringList(); return currentPage()->getBackList(); } const QStringList TabWidget::getForwardList() { if (!currentPage()) return QStringList(); return currentPage()->getForwardList(); } bool TabWidget::canGoBack() { if (!currentPage()) return false; return currentPage()->canGoBack(); } bool TabWidget::canGoForward() { if (!currentPage()) return false; return currentPage()->canGoForward(); } bool TabWidget::canCdUp() { if (!currentPage()) return false; return currentPage()->canCdUp(); } int TabWidget::getSortType() { //fix switch to computer view and back change to default sort issue, link to bug#92261 auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortType = settings->isExist(SORT_COLUMN)? settings->getValue(SORT_COLUMN).toInt() : 0; if (getCurrentUri() != "trash:///" && sortType == 4) { sortType = 0; } if(!getCurrentUri().startsWith("idm:///") && sortType >= 7){ sortType = 0; } return sortType; } else { auto metaInfo = Peony::FileMetaInfo::fromUri(getCurrentUri()); if (!metaInfo) { qWarning()<<"no meta info"<getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; QString currentUri = getCurrentUri(); if (currentUri.startsWith("idm://")) { QString spaceName = currentUri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); QVariantHash config = Peony::IDMDBusManager::getInstance()->getSpacesSortConfig(spaceName); sortType = config.value("sortType").toInt(); qDebug() << __func__ << currentUri << sortType; } return sortType; } // if (!currentPage()) // return 0; // return currentPage()->getSortType(); } Qt::SortOrder TabWidget::getSortOrder() { //fix switch to computer view and back change to default sort issue, link to bug#92261 auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortOrder = settings->isExist(SORT_ORDER)? settings->getValue(SORT_ORDER).toInt() : 1; return Qt::SortOrder(sortOrder); } else { auto metaInfo = Peony::FileMetaInfo::fromUri(getCurrentUri()); if (!metaInfo) { qWarning()<<"no meta info"<getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; QString currentUri = getCurrentUri(); if (currentUri.startsWith("idm://")) { QString spaceName = currentUri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); QVariantHash config = Peony::IDMDBusManager::getInstance()->getSpacesSortConfig(spaceName); sortOrder = config.value("sortOrder").toInt(); } return Qt::SortOrder(sortOrder); } // if (!currentPage()) // return Qt::AscendingOrder; // return currentPage()->getSortOrder(); } bool TabWidget::eventFilter(QObject *obj, QEvent *e) { if (e->type() == QEvent::Resize) { updateStatusBarGeometry(); } return false; } void TabWidget::setCurrentIndex(int index) { m_tab_bar->setCurrentIndex(index); m_stack->setCurrentIndex(index); } void TabWidget::setPreviewPage(Peony::PreviewPageIface *previewPage) { bool visible = false; auto previewPageWidget = dynamic_cast(previewPage); if (previewPageWidget) visible = true; if (m_preview_page) { m_preview_page_container->removeWidget(m_preview_page_container->widget(0)); m_preview_page->closePreviewPage(); } m_preview_page = previewPage; if (m_preview_page) { previewPageWidget->setParent(m_preview_page_container); m_preview_page_container->addWidget(previewPageWidget); updatePreviewPage(); } m_preview_page_container->blockSignals(!visible); m_preview_page_container->setVisible(visible); this->topLevelWidget()->setProperty("isPreviewMode", visible); } void TabWidget::addPage(const QString &uri, bool jumpTo) { setCursor(QCursor(Qt::WaitCursor)); auto info = Peony::FileInfo::fromUri(uri); auto infoJob = new Peony::FileInfoJob(info); //infoJob->setAutoDelete(); connect(infoJob, &Peony::FileInfoJob::queryAsyncFinished, this, [=](){ infoJob->deleteLater(); QString rootDir = info.get()->uri(); if (info.get()->uri().startsWith("file:///") && !info.get()->isDir()) { rootDir = Peony::FileUtils::getParentUri(rootDir); } auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(rootDir); //enumerator->setAutoDelete(); connect(enumerator, &Peony::FileEnumerator::cancelled, this, [=](){ if (!currentPage()) { QTimer::singleShot(100, topLevelWidget(), &QWidget::close); }else{ this->refresh(); } enumerator->deleteLater(); }); connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (critical) { if (G_IO_ERROR_NOT_FOUND == err->code() || G_IO_ERROR_EXISTS == err->code()) { QMessageBox::warning(nullptr, tr("Warning"), err->message()); } else { QMessageBox::critical(nullptr, tr("Error"), err->message()); } //QMessageBox::critical(0, 0, err.get()->message()); setCursor(QCursor(Qt::ArrowCursor)); // if there is no active page, window should be closed to avoid crash. link to: #48031 if (!currentPage()) { this->topLevelWidget()->close(); } enumerator->deleteLater(); return; } auto viewContainer = new Peony::DirectoryViewContainer(m_stack); viewContainer->setProperty("statusBarHeight", qApp->fontMetrics().height() + 10); bool hasCurrentPage = currentPage(); bool hasView = false; if (hasCurrentPage) hasView = currentPage()->getView(); int zoomLevel = -1; if (hasCurrentPage) { // perfer to use current page view type auto internalViews = Peony::DirectoryViewFactoryManager2::getInstance()->internalViews(); //fix continuously click add button quickly crash issue, bug #41425 if (hasView && internalViews.contains(currentPage()->getView()->viewId())) viewContainer->switchViewType(currentPage()->getView()->viewId()); if (hasView && hasCurrentPage) { hasCurrentPage = true; zoomLevel = currentPage()->getView()->currentZoomLevel(); } } else { viewContainer->switchViewType(Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ID).toString()); } viewContainer->setMinimumWidth(520); m_stack->addWidget(viewContainer); if (jumpTo) { m_stack->setCurrentWidget(viewContainer); } //process open symbolic link auto realUri = uri; if (info->isSymbolLink() && info->symlinkTarget().length() >0 && uri.startsWith("file://")) { realUri = "file://" + info->symlinkTarget(); } else if (!info->isDir() && !realUri.startsWith("smb://") && !realUri.startsWith("label://") ) { realUri = Peony::FileUtils::getParentUri(uri); } //Fix bug#132638, special # character use in symbolic link open fail issue if (realUri.contains("\#") && ! realUri.startsWith("filesafe:///") && !realUri.startsWith("search:///")) realUri = Peony::FileUtils::urlEncode(realUri); // fix #174653 if (realUri.isEmpty()) { realUri = "file:///"; } if (!t.isEmpty()) { realUri = t; } //m_stack->addWidget(viewContainer); viewContainer->goToUri(realUri, false, true); if (!info->isDir() && Peony::FileUtils::isFileExsit(uri)) { QTimer::singleShot(500, [=] { viewContainer->getView()->setSelections(QStringList() << uri); }); } bindContainerSignal(viewContainer); updateTrashBarVisible(uri); if (zoomLevel > 0) viewContainer->getView()->setCurrentZoomLevel(zoomLevel); else viewContainer->getView()->setCurrentZoomLevel(Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ZOOM_LEVEL).toInt()); //auto viewContainer = new Peony::DirectoryViewContainer(m_stack); auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortType = settings->isExist(SORT_COLUMN)? settings->getValue(SORT_COLUMN).toInt(): 0; auto sortOrder = settings->isExist(SORT_ORDER)? settings->getValue(SORT_ORDER).toInt(): 1; viewContainer->setSortType(Peony::FileItemModel::ColumnType(sortType)); viewContainer->setSortOrder(Qt::SortOrder(sortOrder)); } else { auto metaInfo = Peony::FileMetaInfo::fromUri(uri); auto sortType = metaInfo->getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; auto sortOrder = metaInfo->getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; if (uri.startsWith("idm:///")) { QString spaceName = uri.mid(7); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); sortType = Peony::IDMDBusManager::getInstance()->getSpacesSortType(spaceName); sortOrder = Peony::IDMDBusManager::getInstance()->getSpacesSortOrder(spaceName); } viewContainer->setSortType(Peony::FileItemModel::ColumnType(sortType)); viewContainer->setSortOrder(Qt::SortOrder(sortOrder)); } m_tab_bar->addPage(realUri, jumpTo); updateTabAllPages(); updateTabBarGeometry(); enumerator->deleteLater(); }); enumerator->prepare(); }); infoJob->queryAsync(); } void TabWidget::goToUri(const QString &uri, bool addHistory, bool forceUpdate) { if (!currentPage()) { // do not trigger go to uri if there is no active page, avoid crash. link to: #45684 return; } qDebug() << "goToUri:" << uri; currentPage()->goToUri(uri, addHistory, forceUpdate); m_tab_bar->updateLocation(m_tab_bar->currentIndex(), uri); updateTrashBarVisible(uri); updatePreviewPage(); } void TabWidget::updateTabPageTitle() { qDebug() << "updateTabPageTitle:" < &volume){ // refresh(); // }); // connect(vm,&Peony::VolumeManager::volumeAdded,this,[=](const std::shared_ptr &volume){ // refresh(); // }); // } m_tab_bar->updateLocation(m_tab_bar->currentIndex(), getCurrentUri().toLocal8Bit()); //m_tab_bar->updateLocation(m_tab_bar->currentIndex(), QUrl::fromPercentEncoding(getCurrentUri().toLocal8Bit())); updateTrashBarVisible(getCurrentUri()); updateStatusBarSliderState(); } void TabWidget::switchViewType(const QString &viewId) { if(!currentPage()||!(currentPage()->getView())) return; if (currentPage()->getView()->viewId() == viewId) return; currentPage()->switchViewType(viewId); // change default view id auto factoryManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto internalViews = factoryManager->internalViews(); if (internalViews.contains(viewId)) Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ID, viewId); bool supportZoom = this->currentPage()->getView()->supportZoom(); this->m_status_bar->m_slider->setEnabled(this->currentPage()->getView()->supportZoom()); } void TabWidget::goBack() { if(!currentPage()) return; currentPage()->goBack(); } void TabWidget::goForward() { if(!currentPage()) return; currentPage()->goForward(); } void TabWidget::cdUp() { if(!currentPage()) return; currentPage()->cdUp(); } void TabWidget::refresh() { if(!currentPage()) return; currentPage()->refresh(); } void TabWidget::stopLoading() { if(!currentPage()) return; currentPage()->stopLoading(); } void TabWidget::tryJump(int index) { if(!currentPage()) return; currentPage()->tryJump(index); } void TabWidget::clearHistory() { if(!currentPage()) return; currentPage()->clearHistory(); } void TabWidget::setSortType(int type) { if(!currentPage()) return; currentPage()->setSortType(Peony::FileItemModel::ColumnType(type)); } void TabWidget::setSortOrder(Qt::SortOrder order) { if(!currentPage()) return; currentPage()->setSortOrder(order); } void TabWidget::setSortFilter(int FileTypeIndex, int FileMTimeIndex, int FileSizeIndex) { if(!currentPage()) return; currentPage()->setSortFilter(FileTypeIndex, FileMTimeIndex, FileSizeIndex); } void TabWidget::setShowHidden(bool showHidden) { if(!currentPage()) return; currentPage()->setShowHidden(showHidden); } void TabWidget::setUseDefaultNameSortOrder(bool use) { if(!currentPage()) return; currentPage()->setUseDefaultNameSortOrder(use); } void TabWidget::setSortFolderFirst(bool folderFirst) { if(!currentPage()) return; currentPage()->setSortFolderFirst(folderFirst); } void TabWidget::addFilterCondition(int option, int classify, bool updateNow) { if(!currentPage()) return; currentPage()->addFilterCondition(option, classify, updateNow); } void TabWidget::removeFilterCondition(int option, int classify, bool updateNow) { if(!currentPage()) return; currentPage()->removeFilterCondition(option, classify, updateNow); } void TabWidget::clearConditions() { if(!currentPage()) return; currentPage()->clearConditions(); } void TabWidget::updateTabAllPages() { m_model->clear(); auto uris = m_tab_bar->getCurrentUris(); for(int i = 0; i < uris.size(); ++i) { auto uri = uris.at(i); QList items1; QStandardItem *item1 = new QStandardItem; QStandardItem *item2 = new QStandardItem(QIcon::fromTheme("window-close-symbolic"),""); item1->setIcon(QIcon::fromTheme(Peony::FileUtils::getFileIconName(uri))); item1->setText(Peony::FileUtils::getFileDisplayName(uri)); items1.append(item1); items1.append(item2); m_model->appendRow(items1); } if (m_treeView) { delete m_treeView; } m_treeView = new QTreeView(this); m_treeView->setWindowFlag(Qt::Popup); m_treeView->move(m_show_page_button->x(), m_tab_bar->sizeHint().height()); m_treeView->setHeaderHidden(true); m_treeView->header()->setStretchLastSection(true); m_treeView->header()->setSectionResizeMode(QHeaderView::Fixed); m_treeView->header()->setMinimumSectionSize(2); m_treeView->setSelectionBehavior(QTreeView::SelectRows); m_treeView->setEditTriggers(QTreeView::NoEditTriggers); m_treeView->setAttribute(Qt::WA_TranslucentBackground); m_treeView->setFrameStyle(QFrame::Sunken); m_treeView->setIndentation(0); m_treeView->setModel(m_model); m_treeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_treeView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // m_treeView->setViewportMargins(0,0,0,0); m_treeView->setContentsMargins(0,0,0,0); m_treeView->verticalScrollBar()->move(m_treeView->width() - m_treeView->verticalScrollBar()->width(), 0); int rowCount = m_model->rowCount(); int rowHeight = m_treeView->model()->rowCount() > 0 ? m_treeView->sizeHintForRow(0) : 36; if (rowHeight > 0) { int headerHeight = m_treeView->header()->isVisible() ? m_treeView->header()->height() : 0; int padding = 4; int totalHeight = rowCount * rowHeight + headerHeight + padding; int maxVisibleRows = 20; int maxHeight = maxVisibleRows * rowHeight + headerHeight + padding; // m_treeView->resize(m_treeView->width(), (qMin(totalHeight,maxHeight))); m_treeView->setFixedWidth(192); m_treeView->setFixedHeight(qMin(totalHeight,maxHeight)); } else { m_treeView->setFixedHeight(360); } m_treeView->header()->resizeSection(0, 152); m_treeView->header()->resizeSection(1, 20); } void TabWidget::updateFilter() { if(!currentPage()) return; currentPage()->updateFilter(); m_status_bar->update(); } void TabWidget::updateAdvanceConditions() { clearConditions(); int count = m_search_filter_layout->count(); if(count <= 1) return; for (int i = 1; i < count; ++i) { QLayoutItem *item = m_search_filter_layout->itemAt(i); auto widget = item->widget(); QGridLayout *rowLayout = static_cast(widget->layout()); auto typecombobox = rowLayout->itemAtPosition(0, 0)->widget(); int type = static_cast(typecombobox)->currentIndex(); if(type + 1 == FileName) continue; auto selectcombobox = rowLayout->itemAtPosition(0, 2)->widget(); int select = static_cast(selectcombobox)->currentIndex(); addFilterCondition(type, select); // QList selectIndexs = m_conditions_list.at(i)->getSelectItemsIndex(); // if (!selectIndexs.isEmpty()) { // for (int j = 0; j < selectIndexs.size(); j++) { // addFilterCondition(i, selectIndexs.at(j) + 1); // } // } } // QStringList selectTexts = m_file_label_box->getSelectItemsText(); // if (!selectTexts.isEmpty()) { // QList colors; // for (auto text : selectTexts) { // QColor tmpColor = FileLabelModel::getGlobalModel()->getLableColorFromLabelName(text); // if (tmpColor != Qt::transparent) { // colors.append(tmpColor); // } // } // setMutipleLabelConditions(selectTexts, colors); // } for(auto key : m_input_edit_keyList) { if(!currentPage()) continue; if (key != "") currentPage()->addFileNameFilter(key); } updateFilter(); } void TabWidget::setCurrentSelections(const QStringList &uris) { if (!currentPage() || !currentPage()->getView()) { qWarning()<<"can not set current selection, current page is invalid. maybe not ready?"; return; } currentPage()->getView()->setSelections(uris); if (uris.count() >0) currentPage()->getView()->scrollToSelection(uris.first()); } void TabWidget::editUri(const QString &uri) { currentPage()->getView()->editUri(uri); } void TabWidget::editUris(const QStringList &uris) { currentPage()->getView()->editUris(uris); } void TabWidget::onViewDoubleClicked(const QString &uri) { qDebug()<<"tab widget double clicked"<findFileInfoByUri(uri); if (!info) { info = Peony::FileInfo::fromUri(uri); } #ifdef MULTI_DISABLE if (isMultFile(info)) { qDebug() << "Mult video or audio file, do not open"; QMessageBox::warning(nullptr, "", tr("Opening such files is not currently supported"));//暂时不支持打开此类文件 return; } #endif if (info->uri().startsWith("trash://")) { QMainWindow *w = Peony::PropertiesWindowFactoryPluginManager::getInstance()->create(QStringList()<show(); Peony::PropertiesWindowFactoryPluginManager::getInstance()->show(); return; } if (info->isDir() || info->isVolume() || info->isVirtual()) { if(info->uri().startsWith("file://") && !info->canExecute()){ QMessageBox::critical(m_parent, tr("Open failed"), tr("Open directory failed, you have no permission!")); return; } bool check = Peony::GlobalSettings::getInstance()->getValue(SHOW_IN_NEW_WINDOW).toBool(); if (check && info->isDir()) { //task#147390 新建窗口来打开文件夹 auto window = dynamic_cast(this->topLevelWidget()); auto newWindow = dynamic_cast(window->create(uri)); newWindow->show(); } else { Q_EMIT this->updateWindowLocationRequest(uri, true); } } else if (IMAGE_MOUNT_MANAGER->isImageFile(uri)) { IMAGE_MOUNT_MANAGER->mountImage(uri); } else { Peony::FileLaunchManager::openAsync(uri, false, false); } } void TabWidget::changeCurrentIndex(int index) { //fix bug#291259, when index is -1 crash issue if (index < 0 || index >= m_tab_bar->getCurrentUris().count()) { return; } m_tab_bar->setCurrentIndex(index); m_stack->setCurrentIndex(index); QString uri = m_tab_bar->getCurrentUris().at(index); /** * @bug #292259: Various abnormal phenomena that occur when switching tabs in search mode * * separate handling of tab switching scenarios that deal with search states * * @author: Renyg * @date: 2025-01-06 */ bool isSearching = uri.startsWith("search:///"); QString searchKey; if (isSearching) { searchKey = Peony::SearchVFSUriParser::getSearchUriNameRegexp(uri); // emit a signal to update the search status of HeaderBar Q_EMIT searchStateChanged(isSearching, searchKey); } else { closeSearch(); } Q_EMIT currentIndexChanged(index); Q_EMIT activePageChanged(); } int TabWidget::count() { return m_stack->count(); } int TabWidget::currentIndex() { return m_stack->currentIndex(); } void TabWidget::moveTab(int from, int to) { auto w = m_stack->widget(from); if (!w) return; m_stack->removeWidget(w); m_stack->insertWidget(to, w); Q_EMIT tabMoved(from, to); } void TabWidget::removeTab(int index) { auto widget = m_stack->widget(index); m_stack->removeWidget(widget); widget->deleteLater(); m_tab_bar->removeTab(index); // m_tab_bar->removeTabUris(index); if (m_model) { m_model->removeRow(index); } if (m_stack->count() > 0) Q_EMIT activePageChanged(); } #include void TabWidget::bindContainerSignal(Peony::DirectoryViewContainer *container) { connect(container, &Peony::DirectoryViewContainer::signal_responseUnmounted, this,&TabWidget::slot_responseUnmounted); connect(container, &Peony::DirectoryViewContainer::updateWindowLocationRequest, this, &TabWidget::updateWindowLocationRequest); connect(container, &Peony::DirectoryViewContainer::directoryChanged, this, &TabWidget::activePageLocationChanged); connect(container, &Peony::DirectoryViewContainer::selectionChanged, this, &TabWidget::activePageSelectionChanged); connect(container, &Peony::DirectoryViewContainer::viewTypeChanged, this, &TabWidget::activePageViewTypeChanged); connect(container, &Peony::DirectoryViewContainer::viewDoubleClicked, this, &TabWidget::onViewDoubleClicked); connect(container, &Peony::DirectoryViewContainer::menuRequest, this, &TabWidget::menuRequest); connect(container, &Peony::DirectoryViewContainer::zoomRequest, this, &TabWidget::zoomRequest); connect(container, &Peony::DirectoryViewContainer::setZoomLevelRequest, m_status_bar, &TabStatusBar::updateZoomLevelState); connect(container, &Peony::DirectoryViewContainer::updateStatusBarSliderStateRequest, this, [=]() { this->updateStatusBarSliderState(); }); connect(container, &Peony::DirectoryViewContainer::updateWindowSelectionRequest, this, [=](const QStringList &uris){ if (container == currentPage()) { Q_EMIT this->updateWindowSelectionRequest(uris); } }); connect(container, &Peony::DirectoryViewContainer::signal_itemAdded, this, [=](const QString& uri){ if (container == currentPage()) Q_EMIT this->signal_itemAdded(uri); }); connect(container, &Peony::DirectoryViewContainer::statusBarChanged, this, [=](){ m_status_bar->update(); }); connect(container, &Peony::DirectoryViewContainer::signal_updateTabPageTitle, this, [=](const QString& uri){ for(int index = 0; index < m_stack->count(); index++){ if(uri.startsWith("label:///") && uri == m_tab_bar->tabData(index).toString()){ m_tab_bar->updateLocation(index, uri.toLocal8Bit()); } } }); connect(container, &Peony::DirectoryViewContainer::signal_updateLocationBar, this, [=](const QString& uri){ auto mainWindow = dynamic_cast(this->topLevelWidget()); for(int index = 0; index < m_stack->count(); index++){ if(uri.startsWith("label:///") && uri == m_tab_bar->tabData(index).toString()){ mainWindow->updateHeaderBar(); } } }); } void TabWidget::updatePreviewPage() { if (!m_preview_page) return; auto selection = getCurrentSelections(); m_preview_page->cancel(); if (selection.isEmpty()) return ; m_preview_page->prepare(selection.first()); m_preview_page->startPreview(); } void TabWidget::resizeEvent(QResizeEvent *e) { QMainWindow::resizeEvent(e); updateTabBarGeometry(); //updateStatusBarGeometry(); //updateSearchFilterHeight(); } void TabWidget::updateTabBarGeometry() { //204 = 48 * 4 + 12 4个按钮每个48px,相互间隔4px //168 + 12 = 180 quint32 windowButtonsWidth = 180; if (Peony::GlobalSettings::getInstance()->getProjectName() == V10_SP1_EDU) { //windowButtonsWidth -= 52; //cherry-pick commit:339dbaf18b9555d274e69c0589a755457e3f555b, 为解决冲突加入的下一行 windowButtonsWidth = 148; } //更新添加控件的位置 int addPageX = 0; int tabBarWidth = 0; if (m_tab_bar->sizeHint().width() + 2 > this->width() - m_add_page_button->width() - windowButtonsWidth) { tabBarWidth = this->width() - m_add_page_button->width() - windowButtonsWidth; addPageX = this->width() - m_add_page_button->width() - windowButtonsWidth; } else { tabBarWidth = this->width() - windowButtonsWidth; addPageX = m_tab_bar->sizeHint().width() + 2; if (m_tab_bar->count() > 1 && m_tab_bar->m_slide_animation->state() != QAbstractAnimation::Stopped) { auto tabWidth = m_tab_bar->tabSizeHint(m_tab_bar->count() - 1).width(); addPageX -= tabWidth * (1 - m_tab_bar->m_slide_animation->currentValue().toReal()); } } if (layoutDirection() == Qt::LeftToRight) m_tab_bar->setGeometry(0, 1, tabBarWidth, m_tab_bar->sizeHint().height()); else m_tab_bar->setGeometry(this->width() - addPageX + 2, 1, addPageX, m_tab_bar->sizeHint().height()); m_tab_bar->raise(); if (Peony::GlobalSettings::getInstance()->getProjectName() == V10_SP1_EDU) { if (layoutDirection() == Qt::LeftToRight) m_add_page_button->move(addPageX, 0); else m_add_page_button->move(this->width() - addPageX - m_add_page_button->width(), 0); if (tabBarWidth == addPageX) { m_show_page_button->show(); if (layoutDirection() == Qt::LeftToRight) m_show_page_button->move(addPageX + 40, 0); else m_show_page_button->move(this->width() - addPageX - 40 - m_show_page_button->width(), 0); } else { m_show_page_button->hide(); } } else { auto lastTabRect = m_tab_bar->rect(); int fixedY = lastTabRect.center().y() - m_add_page_button->height()/2 + 1; if (layoutDirection() == Qt::LeftToRight) m_add_page_button->move(addPageX + 6, fixedY); else m_add_page_button->move(this->width() - addPageX - m_add_page_button->width() + 6, fixedY); if (tabBarWidth == addPageX) { m_show_page_button->show(); if (layoutDirection() == Qt::LeftToRight) m_show_page_button->move(addPageX + 36, fixedY); else m_show_page_button->move(this->width() - addPageX - 36 - m_show_page_button->width(), fixedY); } else { m_show_page_button->hide(); } } m_add_page_button->raise(); m_show_page_button->raise(); } void TabWidget::updateStatusBarGeometry() { auto font = qApp->font(); QFontMetrics fm(font); int x = width() - m_stack->width(); auto sideBarDock = findChild("peony_NavigationSideBarContainer"); if (sideBarDock) { x = sideBarDock->width() + 8; } if (layoutDirection() == Qt::RightToLeft) { x = 0; } m_status_bar->setGeometry(x, this->height() - fm.height() - 16 , m_stack->width() + 4, fm.height() + 10); m_status_bar->raise(); if (Peony::GlobalSettings::getInstance()->getValue(ZOOM_SLIDER_VISIBLE).toBool() && !m_isTabletMode) { m_status_bar->m_slider->show(); } else { m_status_bar->m_slider->hide(); } } void TabWidget::paintEvent(QPaintEvent *e) { //bug#95007 打开预览窗口,有分割线 QPainter painter(this); auto handle = m_preview_splitter->handle(1); auto handlePoint = handle->mapTo(this, QPoint()); QPainterPath path; path.addRect(handlePoint.x(),handlePoint.y(), handle->size().width(),handle->size().height()); path.setFillRule(Qt::FillRule::WindingFill); painter.fillPath(path, this->palette().window().color()); QMainWindow::paintEvent(e); } const QList> TabWidget::getCurrentSelectionFileInfos() { const QStringList uris = getCurrentSelections(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<> TabWidget::getCurrentAllFileInfos() { const QStringList uris = getAllFileUris(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<setVisible(!isTabletMode); m_add_page_button->setVisible(!isTabletMode); m_status_bar->m_slider->hide(); } void TabWidget::addCondition(const QJsonObject &rootObject, const QJsonObject &object) { int defaultType = m_search_filter_layout->count(); if(defaultType < 1) return; if (!object.isEmpty()) { defaultType = Type(object["condition type"].toInt()); } if (!rootObject.isEmpty() && object.isEmpty()) { defaultType = Type::FileLabel; } auto typeCombobox = new FilterComboBox(this); typeCombobox->addItems(m_option_types); typeCombobox->setCurrentIndex(defaultType - 1); if(defaultType > 6) typeCombobox->setCurrentIndex(0); typeCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); QWidget *rowWidget = new QWidget(this); QGridLayout *rowLayout = new QGridLayout(rowWidget); rowLayout->addWidget(typeCombobox, 0, 0); rowWidget->setFixedHeight(TRASH_BUTTON_HEIGHT + 8); rowLayout->setAlignment(Qt::AlignTop); rowWidget->setLayout(rowLayout); connect(typeCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) { qDebug() << "defaultType" << defaultType << index; switchType(Type(index + 1), rootObject, object, rowWidget); }); switchType(Type(defaultType), rootObject, object, rowWidget); QPushButton *addconditonbtn = new QPushButton(QIcon::fromTheme("list-add-symbolic"), ""); addconditonbtn->setFixedSize(QSize(TRASH_BUTTON_HEIGHT, TRASH_BUTTON_HEIGHT)); addconditonbtn->setIconSize(QSize(16, 16)); addconditonbtn->setFlat(true); rowLayout->addWidget(addconditonbtn, 0, 4, Qt::AlignTop | Qt::AlignRight); // 第0行,第1列 //rowLayout->setAlignment(addconditonbtn, Qt::AlignTop |Qt::AlignRight); QPushButton *delconditonbtn = new QPushButton(QIcon::fromTheme("list-remove-symbolic"), ""); delconditonbtn->setFixedSize(QSize(TRASH_BUTTON_HEIGHT, TRASH_BUTTON_HEIGHT)); delconditonbtn->setIconSize(QSize(16, 16)); delconditonbtn->setFlat(true); int count = m_search_filter_layout->count(); if(count == 1){ delconditonbtn->setDisabled(true); } rowLayout->addWidget(delconditonbtn, 0, 5, Qt::AlignTop | Qt::AlignRight); // 第0行,第1列 rowLayout->setColumnStretch(3, 1); // 第2列可拉伸 rowLayout->setColumnStretch(2, 1); // 第2列可拉伸 rowLayout->setColumnStretch(1, 1); // 第2列可拉伸 rowLayout->setColumnStretch(0, 1); // 第2列可拉伸 m_search_filter_layout->setAlignment(Qt::AlignTop); m_search_filter_layout->addWidget(rowWidget, 0, Qt::AlignTop); connect(addconditonbtn, &QPushButton::clicked, this, [=](){ //int count = m_search_filter_layout->count(); m_filter_container->hide(); addCondition(); m_filter_container->show(); updatebtnstatus(); }); connect(delconditonbtn, &QPushButton::clicked, this, [=](){ m_filter_container->hide(); m_search_filter_layout->removeWidget(rowWidget); m_filter_container->show(); rowWidget->deleteLater(); //updateAdvanceConditions(); updatebtnstatus(); }); } void TabWidget::switchType(const Type conditionType, const QJsonObject &rootObject, const QJsonObject &object, QWidget *widget) { int type = 0; bool contains = true; int containIndex = 0; QString keyWords = ""; QStringList labels; if (!object.isEmpty()) { type = object["type"].toInt(); contains = object["contains"].toBool(); containIndex = contains ? 0 : 1; if (Type::FileName == conditionType) { QStringList keyWordLists; QJsonArray keyWordsArray = object["keywords"].toArray(); for (auto array : keyWordsArray) { keyWordLists.append(array.toString()); } keyWords = keyWordLists.join(","); } } if (!rootObject.isEmpty()) { if (Type::FileLabel == conditionType) { QJsonArray labelsArray = rootObject["labels"].toArray(); for (auto arrry : labelsArray) { labels.append(arrry.toString()); } } } QGridLayout *rowLayout = static_cast(widget->layout()); if (rowLayout->columnCount() > 1) { auto widget1 = rowLayout->itemAtPosition(0, 1)->widget(); auto widget2 = rowLayout->itemAtPosition(0, 2)->widget(); rowLayout->removeItem(rowLayout->itemAtPosition(0, 1)); rowLayout->removeItem(rowLayout->itemAtPosition(0, 2)); widget1->deleteLater(); widget2->deleteLater(); } QStringList selections = {tr("Contains"), tr("Not Contains")}; QStringList matchrules = {tr("FileName and FileContent"), tr("Only FileName")}; auto includeExcludeCombobox = new FilterComboBox(this); if (Type::ConditionMatchRule == conditionType) { includeExcludeCombobox->addItem(selections.first()); } else { includeExcludeCombobox->addItems(selections); } includeExcludeCombobox->setCurrentIndex(containIndex); includeExcludeCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); rowLayout->addWidget(includeExcludeCombobox, 0, 1); connect(includeExcludeCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](){ Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); }); switch (conditionType) { case Type::FileName:{ auto nameEdit = new QLineEdit; rowLayout->addWidget(nameEdit, 0, 2); nameEdit->setText(keyWords); nameEdit->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(nameEdit, &QLineEdit::textChanged, this, [=](){ m_input_edit_keyList = nameEdit->text().split(","); //updateAdvanceConditions(); Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); }); break; } case Type::FileSize:{ auto fileSizeCombobox = new FilterComboBox(this); rowLayout->addWidget(fileSizeCombobox, 0, 2); fileSizeCombobox->addItems(m_file_size_list); fileSizeCombobox->setCurrentIndex(type); fileSizeCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(fileSizeCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=]() { //updateAdvanceConditions(); Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); }); break; } case Type::DateRange:{ auto fileDateRangeCombobox = new FilterComboBox(this); rowLayout->addWidget(fileDateRangeCombobox, 0, 2); fileDateRangeCombobox->addItems(m_file_mtime_list); fileDateRangeCombobox->setCurrentIndex(type); fileDateRangeCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(fileDateRangeCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=]() { //updateAdvanceConditions(); Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); }); break; } case Type::FileLabel:{ auto fileLabelCombobox = new Peony::MultiSelectComboBox(this, false); fileLabelCombobox->setPlaceholderText(tr("File smart tags")); rowLayout->addWidget(fileLabelCombobox, 0, 2); //编辑时设置默认选项 QStringList allLabels = Peony::IDMDBusManager::getInstance()->getIntelligentLabel(); bool hasLabel = !allLabels.isEmpty(); if (Edit == m_mode) { if(allLabels.isEmpty() && !labels.isEmpty()){ fileLabelCombobox->addItems(labels); }else{ fileLabelCombobox->addItems(allLabels); } fileLabelCombobox->setDefaultItems(labels); }else{ fileLabelCombobox->addItems(allLabels); } fileLabelCombobox->setDisabled(!hasLabel); fileLabelCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(fileLabelCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](){ QString key = getSearchKey(); QString uri = getCurrentUri(); QString spaceName = uri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); if (!key.isEmpty()) { Peony::IDMDBusManager::getInstance()->reSearchWithLabels(fileLabelCombobox->getSelectItemsText(), spaceName, key); } }); break; // auto fileLabelCombobox = new Peony::MultiSelectComboBox(this); // rowLayout->addWidget(fileLabelCombobox, 0, 2); // QList allLabels = m_file_label_model->getAllFileLabelItems(); // for (int i = 0; i < allLabels.size(); ++i) { // fileLabelCombobox->addItem(allLabels.at(i)->name(), false, 0, allLabels.at(i)->color()); // } // //fileLabelCombobox->addItems(m_file_mtime_list); // fileLabelCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); // connect(fileLabelCombobox, &Peony::MultiSelectComboBox::hidingPopup, this, [=]() { // QStringList selectTexts = fileLabelCombobox->getSelectItemsText(); // if (!selectTexts.isEmpty()) { // QList colors; // for (auto text : selectTexts) { // QColor tmpColor = FileLabelModel::getGlobalModel()->getLableColorFromLabelName(text); // if (tmpColor != Qt::transparent) { // colors.append(tmpColor); // } // } // setMutipleLabelConditions(selectTexts, colors); // } // }); // break; } case Type::ConditionMatchRule:{ auto conditionMatchRuleCombobox = new FilterComboBox(this); rowLayout->addWidget(conditionMatchRuleCombobox, 0, 2); conditionMatchRuleCombobox->addItems(matchrules); conditionMatchRuleCombobox->setItemData(0, matchrules[0], Qt::ToolTipRole); conditionMatchRuleCombobox->setItemData(1, matchrules[1], Qt::ToolTipRole); // 可选:确保 ComboBox 宽度适配内容 conditionMatchRuleCombobox->setCurrentIndex(type); conditionMatchRuleCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); conditionMatchRuleCombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); connect(conditionMatchRuleCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) { m_search_rules_currentIndex = index; if (index > 0) { //设置过滤关键字 MainWindow *mainWindow = dynamic_cast(this->topLevelWidget()); QString key = mainWindow->getLastSearchKey(); qDebug() << __func__ << "key: " << key; this->updateFilterContent(key); } else { bool searchIndex = isSearchIndex(); if (!searchIndex) { int ret = QMessageBox::question(nullptr, tr("Search Settings"), tr("After the creation of the index, " "the next search can get the results of the document content containing the search term, " "during which you can exit the page at any time, " "we will continue to complete the creation in the background.")); if (QMessageBox::Yes == ret) { const QByteArray id(UKUI_SEARCH_SCHEMAS); if (QGSettings::isSchemaInstalled(id)) { QGSettings *searchSettings = new QGSettings(id, QByteArray(), this); if (searchSettings && searchSettings->keys().contains(SEARCH_METHOD_KEY)) { searchSettings->set(SEARCH_METHOD_KEY, true); searchSettings->set("contentIndexEnable", true); searchSettings->set("contentIndexEnableOcr", true); } } } conditionMatchRuleCombobox->setCurrentIndex(1); } //清除过滤关键字 currentPage()->clearFileContentConditions(); updateFilter(); } Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); //updateAdvanceConditions(); }); break; } default:{ auto fileTypeCombobox = new FilterComboBox(this); rowLayout->addWidget(fileTypeCombobox, 0, 2); fileTypeCombobox->addItems(m_file_type_list); fileTypeCombobox->setCurrentIndex(type); fileTypeCombobox->setFixedHeight(TRASH_BUTTON_HEIGHT); connect(fileTypeCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=]() { //updateAdvanceConditions(); qDebug() << "===========" << getConditions(); Peony::IDMDBusManager::getInstance()->updateSearchCondition(getConditions(false)); }); break; } } //updateAdvanceConditions(); } QString TabWidget::getConditions(const bool isDefaultCondition) const { QJsonObject configObj; // 获取标记配置 int count = m_search_filter_layout->count() - 1; //增加默认关键字配置 auto window = dynamic_cast(this->topLevelWidget()); QString keyWords = window->getLastSearchKey(); int defaultCount = 0; if (!keyWords.isEmpty() && isDefaultCondition) { defaultCount = 1; QStringList words = keyWords.split(','); QJsonObject fileNameObj; fileNameObj["condition type"] = int(Type::FileName); fileNameObj["contains"] = true; fileNameObj["keywords"] = QJsonArray::fromStringList(words); fileNameObj["orCondition"] = false; configObj[QString::number(0)] = fileNameObj; } // 获取条件配置 configObj["conditions count"] = count + defaultCount; int j = 1; for (int i = 1; i <= count; ++i) { QLayoutItem *item = m_search_filter_layout->itemAt(i); auto widget = item->widget(); QGridLayout *gridLayout = static_cast(widget->layout()); if (gridLayout->columnCount() < 3) { return ""; } //auto condition = QSharedPointer(new Condition(m_type)); QWidget *widget1 = gridLayout->itemAtPosition(0, 1)->widget(); QWidget *widget2 = gridLayout->itemAtPosition(0, 2)->widget(); int type = static_cast(gridLayout->itemAtPosition(0, 0)->widget())->currentIndex(); bool contains = qobject_cast(widget1)->currentIndex() == 0 ? true : false; switch (Type(type + 1)) { case Type::FileName: { auto edit = qobject_cast(widget2); QString text = edit->text(); QStringList keywords = text.split(','); if (!keywords.isEmpty()) { QJsonObject fileNameObj; fileNameObj["condition type"] = int(Type::FileName); fileNameObj["contains"] = contains; fileNameObj["keywords"] = QJsonArray::fromStringList(keywords); fileNameObj["orCondition"] = false; configObj[QString::number(j - 1 + defaultCount)] = fileNameObj; j++; } break; } case Type::FileType: { auto typeComboBox = qobject_cast(widget2); int type = typeComboBox->currentIndex(); QJsonObject fileTypeObj; fileTypeObj["condition type"] = int(Type::FileType); fileTypeObj["contains"] = contains; fileTypeObj["type"] = type; fileTypeObj["orCondition"] = false; configObj[QString::number(j - 1 + defaultCount)] = fileTypeObj; j++; break; } case Type::FileSize: { auto typeComboBox = qobject_cast(widget2); int type = typeComboBox->currentIndex(); QJsonObject fileSizeObj; fileSizeObj["condition type"] = int(Type::FileSize); fileSizeObj["contains"] = contains; fileSizeObj["type"] = type; fileSizeObj["orCondition"] = false; configObj[QString::number(j - 1 + defaultCount)] = fileSizeObj; j++; break; } // case Condition::FileContent: { // auto edit = qobject_cast(widget2); // QString text = edit->text(); // if(text.isEmpty()) // m_isContentNull = true; // condition->setFileContentCondition(text); // break; // } // case Condition::SearchLocation: { // auto includeExculdeCombobox = qobject_cast(widget1); // bool contains = includeExculdeCombobox->currentIndex() == 0; // auto edit = qobject_cast(widget2); // QString path = edit->text(); // if(path.isEmpty()) // m_isContentNull = true; // condition->setSearchLocationCondition(contains, path); // break; // } case Type::DateRange: { QJsonObject dateRangObj; dateRangObj["condition type"] = int(Type::DateRange); auto typeComboBox = qobject_cast(widget2); int type = typeComboBox->currentIndex(); dateRangObj["contains"] = contains; dateRangObj["type"] = type; dateRangObj["orCondition"] = false; configObj[QString::number(j - 1 + defaultCount)] = dateRangObj; j++; break; } case Type::FileLabel: { auto typeComboBox = qobject_cast(widget2); QStringList labels = typeComboBox->getSelectItemsText(); configObj["conditions count"] = count + defaultCount - 1; configObj["labels"] = QJsonArray::fromStringList(labels); break; } case Type::ConditionMatchRule: { QJsonObject conditionMatchRuleObj; conditionMatchRuleObj["condition type"] = int(Type::ConditionMatchRule); auto typeComboBox = qobject_cast(widget2); int type = typeComboBox->currentIndex(); conditionMatchRuleObj["contains"] = contains; conditionMatchRuleObj["type"] = int(type); conditionMatchRuleObj["orCondition"] = false; configObj[QString::number(j - 1 + defaultCount)] = conditionMatchRuleObj; j++; break; } default: break; } } QJsonDocument doc(configObj); QString jsonStr = doc.toJson(QJsonDocument::Indented); return jsonStr; } void TabWidget::updateConditionFormJson() { removeCondition(); QString currentUri = getCurrentUri(); if (currentUri.isEmpty()) return; QString spaceName = currentUri.remove("idm:///"); spaceName = QString(QUrl::fromPercentEncoding(spaceName.toUtf8())); QString jsonString = Peony::IDMDBusManager::getInstance()->getConditionsBySpaces(spaceName); qDebug() << "==========" << currentUri << jsonString; QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toLocal8Bit().data()); if (jsonDocument.isNull()) { qDebug() << "==========Json Null"; } QJsonObject rootObject = jsonDocument.object(); int conditionCount = rootObject["conditions count"].toInt(); QJsonArray labelsArray = rootObject["labels"].toArray(); qDebug() << __func__ << conditionCount; if (conditionCount == 0 && labelsArray.isEmpty()) { addCondition(); } else { for (int i = 0; i < conditionCount; ++i) { auto conditionObj = rootObject[QString::number(i)].toObject(); addCondition(rootObject, conditionObj); } } if (!labelsArray.isEmpty()) { addCondition(rootObject); } updatebtnstatus(); } void TabWidget::updateCreateVirtualTabShow() { m_mode = Create; m_isVirtualTab = true; m_search_title->show(); m_search_bar->show(); m_current_search->show(); m_home_search->show(); removeCondition(); m_add_filter_button->show(); m_add_filter_button->setChecked(false); m_saveas_space_button->show(); m_space_edit_button->hide(); m_space_cancel_button->hide(); m_space_ok_button->hide(); m_search_bar_layout->setContentsMargins(10, 5, 10, 5); updateSearchPathButton(getCurrentUri()); switchSearchPath(false); updateSearchTypeShow(); } void TabWidget::updatebtnstatus() { int count = m_search_filter_layout->count(); if(count == 2) { for (int i = 1; i < count; ++i) { QLayoutItem *item = m_search_filter_layout->itemAt(i); auto widget = item->widget(); QGridLayout *rowLayout = static_cast(widget->layout()); auto delbtn = rowLayout->itemAtPosition(0, 5)->widget(); delbtn->setDisabled(true); } } else if(count >= 10) { for (int i = 1; i < count; ++i) { QLayoutItem *item = m_search_filter_layout->itemAt(i); auto widget = item->widget(); QGridLayout *rowLayout = static_cast(widget->layout()); auto addbtn = rowLayout->itemAtPosition(0, 4)->widget(); addbtn->setDisabled(true); } } else{ for (int i = 1; i < count; ++i) { QLayoutItem *item = m_search_filter_layout->itemAt(i); auto widget = item->widget(); QGridLayout *rowLayout = static_cast(widget->layout()); auto addbtn = rowLayout->itemAtPosition(0, 4)->widget(); auto delbtn = rowLayout->itemAtPosition(0, 5)->widget(); addbtn->setDisabled(false); delbtn->setDisabled(false); } } } PreviewPageContainer::PreviewPageContainer(QWidget *parent) : QStackedWidget(parent) { } PreviewPageButtonGroups::PreviewPageButtonGroups(QWidget *parent) : QButtonGroup(parent) { setExclusive(true); } peony/src/control/navigation-side-bar.cpp0000664000175000017500000013671415154271106017446 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "navigation-side-bar.h" #include "side-bar-model.h" #include "side-bar-proxy-filter-sort-model.h" #include "side-bar-abstract-item.h" #include "volume-manager.h" #include "volumeManager.h" #include "side-bar-menu.h" #include "side-bar-abstract-item.h" #include "bookmark-manager.h" #include "file-info.h" #include "file-info-job.h" #include "main-window.h" #include "global-settings.h" #include "file-enumerator.h" #include "gerror-wrapper.h" #include "file-utils.h" #include "plugin-manager.h" #include "vfs-plugin-manager.h" #include "x11-window-manager.h" #include "tag-management.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "file-utils.h" #include #include #include #ifdef KY_SDK_DATACOLLECT #include #endif #define NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS 4 #define MINIMUM_COLUMN_SIZE 2 using namespace Peony; NavigationSideBar::NavigationSideBar(QWidget *parent) : QTreeView(parent) { static NavigationSideBarStyle *global_style = new NavigationSideBarStyle; header()->setMinimumSectionSize(30); setSortingEnabled(true); setIconSize(QSize(16, 16)); setProperty("useIconHighlightEffect", true); //both default and highlight. setProperty("iconHighlightEffectMode", 1); this->verticalScrollBar()->setProperty("drawScrollBarGroove", false); setDragDropMode(QTreeView::DropOnly); setProperty("highlightMode", true); setProperty("doNotBlur", true); viewport()->setProperty("doNotBlur", true); auto delegate = new NavigationSideBarItemDelegate(this); setItemDelegate(delegate); installEventFilter(this); setFrameShape(QFrame::NoFrame); setAutoFillBackground(true); setBackgroundRole(QPalette::Base); // setStyleSheet(".NavigationSideBar" // "{" // "border: 0px solid transparent" // "}"); //setStyle(global_style); // setAttribute(Qt::WA_TranslucentBackground); // viewport()->setAttribute(Qt::WA_TranslucentBackground); header()->setSectionResizeMode(QHeaderView::Fixed); header()->setStretchLastSection(true); header()->setMinimumSectionSize(MINIMUM_COLUMN_SIZE); header()->hide(); setContextMenuPolicy(Qt::CustomContextMenu); setExpandsOnDoubleClick(false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_model = new Peony::SideBarModel(this); m_proxy_model = new Peony::SideBarProxyFilterSortModel(this); m_proxy_model->setSourceModel(m_model); this->setModel(m_proxy_model); setMouseTracking(true);//追踪鼠标 setAutoScrollMargin(0); VolumeManager *volumeManager = VolumeManager::getInstance(); connect(volumeManager,&Peony::VolumeManager::volumeAdded,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//display DVD device in real time. }); connect(volumeManager,&Peony::VolumeManager::volumeRemoved,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//The drive does not display when the DVD device is removed. //qDebug() << "volumeRemoved:" < &drive){ m_proxy_model->invalidate();//Multiple udisk eject display problem }); connect(volumeManager,&Peony::VolumeManager::mountAdded,this,[=](const std::shared_ptr &mount){ m_proxy_model->invalidate();//display udisk in real time after format it. }); connect(Experimental_Peony::VolumeManager::getInstance(), &Experimental_Peony::VolumeManager::signal_mountFinished,this,[=](){ //fix open mutiple peony window, mount in side bar crash issue, link to bug#116201,116589 if(!m_currSelectedItem) return; //规避182166的情况 // JumpDirectory(m_currSelectedItem->uri()); // qDebug()<<"挂载后跳转路径:"<uri(); }); connect(this, &QTreeView::clicked, [=](const QModelIndex &index) { switch (index.column()) { case 0: { m_currSelectedItem = m_proxy_model->itemFromIndex(index); //fix open mutiple peony window, mount in side bar crash issue, link to bug#116201,116589 if (! m_currSelectedItem) break; //continue to fix crash issue, related to bug#116201,116589 m_currSelectedItem->connect(m_currSelectedItem, &SideBarAbstractItem::destroyed, this, [=]{ m_currSelectedItem = nullptr; }); if(m_currSelectedItem->isMountable()&&!m_currSelectedItem->isMounted()) m_currSelectedItem->mount(); else{ JumpDirectory(m_currSelectedItem->uri()); #ifdef KY_SDK_DATACOLLECT auto parent = index.parent(); //三级或以下子树跳转才收集数据,分析侧边栏树结构用户使用率 if (parent.isValid() && parent.parent().isValid()){ sendKdkDataAsync(); } #endif } break; } case 1: { auto item = m_proxy_model->itemFromIndex(index); if (item->isMounted() || item->isEjectable()||item->isStopable()) { if(item->getDevice().contains("/dev/sr") && FileUtils::isBusyDevice(item->getDevice())){/* 光盘在刻录数据、镜像等操作时,若处于busy状态时,不可弹出。link to bug#143293 */ QMessageBox::information(this, tr("Tips"), tr("The device is in busy state, please perform this operation later.")); break; } auto leftIndex = m_proxy_model->index(index.row(), 0, index.parent()); this->collapse(leftIndex); item->ejectOrUnmount(); } else { // if item is not unmountable, just be same with first column. // fix #39716 if (!item->uri().isNull() && item->uri() != "idm:///") { Q_EMIT this->updateWindowLocationRequest(item->uri()); } if (item->uri() == "idm:///") { Q_EMIT this->createVirtualTabAndSearch(); } } break; } default: break; } }); connect(this, &QTreeView::customContextMenuRequested, this, [=](const QPoint &pos) { auto index = indexAt(pos); auto item = m_proxy_model->itemFromIndex(index); if (item) { if (item->type() != Peony::SideBarAbstractItem::SeparatorItem) { QList actionList; MainWindow *window = dynamic_cast(this->topLevelWidget()); //fix bug#216256, open data block in menu fail issue auto curUri = item->uri(); if (item->uri() == "computer:///ukui-data-volume") { curUri = "file:///data"; //story 28545, improve data block solution, when has no user file in /data, go to usershare //fix bug#239232, open in side bar menu not jump to usershare issue if (Peony::FileUtils::isFileExsit("file:///data/usershare")) curUri = "file:///data/usershare"; } auto actionOpeninWindow =new QAction(QIcon::fromTheme("window-new-symbolic"), tr("Open In New Window")); actionList<setEnumerateDirectory(curUri); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ auto targetUri = Peony::FileUtils::getTargetUri(curUri); if (!targetUri.isEmpty()) { auto enumerator2 = new Peony::FileEnumerator; enumerator2->setEnumerateDirectory(targetUri); enumerator2->connect(enumerator2, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (!critical) { auto newWindow = window->create(targetUri); dynamic_cast(newWindow)->show(); } else { auto info = FileInfo::fromUri(targetUri); QMessageBox::critical(0, 0, tr("Can not open %1, %2").arg(info.get()->displayName()).arg(err.get()->message())); } enumerator2->deleteLater(); }); enumerator2->prepare(); } else if (!err.get() && !critical) { auto newWindow = window->create(curUri); dynamic_cast(newWindow)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); if (!qApp->property("tabletMode").toBool()) { auto actionOpeninTab =new QAction(QIcon::fromTheme("tab-new-symbolic"), tr("Open In New Tab")); actionList<setEnumerateDirectory(curUri); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ //fix bug#345018, open data block in menu fail issue auto targetUri = Peony::FileUtils::getTargetUri(curUri); if (!targetUri.isEmpty()) { auto enumerator2 = new Peony::FileEnumerator; enumerator2->setEnumerateDirectory(targetUri); enumerator2->connect(enumerator2, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (!critical) { window->addNewTabs(QStringList()<(window)->show(); } else { auto info = FileInfo::fromUri(targetUri); QMessageBox::critical(0, 0, tr("Can not open %1, %2").arg(info.get()->displayName()).arg(err.get()->message())); } enumerator2->deleteLater(); }); enumerator2->prepare(); } else if (!err.get() && !critical) { window->addNewTabs(QStringList()<(window)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); } if (item->type() == SideBarAbstractItem::FileSystemItem) { if ((0 != QString::compare(item->uri(), "computer:///")) && (0 != QString::compare(item->uri(), "filesafe:///"))) { for (const auto &actionItem : actionList) { if(item->isVolume()){/* 分区才去需要判断是否已挂载 */ actionItem->setEnabled(item->isMounted()); if(item->getDevice().contains("/dev/sr")){/* 光盘在刻录数据、镜像等操作时,即若处于busy状态时,该菜单置灰不可用。 */ actionItem->setDisabled(FileUtils::isBusyDevice(item->getDevice())); } } } } } Peony::SideBarMenu menu(item, nullptr,actionList, this); menu.exec(mapToGlobal(pos)); } } }); connect(m_model, &QAbstractItemModel::dataChanged, this, [=](){ this->viewport()->update(); m_proxy_model->invalidate(); }); connect(selectionModel(), &QItemSelectionModel::selectionChanged, this, &QTreeView::doItemsLayout); connect(Peony::GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=](const QString& key){ if (SHOW_NETWORK == key) { for (int i = 0; i < m_proxy_model->rowCount(); ++i) { auto index = m_proxy_model->index(i, 0); auto item = m_proxy_model->itemFromIndex(index); bool isShowNetwork = Peony::GlobalSettings::getInstance()->isExist(SHOW_NETWORK) ? Peony::GlobalSettings::getInstance()->getValue(SHOW_NETWORK).toBool() : true; if (item->type() == SideBarAbstractItem::NetWorkItem) { this->setRowHidden(index.row(), index.parent(), !isShowNetwork); if (!isShowNetwork) { item->findChildrenAsync(); } return; } } this->viewport()->update(); } }); connect(VFSPluginManager::getInstance(), &VFSPluginManager::updateVFSPlugin, this, [=](VFSPluginIface *vfsPIface, bool enable){ qDebug() << __func__ << vfsPIface->name() << enable; for (int i = 0; i < m_proxy_model->rowCount(); ++i) { auto index = m_proxy_model->index(i, 0); auto item = m_proxy_model->itemFromIndex(index); if (item->type() == SideBarAbstractItem::VFSItem && item->uri().contains(vfsPIface->uriScheme()) && !item->uri().contains("computer:///") && vfsPIface->pluginType() == PluginInterface::VFSPlugin) { if (m_currSelectedItem) { if (!m_currSelectedItem->uri().startsWith("file://") && enable) { JumpDirectory("computer:///"); } } this->setRowHidden(index.row(), index.parent(), enable); return; } //hide kmre if (item->type() == SideBarAbstractItem::FavoriteItem && vfsPIface->uriScheme() == "kmre://" && vfsPIface->pluginType() == PluginInterface::VFSPlugin) { if (m_currSelectedItem) { if (!m_currSelectedItem->uri().startsWith("file:///") && enable) { JumpDirectory("computer:///"); } } for (int j = 0; j < m_proxy_model->rowCount(index); ++j) { auto tIndex = m_proxy_model->index(j, 0, index); auto tItem = m_proxy_model->itemFromIndex(tIndex); if (tItem->uri().startsWith("kmre:///")) { this->setRowHidden(tIndex.row(), tIndex.parent(), enable); return; } } } } }); connect(m_model, &SideBarModel::signal_collapsedChildren, this, [=](const QModelIndex &index){ QModelIndex modelIndex = m_proxy_model->mapFromSource(index); collapse(modelIndex); }); //expandToDepth(1);/* 快速访问、计算机、网络 各模块往下展开一层 */ for(int row =0; row < model()->rowCount();row++) { auto index = model()->index(row,0); auto srcIndex = m_proxy_model->mapToSource(index); auto item = m_model->itemFromIndex(srcIndex); auto type = item->type(); if (item->type() != SideBarAbstractItem::VFSItem && item->type() != SideBarAbstractItem::SeparatorItem) { doExpand(index); } QStringList disExtensions = GlobalSettings::getInstance()->getValue(DISABLED_EXTENSIONS).toStringList(); for (auto extensions : disExtensions) { VFSPluginIface *pIface = dynamic_cast(PluginManager::getInstance()->getPluginByFileName(extensions)); if (pIface && pIface->pluginType() == PluginInterface::VFSPlugin && item->type() == SideBarAbstractItem::VFSItem && !item->uri().contains("computer:///") && item->uri().contains(pIface->uriScheme())) { this->setRowHidden(index.row(), index.parent(), true); } if (pIface && pIface->pluginType() == PluginInterface::VFSPlugin && item->type() == SideBarAbstractItem::FavoriteItem && pIface->uriScheme() == "kmre://" && item->uri().contains(pIface->uriScheme())) { this->setRowHidden(index.row(), index.parent(), true); } } // if(item->uri()=="filesafe:///")/* 文件保护箱默认不展开 */ // continue; // expand(index); } /** * @bug #278107: [Requirement 35207] [Start Menu] [Ribbon] Shortcut Entry-Computer Jump to the left side of the computer interface positioning error * * comment the following code * * @author: Renyg * @date: 2024-11-01 */ #if 0 /* 打开文件管理器默认聚焦在家目录上 */ QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QItemSelectionModel *selectionModel = this->selectionModel(); for (int i = 0; i < m_proxy_model->rowCount(); ++i) { auto index = m_proxy_model->index(i, 0); auto item = m_proxy_model->itemFromIndex(index); if (item->uri() == homeUri) { auto index1 = m_proxy_model->index(i, 1); this->setCurrentIndex(index); /* 通过QItemSelection设置选中项 */ QItemSelection selection(index, index1); selectionModel->select(selection, QItemSelectionModel::Select); } }//end #endif } void NavigationSideBar::sendKdkDataAsync() { #ifdef KY_SDK_DATACOLLECT QtConcurrent::run([=]() { //story 24997, collet second level tree child click event KTrackData *node = kdk_dia_data_init(KEVENTSOURCE_DESKTOP,KEVENT_CLICK); //传入事件描述“点击侧边栏展开子树”,上传点击事件,收集使用二级以上子树跳转数据 kdk_dia_upload_default(node,"peony","secondLevelChildClick"); //释放内存 kdk_dia_data_free(node); }); #endif } void NavigationSideBar::doExpand(const QModelIndex &index) { if (isExpanded(index)) return; auto item = m_proxy_model->itemFromIndex(index); connect(item, &SideBarAbstractItem::findChildrenFinished, this, [=]{ auto currentIndex = m_proxy_model->mapFromSource(item->firstColumnIndex()); this->expand(currentIndex); }); item->findChildrenAsync(); auto globalSettings = Peony::GlobalSettings::getInstance(); bool isShowNetwork = globalSettings->isExist(SHOW_NETWORK) ? globalSettings->getValue(SHOW_NETWORK).toBool() : true; QStringList disExtensions = globalSettings->getValue(DISABLED_EXTENSIONS).toStringList(); // 获取索引项并缓存到局部变量 auto itemType = item->type(); auto itemUri = item->uri(); if (itemType == SideBarAbstractItem::NetWorkItem && !isShowNetwork) { // 如果不显示网络项目,则隐藏该行并退出 this->setRowHidden(index.row(), index.parent(), true); return; } // 使用 QMap 缓存插件实例 PluginManager* pluginManager = PluginManager::getInstance(); QMap cachedPlugins; // 遍历禁用的扩展列表 for (auto extension : disExtensions) { // 如果插件未缓存,则动态转换并缓存 if (!cachedPlugins.contains(extension)) { VFSPluginIface* pIface = dynamic_cast(pluginManager->getPluginByFileName(extension)); cachedPlugins.insert(extension, pIface); } else { auto pIface = cachedPlugins[extension]; if (pIface && pIface->pluginType() == PluginInterface::VFSPlugin) { bool isFileSystemItem = (itemType == SideBarAbstractItem::FileSystemItem); bool isFavoriteItem = (itemType == SideBarAbstractItem::FavoriteItem); if ((isFileSystemItem && !itemUri.contains("computer:///") && itemUri.contains(pIface->uriScheme())) || (isFavoriteItem && pIface->uriScheme() == "kmre://" && itemUri.contains(pIface->uriScheme()))) { this->setRowHidden(index.row(), index.parent(), true); return; } } } } } void NavigationSideBar::doCollapse(const QModelIndex &index) { if (!isExpanded(index)) return; auto item = m_proxy_model->itemFromIndex(index); this->collapse(index); QTimer::singleShot(qApp->style()->styleHint(QStyle::SH_Widget_Animation_Duration), item, [=]{ item->clearChildren(); }); } bool NavigationSideBar::eventFilter(QObject *obj, QEvent *e) { return false; } bool NavigationSideBar::viewportEvent(QEvent *e) { if (e->type() == QEvent::ToolTip) { // 处理 ToolTip 事件的代码 QHelpEvent *helpEvent = static_cast(e); QModelIndex itemIndex = indexAt(helpEvent->pos()); if (!itemIndex.isValid()) { return QTreeView::viewportEvent(e); } //获取提示文本和index QModelIndex parentIndex = itemIndex.parent(); QModelIndex firstColumnIndex; if (parentIndex.isValid()) { firstColumnIndex = model()->index(itemIndex.row(), 0, parentIndex); } else { firstColumnIndex = model()->index(itemIndex.row(), 0); } QStyleOptionViewItem opt; initViewItemOption(&opt); QString text = firstColumnIndex.data(Qt::DisplayRole).toString(); text = FileUtils::wrapTextForTooltip(text, helpEvent->globalPos(),opt.font); NavigationSideBarItemDelegate *delegate = static_cast(itemDelegate()); delegate->initStyleOption(&opt, firstColumnIndex); opt.rect = visualRect(firstColumnIndex); QRect rect = QApplication::style()->subElementRect(QStyle::SE_ItemViewItemText, &opt, nullptr); const QWidget *widget = opt.widget; const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1; QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding QTextLayout textLayout(text, opt.font); QTextOption textOption; const bool wrapText = opt.features & QStyleOptionViewItem::WrapText; textOption.setWrapMode(wrapText ? QTextOption::WordWrap : QTextOption::ManualWrap); textOption.setTextDirection(opt.direction); textOption.setAlignment(QStyle::visualAlignment(opt.direction, opt.displayAlignment)); textLayout.setTextOption(textOption); textLayout.beginLayout(); QTextLine line = textLayout.createLine(); if (!line.isValid()) return QTreeView::viewportEvent(e);; line.setLineWidth(textRect.width()); const bool isShow = line.naturalTextWidth() > textRect.width(); textLayout.endLayout(); //qDebug() << "line.naturalTextWidth(): " << line.naturalTextWidth() <<"textRect: " <ignore(); return true; }else{ QToolTip::showText(helpEvent->globalPos(), text, this); return true; } } return QTreeView::viewportEvent(e); } void NavigationSideBar::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton || event->button() == Qt::RightButton) { auto index = this->indexAt(event->pos()); if (index.isValid()) { // 计算展开按钮位置 auto rect = visualRect(index); int identation = indentation(); rect.setWidth(identation); rect.translate(-identation, 0); if (rect.contains(event->pos())) { // 展开/收起 if (isExpanded(index)) { doCollapse(index); } else { doExpand(index); } event->ignore(); return; } } } return QTreeView::mousePressEvent(event); } void NavigationSideBar::updateGeometries() { setViewportMargins(8, 0, 4, 0); QTreeView::updateGeometries(); if(m_notAllowHorizontalMove){ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } m_notAllowHorizontalMove = false; } void NavigationSideBar::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint) { //skip unmount indicator index if (index.isValid()) { if (index.column() == 0) { QTreeView::scrollTo(index, hint); } } } void NavigationSideBar::paintEvent(QPaintEvent *event) { // QPalette pal = qApp->palette(); // pal.setColor(QPalette::Base, QColor(Qt::transparent)); // setPalette(pal); // viewport()->setPalette(pal); QTreeView::paintEvent(event); } void NavigationSideBar::resizeEvent(QResizeEvent *e) { QTreeView::resizeEvent(e); if (header()->count() > 0) { int width = verticalScrollBar()->isVisible()? verticalScrollBar()->width() : 10; setColumnWidth(0, this->viewport()->width() - MINIMUM_COLUMN_SIZE - viewportMargins().left() - viewportMargins().right() - width); setColumnWidth(1, MINIMUM_COLUMN_SIZE); } } void NavigationSideBar::dropEvent(QDropEvent *e) { //fix invalid index cause crash issue QModelIndex targetIndex = indexAt(e->pos()); if (! targetIndex.isValid()) return; QString destUri = m_proxy_model->itemFromIndex(targetIndex)->uri(); auto data = e->mimeData(); auto bookmark = Peony::BookMarkManager::getInstance(); if (bookmark->isLoaded()) { for (auto url : data->urls()) { if(url.toString().startsWith("filesafe:///")){ QMessageBox::warning(this, tr("warn"), tr("This operation is not supported.")); continue; } if (dropIndicatorPosition() == QAbstractItemView::AboveItem || dropIndicatorPosition() == QAbstractItemView::BelowItem || "favorite:///" == destUri) { // add to bookmark e->setAccepted(true); //FIXME: replace BLOCKING api in ui thread. auto info = Peony::FileInfo::fromUri(url.toDisplayString()); if (info->displayName().isNull()) { Peony::FileInfoJob j(info); j.querySync(); } if (info->isDir()) { bookmark->addBookMark(url.url()); } } } } if (e->keyboardModifiers() & Qt::ControlModifier) { QModelIndex sourceIndex = m_proxy_model->mapToSource(targetIndex); m_model->dropMimeData(e->mimeData(), Qt::CopyAction, sourceIndex.row(), 0, sourceIndex); e->accept(); return; } QTreeView::dropEvent(e); } QSize NavigationSideBar::sizeHint() const { return QTreeView::sizeHint(); } void NavigationSideBar::JumpDirectory(const QString &uri) { if((uri=="" || uri.startsWith("computer://")) && m_currSelectedItem && m_currSelectedItem->getDevice().startsWith("/dev/sd")) {/* 异常U盘 */ QMessageBox::information(nullptr, tr("Tips"), tr("This is an abnormal Udisk, please fix it or format it")); return; } auto info = FileInfo::fromUri(uri); // try fix #174128, peony stucked when click sidebar network item sometimes. if (!uri.startsWith("network:///")) { if (info.get()->isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } } auto targetUri = FileUtils::getTargetUri(uri); if (targetUri == "" && uri== "burn://") { qDebug() << "empty drive"<updateWindowLocationRequest(targetUri); return; } // try fixing #133429. if (m_currSelectedItem->getDevice().startsWith("/dev/sr") && uri.startsWith("computer://")) { return; } //some side bar item doesn't have a uri. //do not emit signal with a null uri to window. if (!uri.isNull()) Q_EMIT this->updateWindowLocationRequest(uri); } void NavigationSideBar::keyPressEvent(QKeyEvent *event) { if(event->key() == Qt::Key_Left||event->key()==Qt::Key_Right) { auto index = currentIndex(); if (event->key() == Qt::Key_Left) { doCollapse(index); } else { doExpand(index); } return; } QTreeView::keyPressEvent(event); if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Space) { if (!selectedIndexes().isEmpty()) { auto index = selectedIndexes().first(); auto uri = index.data(Qt::UserRole).toString(); Q_EMIT this->updateWindowLocationRequest(uri, true); } } if(event->key() == Qt::Key_Left||event->key()==Qt::Key_Right) {/* 按下左右键不可使侧边栏内容左右平移显示 */ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } } void NavigationSideBar::focusInEvent(QFocusEvent *event) { QTreeView::focusInEvent(event); if (event->reason() == Qt::TabFocus) { if (selectedIndexes().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::Select); selectionModel()->select(model()->index(0, 1), QItemSelectionModel::Select); } else { scrollTo(selectedIndexes().first(), QTreeView::PositionAtCenter); auto selections = selectedIndexes(); clearSelection(); QTimer::singleShot(100, this, [=](){ for (auto index : selections) { selectionModel()->select(index, QItemSelectionModel::Select); } }); } } GlobalSettings::getInstance()->setValue("LAST_FOCUS_PEONY_WINID", dynamic_cast(this->topLevelWidget())->winId()); } void NavigationSideBar::wheelEvent(QWheelEvent *event) { QTreeView::wheelEvent(event); // if (event->orientation()==Qt::Horizontal) { // /* 触摸板左右滑动不可使侧边栏内容左右平移显示 */ // horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ // } if (event->angleDelta().x() != 0) { /* 触摸板左右滑动不可使侧边栏内容左右平移显示 */ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } } int NavigationSideBar::sizeHintForColumn(int column) const { if (column == 1) return MINIMUM_COLUMN_SIZE; if (column == 0) return viewport()->width() - MINIMUM_COLUMN_SIZE - viewportMargins().left() - viewportMargins().right() - verticalScrollBar()->width(); return QTreeView::sizeHintForColumn(column); } void NavigationSideBar::initViewItemOption(QStyleOptionViewItem *option) const { QTreeView::initViewItemOption(option); auto hoverColor = option->palette.color(QPalette::BrightText); hoverColor.setAlphaF(0.05); option->palette.setBrush(QPalette::Disabled, QPalette::Midlight, hoverColor); } // QStyleOptionViewItem NavigationSideBar::viewOptions() const // { // auto opt = QTreeView::viewOptions(); // auto hoverColor = opt.palette.color(QPalette::BrightText); // hoverColor.setAlphaF(0.05); // opt.palette.setBrush(QPalette::Disabled, QPalette::Midlight, hoverColor); // return opt; // } void NavigationSideBar::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { if ((event->dropAction() == Qt::MoveAction) && FileUtils::containsStandardPath(event->mimeData()->urls())) { event->ignore(); return; } } QAbstractItemView::dragEnterEvent(event); } NavigationSideBarItemDelegate::NavigationSideBarItemDelegate(QObject *parent) { } QSize NavigationSideBarItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { // auto size = QStyledItemDelegate::sizeHint(option, index); // //task#106007 【文件管理器】文件管理器应用做平板UI适配,修改侧边栏项的高度--48px // //size.setHeight(36); // return size; QSize size = QStyledItemDelegate::sizeHint(option, index); if (index.column() == 1) { size.setWidth(size.width() - 8); // 增加宽度容纳额外的间距 } return size; } void NavigationSideBarItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { //painter->save(); // if (index.column() == 1) { // QPainterPath rightRoundedRegion; // rightRoundedRegion.setFillRule(Qt::WindingFill); // auto rect = option.rect; // auto view = qobject_cast(option.widget); // if (view) { // rect.setRight(view->viewport()->rect().right()); // } // rightRoundedRegion.addRoundedRect(rect, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS); // rightRoundedRegion.addRect(rect.adjusted(0, 0, -NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, 0)); // //painter->setClipPath(rightRoundedRegion); // } // painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); // QStyledItemDelegate::paint(painter, option, index); // painter->restore(); QString uri = index.data(Qt::UserRole).toString(); if (index.column() != 1 && uri!="idm:///") { QStyledItemDelegate::paint(painter, option, index); return; } QStyleOptionViewItem opt = option; initStyleOption(&opt, index); QIcon icon = opt.icon; QString text = opt.text; opt.icon = QIcon(); opt.text = QString(); painter->save(); const QWidget *widget = opt.widget; const QStyle *style = widget ? widget->style() : QApplication::style(); // 先绘制背景(包括选中态) style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget); // 计算图标区域 int iconSize = style->pixelMetric(QStyle::PM_SmallIconSize); QRect iconRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, widget); iconRect.setWidth(iconSize); iconRect.adjust(-8, 0, -8, 0); // 微调图标位置 // 获取当前颜色(根据是否选中) QColor iconColor = opt.state & QStyle::State_Selected ? opt.palette.color(QPalette::HighlightedText) : opt.palette.color(QPalette::Text); // 手动绘制图标并着色 if (!icon.isNull()) { QPixmap basePixmap = icon.pixmap(iconSize, iconSize); QPixmap tintedPixmap(basePixmap.size()); tintedPixmap.fill(Qt::transparent); QPainter p(&tintedPixmap); p.setCompositionMode(QPainter::CompositionMode_Source); p.drawPixmap(0, 0, basePixmap); p.setCompositionMode(QPainter::CompositionMode_SourceIn); p.fillRect(tintedPixmap.rect(), iconColor); p.end(); painter->drawPixmap(iconRect.topLeft(), tintedPixmap); } // 绘制文字 if (!text.isEmpty()) { QRect textRect = opt.rect; textRect.setLeft(iconRect.right()); QFontMetrics metrics(opt.font); int textWidth = metrics.horizontalAdvance(text); if (textWidth > textRect.width()) { text = metrics.elidedText(text, Qt::ElideRight, textRect.width()); } painter->setPen(iconColor); painter->drawText(textRect, Qt::AlignVCenter | Qt::AlignLeft, text); } painter->restore(); } NavigationSideBarContainer::NavigationSideBarContainer(QWidget *parent) : Peony::SideBar(parent) { setObjectName("peony_NavigationSideBarContainer"); setMinimumWidth(144); /* 设计要求侧边栏最小宽度为144px */ //setAttribute(Qt::WA_TranslucentBackground); setBackgroundRole(QPalette::Base); setAutoFillBackground(true); m_layout = new QVBoxLayout; m_layout->setContentsMargins(0, 4, 0, 0); m_layout->setSpacing(0); QWidget *widget = new QWidget; widget->setLayout(m_layout); setWidget(widget); auto sideBar = new NavigationSideBar(this); addSideBar(sideBar); connect(sideBar, &NavigationSideBar::updateWindowLocationRequest, this, &NavigationSideBarContainer::updateWindowLocationRequest); connect(sideBar, &NavigationSideBar::createVirtualTabAndSearch, this, &NavigationSideBarContainer::createVirtualTabAndSearch); } #include "file-label-model.h" void NavigationSideBarContainer::addSideBar(NavigationSideBar *sidebar) { if (m_sidebar) return; m_sidebar = sidebar; m_layout->addWidget(sidebar); //m_layout->addStretch(); m_labelDialog = new FileLabelBox(this); m_labelDialog->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_labelDialog->hide(); m_layout->addWidget(m_labelDialog); QWidget *buttonsContainer = new QWidget(this); QVBoxLayout *buttonsLayout = new QVBoxLayout(buttonsContainer); buttonsLayout->setContentsMargins(4, 4, 2, 4); buttonsLayout->setSpacing(2); connect(m_labelDialog->selectionModel(), &QItemSelectionModel::selectionChanged, [=]() { QModelIndex index = m_labelDialog->currentIndex(); QString name = index.data(Qt::DisplayRole).toString(); int id = index.data(Qt::UserRole).toInt(); if (id) { QString uri = "label:///" + QString::number(id); Q_EMIT m_sidebar->updateWindowLocationRequest(uri); } }); //when clicked in blank, currentChanged may not triggered connect(m_labelDialog, &FileLabelBox::leftClickOnBlank, [=]() { //setLabelNameFilter(""); }); LabelButton *labelButton = new LabelButton(this); labelButton->setProperty("isWindowButton", 0x1); //m_label_button->setCheckable(true); labelButton->setFocusPolicy(Qt::FocusPolicy(labelButton->focusPolicy())); labelButton->setLastIcon(":/icons/ukui-down-symbolic"); labelButton->setFirstIcon(":/icons/sign"); labelButton->setText(tr("Manager tags...")); LabelButton *control = new LabelButton(this); control->setText(tr("More tags...")); control->setProperty("isWindowButton", 0x1); control->hide(); connect(control, &QPushButton::clicked, this, [=](bool checked){ Peony::TagManagement::getInstance()->show(); }); buttonsLayout->addWidget(control); buttonsLayout->addWidget(labelButton); connect(labelButton, &QPushButton::clicked, this, [=](){ bool checked = !labelButton->getShow(); if (checked) { labelButton->setLastIcon(":/icons/ukui-up-symbolic"); } else { labelButton->setLastIcon(":/icons/ukui-down-symbolic"); } labelButton->setShow(checked); m_labelDialog->setFloatWidgetVisible(checked); }); connect(m_labelDialog, &FileLabelBox::fileLabelVisible, this, [=](bool checked){ control->setVisible(checked); m_labelDialog->setVisible(checked); }); m_layout->addWidget(buttonsContainer); setLayout(m_layout); setTabOrder(m_sidebar, labelButton); } QSize NavigationSideBarContainer::sizeHint() const { auto size = QWidget::sizeHint(); auto width = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_SIDEBAR_WIDTH).toInt(); qDebug() << "sizeHint set DEFAULT_SIDEBAR_WIDTH:"<rect(), qApp->palette().base().color()); Peony::SideBar::paintEvent(event); } NavigationSideBarStyle::NavigationSideBarStyle() { } void NavigationSideBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { painter->save(); switch (element) { case QStyle::PE_IndicatorItemViewItemDrop: { /* hotfixbug#99344:拖拽文件到侧边栏,出现黑框 */ painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, true);/* 反锯齿 */ /* 按设计要求,边框颜色为调色板highlight值,圆角为6px */ QColor color = option->palette.color(QPalette::Highlight); painter->setPen(color); painter->drawRoundedRect(option->rect, 6, 6); painter->restore(); return; } // case QStyle::PE_IndicatorBranch: { // if (option->rect.x() == 0) { // QPainterPath leftRoundedRegion; // leftRoundedRegion.setFillRule(Qt::WindingFill); // leftRoundedRegion.addRoundedRect(option->rect, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS); // leftRoundedRegion.addRect(option->rect.adjusted(NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, 0, 0, 0)); // painter->setClipPath(leftRoundedRegion); // } // const QStyleOptionViewItem *tmp = qstyleoption_cast(option); // QStyleOptionViewItem opt = *tmp; // if (!opt.state.testFlag(QStyle::State_Selected)) { // if (opt.state & QStyle::State_Sunken) { // opt.palette.setColor(QPalette::Highlight, opt.palette.button().color()); // } // if (opt.state & QStyle::State_MouseOver) { // opt.palette.setColor(QPalette::Highlight, opt.palette.mid().color()); // } // } // qApp->style()->drawPrimitive(element, &opt, painter, widget); // painter->restore(); // return; // } case QStyle::PE_PanelItemViewRow: { painter->restore(); return; break; } case QStyle::PE_PanelItemViewItem: { break; } default: break; } qApp->style()->drawPrimitive(element, option, painter, widget); painter->restore(); } void NavigationSideBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == QStyle::CE_ItemViewItem) { const QStyleOptionViewItem *tmp = qstyleoption_cast(option); QStyleOptionViewItem opt = *tmp; if (!opt.state.testFlag(QStyle::State_Selected)) { if (opt.state & QStyle::State_Sunken) { opt.palette.setColor(QPalette::Highlight, opt.palette.button().color()); } if (opt.state & QStyle::State_MouseOver) { opt.palette.setColor(QPalette::Highlight, opt.palette.mid().color()); } } return qApp->style()->drawControl(element, &opt, painter, widget); } } TitleLabel::TitleLabel(QWidget *parent):QWidget(parent) { X11WindowManager::getInstance()->registerWidget(this); m_pix_label = new QLabel(this); //task#106007 【文件管理器】文件管理器应用做平板UI适配,修改应用图标可以跟随主题框架 m_pix_label->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(24,24)); if (QGSettings::isSchemaInstalled("org.ukui.style")) { m_gSettings = new QGSettings("org.ukui.style", QByteArray(), this); connect(m_gSettings, &QGSettings::changed, this, [=](const QString &key) { if("iconThemeName" == key){ m_pix_label->setPixmap(QIcon::fromTheme("system-file-manager").pixmap(24,24)); } }); } m_text_label = new QLabel(tr("Peony"),this); QHBoxLayout *l = new QHBoxLayout(this); l->setContentsMargins(8, 8, 8, 8); /* 按设计要求间距为8px */ l->addWidget(m_pix_label); l->addSpacing(8); l->addWidget(m_text_label); l->addStretch(); this->setFixedHeight(sizeHint().height()); } LabelButton::LabelButton(QWidget *parent) : QPushButton(parent) { this->setAttribute(Qt::WA_TranslucentBackground); m_mainLayout = new QHBoxLayout(this); m_firstSymbolic = new QLabel(this); m_lastSymbolic = new QLabel(this); m_text = new QLabel(this); m_firstSymbolic->setProperty("useIconHighlightEffect", 0x2); m_lastSymbolic->setProperty("useIconHighlightEffect", 0x2); m_mainLayout->addWidget(m_firstSymbolic); m_mainLayout->addWidget(m_text); m_mainLayout->addStretch(); m_mainLayout->addWidget(m_lastSymbolic); setLayout(m_mainLayout); } //void LabelButton::mousePressEvent(QMouseEvent *event) //{ // if (!m_isPress) { // m_isPress = true; // } // Q_UNUSED(event); //} //void LabelButton::mouseReleaseEvent(QMouseEvent *event) //{ // if (m_isPress) { // m_show = !m_show; // Q_EMIT clicked(m_show); // } // m_isPress = false; // Q_UNUSED(event); //} void LabelButton::setLastIcon(const QString &symbolic) { m_lastSymbolic->setPixmap(QIcon(symbolic).pixmap(64,64)); } void LabelButton::setFirstIcon(const QString &symbolic) { m_firstSymbolic->setPixmap(QIcon(symbolic).pixmap(64,64)); } void LabelButton::setText(QString text) { m_text->setText(text); } void LabelButton::setShow(bool isShow) { m_show = isShow; } bool LabelButton::getShow() { return m_show; } peony/src/control/view-type-menu.h0000664000175000017500000000316215154271070016151 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef VIEWTYPEMENU_H #define VIEWTYPEMENU_H #include namespace Peony { class ViewFactorySortFilterModel2; } class ViewTypeMenu : public QMenu { Q_OBJECT public: explicit ViewTypeMenu(QWidget *parent = nullptr); const QIcon getCurrentIconFromViewId(); Q_SIGNALS: void switchViewRequest(const QString &viewId, const QIcon &icon, bool resetToZoomLevelHint = false); void updateZoomLevelHintRequest(int zoomLevelHint); public Q_SLOTS: void setCurrentView(const QString &viewId, bool blockSignal = false); void setCurrentDirectory(const QString &uri); protected: bool isViewIdValid(const QString &viewId); void updateMenuActions(); private: QString m_current_uri; QString m_current_view_id; Peony::ViewFactorySortFilterModel2 *m_model; QActionGroup *m_view_actions; }; #endif // VIEWTYPEMENU_H peony/src/control/label-box-delegate.h0000664000175000017500000000326715154271106016701 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: MeihongHe * */ #ifndef LABELBOXDELEGATE_H #define LABELBOXDELEGATE_H #include class FileLabelModel; class LabelBoxDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit LabelBoxDelegate(QObject *parent = nullptr); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index); QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void destroyEditor(QWidget *editor, const QModelIndex &index) const override; FileLabelModel* getSourceModel(const QAbstractItemModel* model) const; QModelIndex mapToSourceIndex(const QModelIndex& proxyIndex) const; Q_SIGNALS: }; #endif // LABELBOXDELEGATE_H peony/src/control/tab-status-bar.h0000664000175000017500000000446715154271070016120 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: MeihongHe * */ #ifndef TABSTATUSBAR_H #define TABSTATUSBAR_H #include #include class QLabel; class QToolBar; class TabWidget; class ElidedLabel; class QSlider; class QVariantAnimation; class TabStatusBar : public QStatusBar { friend class MainWindow; friend class TabWidget; Q_OBJECT public: explicit TabStatusBar(TabWidget *tab, QWidget *parent = nullptr); ~TabStatusBar() override; int currentZoomLevel(); Q_SIGNALS: void zoomLevelChangedRequest(int zoomLevel); public Q_SLOTS: void update(); void update(const QString &message); void updateZoomLevelState(int zoomLevel); void onZoomRequest(bool zoomIn); //显示隐藏文件,更新项目个数 void updateItemsNum(); void updateSearchProgress(bool searching); protected: void paintEvent(QPaintEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; private: TabWidget *m_tab = nullptr; ElidedLabel *m_label = nullptr; QToolBar *m_styled_toolbar = nullptr; QSlider *m_slider; bool m_searching = false; QVariantAnimation* m_animation; }; class ElidedLabel : public QWidget { Q_OBJECT public: explicit ElidedLabel(QWidget *parent); void setText(const QString &text); void setSearch(bool searching); void setValue(double value); protected: void paintEvent(QPaintEvent *event) override; private: QString m_text; QPixmap m_disc; bool m_searching = false; double m_val = 0.0; }; #endif // TABSTATUSBAR_H peony/src/control/sort-type-menu.h0000664000175000017500000000364115154271106016170 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef SORTTYPEMENU_H #define SORTTYPEMENU_H #include #include class SortTypeMenu : public QMenu { Q_OBJECT public: explicit SortTypeMenu(QWidget *parent = nullptr); void setOriginPathVisible(bool visible); void setFilePathVisible(bool visible); QString getSortTypeName(int type); void updateSortOrderName(int type); void setUserAddedEnable(bool visiable); bool isAutoModeType(int type); Q_SIGNALS: void switchSortTypeRequest(int type); void switchSortOrderRequest(Qt::SortOrder order); void globalSortingPolicyChanged(); public Q_SLOTS: void setSortType(int type); void setSortOrder(Qt::SortOrder order); private: int m_sort_type = 0; Qt::SortOrder m_sort_order = Qt::AscendingOrder; QAction *m_origin_path = nullptr; QAction *m_file_path = nullptr; QAction *m_mostUsed = nullptr; QAction *m_userAdded = nullptr; QAction *m_autoAdded = nullptr; QAction *m_onlyUserAdded = nullptr; QAction *m_onlyAutoAdded = nullptr; QMenu *m_addMode = nullptr; QActionGroup *m_sort_types; QActionGroup *m_sort_orders; }; #endif // SORTTYPEMENU_H peony/src/control/file-label-box.h0000664000175000017500000000410515154271070016036 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef FILELABELBOX_H #define FILELABELBOX_H #include #include #include #include class PEONYCORESHARED_EXPORT FileLabelBox : public QListView { Q_OBJECT public: explicit FileLabelBox(QWidget *parent = nullptr); QSize sizeHint() const; int getTotalDefaultColor() { return TOTAL_DEFAULT_COLOR; } const int TOTAL_DEFAULT_COLOR = 7; void setFloatWidgetVisible(bool visible); Q_SIGNALS: void leftClickOnBlank(); void fileLabelVisible(bool checked); protected: void mousePressEvent(QMouseEvent *e); void paintEvent(QPaintEvent *e); private: QPropertyAnimation *m_labelHeightAnimation = nullptr; bool m_isShow = false; }; class LabelBoxStyle : public QProxyStyle { static LabelBoxStyle *getStyle(); friend class FileLabelBox; LabelBoxStyle() {} void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const override; }; #endif // FILELABELBOX_H peony/src/control/operation-menu.h0000664000175000017500000000572215154271106016224 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef OPERATIONMENU_H #define OPERATIONMENU_H #include "about-dialog.h" #include #include #include class MainWindow; class QToolButton; class OperationMenuEditWidget; class QWidgetAction; class OperationMenu : public QMenu { Q_OBJECT public: explicit OperationMenu(MainWindow *window, QWidget *parent = nullptr); public Q_SLOTS: void updateMenu(); private: QAction *m_show_hidden = nullptr; QAction *m_forbid_thumbnailing = nullptr; QAction *m_resident_in_backend = nullptr; QAction *m_showFileExtension = nullptr; QAction *m_showCreateTime = nullptr; QAction *m_showFoldersInNewWindow = nullptr; QAction *m_showRelativeTime = nullptr; QAction *m_showNetwork = nullptr; QAction *m_setSambaPassword = nullptr; QAction *m_connecttoServer = nullptr; private: MainWindow *m_window = nullptr; OperationMenuEditWidget *m_edit_widget = nullptr; QWidgetAction *m_editWidgetContainer = nullptr; }; class OperationMenuEditWidget : public QWidget { public: friend class OperationMenu; Q_OBJECT Q_SIGNALS: void operationAccepted(); private: explicit OperationMenuEditWidget(MainWindow *window, QWidget *parent = nullptr); void updateActions(const QString ¤tDirUri, const QStringList &selections); /** * @brief Handles events for watched objects * @param watched The object being watched * @param event The event that occurred * @return true if the event was handled, false otherwise * * This event filter specifically handles tooltip events for QToolButtons, * calculating and adjusting tooltip positions to ensure they remain visible * within screen boundaries. */ bool eventFilter(QObject *watched, QEvent *event); /** * @brief Installs tooltip event filter on a tool button * @param btn The QToolButton to install the event filter on * * Sets up event filtering for tooltip display on the specified button. */ void installTooltipFilter(QToolButton *btn); QToolButton *m_copy = nullptr; QToolButton *m_paste = nullptr; QToolButton *m_cut = nullptr; QToolButton *m_trash = nullptr; }; #endif // OPERATIONMENU_H peony/src/control/header-bar.h0000664000175000017500000001413015154271106015245 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef HEADERBAR_H #define HEADERBAR_H #include #include #include #include #include class MainWindow; class ViewTypeMenu; class SortTypeMenu; class OperationMenu; namespace Peony { class SearchWidget; } class HeaderBar; class QHBoxLayout; class HeaderBarContainer : public QToolBar { Q_OBJECT public: explicit HeaderBarContainer(QWidget *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); void addHeaderBar(HeaderBar *headerBar); void addMenu(MainWindow *m_window); QWidget *m_topMenu = nullptr; protected: void paintEvent(QPaintEvent *e); private: QWidget *m_internal_widget; QHBoxLayout *m_layout; HeaderBar *m_header_bar = nullptr; QToolButton *m_max_or_restore = nullptr; }; class HeaderBar : public QToolBar { friend class HeaderBarContainer; friend class MainWindow; friend class TopMenuBar; Q_OBJECT enum HeaderBarAction { GoBack, GoForward, LocationBar, Search, ViewType, SortType, Option, Copy, Cut, SeletcAll, Delete, TabletSelectAll, //task#106007 【文件管理器】文件管理器应用做平板UI适配,增加选项控件 TabletSelectDone, TabletMoveTo, TabletCopyTo, TabletDelete, TabletMin, TabletClose, IconView, ListView }; public: void updatePreviewStatus(bool check); private: explicit HeaderBar(MainWindow *parent = nullptr); ~HeaderBar(); Q_SIGNALS: void updateLocationRequest(const QString &uri, bool addHistory = true, bool force = true); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void viewTypeChangeRequest(const QString &viewId); void updateZoomLevelHintRequest(int zoomLevelHint); void updateSearchRequest(bool showSearch); // void clearTrash(); void refreshRequest(); void updateFileTypeFilter(const int &index); void setGlobalFlag(bool isGlobal); void updateSearchRecursive(bool recursive); void closeSearch(); void setLocation(const QString &uri); void cancelEdit(); void startEdit(bool bSearch = false); void updateSearchProgress(bool searching); void setSearchBarFocus(); protected: void addSpacing(int pixel); void mouseMoveEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent *e); void addTabletMenu(); void updateSelectStatus(bool autoUpdate); private Q_SLOTS: void updateIcons(); void updateMaximizeState(); void openDefaultTerminal(); void findDefaultTerminal(); void tryOpenAgain(); void switchSelectStatus(bool select); void cancleSelect(); void updateSortTypeEnable(); void updateViewTypeEnable(); void updatePreviewPageVisible(); void updateTabletModeValue(bool isTabletMode); bool CopyOrMoveTo(bool isCut); void quitMultiSelect(); void setSearchMode(bool isSearching); void quitSerachMode(); void finishEdit(); private: const QString m_uri; MainWindow *m_window; Peony::SearchWidget *m_searchWidget; ViewTypeMenu *m_view_type_menu; SortTypeMenu *m_sort_type_menu; OperationMenu *m_operation_menu; QToolButton *m_create_folder; QToolButton *m_go_back; QToolButton *m_go_forward; QToolButton *m_go_up; QToolButton *m_search_button; // bool m_search_global = false; bool m_is_intel = false; bool m_tablet_mode = false; // bool m_isDone = false; bool m_isSelectAll = false; // save the actions to show or hide QHash m_actions; QToolButton *m_maximize_restore_button; QAction *m_preview_action = nullptr; QActionGroup *m_view_actions; }; class HeaderBarToolButton : public QToolButton { friend class HeaderBar; friend class MainWindow; Q_OBJECT explicit HeaderBarToolButton(QWidget *parent = nullptr); }; class HeadBarPushButton : public QPushButton { friend class HeaderBar; friend class MainWindow; Q_OBJECT explicit HeadBarPushButton(QWidget *parent = nullptr); }; class HeaderBarStyle : public QProxyStyle { friend class HeaderBar; friend class HeaderBarContainer; static HeaderBarStyle *getStyle(); HeaderBarStyle() {} int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override; }; class TopMenuBar : public QMenuBar { Q_OBJECT public: explicit TopMenuBar(HeaderBar *headerBar, MainWindow *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); protected: void addWindowButtons(); private Q_SLOTS: void updateTabletMode(bool isTabletMode); private: QWidget *m_top_menu_internal_widget = nullptr; QHBoxLayout *m_top_menu_layout = nullptr; MainWindow *m_window = nullptr; QToolButton *m_max_or_restore = nullptr; QToolButton *m_minimize = nullptr; QToolButton *m_close = nullptr; bool m_tablet_mode = false; HeaderBar *m_header_bar = nullptr; }; #endif // HEADERBAR_H peony/src/control/label-box-delegate.cpp0000664000175000017500000000631015154271106017224 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: MeihongHe * */ #include "label-box-delegate.h" #include "file-label-model.h" #include #include #include LabelBoxDelegate::LabelBoxDelegate(QObject *parent) : QStyledItemDelegate(parent) { qDebug() << "LabelBoxDelegate enter"; } void LabelBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) { qDebug() << "LabelBoxDelegate paint"; auto opt = option; opt.decorationSize = QSize(); QStyledItemDelegate::paint(painter, opt, index); } QWidget *LabelBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option); auto labelModel = getSourceModel(index.model()); if (labelModel) { QModelIndex sourceIndex = mapToSourceIndex(index); labelModel->setEditingIndex(sourceIndex); } QLineEdit* editor = new QLineEdit(parent); editor->setMaxLength(14); return editor; } void LabelBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString text = index.model()->data(index, Qt::EditRole).toString(); QLineEdit* lineEdit = qobject_cast(editor); lineEdit->setText(text); } void LabelBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit* lineEdit = qobject_cast(editor); QString text = lineEdit->text(); model->setData(index, text, Qt::EditRole); auto labelModel = getSourceModel(model); if (labelModel) { labelModel->clearEditingIndex(); } } void LabelBoxDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const { auto labelModel = getSourceModel(index.model()); if (labelModel) { labelModel->clearEditingIndex(); } QStyledItemDelegate::destroyEditor(editor, index); } FileLabelModel* LabelBoxDelegate::getSourceModel(const QAbstractItemModel* model) const { if (auto proxyModel = qobject_cast(model)) { return qobject_cast(proxyModel->sourceModel()); } return qobject_cast(const_cast(model)); } QModelIndex LabelBoxDelegate::mapToSourceIndex(const QModelIndex& proxyIndex) const { if (auto proxyModel = qobject_cast(proxyIndex.model())) { return proxyModel->mapToSource(proxyIndex); } return proxyIndex; } peony/translations/0000775000175000017500000000000015154271070013355 5ustar fengfengpeony/translations/peony-qt-desktop/0000775000175000017500000000000015154271106016600 5ustar fengfengpeony/translations/peony-qt-desktop/peony-qt-desktop_de.ts0000664000175000017500000005106115154271106023046 0ustar fengfeng AdvancedDesktopIconView Open Link failed Open Link fehlgeschlagen File not exist, do you want to delete the link file? Datei nicht vorhanden, möchten Sie die Linkdatei löschen? Open failed Öffnen fehlgeschlagen Open directory failed, you have no permission! Das Öffnen des Verzeichnisses ist fehlgeschlagen, Sie haben keine Berechtigung! Desktop Icon View Desktop-Symbol-Ansicht FileActionController New Folder Open Link failed Open Link fehlgeschlagen File not exist, do you want to delete the link file? Datei nicht vorhanden, möchten Sie die Linkdatei löschen? Open failed Öffnen fehlgeschlagen Open directory failed, you have no permission! Das Öffnen des Verzeichnisses ist fehlgeschlagen, Sie haben keine Berechtigung! Peony::DesktopIconView Desktop Icon View Desktop-Symbol-Ansicht New Folder Neuer Ordner set background Hintergrund festlegen Delete file Warning 删除文件警告 Open failed Öffnen fehlgeschlagen Open directory failed, you have no permission! Das Öffnen des Verzeichnisses ist fehlgeschlagen, Sie haben keine Berechtigung! Open Link failed Open Link fehlgeschlagen File not exist, do you want to delete the link file? Datei nicht vorhanden, möchten Sie die Linkdatei löschen? Peony::DesktopItemModel Computer Computer Trash Müll Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select Auswahl umkehren &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Neuer Ordner View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window In neuem Fenster öffnen Select All Alles auswählen Open Offen Open with... Öffnen mit... More applications... Weitere Anwendungen... Open %1 selected files %1 ausgewählte Dateien öffnen New Neu Empty File Leere Datei Folder Ordner Auto arrange View Type Typ der Ansicht Small Klein Normal Normal Large Groß Huge Riesig Sort By Sortieren nach Time Modified Mount Sort By... 排序方式... Name Name File Type Dateityp File Size Dateigröße Sort Order Clean the trash Reinigen Sie den Müll Copy Kopieren Delete to trash In den Papierkorb löschen Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date Änderungsdatum Delete file Warning 删除文件警告 Cut Schneiden &Delete to trash 删除到回收站(&D) Delete forever Für immer löschen Rename Umbenennen Paste Kleister Refresh Auffrischen Properties Eigenschaften P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop Pfingstrose-qt-desktop Peony-Qt Desktop 桌面 Desktop 桌面 Close the peony desktop window Schließen Sie das Pfingstrosen-Desktopfenster Take over the dbus service. Übernehmen Sie den dbus-Service. Take over the desktop displaying Übernehmen Sie die Desktop-Anzeige Setup backgrounds Hintergründe einrichten Clear standard icons Übersichtliche Standardsymbole Layout item with top to bottom left to right Force update backgrounds set background 设置背景 QObject set background Hintergrund festlegen display settings Anzeige-Einstellungen set resolution 设置分辨率 Set Background Display Settings peony/translations/peony-qt-desktop/peony-qt-desktop_zh_HK.ts0000664000175000017500000005575715154271106023501 0ustar fengfeng AdvancedDesktopIconView New Folder 新建資料夾 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 檔案不存在,是否要刪除連結檔? Open failed 打開失敗 Open directory failed, you have no permission! 打開目錄失敗,您沒有許可權! Desktop Icon View 桌面圖示檢視 FileActionController New Folder Open Link failed File not exist, do you want to delete the link file? Open failed Open directory failed, you have no permission! Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select 反向選擇 &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建資料夾 View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window 在新視窗中打開 Select All 全選 Open 打開 Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... 開啟方式... More applications... 更多應用程式... Open %1 selected files 開啟 %1 個選定的檔案 New 新增功能 Empty File 空檔 Folder 資料夾 Auto arrange 自動排列 View Type 視圖類型 Small Normal 正常 Large Huge 巨大 Sort By 排序方式 Time Modified 修改時間 Mount 安裝 Sort By... 排序方式... Name 名字 File Type 檔案類型 File Size 檔大小 Sort Order 排序順序 Clean the trash 清理垃圾桶 Copy 複製 Delete to trash 刪除至回收站 Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date 修改日期 Delete file Warning 删除文件警告 Cut &Delete to trash 删除到回收站(&D) Delete forever 永久刪除 Rename 重新命名 Paste Refresh 刷新 Properties 性能 P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop 牡丹-qt-桌面 Peony-Qt Desktop 桌面 Desktop 桌面 Warning 警告 Close the peony desktop window 關閉牡丹桌面視窗 Take over the dbus service. 接管 dbus 服務。 Take over the desktop displaying 接管桌面顯示 Setup backgrounds 設置背景 Clear standard icons 清除標準圖示 Layout item with top to bottom left to right 從上到下從左到右的布局專案 Force update backgrounds 強制更新背景 Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background 設置背景 Display Settings 顯示設置 StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_fr.ts0000664000175000017500000003151315154271106023065 0ustar fengfeng Peony::DesktopIconView Desktop Icon View Affichage des icônes du bureau New Folder Nouveau dossier set background Définir l'arrière-plan Delete file Warning Dosyayı Sil Uyarısı Open Link failed Échec de l'ouverture du lien File not exist, do you want to delete the link file? Le fichier n'existe pas, voulez-vous supprimer le fichier de lien ? Open failed Échec de l'ouverture Open directory failed, you have no permission! L'ouverture du répertoire a échoué, vous n'avez aucune permission ! Peony::DesktopMenu &Open in new Window &Ouvrir dans une nouvelle fenêtre Select &All &Tout sélectionner &Open "%1" &Ouvrir "%1" Open "%1" &with... Ouvrir "%1" &avec... &More applications... &Plus d'applications... Open "%1" with... Ouvrir "%1" avec... &Open &Ouvrir &Open %1 selected files &Ouvrir %1 fichiers sélectionnés Reverse Select Sélection inverse &New... &Yeni... New... Nouveau... Empty &File Fichier vide &Folder &Dossier New Folder Nouveau dossier View Type... Type de vue... &Small &Petit &Normal &Normal &Large &Large &Huge &Énorme Sort By... Trier par... Name Nom File Type Type de fichier File Size Taille du fichier Modified Date Date modifiée Delete file Warning Dosyayı Sil Uyarısı Cut Couper &Delete to trash &Supprimer vers la corbeille Delete forever Kalıcı olarak sil Rename Renommer Properties Propriétés P&roperties Özellikler Sort Order... Sıralama Düzeni... Ascending Order Artan Düzen Descending Order Azalan Düzen Zoom &In Yakınlaştır Zoom &Out Uzaklaştır &Restore all Tümünü Onar &Clean the trash &Nettoyer la corbeille Delete Permanently Supprimer définitivement Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. &Copy &Copier Cu&t Kes &Delete Sil &Rename Yeniden Adlandır &Paste &Coller &Refresh &Rafraîchir &Properties Özellikler Peony::DesktopWindow Desktop Bureau set background définir l'arrière-plan New Folder Yeni Klasör PeonyDesktopApplication Close the peony-qt desktop window Masaüstünü kapatın ve çıkın peony-qt-desktop Masaüstü Peony-Qt Desktop Masaüstü Desktop Masaüstü Close the peony desktop window Fermer la fenêtre peony du bureau Take over the dbus service. Reprendre le service dbus. Take over the desktop displaying Reprendre l'affichage du bureau peony/translations/peony-qt-desktop/peony-qt-desktop_vi.ts0000664000175000017500000005535415154271106023105 0ustar fengfeng AdvancedDesktopIconView New Folder Open Link failed Mở liên kết thất bại File not exist, do you want to delete the link file? Tệp đích không tồn tại,bạn có muốn xóa liên kết này không? Open failed Open directory failed, you have no permission! Mở thư mục thất bại,bạn không có quyền truy cập vào thư mục này! Desktop Icon View Chế độ xem biểu tượng trên màn hình chính Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select Chọn ngược lại &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window Select All Chọn tất cả Open Mở Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... Phương cách mở More applications... Ứng dụng nhiều hơn Open %1 selected files Mở %1 cái tệp đã chọn New Tạo Empty File Văn bản trống Folder Thư mục Auto arrange Xếp hàng tự động View Type Loại chế độ xem Small Biểu tượng nhỏ Normal Biểu tượng vừa Large Biểu tượng lớn Huge Biểu tượng cực lớn Sort By Loại sắp xếp Mount Sort By... 排序方式... Name Tên người dùng File Type Loại tệp File Size Sort Order Thứ tự sắp xếp Clean the trash Copy Sao chép Delete to trash Xóa vào thùng rác Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date Sửa đổi ngày Delete file Warning 删除文件警告 Cut Cắt &Delete to trash 删除到回收站(&D) Delete forever Xóa vĩnh viễn Rename Đổi tên Paste Dán Refresh Làm mới Properties Thuộc tính P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order Thứ tự tăng dần Descending Order Thứ tự giảm dần Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop Màn hình nền Peony-Qt Desktop 桌面 Desktop 桌面 Warning Cảnh báo Close the peony desktop window Đóng chương trình màn hình Take over the dbus service. Tiếp quản dịch vụ DBus. Take over the desktop displaying Tiếp quản mành hình nền Setup backgrounds Đặt nền Clear standard icons Xóa biểu tượng tiêu chuẩn Layout item with top to bottom left to right Sắp xếp các biểu tượng từ trên xuống dưới và từ trái sang phải Force update backgrounds Cập nhật màn hình nền bắt buộc Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background Display Settings StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_ug_CN.ts0000664000175000017500000006005315154271106023452 0ustar fengfeng AdvancedDesktopIconView Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باسمازمۇندى ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ۇقىعىڭىز جوق! Desktop Icon View ۇستەل بەتى اي كۇن كورىنۋى FileActionController New Folder Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باسمازمۇندى ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ۇقىعىڭىز جوق! Peony::DesktopIconView Desktop Icon View ۇستەل بەتى اي كۇن كورىنۋى New Folder جاڭا حۇجات قىسقىش set background 设置背景 Delete file Warning 删除文件警告 Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باسمازمۇندى ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ۇقىعىڭىز جوق! Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى Set Background ارتى تەڭدٸك تەڭشەۋ File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select كەرٸ باعىتتالۋ تالداۋ &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭا حۇجات قىسقىش View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window جاڭا تەرەزەدە اشٸلدٸ Select All ٴبارىن تالدا Open ٸشٸۋ Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... ٸشٸۋ ٴتاسٸلٸ... More applications... الٸدە كوپ ئەپلەر Open %1 selected files تالدانعان حۇجاتىن %1 نى ٸشٸۋ New جاڭا Empty File قۇرعاق حۇجات Folder حۇجات قىسقىش Auto arrange View Type كورۋ تيپى Small كشكەنە Normal نورمال Large ۇلكەن Huge وتە ۇلكەن Sort By تارتٸپكە تىزۋ نەگىزىنەن Time Modified Mount Sort By... 排序方式... Name شايۋ File Type حۇجات تۇرى File Size حۇجات ۇلكەندىگى Sort Order Clean the trash قوقسىقتاردى تازالاۋ Copy كوشىرۋ Delete to trash قوقسىق ساندىعىنا تاستاۋ Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date وزگەرتىلگەن ۋاقىتى Delete file Warning 删除文件警告 Cut كەسۋ &Delete to trash 删除到回收站(&D) Delete forever ماڭگىلىك ٴوشىرۋ Rename قاتە ات فاميليا ەتۋ Paste شاپتاۋ Refresh جاڭالاۋ Properties سۋرەت قاسيەتى P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peony-qt-ۇستەل بەتى Peony-Qt Desktop 桌面 Desktop 桌面 Close the peony desktop window peony ۇستەل بەتى تەرەزەنى جابىپ الۋ Take over the dbus service. dbus قىزىمەتتى ئۆتكۈزۈۋالىدۇ. Take over the desktop displaying وتكىزىلىپ ۇستەل بەتى كورسەتۋ Setup backgrounds ارتى كورىنۋ ورنالاسترعان ەتۋ Clear standard icons ولشەمدى گرافيىكتى تازالاۋ Layout item with top to bottom left to right Force update backgrounds Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background ارتى تەڭدٸك تەڭشەۋ Display Settings تەڭگەرگٸشتٸ كورسەتۋ StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_ug.ts0000664000175000017500000005654015154271106023100 0ustar fengfeng AdvancedDesktopIconView New Folder يېڭى ھۆججەت قىسقۇچ Open Link failed ئۇلانمىنى ئېچىش مەغلۇپ بولدى File not exist, do you want to delete the link file? ھۆججەت مەۋجۇت ئەمەس، ئۇلانما ھۆججەتنى ئۆچۈرەمسىز؟ Open failed ئېچىش مەغلۇپ بولدى Open directory failed, you have no permission! مۇندەرىجىنى ئېچىش مەغلۇپ بولدى، سىزنىڭ ھوقۇقىڭىز يوق! Desktop Icon View ئۈستەل يۈزى سىنبەلگە كۆرۈنۈشى Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select تەتۈر يۆنىلىشلىك تاللاش &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder يېڭى ھۆججەت قىسقۇچ View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window يېڭى كۆزنەكتە ئېچىش Select All ھەممىسىنى تاللاش Open ئېچىش Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... ئېچىش ئۇسۇلى... More applications... تېخىمۇ كۆپ ئەپلەر.... Open %1 selected files %1 لىك رەسىمنى ئېچىش New يېڭى Empty File قۇرۇق ھۆججەت Folder ھۆججەت قىسقۇچ Auto arrange ئاپتوماتىك ئورۇنلاشتۇرۇش View Type كۆرۈش تۈرى Small كىچىك Normal نورمال Large چوڭ Huge ناھايىتى چوڭ Sort By رەتكە تىزىش ئاساسى Mount باغلاش Sort By... 排序方式... Name نامى File Type ھۆججەت تۈرى File Size ھۆججەت چوڭلۇقى Sort Order رەتكە تىزىش تەرتىپى Clean the trash ئەخلەت ساندۇقىنى تازىلاش Copy كۆچۈرۈش Delete to trash ئەخلەت تۇڭىغا تاشلىۋېتىش Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date ئۆزگەرتىلگەن ۋاقتى Delete file Warning 删除文件警告 Cut كېسىش &Delete to trash 删除到回收站(&D) Delete forever مەڭگۈلۈك ئۆچۈرۈش Rename قايتا ئىسىم فامىلە قىلىش Paste چاپلاش Refresh يېڭىلاش Properties خاسلىقى P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order ئۆرلەش تەرتىپى Descending Order تۆۋەنلەش تەرتىپى Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peony-qt-ئۈستەل يۈزى Peony-Qt Desktop 桌面 Desktop 桌面 Warning ئاگاھلانددۇرۇش Close the peony desktop window peony ئۈستەل يۈزى كۆزنىكىنى ئېتىۋېتىش Take over the dbus service. dbus مۇلازىمىتىنى ئۆتكۈزۈۋالىدۇ. Take over the desktop displaying ئۆتكۈزۈۋېلىپ ئۈستەل يۈزى كۆرسىتىش Setup backgrounds ئارقا كۆرۈنۈش تەسىس قىلىش Clear standard icons ئۆلچەملىك سىنبەلگىنى تازىلاش Layout item with top to bottom left to right ئۈستىدىن ئاستى سولدىن ئوڭغا ئورۇنلاشتۇرۇلغان بەت لايىھەسى Force update backgrounds تەگلىكنى مەجبۇرىي يېڭىلاش پروگراممىسى Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background تەگلىك بەلگىلەش Display Settings كۆرسىتىش تەڭشەكلىرى StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_es.ts0000664000175000017500000005075515154271106023076 0ustar fengfeng AdvancedDesktopIconView Open Link failed Error en el enlace abierto File not exist, do you want to delete the link file? El archivo no existe, ¿desea eliminar el archivo de enlace? Open failed Error al abrirlo Open directory failed, you have no permission! Error en el directorio abierto, ¡no tiene permiso! Desktop Icon View Vista de icono de escritorio FileActionController New Folder Open Link failed Error en el enlace abierto File not exist, do you want to delete the link file? El archivo no existe, ¿desea eliminar el archivo de enlace? Open failed Error al abrirlo Open directory failed, you have no permission! Error en el directorio abierto, ¡no tiene permiso! Peony::DesktopIconView Desktop Icon View Vista de icono de escritorio New Folder Nueva carpeta set background Establecer fondo Delete file Warning 删除文件警告 Open failed Error al abrirlo Open directory failed, you have no permission! Error en el directorio abierto, ¡no tiene permiso! Open Link failed Error en el enlace abierto File not exist, do you want to delete the link file? El archivo no existe, ¿desea eliminar el archivo de enlace? Peony::DesktopItemModel Computer Ordenador Trash Basura Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select Selección inversa &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Nueva carpeta View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window Abrir en una ventana nueva Select All Seleccionar todo Open Abrir Open with... Abrir con... More applications... Más aplicaciones... Open %1 selected files Abrir %1 archivos seleccionados New Nuevo Empty File Archivo vacío Folder Carpeta Auto arrange View Type Tipo de vista Small Pequeño Normal Normal Large Grande Huge Enorme Sort By Ordenar por Time Modified Mount Sort By... 排序方式... Name Nombre File Type Tipo de archivo File Size Tamaño del archivo Sort Order Clean the trash Limpiar la basura Copy Copiar Delete to trash Eliminar a la papelera Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date Fecha de modificación Delete file Warning 删除文件警告 Cut Cortar &Delete to trash 删除到回收站(&D) Delete forever Eliminar para siempre Rename Rebautizar Paste Pegar Refresh Actualizar Properties Propiedades P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peonía-qt-escritorio Peony-Qt Desktop 桌面 Desktop 桌面 Close the peony desktop window Cerrar la ventana del escritorio de la peonía Take over the dbus service. Hazte cargo del servicio de dbus. Take over the desktop displaying Toma el control de la visualización del escritorio Setup backgrounds Fondos de configuración Clear standard icons Borrar iconos estándar Layout item with top to bottom left to right Force update backgrounds set background 设置背景 QObject set background Establecer fondo display settings Configuración de pantalla set resolution 设置分辨率 Set Background Display Settings peony/translations/peony-qt-desktop/peony-qt-desktop_ky.ts0000664000175000017500000005662315154271106023112 0ustar fengfeng AdvancedDesktopIconView New Folder جاڭى ۅجۅت قىپچىعىچ Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتۉن ۅچۉرۅسۉزبۉ؟ Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! تىزىمدىك اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇرۇقسات جوق! Desktop Icon View شىرە بەتى شارتتۇۇ بەلگى گۅرۉنۉشۉ Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select تەسكەرى تانداش &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭى ۅجۅت قىپچىعىچ View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window جاڭى كۅزۅنۅكتۅ اچۇۇ Select All باردىعىن تاندا Open اچۇۇ Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... اچۇۇ مەنەن... More applications... داعى ەلە كۅپ تىركەمەلەر.... Open %1 selected files %1 لىق سۉرۅتتۉ اچۇۇ New جاڭى Empty File ۅجۅت كۅڭدۅي Folder تىزىمدىك Auto arrange اپتوماتتىك ورۇنداشتىرۇۇ View Type كۅرۉۉ تۉرۉ Small كىچىك Normal نورماال Large چوڭ Huge ەرەكچە چوڭ Sort By بويۇنچا تۉرگۅ بۆلۉش Mount بايلوو Sort By... 排序方式... Name ات-تەك اتى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ Sort Order تۉرگۅ بۆلۉش تارتىبى Clean the trash شىپىرىندى ساندىعىن تازالوو Copy گۅچۉرۉش Delete to trash شىپىرىندى چەلەك تاشلىۋېتىش Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date ۅزگۅرتۉلگۅن ۇباقتى Delete file Warning 删除文件警告 Cut قىيىش &Delete to trash 删除到回收站(&D) Delete forever تۉبۅلۉك ۅچۉرۉۉ Rename اتىن ۅزگۅرتۉش Paste ىلەەشكەك Refresh جاڭىلوو Properties ۅزگۅچۅلۉكتۅر P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order جوعورۇلو تارتىبى Descending Order تۅمۅندۅش تارتىبى Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peony-qt-شىرە بەتى Peony-Qt Desktop 桌面 Desktop 桌面 Warning ەسكەرتۉۉ Close the peony desktop window peony شىرە بەتى كۅزۅنۅگۉن ەتىپ جىبەرۉۉ Take over the dbus service. dbus مۇلازىمەتىردى ۉستۅمدۉك قىلات.. Take over the desktop displaying ۅتكۅزۉپ جىبەرىلىپ شىرە بەتى كۅرسۅتۉۉ Setup backgrounds ارقا كۅرۉنۉش قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ Clear standard icons ۅلچۅمدۉۉ شارتتۇۇ بەلگىنى تازالوو Layout item with top to bottom left to right ۉستۉنۅن الدى سولدون وڭ جاقا ورۇنداشتىرىلعان بەت دولبوورۇ Force update backgrounds تاقتانى زوردۇق مەنەن جاڭىلوو پىروگىرامماسى Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background تۅشۅنمۅ بەلگىلۅۅ Display Settings كۅرسۅتۉۉ تەڭشەكتەرى StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_bo_CN.ts0000664000175000017500000006162515154271106023445 0ustar fengfeng AdvancedDesktopIconView New Folder ཡིག་ཁུག་གསར་འཛུགས། Open Link failed བདེ་མྱུར་གྱི་ཐབས་ལ་བརྟེན་ནས་ཕམ་སོང་། File not exist, do you want to delete the link file? དམིགས་འབེན་ཡིག་ཆ་མེད་པས།བསུབ་ན་ནུས་པ་མེད་པར་གཏོང་ཐུབ་བམ། Open failed ཁ་ཕྱེ་མ་ཐུབ། Open directory failed, you have no permission! ཡིག་ཆའི་ཁ་ཕྱེ་ནས་ཕམ་སོང་།ཁྱེད་ལ་དཀར་ཆག་འདིའི་དབང་ཚད་མེད། Desktop Icon View ཅོག་ངོས་རི་མོ། FileActionController New Folder Open Link failed File not exist, do you want to delete the link file? Open failed Open directory failed, you have no permission! Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select ལྡོག་འདེམས། &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder ཡིག་ཁུག་གསར་འཛུགས། View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window སྒེའུ་ཁུང་གསར་པའི་ནང་ཁ་ཕྱེ། Select All ཡོངས་འདེམས་ Open སྒོ་ཕྱེ་བ། Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... ཁ་འབྱེད་སྟངས། More applications... སྤྱོད་བཏང་སྣ་ཚོགས། Open %1 selected files གདམ་ཟིན་པའི་ཡིག་ཆ་%1ཁ་ཕྱེས། New གསར་འཛུགས། Empty File ཡིག་སྟོང། Folder ཡིག་སྣོད་ Auto arrange སྟར་རང་སྒྲིག View Type མཐོང་རིས་རིགས། Small ཆུང་བ། Normal རྒྱུན་ལྡན་གྱི་གནས་ Large ཆེ་བ། Huge རིས་རྟགས་ཤིན་ཏུ་ཆེ་བ། Sort By གོ་རིམ་སྒྲིག་སྟངས། Time Modified བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད Mount བཀལ་ལེན། Sort By... 排序方式... Name མིང་། File Type ཡིག་ཆའི་རིགས། File Size ཡིག་ཆའི་མང་ཉུང་། Sort Order གོ་རིམ་སྒྲིག་པ། Clean the trash སྙིགས་སྒམ་གཙང་སེལ། Copy འདྲ་ཕབ། Delete to trash སྙིགས་སྣོད་དུ་སུབ་པ། Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date བཅོས་པའི་ཚེས་གྲངས། Delete file Warning 删除文件警告 Cut དྲས་གཏུབ། &Delete to trash 删除到回收站(&D) Delete forever རྕ་བ་ནས་བསུབ་པ། Rename མིང་བསྒྱུར་བ། Paste སྦྱར་བ། Refresh གསར་འདོན། Properties གཏོགས་གཤིས། P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order རིམ་འཕར། Descending Order རིམ་འབེབས། Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop ཅོག་ངོས། Peony-Qt Desktop 桌面 Desktop 桌面 Warning ཐ་ཚིག་སྒྲོག་པ། Close the peony desktop window ཅོག་ངོས་བྱ་རིམ་ཁ་རྒྱག་པ། Take over the dbus service. DBusཞབས་ཞུ་རྩིས་ལེན་བྱེད་པ། Take over the desktop displaying ཅོག་ངོས་རྩིས་ལེན་པ། Setup backgrounds Setupbackgrounds Clear standard icons Clearstandardicons Layout item with top to bottom left to right གཡས་གོང་ནས་གཡོན་འོག་བར་རིས་རྟགས་སྟར་སྒྲིག Force update backgrounds བཙན་བཤེད་ངང་རྒྱབ་ལྗོངས་སྒྱུར། Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background རྒྱབ་ལྗོངས་སྒྲིག་འགོད། Display Settings སྒྲིག་འགོད་འཆར་བ། StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_cs.ts0000664000175000017500000003173415154271106023070 0ustar fengfeng Peony::DesktopIconView Desktop Icon View New Folder Yeni Klasör set background Open Link failed File not exist, do you want to delete the link file? Open failed Open directory failed, you have no permission! Peony::DesktopItemModel Computer Trash Peony::DesktopMenu Reverse Select &New... &Yeni... New... New Folder Yeni Klasör View Type... Sort By... Name File Type File Size Modified Date Open in new Window Select All Open Open with... More applications... Open %1 selected files Empty File Folder Small Normal Large Huge Clean the trash Copy Cut Delete to trash Delete forever Kalıcı olarak sil Rename Paste Refresh Properties P&roperties Özellikler Sort Order... Sıralama Düzeni... Ascending Order Artan Düzen Descending Order Azalan Düzen Zoom &In Yakınlaştır Zoom &Out Uzaklaştır Delete Permanently Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Cu&t Kes &Delete Sil &Rename Yeniden Adlandır &Properties Özellikler Peony::DesktopWindow Desktop Masaüstü New Folder Yeni Klasör PeonyDesktopApplication Close the peony-qt desktop window Masaüstünü kapatın ve çıkın peony-qt-desktop Masaüstü Peony-Qt Desktop Masaüstü Desktop Masaüstü Close the peony desktop window Take over the dbus service. Take over the desktop displaying Setup backgrounds Clear standard icons QObject set background set resolution peony/translations/peony-qt-desktop/peony-qt-desktop_tr.ts0000664000175000017500000004107215154271106023104 0ustar fengfeng Peony::DesktopIconView Desktop Icon View Masaüstü Simgelerini Göster New Folder Yeni Klasör set background Arkaplanı Değiştir Delete file Warning Dosyayı Sil Uyarısı Open Link failed Bağlantı Açılamadı File not exist, do you want to delete the link file? Dosya mevcut değil, bağlantı dosyasını silmek istiyor musunuz? Open failed Açma hatalı Open directory failed, you have no permission! Dizin açılamadı, izniniz yok! Peony::DesktopItemModel Computer Trash Peony::DesktopMenu &Open in new Window Yeni Pencerede Aç Select &All Tümünü Seç &Open "%1" "%1" Aç Open "%1" &with... "%1" &ile aç... &More applications... &Daha fazla uygulama... Open "%1" with... "%1" ile aç... &Open &Aç &Open %1 selected files Seçilen %1 dosyasını aç Reverse Select Seçimi Ters Çevir &New... &Yeni... New... Yeni... Empty &File &Boş Dosya &Folder &Klasör New Folder Yeni Klasör View Type... Görünüm Türü... &Small &Küçük &Normal &Normal &Large &Büyük &Huge &Daha Büyük Open in new Window Select All Open Open with... More applications... Open %1 selected files Empty File Folder Small Normal Large Huge Sort By... Sırala... Name İsim File Type Dosya Türü File Size Dosya Boyutu Clean the trash Copy Delete to trash Modified Date Düzenleme Tarihi Delete file Warning Dosyayı Sil Uyarısı Cut Kes &Delete to trash Çöp Kutusuna Taşı Delete forever Kalıcı olarak sil Rename Yeniden Adlandır Paste Refresh Properties Özellikler P&roperties Özellikler Sort Order... Sıralama Düzeni... Ascending Order Artan Düzen Descending Order Azalan Düzen Zoom &In Yakınlaştır Zoom &Out Uzaklaştır &Restore all Tümünü Onar &Clean the trash Çöpü Temizle Delete Permanently Kalıcı Olarak Sil Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. &Copy &Kopyala Cu&t Kes &Delete Sil &Rename Yeniden Adlandır &Paste Yapıştır &Refresh Yenile &Properties Özellikler Peony::DesktopWindow Desktop Masaüstü set background Arkaplanı Değiştir New Folder Yeni Klasör PeonyDesktopApplication Close the peony-qt desktop window Masaüstünü kapatın ve çıkın peony-qt-desktop Masaüstü Peony-Qt Desktop Masaüstü Desktop Masaüstü Close the peony desktop window Peony masaüstü penceresini kapat Take over the dbus service. Dbus servisini al Take over the desktop displaying Masaüstü görüntülemeyi al Setup backgrounds Clear standard icons set background Arkaplanı Değiştir QObject set background Arkaplanı Değiştir set resolution peony/translations/peony-qt-desktop/peony-qt-desktop_zh_CN.ts0000664000175000017500000005614015154271106023462 0ustar fengfeng AdvancedDesktopIconView New Folder 新建文件夹 Open Link failed 打开快捷方式失败 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Desktop Icon View 桌面图标视图 FileActionController New Folder 新建文件夹 Open Link failed 打开快捷方式失败 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select 反选 &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建文件夹 View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window 在新窗口中打开 Select All 全选 Open 打开 Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... 打开方式 More applications... 更多应用 Open %1 selected files 打开%1个选中文件 New 新建 Empty File 空文本 Folder 文件夹 Auto arrange 自动排列 View Type 视图类型 Small 小图标 Normal 中图标 Large 大图标 Huge 超大图标 Sort By 排序方式 Time Modified 修改日期 Mount 挂载 Sort By... 排序方式... Name 文件名称 File Type 文件类型 File Size 文件大小 Sort Order 排序顺序 Clean the trash 清空回收站 Copy 复制 Delete to trash 删除到回收站 Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date 修改日期 Delete file Warning 删除文件警告 Cut 剪切 &Delete to trash 删除到回收站(&D) Delete forever 永久删除 Rename 重命名 Paste 粘贴 Refresh 刷新 Properties 属性 P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop 桌面 Peony-Qt Desktop 桌面 Desktop 桌面 Warning 警告 Close the peony desktop window 关闭桌面程序 Take over the dbus service. 接管DBus服务。 Take over the desktop displaying 接管桌面 Setup backgrounds Setup backgrounds Clear standard icons Clear standard icons Layout item with top to bottom left to right 从左上到右下排列图标 Force update backgrounds 强制更新背景 Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background 设置背景 Display Settings 显示设置 StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_zh_Hant.ts0000664000175000017500000005435315154271106024060 0ustar fengfeng AdvancedDesktopIconView New Folder 新建資料夾 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 檔案不存在,是否要刪除連結檔? Open failed 打開失敗 Open directory failed, you have no permission! 打開目錄失敗,您沒有許可權! Desktop Icon View 桌面圖示檢視 Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select 反向選擇 &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建資料夾 View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window 在新視窗中打開 Select All 全選 Open 打開 Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... 開啟方式... More applications... 更多應用程式... Open %1 selected files 開啟 %1 個選定的檔案 New 新增功能 Empty File 空檔 Folder 資料夾 Auto arrange 自動排列 View Type 視圖類型 Small Normal 正常 Large Huge 巨大 Sort By 排序方式 Mount 安裝 Sort By... 排序方式... Name 名字 File Type 檔案類型 File Size 檔大小 Sort Order 排序順序 Clean the trash 清理垃圾桶 Copy 複製 Delete to trash 刪除至回收站 Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date 修改日期 Delete file Warning 删除文件警告 Cut &Delete to trash 删除到回收站(&D) Delete forever 永久刪除 Rename 重新命名 Paste Refresh 刷新 Properties 性能 P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop 牡丹-qt-桌面 Peony-Qt Desktop 桌面 Desktop 桌面 Warning 警告 Close the peony desktop window 關閉牡丹桌面視窗 Take over the dbus service. 接管 dbus 服務。 Take over the desktop displaying 接管桌面顯示 Setup backgrounds 設置背景 Clear standard icons 清除標準圖示 Layout item with top to bottom left to right 從上到下從左到右的布局專案 Force update backgrounds 強制更新背景 Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background 設置背景 Display Settings 顯示設置 StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_ky_KG.ts0000664000175000017500000006031015154271106023457 0ustar fengfeng AdvancedDesktopIconView Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتنى ۅچۉرۅسۉزبۉ؟ Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! مازمۇۇندۇ اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇقۇعۇڭۇز جوق! Desktop Icon View شىرە بەتى شارتتۇۇ بەلگى گۅرۉنۉشۉ FileActionController New Folder Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتنى ۅچۉرۅسۉزبۉ؟ Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! مازمۇۇندۇ اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇقۇعۇڭۇز جوق! Peony::DesktopIconView Desktop Icon View شىرە بەتى شارتتۇۇ بەلگى گۅرۉنۉشۉ New Folder جاڭى ۅجۅت قىپچىعىچ set background 设置背景 Delete file Warning 删除文件警告 Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! مازمۇۇندۇ اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇقۇعۇڭۇز جوق! Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ Set Background ارقا تۅشۅنمۅ تەڭشۅۅ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتنى ۅچۉرۅسۉزبۉ؟ Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select تەسكەرى باعىتتۇۇ تانداش &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭى ۅجۅت قىپچىعىچ View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window جاڭى كۅزۅنۅكتۅ اچىلات Select All باردىعىن تانداڭ Open اچۇۇ Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... اچۇۇ ارعاسى... More applications... داعى ەلە كۅپ ئەپلەر Open %1 selected files تاندالعان ۅجۅتتۉن %1 نى اچۇۇ New جاڭى Empty File كۅڭدۅي ۅجۅت Folder ۅجۅت قىپچىعىچ Auto arrange View Type كۅرۉۉ تۉرۉ Small كىچىك Normal نورماال Large چوڭ Huge ەرەكچە چوڭ Sort By ىرەتكە تىزۉۉ نەگىزى Time Modified Mount Sort By... 排序方式... Name ئېتى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ Sort Order Clean the trash ئەخلەتلەرنى تازالوو Copy گۅچۉرۉش Delete to trash شىپىرىندى ساندىققا تاشتاش Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date ۅزگۅرتۉلگۅن ۇباقتى Delete file Warning 删除文件警告 Cut قىيىش &Delete to trash 删除到回收站(&D) Delete forever تۉبۅلۉك ۅچۉرۉۉ Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Paste چاپتوو Refresh جاڭىلوو Properties سۉرۅت قاسىيەتىن P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peony-qt-شىرە بەتى Peony-Qt Desktop 桌面 Desktop 桌面 Close the peony desktop window peony شىرە بەتى كۅزۅنۅگۉن ەتىپ جىبەرۉۉ Take over the dbus service. dbus مۇلازىمەتىردى ئۆتكۈزۈۋالىدۇ. Take over the desktop displaying ۅتكۅزۉپ جىبەرىلىپ شىرە بەتى كۅرسۅتۉۉ Setup backgrounds ارقا كۅرۉنۉش قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ Clear standard icons ۅلچۅمدۉۉ شارتتۇۇ بەلگىنى تازالوو Layout item with top to bottom left to right Force update backgrounds Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background ارقا تۅشۅنمۅ تەڭشۅۅ Display Settings تەڭشەكتى كۅرسۅتۉۉ StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_mn.ts0000664000175000017500000006326715154271106023103 0ustar fengfeng AdvancedDesktopIconView New Folder ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠠᠪᠲᠠᠰᠤ ᠰᠢᠨ᠎ᠡ᠎ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠬᠤ Open Link failed ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ File not exist, do you want to delete the link file? ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠲᠤᠰ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶᠢᠭ᠎ᠢ᠋ ᠬᠠᠰᠤᠨ᠎ᠠ ᠤᠤ ? Open failed ᠨᠡᠭᠡᠭᠡᠵᠦ ᠳᠡᠢᠯᠦᠭᠰᠡᠨ ᠦᠭᠡᠢ Open directory failed, you have no permission! ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠲᠠᠨ ᠳ᠋ᠤ᠌ ᠳᠤᠰ ᠭᠠᠷᠴᠠᠭ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ! Desktop Icon View ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠤ᠋ᠨ ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ ᠤ᠋ᠨ ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ FileActionController New Folder Open Link failed File not exist, do you want to delete the link file? Open failed Open directory failed, you have no permission! Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select ᠤᠷᠪᠠᠭᠤ ᠪᠡᠷ ᠰᠤᠩᠭᠤᠬᠤ &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠠᠪᠲᠠᠰᠤ ᠰᠢᠨ᠎ᠡ ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠬᠤ View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window ᠰᠢᠨ᠎ᠡ ᠴᠤᠨᠭᠬᠤᠨ ᠳᠡᠭᠡᠷ᠎ᠡ ᠨᠡᠭᠡᠭᠡᠬᠦ Select All ᠪᠦᠬᠦᠨ ᠢ᠋ ᠰᠤᠩᠭᠤᠬᠤ Open ᠨᠡᠬᠡᠬᠡᠬᠦ Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... ᠨᠡᠬᠡᠬᠡᠬᠦ ᠠᠷᠭ᠎ᠠ… More applications... ᠤᠯᠠᠮ ᠤᠯᠠᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ… Open %1 selected files %1 ᠰᠤᠩᠭᠤᠭᠰᠠᠨ ᠹᠠᠢᠯ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠬᠦ New ᠰᠢᠨ᠎ᠡ ᠡᠬᠦᠳᠭᠦ Empty File ᠬᠤᠭᠤᠰᠤᠨ ᠲᠸᠺᠰᠲ Folder ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ Auto arrange ᠠᠦ᠋ᠲ᠋ᠣ᠋ ᠵᠢᠭᠰᠠᠭᠠᠯᠲᠠ View Type ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ ᠵᠦᠢᠯ Small ᠵᠢᠵᠢᠭ ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ Normal ᠳᠤᠮᠳᠠ ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ Large ᠶᠡᠬᠡ ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ Huge ᠮᠠᠰᠢ ᠲᠤᠮᠤ ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ Sort By ᠵᠢᠭᠰᠠᠭᠠᠬᠤ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶ᠋ᠢᠭ Time Modified ᠴᠠᠭ ᠢᠶᠠᠨ ᠵᠠᠰᠠᠨ᠎ᠠ ᠃ Mount ᠡᠯᠬᠦᠬᠦ Sort By... 排序方式... Name ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ File Type ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ ᠵᠦᠢᠯ File Size ᠹᠠᠢᠯ᠎ᠤᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ Sort Order ᠳᠠᠷᠠᠭᠠᠯᠠᠭᠤᠯᠬᠤ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ Clean the trash ᠬᠤᠭᠯᠠᠭᠤᠷ ᠢ᠋ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ Copy ᠺᠤᠫᠢᠳᠠᠬᠤ Delete to trash ᠬᠠᠰᠤᠵᠤ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠤᠷᠤᠭᠤᠯᠬᠤ Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date ᠵᠠᠰᠠᠭᠰᠠᠨ ᠡᠳᠦᠷ ᠰᠠᠷ᠎ᠠ Delete file Warning 删除文件警告 Cut ᠡᠰᠬᠡᠬᠦ &Delete to trash 删除到回收站(&D) Delete forever ᠦᠨᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ Rename ᠳᠠᠬᠢᠵᠤ ᠨᠡᠷᠡᠯᠡᠬᠦ Paste ᠨᠠᠭᠠᠬᠤ Refresh ᠱᠢᠨᠡᠳᠭᠡᠬᠦ᠌ Properties ᠬᠠᠷᠢᠶᠠᠳᠤ ᠴᠢᠨᠠᠷ P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order ᠦᠭᠰᠦᠬᠦ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ Descending Order ᠪᠠᠭᠤᠷᠠᠬᠤ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ Peony-Qt Desktop 桌面 Desktop 桌面 Warning ᠰᠡᠷᠡᠮᠵᠢᠯᠡᠬᠦᠯᠬᠦ᠌ Close the peony desktop window ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠤ᠋ᠨ ᠫᠡᠷᠦᠭᠷᠡᠮ ᠢ᠋ ᠬᠠᠭᠠᠬᠤ Take over the dbus service. dbus ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠵᠢ ᠵᠠᠯᠭᠠᠵᠤ ᠬᠠᠮᠢᠶᠠᠷᠬᠤ Take over the desktop displaying ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠢ᠋ ᠵᠠᠯᠭᠠᠵᠤ ᠬᠠᠮᠢᠶᠠᠷᠬᠤ Setup backgrounds ᠠᠷᠤ ᠦᠵᠡᠭᠳᠡᠯ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ Clear standard icons ᠪᠠᠷᠢᠮᠵᠢᠶᠠᠳᠤ ᠰᠢᠪᠠᠭ᠎ᠠ ᠵᠢ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ Layout item with top to bottom left to right ᠵᠡᠭᠦᠨ ᠳᠡᠭᠡᠷ᠎ᠡ᠎ᠡᠴᠡ ᠪᠠᠷᠠᠭᠤᠨ ᠳᠣᠷᠣᠭᠰᠢ ᠰᠢᠪᠠᠭ᠎ᠠ ᠵᠢ ᠵᠢᠭᠰᠠᠭᠠᠬᠤ Force update backgrounds ᠠᠷᠦ ᠠᠬᠤᠢ ᠵᠢ ᠠᠯᠪᠠ᠎ᠪᠡᠷ ᠰᠢᠨᠡᠴᠢᠯᠡᠬᠦ Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background ᠠᠷᠦ ᠠᠬᠤᠢ ᠵᠢ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ Display Settings ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯᠲᠠ ᠢᠯᠡᠷᠡᠬᠦ StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_kk.ts0000664000175000017500000005640715154271106023074 0ustar fengfeng AdvancedDesktopIconView New Folder جاڭا حۇجات قىسقىش Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باسمازمۇندى ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ۇقىعىڭىز جوق! Desktop Icon View ۇستەل بەتى اي كۇن كورىنۋى Peony::DesktopIconView Desktop Icon View 桌面图标视图 New Folder 新建文件夹 set background 设置背景 Delete file Warning 删除文件警告 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Open Link failed 打开快捷方式失败 Set Background 设置背景 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Peony::DesktopItemModel Computer 计算机 Trash 回收站 My Document 我的文档 Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select كەرٸ باعىتتالۋ تالداۋ &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭا حۇجات قىسقىش View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window جاڭا تەرەزەدە ٸشٸۋ Select All جالپىسىن تالداۋ Open ٸشٸۋ Can not open path "%1",permission denied. 无法打开路径 "%1", 权限被拒绝。 Open with... ٸشٸۋ ٴتاسٸلٸ... More applications... الٸدە كوپ قولدانعىش... Open %1 selected files %1 تالدانعان حۇجاتتاردى ٸشٸۋ New جاڭا Empty File قۇرعاق حۇجات Folder حۇجات قىسقىش Auto arrange اۆتوماتتى ورنالاستٸرۋ View Type كورۋ تيپى Small كشكەنە Normal نورمال Large ۇلكەن Huge وتە ۇلكەن Sort By تارتٸپكە تىزۋ نەگىزىنەن Mount تاۋ Sort By... 排序方式... Name مى File Type حۇجات تۇرى File Size حۇجات ۇلكەندىگى Sort Order تارتٸپكە تىزۋ جاعٸ Clean the trash قوقسىق ساندىقتى تازالاۋ Copy كوشىرۋ Delete to trash ٴوشىرۋ قوقسىق ساندىعىنا Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date وزگەرتىلگەن ۋاقىتى Delete file Warning 删除文件警告 Cut كەسۋ &Delete to trash 删除到回收站(&D) Delete forever ماڭگىلىك ٴوشىرۋ Rename قاتە ات فاميليا ەتۋ Paste جابىسقاق Refresh جاڭالاۋ Properties قاسيەتى P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order ورلەۋ جاعٸ Descending Order تومەندەۋ جاعٸ Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopModeFactory desktop icon mode 桌面图标模式 Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 Peony::StudyCenterMode math 数学 english 英语 chinese 语文 other 其他 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop peony-qt-ۇستەل بەتى Peony-Qt Desktop 桌面 Desktop 桌面 Warning ەسكەرتۋ Close the peony desktop window peony ۇستەل بەتى تەرەزەنى جابىپ الۋ Take over the dbus service. dbus قىزىمەتتى ئۆتكۈزۈۋالىدۇ. Take over the desktop displaying وتكىزىلىپ ۇستەل بەتى كورسەتۋ Setup backgrounds ارتى كورىنۋ ورنالاسترعان ەتۋ Clear standard icons ولشەمدى گرافيىكتى تازالاۋ Layout item with top to bottom left to right ٷستٸدەن استٸ سولدان وڭعا ورنالاستٸرٸلعان شاراپات ۇلگىسى Force update backgrounds نۇسقانٸ ماجبۇر جاڭالاۋ پٸروگٸرامماسٸ Open learning center. 打开学习中心 set background 设置背景 QObject set background 设置背景 display settings 显示设置 set resolution 设置分辨率 Error 错误 Set Background تەڭدٸك بەلگٸلەۋ Display Settings كورسەتۋ تەڭشەۋلەرى StudyStatusWidget 学情中心 学情中心 STATISTICS 统计数据 今日使用时长 今日使用时长 本周使用时长 本周使用时长 本月使用时长 本月使用时长 最常使用 (本周累计) 最常使用 (本周累计) TabletMenu Uninstall 卸载 TabletPluginWidget Search 搜索 peony/translations/peony-qt-desktop/peony-qt-desktop_kk_KZ.ts0000664000175000017500000005207715154271106023477 0ustar fengfeng AdvancedDesktopIconView Open Link failed Сілтемені ашу жаңылысы File not exist, do you want to delete the link file? Файл жоқ, сілтеме файлын жойғыңыз келе ме? Open failed Ашу жаңылысы Open directory failed, you have no permission! Каталогты ашу жаңылысы, рұқсатыңыз жоқ! Desktop Icon View Үстел белгішесінің көрінісі FileActionController New Folder Open Link failed Сілтемені ашу жаңылысы File not exist, do you want to delete the link file? Файл жоқ, сілтеме файлын жойғыңыз келе ме? Open failed Ашу жаңылысы Open directory failed, you have no permission! Каталогты ашу жаңылысы, рұқсатыңыз жоқ! Peony::DesktopIconView Desktop Icon View Үстел белгішесінің көрінісі New Folder Жаңа қапшық set background аясын орнату Delete file Warning 删除文件警告 Open failed Ашу жаңылысы Open directory failed, you have no permission! Каталогты ашу жаңылысы, рұқсатыңыз жоқ! Open Link failed Сілтемені ашу жаңылысы File not exist, do you want to delete the link file? Файл жоқ, сілтеме файлын жойғыңыз келе ме? Peony::DesktopItemModel Computer Компьютер Trash Себет Peony::DesktopMenu &Open in new Window 在新窗口中打开(&N) Select &All 全选(&A) &Open "%1" 打开 "%1"(&O) Open "%1" &with... 打开方式(&W)... &More applications... 更多应用(&M)... Open "%1" with... 打开方式... &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) Reverse Select Кері таңдау &New... 新建(&N) New... 新建... Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Жаңа қапшық View Type... 视图类型... &Small 小图标(&S) &Normal 中图标(&N) &Large 大图标(&L) &Huge 超大图标(&H) Open in new Window Жаңа терезеде ашу Select All Барлығын таңдау Open Ашу Open with... Ð Ð°Ñ Ð°Ñ More applications... Қосымша қосымшалар... Open %1 selected files % 1 таңдалған файлдарды ашу New Жаңа Empty File Бос файл Folder Қапшық Auto arrange View Type Көрініс түрі Small Кіші Normal Қалыпты Large Үлкен Huge Орасан зор Sort By Сұрыптау Time Modified Mount Sort By... 排序方式... Name Атауы File Type Файл түрі File Size Файл өлшемі Sort Order Clean the trash Себетті тазалау Copy Көшіру Delete to trash Өшірілгенге дейін өшіру Error 错误 Can not show trash properties with other files together! 不能将回收站与其他文件一起查看属性! Modified Date Өзгертілген күн Delete file Warning 删除文件警告 Cut Қиып алу &Delete to trash 删除到回收站(&D) Delete forever Мәңгі өшіру Rename Атын өзгерту Paste Қою Refresh Жаңарту Properties Сипаттары P&roperties 属性(&R) Sort Order... 排列顺序... Ascending Order 升序 Descending Order 降序 Zoom &In 放大(&I) Zoom &Out 缩小(&O) &Restore all 恢复全部(&R) &Clean the trash 清空回收站(&C) Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Copy 复制(&C) Cu&t 剪切(&T) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) Peony::DesktopWindow Desktop 桌面 set background 设置壁纸 New Folder 新建文件夹 PeonyDesktopApplication Close the peony-qt desktop window 关闭桌面并退出 peony-qt-desktop жұмыс үстелiнiң жұмыс үстелi Peony-Qt Desktop 桌面 Desktop 桌面 Close the peony desktop window Peony жұмыс үстелі терезесін жабу Take over the dbus service. Dbus қызметін өз мойнына алыңыз. Take over the desktop displaying Жұмыс үстелін көрсетуді алу Setup backgrounds Өңдемелерді орнату Clear standard icons Стандартты белгішелерді тазалау Layout item with top to bottom left to right Force update backgrounds set background 设置背景 QObject set background аясын орнату display settings дисплей параметрлері set resolution 设置分辨率 Set Background Display Settings peony/translations/peony-qt-desktop/peony-qt-desktop_fa.ts0000664000175000017500000003224015154271070023042 0ustar fengfeng Peony::DesktopIconView Desktop Icon View نمایش آیکون‌های میز کار New Folder پوشۀ جدید set background انتخاب پس‌زمینه Delete file Warning Dosyayı Sil Uyarısı Open Link failed لینک باز نشد File not exist, do you want to delete the link file? فایل موجود نیست، آیا تمایل دارید که لینک حذف شود؟ Open failed باز نشد Open directory failed, you have no permission! پوشه باز نشد، اجازه‌ی دسترسی وجود ندارد! Peony::DesktopMenu &Open in new Window &بازکردن در پنجرۀ جدید Select &All انتخاب &همه &Open "%1" &بازکردن "%1" Open "%1" &with... بازکردن "%1" به &وسیلۀ... &More applications... &نرم‌افزارهای بیشتر... Open "%1" with... بازکردن "%1" به وسیلۀ... &Open &بازکردن &Open %1 selected files &بازکردن %1 فایل‌های انتخاب‌شده Reverse Select معکوس‌کردن انتخاب‌ها &New... &Yeni... New... جدید... Empty &File &فایل خالی &Folder &پوشه New Folder پوشهٔ جدید View Type... نحوۀ نمایش... &Small &کوچک &Normal &متوسط &Large ب&زرگ &Huge &خیلی بزرگ Sort By... مرتب‌کردن بر اساس... Name نام File Type نوع فایل File Size حجم فایل Modified Date تاریخ ایجاد تغییر Delete file Warning Dosyayı Sil Uyarısı Cut بریدن &Delete to trash &حذف (به سطل زباله) Delete forever Kalıcı olarak sil Rename تغییر نام Properties مشخصات P&roperties Özellikler Sort Order... Sıralama Düzeni... Ascending Order Artan Düzen Descending Order Azalan Düzen Zoom &In Yakınlaştır Zoom &Out Uzaklaştır &Restore all Tümünü Onar &Clean the trash &خالی‌کردن سطل زباله Delete Permanently حذف همیشگی Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. آیا از حذف این فایل‌ها اطمینان دارید؟ پس از حذف، امکان بازگرداندن آن‌ها وجود ندارد. &Copy &کپی‌کردن Cu&t Kes &Delete Sil &Rename Yeniden Adlandır &Paste &چسباندن &Refresh &تازه‌کردن &Properties Özellikler Peony::DesktopWindow Desktop میز کار set background انتخاب پس‌زمینه New Folder Yeni Klasör PeonyDesktopApplication Close the peony-qt desktop window Masaüstünü kapatın ve çıkın peony-qt-desktop Masaüstü Peony-Qt Desktop Masaüstü Desktop Masaüstü Close the peony desktop window بستن پنجرۀ میز کار پینی Take over the dbus service. به عهده‌گرفتن خدمات DBus. Take over the desktop displaying به عهده‌گرفتن نمایش میز کار peony/translations/libpeony-qt/0000775000175000017500000000000015154271106015620 5ustar fengfengpeony/translations/libpeony-qt/libpeony-qt_cs.ts0000664000175000017500000074335015154271106021134 0ustar fengfeng ColorPushButton Label Management ... Remove "%1" add "%1" ConnectServerDialog Connect to Sever Domain Password Save Password User Anonymous Ok Cancel DiscControl is busy! is busy! not support udf at present. unmount disc failed before udf format. DVD+RW udf format fail. preparation failed before DVD-RW udf format. FileLabelModel Red Orange Yellow Green Blue Purple Error Label or color is duplicated. FileOperationHelper Burn failed Format_Dialog Dialog rom_size system vfat/fat32 exfat ntfs ext4 device_name clean it total ok close TextLabel Format Rom size: Filesystem: Disk name: Completely erase(Time is longer, please confirm!) Set password Set password for volume based on LUKS (only ext4) Warning Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Cancel OK Data Device name cannot start with a decimal point, Please re-enter! Enter Password: Password too short, please retype a password more than 6 characters %1/sec, %2 remaining. over one day getting progress... Error Block not existed! Formatting. Do not close this window Error locking device: Failed to deactivate device: Device or resource busy KyFileDialogRename Renaming "%1" Renaming failed, the reason is: %1 Filename too long Copying "%1" To "%1" Copying failed, the reason is: %1 Moving "%1" Moving failed, the reason is: %1 File operation error: The reason is: %1 Skip Truncation Save Rename All applications Cancel Apply Bytes Front truncation Post truncation OK Description: Skip copying files of the current type truncate interval . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Description: By default, save to "%1/扩展". modify the name Explanation: When renaming a file name, ensure it is within %1 bytes and MainProgressBar starting ... Calculating time cancel all file operations Are you sure want to cancel all file operations continue pause canceling ... sync ... %1Mb/s Est. time left: %2 OK File Operation Minimize Close Kapat Are you sure to cancel all file operations? Cancel MessageDialog Peony Forcibly pulling out the device may cause data loss or device exceptions! OtherButton Other Queue Peony::AdvanceSearchBar Key Words input key words... Search Location choose search path... browse File Type Choose File Type Modify Time Choose Modify Time File Size Choose file size show hidden file go back hidden advance search page file name content search start search Select path Operate Tips Have no key words or search location! Search file name or content at least choose one! Search content or file name at least choose one! İçeriği veya dosya adını en az birini seçin! Peony::AdvancedLocationBar Search File Peony::AdvancedPermissionsPage Permission refinement settings Permission refinement settings tip Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? User Read Write Executable delete Inherit permission Add Apply Cancel Peony::AllFileLaunchDialog Choose new application Choose an Application to open this file apply now OK Cancel Peony::BasicPropertiesPage Choose a custom icon Type: Name Location symbolLink Folder Include: Move Open with: Description: Select multiple files Size: Time Modified: Time Access: Readonly Hidden Readonly (just applied by subfiles) Property: usershare %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. Choose a new folder: Error cannot move a folder to itself ! %1 Bytes Space Usage: Time Create: %1 files, %2 folders Can't get remote file information Peony::ComputerPropertiesPage CPU Name: CPU Core: Memory Size: User Name: Desktop: You should mount this volume first Name: Data System Disk Total Space: Used Space: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Type: Kylin Burner Open with: Unknown Peony::ConnectServerDialog Connect to server Ip Port Type Personal Collection server: Add Delete Connect Warning Ip input error, please re-enter! Port input error, please re-enter! Peony::ConnectServerLogin The login user Please enter the %1's user name and password of the server. User's identity Guest Name Password domain Cancel OK Registered users Remember the password Peony::CreateLinkInternalPlugin Create Link to Desktop Create Link to... Choose a Directory to Create Link Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile Create file Dosya oluştur NewFolder Create file error Peony::CustomErrorHandler Is Error Handled? Error not be handled correctly Peony::DefaultAcitonWidget No default app Peony::DefaultOpenWithWidget No default app Peony::DefaultPreviewPage Can not preivew this file. Bu dosya önizlemesi görüntülenemiyor. Select the file you want to preview Can not preview this file Peony::DefaultPreviewPageFactory Default Preview This is the Default Preview of peony-qt Peony::DetailsPropertiesPage Name: File type: Location: yyyy-MM-dd, HH:mm:ss Create time: Modify time: File size: Width: Height: Owner Owner: Computer Computer: %1 (this computer) Unknown Can't get remote file information %1 px Peony::DirectoryView::IconView Icon View Simge Görünümü warn This operation is not supported. Peony::DirectoryView::IconView2 Icon View Simge Görünümü Peony::DirectoryView::ListView List View Liste Görünümü warn This operation is not supported. Peony::DirectoryView::ListView2 List View Liste Görünümü Peony::DirectoryViewFactoryManager Icon View Simge Görünümü Peony::DirectoryViewMenu Add to bookmark &New... &Yeni New Folder Icon View Simge Görünümü List View Liste Görünümü Name File Type File Size Open in New Window Open in New Tab Open Open failed Open directory failed, you have no permission! Open with... More applications... Open %1 selected files New Empty File Folder Ascending Order Descending Order View Type Sort By Time Modified Original Path Path Sort Order Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Folder First Chinese First Show Hidden Copy Cut Delete to trash Paste Refresh Select All Properties format Restore Cancel File:"%1" is not exist, did you moved or deleted it? Mount MultiSelect Delete Error Cu&t &Kes Delete forever Kalıcı Olarak Sil Rename Reverse Select P&roperties &Özellikler &Rename &Yeniden Adlandır &Properties Özellikler &Clean the Trash Clean All Open Parent Folder in New Window Peony::DirectoryViewWidget Directory View Dizin Görünümü Peony::ExtensionsManagerWidget Extensions Manager Available extensions Ok Cancel Peony::FMWindow File Manager advanced search clear record Loaing... Press Esc to stop a loading. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Ctrl+H Show|Hidden Ctrl+H Undo Redo Peony Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. New Folder Peony::FileBatchRenameOperation File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden these files? Rename file error Peony::FileCopy Error in source or destination file path! Error when copy file: %1, can not copy special files, skip this file and continue? Can not copy %1, file doesn't exist. Has the file been renamed or moved? The dest file "%1" has existed! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Error writing to file: Input/output error Write file error: There is no available disk space for device! Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. Failed to create %1. Please check whether the device has been removed! File opening failure operation cancel Peony::FileCopyOperation File copy Dosya kopyalama Create folder %1 failed: %2 File copy error Cannot opening file, permission denied! The file name exceeds the limit File:%1 was not found. Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Link file error Burning does not support replacement Peony::FileDeleteOperation File delete Dosya silme File delete error Delete file error Invalid Operation! Can not delete "%1". Peony::FileEnumerator The password dialog box is canceled Message recipient disconnected from message bus without replying! Error Peony::FileInfo data folder file text file Peony::FileItem Warning Error Open Link failed File not exist, do you want to delete the link file? Can not open path "%1",permission denied. Can not find path "%1",are you moved or renamed it? Peony::FileItemModel child(ren) Symbol Link, System Disk File Name Delete Date Create Date Time Modified File Size Original Path Path File %1 is existed in space, please not add file repeatly. Operation not supported File Type Peony::FileLabelInternalMenuPlugin Add File Label Delete All Label Label Management ... add "%1" Remove "%1" Peony::FileLabelWidget Label Management ... Peony::FileLauchDialog The opening mode of the %1 %2 unknown No application is set to open file "%1 %2" Still using the last opened application: known Open application is used by default: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Other application: Select application: Always open the %1%2 file with this application Choose other application Go to application center Ok Cancel Desktop files(*.desktop) Select Open Action Select Peony::FileLaunchAction Execute Directly Execute in Terminal Detected launching an executable file %1, you want? Open Failed Can not open %1, file not exist, is it deleted? File not exist, is it deleted or moved to other path? Dosya mevcut değil, silinmiş veya başka bir yere taşınmış olabilir Can not open %1 %1 açılamadı No Permission File is not readable. Please check if file has read permisson. By Default App Launch Options Open Link failed File not exist, do you want to delete the link file? Can not open %1, Please confirm you have the right authority. Open App failed The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Error File original path not exist, are you deleted or moved it? Can not get a default application for opening %1, do you want open it with text format? Peony::FileLinkOperation Symbolic Link Link file error Link file Dosyayı bağla Peony::FileMoveOperation Invalid move operation, cannot move a file itself. Geçersiz taşıma işlemi, bir dosyanın kendisini taşıyamaz. Move file Dosyayı taşı Create file Dosya oluştur Move file error System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. File move error Invalid move operation, cannot move a file into its sub directories. Cannot opening file, permission denied! The file name exceeds the limit Create file error Link file error Burning does not support replacement Invalid Operation. File:%1 was not found. Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error File delete Dosya silme Invalid Operation Peony::FileOperationAfterProgressPage &More Details Peony::FileOperationErrorDialog File Operation Error unkwon null Error message: Source File: Dest File: Ignore Ignore All Overwrite Overwrite All Backup Backup All &Retry &Cancel Peony::FileOperationErrorDialogBase Close Kapat Peony::FileOperationErrorDialogConflict Replace Ignore Do the same <p>This location already contains the file '%1', Do you want to override it?</p> Unexpected error from %1 to %2 Backup Peony::FileOperationErrorDialogNotSupported Cancel Delete Make sure the disk is not full or write protected and that the file is not protected Peony::FileOperationErrorDialogWarning OK Cancel Skip all Make sure the disk is not full or write protected and that the file is not protected Please make sure the disk is not full or not is write protected, or file is not being used. Lütfen diskin dolu olmadığından veya yazmaya karşı korumalı olmadığından veya dosyanın kullanılmadığından emin olun. Peony::FileOperationInfo Symbolic Link Copy Move Rename Link Delete Delete Permanently Restore New - Symbolic Link - Symbolik Link Peony::FileOperationManager Warn '%1' is occupied,you cannot operate! OK Cancel Do you want to put selected %1 item(s) into trash? Do not show again System Disk Data Insufficient storage space %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Can't delete. You can't delete a file whenthe file is doing another operation File Operation is Busy There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. The long name file is saved to %1 Undo %1 Redo %1 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. Daha önce bir veya daha fazla dosya işlemi yürütüldü. Operasyonunuz tamamlanana kadar yürütmeyi bekleyecektir. Peony::FileOperationPreparePage counting: state: Peony::FileOperationProgressPage &More Details From: To: Peony::FileOperationProgressWizard File Manager &Cancel Preparing... Handling... Clearing... Rollbacking... File Operation A file operation is running backend... %1 files, %2 %1 done, %2 total, %3 of %4. clearing: %1, %2 of %3 copying... Syncing... Peony::FilePreviewPage File Type: Time Access: Time Modified: Children Count: Size: Location: Time Created: Image resolution: color model: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare %1x%2 %1 total, %2 hidden Peony::FileRenameOperation Rename file Dosyayı yeniden isimlendir File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden this file? When change the file suffix, the file may be invalid. Are you sure to change it ? A file and a directory with the same name cannot replace each other Rename file error Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// Trash file error Invalid Operation! Can not trash "%1". An unmanageable conflict exists. Please check the recycle bin. Trash file Çöp dosyası Peony::FileUntrashOperation Untrash file Dosyayı geri al Untrash file error Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Minimize Close Kapat Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Open With More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Save As file All File This location has no write permission.please change the storage location Label Properties Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name SideBar Menu Create New Label Delete Label Display the following items in the identification area: (maximum of 6) Rename Edit Color Delete This Label Peony::LocationBar Search "%1" in "%2" File System Search results for all files marked in "%1" in "%2" Open In New Tab Open In New Window Copy Directory ">Dizini Kopyala Peony::MountOperation Operation Cancelled Login failed, unknown username or password error, please re-enter! Peony::NavigationToolBar Go Back Go Forward History Clear History Cd Up Refresh Peony::NewFileLaunchDialog Choose new application Choose an Application to open this file apply now OK Cancel Peony::OpenWithPropertiesPage How do you want to open "%1%2" files ? Default open with: Other: Choose other application Go to application center Peony::PathEdit Go To Peony::PermissionsPropertiesPage Target: %1 Group or User Read and Write Readonly (Current User) The folder containing this file is protected, and only the file owner can modify the file. Current User Permissions modify tip The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Permission refinement settings The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Can not get the permission info. Others You can not change the access of this file. Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok Cancel Peony::PropertiesWindow Trash Recent Selected %1 Files usershare Data System Disk Properties Ok Cancel Restore Close Kapat Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing. Origin Path: Deletion Date: Size: Original Location: Peony::SearchBar Input the search key of files you would like to find. Input search key... advance search clear record Peony::SearchBarContainer Search File Clear all file folder image video text file audio others wps file Peony::SharedFileLinkOperation Symbolic Link The dest file "%1" has existed! Link file error Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Trash Recent Quick Access KmreData Peony::SideBarFileSystemItem Data Peony::SideBarMenu &Properties Özellikler P&roperties Özellikler Properties Delete Symbolic Unmount Eject Format burndata Peony::SideBarModel Network Peony::SideBarPersonalItem Personal Peony::SideBarSeparatorItem (No Sub Directory) Peony::StatusBar ; %1 folders ; %1 files, %2 total ; %1 folder ; %1 file, %2 %1 selected Peony::SyncThread Notify Peony::TagManagement Mark Peony::ToolBar Open in new &Window Yeni Pencerede Aç Sort Type File Name File Type File Size Modified Date Open in New window Open in new Tab Ascending Descending Copy Paste Cut Trash Clean Trash Restore Options Forbid Thumbnail Show Hidden Resident in Backend Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. &Help &About... Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Peony::TooltipsManager Unknow Type: Duration: Size: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Peony::VolumeManager Error ProgressBar starting ... canceling ... sync ... continue pause close QObject Icon View Simge Görünümü Show the folder children as icons. List View Liste Görünümü Show the folder children as rows in a list. Basic Show the basic file properties, and allow you to modify the access and name. Permissions Show and modify file's permission, owner and group. Computer Properties Show the computer properties or items in computer. Trash and Recent Show the file properties or items in trash or recent. eject device failed Aygıtı çıkarma başarısız oldu Please check whether the device is occupied and then eject the device again Lütfen cihazın dolu olup olmadığını kontrol edin ve ardından cihazı tekrar çıkarın Format failed YES Formatting successful! But failed to set the device name. qmesg_notify Format Begin Format Close Kapat Format operation has been finished successfully. Sorry, the format operation is failed! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? format File Manager Notify Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Not authorized to perform operation. Unable to unmount it, you may need to close some programs, such as: GParted etc. Failed to activate device: Incorrect passphrase The device has been mount successfully! Eject device failed, the reason may be that the device has been removed, etc. Eject failed Data synchronization is complete and the device can be safely unplugged! Error: %1 Do you want to unmount forcely? Password is empty, please re-enter! favorite Favorites File is not existed. Share Data Operation not supported Trash Recent The virtual file system does not support folder creation Can not create a symbolic file for vfs location Symbolic Link Can not create symbolic file here, %1 Can not add a file to favorite directory. The virtual file system cannot be opened Virtual file directories do not support move and copy operations Default favorite vfs of peony Mark mark this file. Open With open with. Details It need to synchronize before operating the device,place wait! Unable to discover the file, it may have been removed or deleted. permission denied duplicate data System Disk Computer Data Failed to open file "%1": insufficient permissions. File “%1” does not exist. Please check whether the file has been deleted. Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. burn operation has been cancelled is busy! The file is too large to be moved to the recycle bin. Do you want to permanently delete it? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Delete Cancel Clean the Trash Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Intelligent Space File %1 is existed in space, please not add file repeatly. Virtual file directories do not support move operations label Show properties plugin window. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData Disc Type: Device Name: OK Cancel Unknown Warning No burn data, please add! The disc name cannot be set to empty, please re-enter it! AppendBurnData operation has been finished successfully. Sorry, the appendBurnData operation is failed! Failed Burning. Do not close this window Burning this disc will append datas on it. Do you want to continue ? Burn Begin Burning Close Kapat UdfBurn::UdfFormatDialog Format Disc Type: Device Name: OK Cancel Unknown Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. Sorry, the format operation is failed! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat UdfFormatDialog Format Disc Type: Device Name: OK Cancel Unknown Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. Sorry, the format operation is failed! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_de.ts0000664000175000017500000107374115154271106021120 0ustar fengfeng ColorPushButton label management ... Etiketten-Management ... Label Management ... Remove "%1" "%1" löschen delete "%1" "%1" löschen add "%1" Fügen Sie "%1" hinzu ConnectServerDialog Connect to Sever Mit Server verbinden Domain Domäne Password Passwort Save Password Passwort speichern User Benutzer Anonymous Anonym Ok Okay Cancel Abbrechen DiscControl is busy! ist beschäftigt! is busy! ist beschäftigt! not support udf at present. UDF wird derzeit nicht unterstützt. unmount disc failed before udf format. Das Aufheben der Bereitstellung des Datenträgers vor der UDF-Formatierung ist fehlgeschlagen. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. Das DVD+RW-UDF-Format schlägt fehl. preparation failed before DVD-RW udf format. Die Vorbereitung ist vor dem DVD-RW-UDF-Format fehlgeschlagen. FileLabelModel Red Rot Orange Orange Yellow Gelb Green Grün Blue Blau Purple Lila Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error Fehler Label or color is duplicated. Beschriftung oder Farbe wird dupliziert. FileOperationHelper Burn failed Brennvorgang fehlgeschlagen Format_Dialog Dialog Dialogfeld rom_size rom_size system System vfat/fat32 VFAT/FAT32 exfat exfat ntfs NTFS vfat VFAT ext4 ext4 device_name device_name clean it total Reinigen Sie es insgesamt ok Okay close schließen TextLabel TextBeschriftung qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format Format Rom size: Rom-Größe: Filesystem: Dateisystem: Disk name: Name des Datenträgers: Completely erase(Time is longer, please confirm!) Vollständig löschen (Die Zeit ist länger, bitte bestätigen!) Set password Passwort festlegen Set password for volume based on LUKS (only ext4) Festlegen des Kennworts für das Volume basierend auf LUKS (nur ext4) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Die Formatierung des ext4-Dateisystems kann dazu führen, dass andere Benutzer das USB-Laufwerk nicht lesen oder schreiben können Cancel Abbrechen OK OKAY Data Daten Error locking device: Failed to deactivate device: Device or resource busy Warning Warnung Device name cannot start with a decimal point, Please re-enter! Gerätename darf nicht mit einem Komma beginnen, Bitte erneut eingeben! Enter Password: Passwort eingeben: Password too short, please retype a password more than 6 characters Passwort zu kurz, bitte geben Sie ein Passwort mit mehr als 6 Zeichen ein %1/sec, %2 remaining. %1/Sek., %2 verbleibend. over one day über einen Tag getting progress... Fortschritte machen... Error Fehler Block not existed! Block nicht vorhanden! Formatting. Do not close this window Formatierung. Dieses Fenster nicht schließen KyFileDialogRename Renaming "%1" Umbenennen von "%1" Renaming failed, the reason is: %1 Die Umbenennung ist fehlgeschlagen, der Grund ist: %1 Filename too long Dateiname zu lang Copying "%1" Kopieren von "%1" To "%1" Zu "%1" Copying failed, the reason is: %1 Fehler beim Kopieren, der Grund: %1 Moving "%1" Verschieben von "%1" Moving failed, the reason is: %1 Das Verschieben ist fehlgeschlagen, der Grund ist: %1 File operation error: Fehler beim Dateivorgang: The reason is: %1 Der Grund ist: %1 Truncation Abschneiden Save Retten All applications Alle Anwendungen Cancel Abbrechen Apply Anwenden Bytes Bytes Front truncation Vordere Kürzung Post truncation Kürzung nach der Veröffentlichung Description: Skip copying files of the current type Beschreibung: Überspringen des Kopierens von Dateien des aktuellen Typs truncate interval Intervall abschneiden . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Explanation: When renaming a file name, ensure it is within %1 bytes and Explanation: Truncate the portion of the file name that exceeds 225 bytes and select Erklärung: Schneiden Sie den Teil des Dateinamens ab, der 225 Byte überschreitet, und wählen Sie Description: By default, save to "%1/扩展". Beschreibung: Speichern Sie standardmäßig unter "%1/扩展". modify the name Ändern des Namens Explanation: When renaming a file name, ensure it is within 255 bytes and Erklärung: Wenn Sie einen Dateinamen umbenennen, stellen Sie sicher, dass er nicht länger als 225 Byte ist und {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and Erklärung: Wenn Sie einen Dateinamen umbenennen, stellen Sie sicher, dass er nicht länger als 225 Byte ist und Skip Hüpfen Skip All 全部跳过 Rename Umbenennen Please enter a new name 请输入文件名 OK OKAY MainProgressBar File operation Datei-Vorgang starting ... Anlassen... cancel all file operations Alle Dateivorgänge abbrechen Minimize Minimieren Close Schließen Are you sure to cancel all file operations? Sind Sie sicher, dass Sie alle Dateioperationen abbrechen? Are you sure want to cancel all file operations Sind Sie sicher, dass Sie alle Dateivorgänge abbrechen möchten? OK OKAY File Operation Datei-Vorgang Cancel Abbrechen Calculating time continue fortsetzen pause Pause canceling ... annullierend... sync ... synchronisieren... %1Mb/s Est. time left: %2 MessageDialog Peony Pfingstrose Forcibly pulling out the device may cause data loss or device exceptions! Das gewaltsame Herausziehen des Geräts kann dazu führen, dass Verlust oder Geräteausnahmen! OtherButton Other queue Andere Warteschlange Other Queue Peony::AdvanceSearchBar Key Words Schlüsselwörter input key words... Schlüsselwörter eingeben... Search Location Standort suchen choose search path... Suchpfad wählen... browse blättern File Type Dateityp Choose File Type Wählen Sie den Dateityp Modify Time Zeit ändern Choose Modify Time Wählen Sie Zeit ändern File Size Dateigröße Choose file size Wählen Sie die Dateigröße show hidden file Versteckte Datei anzeigen go back Zurück hidden advance search page Ausgeblendete erweiterte Suchseite file name Dateiname content Inhalt search suchen start search Suche starten Select path Pfad auswählen Operate Tips Tipps zur Bedienung Have no key words or search location! Haben Sie keine Schlüsselwörter oder suchen Sie nach einem Ort! Search file name or content at least choose one! Suchen Sie nach Dateinamen oder Inhalten, wählen Sie zumindest einen! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... Inhalt suchen... Search File Peony::AdvancedPermissionsPage Permission refinement settings Einstellungen für die Berechtigungseinschränkung Permission refinement settings tip Tipp für die Einstellungen zur Berechtigungseinschränkung Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? Das Festlegen von ACL-Berechtigungen führt zu einer Änderung der Benutzergruppenberechtigungen für grundlegende Berechtigungen. Müssen Sie weiterhin ACL-Berechtigungen festlegen? User Benutzer Read Lesen Write Schreiben Executable Ausführbar delete löschen Inherit permission Berechtigung erben Add Hinzufügen Apply Anwenden Cancel Abbrechen Peony::AllFileLaunchDialog Choose new application Neue Anwendung auswählen Choose an Application to open this file Wählen Sie eine Anwendung aus, um diese Datei zu öffnen apply now Jetzt bewerben OK OKAY Cancel Abbrechen Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon Wählen Sie ein benutzerdefiniertes Symbol aus Type: Art: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name Name Location Ort move 移动 symbolLink symbolLink Folder Ordner Include: Einschließen: Move Open with: Öffnen mit: Description: Beschreibung: Select multiple files Wählen Sie mehrere Dateien aus Size: Größe: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: Platzbedarf: Time Create: Zeit erstellen: Time Modified: Geänderte Zeit: Time Access: Zeitlicher Zugang: Readonly Schreibgeschützt Hidden Versteckt Readonly (just applied by subfiles) Property: Eigentum: usershare usershare %1 (%2 Bytes) %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. Bitte wählen Sie ein Bild aus, das kleiner als 1 MB ist. Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 Byte %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 Dateien, %2 Ordner Can't get remote file information Remotedateiinformationen können nicht abgerufen werden %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU-Name: CPU Core: CPU-Kern: Memory Size: Speichergröße: User Name: Benutzername: Desktop: Desktop: You should mount this volume first Sie sollten dieses Volume zuerst bereitstellen Name: Name: File System Dateisystem Data Daten System Disk Total Space: Gesamtfläche: Used Space: Genutzter Speicherplatz: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Freier Speicherplatz: Type: Art: Kylin Burner Kylin Burner Open with: Öffnen mit: Unknown Unbekannt Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server Mit Server verbinden Ip Ip Port Hafen Type Art Personal Collection server: Server für persönliche Sammlungen: Add Hinzufügen Delete Löschen Connect Verbinden Ip input error, please re-enter! IP-Eingabefehler, bitte erneut eingeben! Port input error, please re-enter! Fehler bei der Porteingabe, bitte erneut eingeben! add 添加 delete 连接 删除 connect 连接 Warning Warnung ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user Der angemeldete Benutzer Please enter the %1's user name and password of the server. Geben Sie den Benutzernamen und das Kennwort des Servers von %1 ein. User's identity Identität des Nutzers Guest Gast Name Name Password Passwort domain Cancel Abbrechen OK OKAY guest 游客(匿名登录) Registered users Registrierte Benutzer name 用户名 password 密码 Remember the password Merken Sie sich das Passwort cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop Link zum Desktop erstellen Create Link to... Link erstellen zu... Choose a Directory to Create Link Wählen Sie ein Verzeichnis aus, um einen Link zu erstellen Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Link zum Desktop erstellen Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile NeueDatei Create file Datei erstellen NewFolder Neuer Ordner Create file error Fehler beim Erstellen einer Datei Peony::CustomErrorHandler Is Error Handled? Wird der Fehler behandelt? Error not be handled correctly Fehler werden nicht korrekt behandelt Peony::DefaultAcitonWidget No default app Keine Standard-App Peony::DefaultOpenWithWidget No default app Keine Standard-App Peony::DefaultPreviewPage Select the file you want to preview... Wählen Sie die Datei aus, die Sie in der Vorschau anzeigen möchten... Select the file you want to preview Can not preview this file Can not preview this file. Diese Datei kann nicht in der Vorschau angezeigt werden. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview Standard-Vorschau This is the Default Preview of peony-qt Dies ist die Standardvorschau von peony-qt Peony::DetailsPropertiesPage Name: Name: File type: Dateityp: Location: Ort: yyyy-MM-dd, HH:mm:ss JJJJ-MM-TT, HH:MM:SS Create time: Zeit schaffen: Modify time: Zeit ändern: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: Dateigröße: Width: Breite: Height: Höhe: Owner Eigentümer Owner: Eigentümer: Computer Computer Computer: Computer: %1 (this computer) %1 (dieser Computer) Unknown Unbekannt Can't get remote file information Remotedateiinformationen können nicht abgerufen werden %1 px %1 px Peony::DirectoryView::IconView Icon View 图标视图 warn warnen This operation is not supported. Dieser Vorgang wird nicht unterstützt. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn warnen This operation is not supported. Dieser Vorgang wird nicht unterstützt. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark Zum Lesezeichen hinzufügen &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Neuer Ordner Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name Name File Type Dateityp File Size Dateigröße New... 新建... Open in New Window In neuem Fenster öffnen Open in New Tab In neuem Tab öffnen Open Offen Open failed Open directory failed, you have no permission! Open with... Öffnen mit... More applications... Weitere Anwendungen... Open %1 selected files %1 ausgewählte Dateien öffnen New Neu Empty File Leere Datei Folder Ordner View Type Typ der Ansicht Sort By Sortieren nach Modified Date Änderungsdatum Original Path Ursprünglicher Pfad Sort Order... 排序顺序... Ascending Order Aufsteigende Reihenfolge Mount MultiSelect Mehrfachauswahl Descending Order Absteigende Reihenfolge Sort Preferences... 排序偏好... Folder First Ordner zuerst Chinese First Chinesisch zuerst Show Hidden Ausgeblendet anzeigen Copy Kopieren File:"%1" is not exist, did you moved or deleted it? Datei:"%1" existiert nicht, haben Sie sie verschoben oder gelöscht? Peony-Qt filesafe menu Extension Peony-Qt filesafe menu Erweiterung Peony File Labels Menu Extension Menüerweiterung für Pfingstrosen-Dateietiketten &Copy 复制(&C) Cut Schneiden Delete to trash In den Papierkorb löschen Paste Kleister Refresh Auffrischen Select All Alles auswählen Properties Eigenschaften format Format Restore Wiederherstellen Delete Löschen Time Modified Path Sort Order Sortierreihenfolge Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Sortier-Voreinstellungen Cancel Error Fehler File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever Für immer löschen Rename Umbenennen Select &All 全选(&A) Reverse Select Auswahl umkehren P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash &Säubern Sie den Müll Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All Alle säubern Open Parent Folder in New Window Übergeordneten Ordner in neuem Fenster öffnen Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager Erweiterungs-Manager Available extensions Verfügbare Erweiterungen Ok Okay Cancel Abbrechen Peony::FMWindow File Manager Dateimanager advanced search Erweiterte Suche clear record Löschen Sie den Datensatz Loaing... Press Esc to stop a loading. Loaing... Drücken Sie die Esc-Taste, um einen Ladevorgang zu stoppen. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Verfasser: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo Aufmachen Redo Noch einmal machen Peony Qt Pfingstrose Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder Neuer Ordner Peony::FileBatchRenameOperation File Rename error Fehler beim Umbenennen von Dateien Invalid file name %1%2%3 . Ungültiger Dateiname %1%2%3 . File Rename warning Warnung zum Umbenennen von Dateien Are you sure to hidden these files? Sind Sie sicher, dass Sie diese Dateien ausblenden müssen? Rename file error Fehler beim Umbenennen der Datei Peony::FileCopy Error in source or destination file path! Fehler im Quell- oder Zieldateipfad! Error when copy file: %1, can not copy special files, skip this file and continue? Fehler beim Kopieren der Datei: %1, spezielle Dateien können nicht kopiert werden, diese Datei überspringen und fortfahren? Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 kann nicht kopiert werden, die Datei ist nicht vorhanden. Wurde die Datei umbenannt oder verschoben? The dest file "%1" has existed! Die Zieldatei "%1" ist vorhanden! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32-Dateisysteme unterstützen keine einzige Datei, die mehr als 4 GB Speicherplatz belegt! Error writing to file: Input/output error Fehler beim Schreiben in eine Datei: Eingabe-/Ausgabefehler Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 konnte nicht erstellt werden. Bitte stellen Sie sicher, dass es sich im Stammverzeichnis befindet oder ob das Gerät das gphoto2-Protokoll korrekt unterstützt. Failed to create %1. %1 konnte nicht erstellt werden. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! Bitte prüfen Sie, ob das Gerät entfernt wurde! Write file error: There is no available disk space for device! Fehler beim Schreiben der Datei: Es ist kein Speicherplatz für das Gerät verfügbar! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure Fehler beim Öffnen der Datei Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel Vorgang Abbrechen Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 Fehler beim Erstellen des Ordners %1: %2 File copy error Fehler beim Kopieren der Datei The file name exceeds the limit Der Dateiname überschreitet den Grenzwert Cannot opening file, permission denied! Datei kann nicht geöffnet werden, Berechtigung verweigert! File:%1 was not found. Datei:%1 wurde nicht gefunden. File System Dateisystem Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data Daten %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 Kein Speicherplatz mehr auf dem Gerät. Größe der Kopierdatei: %2 GB, benötigter Speicherplatz: %3 GB. Link file error Fehler bei der Verknüpfung der Datei Burning does not support replacement Das Brennen unterstützt keinen Austausch Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error Fehler beim Löschen der Datei Delete file error Fehler beim Löschen der Datei Invalid Operation! Can not delete "%1". Ungültiger Vorgang! "%1" kann nicht gelöscht werden. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled Das Dialogfeld "Kennwort" wird abgebrochen Message recipient disconnected from message bus without replying! Nachrichtenempfänger vom Nachrichtenbus getrennt, ohne zu antworten! Error Fehler Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data Daten folder Ordner file Datei text file Textdatei Peony::FileInfoJob Trash Müll Computer Computer Network Netz Recent Aktuell Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer Computer Network Netz Recent Aktuell Peony::FileItem Delete file Warning 删除文件警告 Warning Warnung Error Fehler Open Link failed Open Link fehlgeschlagen File not exist, do you want to delete the link file? Datei nicht vorhanden, möchten Sie die Linkdatei löschen? Can not open path "%1",permission denied. Der Pfad "%1" kann nicht geöffnet werden, Berechtigung verweigert. Can not find path "%1",are you moved or renamed it? Sie können den Pfad "%1" nicht finden, wurden Sie ihn verschoben oder umbenannt? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) Kind(er) Symbol Link, Symbol-Link, System Disk File Name Dateiname Delete Date Datum löschen Create Date Erstellungsdatum Time Modified File Size Dateigröße Original Path Ursprünglicher Pfad Path File %1 is existed in space, please not add file repeatly. Operation not supported Vorgang wird nicht unterstützt File Type Dateityp Modified Date Änderungsdatum Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label Delete All Label 删除所有标记 Label Management ... add "%1" Fügen Sie "%1" hinzu Remove "%1" "%1" löschen Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... Etiketten-Management ... Peony::FileLabelWidget label management ... Etiketten-Management ... Label Management ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 Der Öffnungsmodus des %1 %2 unknown unbekannt No application is set to open file "%1 %2" Es ist keine Anwendung zum Öffnen der Datei "%1 %2" festgelegt. Still using the last opened application: Verwenden Sie immer noch die zuletzt geöffnete Anwendung: known bekannt Open application is used by default: Standardmäßig wird die geöffnete Anwendung verwendet: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Sie können im Softwarecenter nach einer Anwendung suchen, mit der diese Datei geöffnet werden kann, oder eine vorhandene Anwendung auf Ihrem Computer auswählen. Other application: Andere Anwendung: Select application: Anwendung auswählen: Always open the %1%2 file with this application Öffnen Sie die %1%2-Datei immer mit dieser Applikation Choose other application Wählen Sie eine andere Anwendung Go to application center Zum Application Center Ok Okay Cancel Abbrechen Desktop files(*.desktop) Desktop-Dateien (*.desktop) Select Open Action Wählen Sie Aktion öffnen aus Select Auswählen Peony::FileLaunchAction Execute Directly Direkt ausführen Execute in Terminal Im Terminal ausführen Detected launching an executable file %1, you want? Beim Starten einer ausführbaren Datei %1 wurde festgestellt, dass Sie möchten? Delete file Warning 删除文件警告 Open Failed Öffnen fehlgeschlagen Can not open %1, file not exist, is it deleted? %1 kann nicht geöffnet werden, Datei existiert nicht, wird sie gelöscht? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission Keine Erlaubnis File is not readable. Please check if file has read permisson. Die Datei ist nicht lesbar. Bitte prüfen Sie, ob die Datei Leseberechtigung hat. By Default App Nach Standard-App Launch Options Start-Optionen Open Link failed Open Link fehlgeschlagen File not exist, do you want to delete the link file? Datei nicht vorhanden, möchten Sie die Linkdatei löschen? Can not open %1, Please confirm you have the right authority. %1 kann nicht geöffnet werden. Vergewissern Sie sich, dass Sie über die entsprechende Berechtigung verfügen. Open App failed App öffnen fehlgeschlagen The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Die verknüpfte App wird geändert oder deinstalliert, sodass sie nicht richtig funktionieren kann. Möchten Sie die Linkdatei löschen? Error Fehler File original path not exist, are you deleted or moved it? Der ursprüngliche Dateipfad existiert nicht, haben Sie ihn gelöscht oder verschoben? Can not get a default application for opening %1, do you want open it with text format? Sie können keine Standardanwendung zum Öffnen von %1 erhalten, möchten Sie sie im Textformat öffnen? Warning Warnung Can not open the file, application is disabled Die Datei kann nicht geöffnet werden, die Anwendung ist deaktiviert Peony::FileLinkOperation Symbolic Link Symbolischer Link Link file error Fehler bei der Verknüpfung der Datei Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error Fehler beim Verschieben von Dateien File System Dateisystem Data Daten %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 Kein Speicherplatz mehr auf dem Gerät. Größe der Kopierdatei: %2 GB, benötigter Speicherplatz: %3 GB. File move error Fehler beim Verschieben von Dateien Invalid move operation, cannot move a file into its sub directories. Ungültiger Verschiebevorgang, eine Datei kann nicht in ihre Unterverzeichnisse verschoben werden. The file name exceeds the limit Der Dateiname überschreitet den Grenzwert Create file error Fehler beim Erstellen einer Datei Cannot opening file, permission denied! Datei kann nicht geöffnet werden, Berechtigung verweigert! File:%1 was not found. Datei:%1 wurde nicht gefunden. Invalid Operation. Ungültiger Vorgang. System Disk Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error Fehler beim Löschen der Datei Link file error Fehler bei der Verknüpfung der Datei Burning does not support replacement Das Brennen unterstützt keinen Austausch Burn failed 刻录失败 File delete 文件删除 Invalid Operation Ungültiger Vorgang Peony::FileOperationAfterProgressPage &More Details &mehr Details Peony::FileOperationErrorDialog File Operation Error Fehler beim Dateivorgang unkwon Unkwon null null Error message: Fehlermeldung: Source File: Quelldatei: Dest File: Dest-Datei: Ignore Ignorieren Ignore All Alle ignorieren Overwrite Überschreiben Overwrite All Alle überschreiben Backup Sicherungskopie Backup All Alle sichern &Retry &Wiederholen &Cancel &Abbrechen Peony::FileOperationErrorDialogBase Close Schließen Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace Ersetzen Ignore Ignorieren Do the same Machen Sie das Gleiche <p>This location already contains the file '%1', Do you want to override it?</p> <p> Dieser Speicherort enthält bereits die Datei '%1', Möchten Sie sie überschreiben? </p> Unexpected error from %1 to %2 Unerwarteter Fehler von %1 bis %2 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup Sicherungskopie Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes Ja No Nein Cancel 取消 Delete Löschen Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected Stellen Sie sicher, dass der Datenträger nicht voll oder schreibgeschützt ist und dass die Datei nicht geschützt ist Peony::FileOperationErrorDialogWarning OK OKAY Cancel Abbrechen Skip all Make sure the disk is not full or write protected and that the file is not protected Stellen Sie sicher, dass der Datenträger nicht voll oder schreibgeschützt ist und dass die Datei nicht geschützt ist Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link Symbolischer Link Copy Kopieren Move Rename Umbenennen Link Delete Löschen Delete Permanently 永久删除 Restore Wiederherstellen New Neu - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn Warnen '%1' is occupied,you cannot operate! '%1' ist belegt, Sie können nicht operieren! No, go to settings 否,跳转到设置 OK OKAY Cancel Abbrechen Do you want to put selected %1 item(s) into trash? Möchten Sie ausgewählte(s) %1 Element(e) in den Papierkorb verschieben? Do not show again Nicht mehr anzeigen File System Dateisystem System Disk Data Daten Insufficient storage space Unzureichender Stauraum %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 Kein Speicherplatz mehr auf dem Gerät. Größe der Kopierdatei: %2 GB, benötigter Speicherplatz: %3 GB. Can't delete. Kann nicht gelöscht werden. You can't delete a file whenthe file is doing another operation Sie können eine Datei nicht löschen, wenn die Datei einen anderen Vorgang ausführt File Operation is Busy Der Dateivorgang ist ausgelastet There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Es wurden bereits eine oder mehrere Dateioperationen ausgeführt. Ihre Operation wartet auf die Ausführung, bis sie fertig ist. Wenn Sie Dateioperationen trotzdem parallel ausführen möchten, können Sie die Standardoption "Parallel zulassen" im Optionsmenü ändern. The long name file is saved to %1 Die Langnamensdatei wird unter %1 gespeichert Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: Zählen: state: Zustand: Peony::FileOperationProgressPage &More Details &mehr Details From: Von: To: An: Peony::FileOperationProgressWizard File Manager Dateimanager &Cancel &Abbrechen Preparing... Vorbereitend... Handling... Handhabung... Clearing... Lichtung... Rollbacking... Rollbacking... File Operation Datei-Vorgang A file operation is running backend... Ein Dateivorgang wird im Backend ausgeführt... %1 files, %2 %1 Dateien, %2 %1 done, %2 total, %3 of %4. %1 erledigt, %2 gesamt, %3 von %4. clearing: %1, %2 of %3 Ausgleichen: %1, %2 von %3 copying... Kopieren... Syncing... Zeitlich übereinstimmend... Peony::FilePreviewPage File Name: 文件名称: File Type: Dateityp: Time Access: Zeitlicher Zugang: Time Modified: Geänderte Zeit: Children Count: Anzahl der Kinder: Size: Größe: Location: Time Created: Erstellungszeit: Image resolution: Bildauflösung: color model: Farbmodell: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare usershare Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden %1 gesamt, %2 ausgeblendet Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error Fehler beim Umbenennen von Dateien Invalid file name %1%2%3 . Ungültiger Dateiname %1%2%3 . Are you sure to hidden this file? Sind Sie sicher, dass Sie diese Datei ausgeblendet haben? When change the file suffix, the file may be invalid. Are you sure to change it ? Wenn Sie das Dateisuffix ändern, ist die Datei möglicherweise ungültig. Sind Sie sicher, dass Sie es ändern werden? A file and a directory with the same name cannot replace each other The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning Warnung zum Umbenennen von Dateien The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error Fehler beim Umbenennen der Datei Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// Müll:/// Trash file error Fehler in der Papierkorbdatei Invalid Operation! Can not trash "%1". Ungültiger Vorgang! "%1" kann nicht in den Papierkorb verschoben werden. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. Es besteht ein unüberschaubarer Konflikt. Bitte überprüfen Sie den Papierkorb. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Fehler beim Aufheben der Papierkorbdatei Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Verbreitung Minimize Minimieren Close Schließen Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Offen Open With Öffnen mit More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Kopieren Save As file Datei All File This location has no write permission.please change the storage location Label Properties Eigenschaften Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name Name SideBar Seitenleiste Menu Menü Create New Label Neues Etikett erstellen Delete Label Beschriftung löschen Display the following items in the identification area: (maximum of 6) Zeigen Sie die folgenden Elemente im Identifikationsbereich an: (maximal 6) Rename Umbenennen Edit Color Farbe bearbeiten Delete This Label Diese Bezeichnung löschen Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" Suchen nach "%1" in "%2" File System Dateisystem Search results for all files marked in "%1" in "%2" &Copy Directory 拷贝路径(&C) Open In New Tab In neuem Tab öffnen Open In New Window In neuem Fenster öffnen Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory Verzeichnis kopieren Peony::MountOperation Operation Cancelled Vorgang abgebrochen Login failed, unknown username or password error, please re-enter! Login fehlgeschlagen, unbekannter Benutzername oder Passwortfehler, bitte erneut eingeben! Peony::NavigationToolBar Go Back Zurück Go Forward Vorwärts gehen History Geschichte Clear History Historie löschen Cd Up Cd nach oben Refresh Auffrischen Peony::NewFileLaunchDialog Choose new application Neue Anwendung auswählen Choose an Application to open this file Wählen Sie eine Anwendung aus, um diese Datei zu öffnen apply now Jetzt bewerben OK OKAY Cancel Abbrechen Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? Wie möchten Sie "%1%2"-Dateien öffnen? Default open with: Standardmäßig öffnen mit: Other: Andere: Choose other application Wählen Sie eine andere Anwendung Go to application center Zum Application Center Peony::PathEdit Go To Gehe zu Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 Ziel: %1 Read and Write Lesen und Schreiben Readonly Schreibgeschützt Group or User Gruppe oder Benutzer (Current User) (Aktueller Benutzer) The folder containing this file is protected, and only the file owner can modify the file. Current User Aktueller Benutzer Permissions modify tip Tipp zum Ändern von Berechtigungen The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Für die aktuelle Datei oder den aktuellen Ordner wurden bereits ACL-Berechtigungen festgelegt. Das Ändern von Benutzergruppenberechtigungen kann dazu führen, dass die in ACL festgelegten Berechtigungen nicht mehr verwendet werden können. Möchten Sie weiterhin Benutzergruppenberechtigungen ändern? Permission refinement settings Einstellungen für die Berechtigungseinschränkung The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Der aktuelle Benutzer hat die erweiterte Freigabe festgelegt. Wenn Sie die Berechtigungen noch ändern müssen, ist die erweiterte Freigabe möglicherweise nicht verfügbar. Möchten Sie mit dem Einstellen fortfahren? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. Die Berechtigungsinformationen können nicht abgerufen werden. (Me) (我) Others Andere Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. Sie können den Zugriff auf diese Datei nicht ändern. Me User 用户 Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok Okay Cancel Peony::PropertiesWindow Trash Müll Recent Aktuell Selected Ausgewählt %1 Files %1 Dateien usershare usershare Data Daten System Disk Properties Eigenschaften Ok Okay Cancel Abbrechen Restore Wiederherstellen Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. Bestätigungsdialog während des Papierkorbs anzeigen. Origin Path: Ursprungspfad: Deletion Date: Löschdatum: Size: Größe: Original Location: Ursprünglicher Standort: Peony::SearchBar Input the search key of files you would like to find. Geben Sie den Suchschlüssel der Dateien ein, die Sie suchen möchten. Input search key... Suchschlüssel eingeben... advance search Erweiterte Suche clear record Löschen Sie den Datensatz Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Clear Klar all alle file folder Ordner image Bild video Video text file Textdatei audio Audio others andere wps file WPS-Datei Peony::SharedFileLinkOperation Symbolic Link Symbolischer Link The dest file "%1" has existed! Die Zieldatei "%1" ist vorhanden! Link file error Fehler bei der Verknüpfung der Datei Peony::SideBarCloudItem CloudStorage Cloud-Speicher CloudFile Cloud-Datei Peony::SideBarFavoriteItem Trash Müll Recent Aktuell Quick Access Favorite Lieblings- KmreData KmreData Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data Daten Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties Eigenschaften Delete Symbolic Symbolisch löschen Unmount Aushängen Eject Ausstoßen Format Format burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format Format Peony::SideBarModel Shared Data 共享数据 Network Netz Peony::SideBarPersonalItem Personal Persönlich Peony::SideBarSeparatorItem (No Sub Directory) (Kein Unterverzeichnis) Peony::StatusBar ; %1 folders ; %1 Ordner ; %1 files, %2 total ; %1 Dateien, %2 gesamt ; %1 folder ; Ordner %1 ; %1 file, %2 ; %1 Datei, %2 %1 selected %1 ausgewählt Peony::SyncThread notify 温馨提示 benachrichtigen Notify Peony::TagManagement General 通用 Mark Markieren Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type Art der Sortierung File Name Dateiname File Type Dateityp File Size Dateigröße Modified Date Änderungsdatum Open in New window In neuem Fenster öffnen Open in new Tab In neuem Tab öffnen Ascending Aufsteigend Descending Absteigend Copy Kopieren Paste Kleister Cut Schneiden Trash Müll Clean Trash Müll reinigen Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore Wiederherstellen Options Optionen Forbid Thumbnail Thumbnail verbieten Show Hidden Ausgeblendet anzeigen Resident in Backend Resident im Backend Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Lassen Sie das Programm nach dem Schließen des letzten Fensters noch laufen. Dies verkürzt die Zeit für den nächsten Start, verbraucht aber auch Ressourcen im Backend. &Help &Hilfe &About... &Über... Peony Qt Pfingstrose Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Verfasser: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Type: Art: Duration: Size: Größe: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Warnung Peony::VolumeManager Error Fehler ProgressBar starting ... Anlassen... canceling ... annullierend... sync ... synchronisieren... continue fortsetzen pause Pause close cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View Icon-Ansicht Show the folder children as icons. Zeigen Sie die untergeordneten Ordner als Symbole an. List View Listenansicht Show the folder children as rows in a list. Zeigen Sie die untergeordneten Ordner als Zeilen in einer Liste an. Basic Preview Page 基本 Basic Grundlegend Show the basic file properties, and allow you to modify the access and name. Zeigen Sie die grundlegenden Dateieigenschaften an, und Sie können den Zugriff und den Namen ändern. Permissions Page 权限 Permissions Erlaubnisse Show and modify file's permission, owner and group. Anzeigen und Ändern der Berechtigung, des Eigentümers und der Gruppe der Datei. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? Die Datei ist zu groß, um in den Papierkorb verschoben zu werden. Möchten Sie es dauerhaft löschen? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Diese Dateien sind zu groß, um in den Papierkorb verschoben zu werden. Möchten Sie diese %1-Dateien dauerhaft löschen? Delete Löschen Clean the Trash Reinigen Sie den Müll OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. Möchten Sie den Papierkorb leeren und die Dateien dauerhaft löschen? Wenn es einmal begonnen hat, gibt es keine Möglichkeit, sie wiederherzustellen. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties Computer-Eigenschaften Show the computer properties or items in computer. Zeigen Sie die Computereigenschaften oder -elemente im Computer an. Trash and Recent Properties Page 最近/回收 Trash and Recent Papierkorb und "Zuletzt verwendet" Show the file properties or items in trash or recent. Zeigen Sie die Dateieigenschaften oder Elemente im Papierkorb oder zuletzt verwendet an. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed Formatierung fehlgeschlagen YES JA Formatting successful! But failed to set the device name. Formatierung erfolgreich! Der Gerätename konnte jedoch nicht festgelegt werden. qmesg_notify qmesg_notify Format Format Begin Format Format beginnen Close Schließen Format operation has been finished successfully. Der Formatierungsvorgang wurde erfolgreich abgeschlossen. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! Der Formatierungsvorgang ist leider fehlgeschlagen! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Durch das Formatieren dieses Volumes werden alle darauf befindlichen Daten gelöscht. Bitte sichern Sie alle aufbewahrten Daten vor der Formatierung. Möchten Sie fortfahren? format Format begin format 开始 close 关闭 File Manager Dateimanager Notify Default search vfs of peony 默认文件搜索 Force unmount failed Aufheben der Bereitstellung erzwingen fehlgeschlagen Error: %1 Fehler: %1 Data synchronization is complete,the device has been unmount successfully! Die Datensynchronisierung ist abgeschlossen, das Gerät wurde erfolgreich ausgemountet! Unmount failed Unmount fehlgeschlagen Not authorized to perform operation. Nicht berechtigt, den Betrieb durchzuführen. Unable to unmount it, you may need to close some programs, such as: GParted etc. Da es nicht möglich ist, es auszuhängen, müssen Sie möglicherweise einige Programme schließen, wie z.B.: GParted usw. Error: %1 Do you want to unmount forcely? Fehler: %1 Willst du gewaltsam absteigen? Cancel Abbrechen Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase Fehler beim Aktivieren des Geräts: Falsche Passphrase The device has been mount successfully! Das Gerät wurde erfolgreich montiert! Eject device failed, the reason may be that the device has been removed, etc. Das Auswerfen des Geräts ist fehlgeschlagen, der Grund kann sein, dass das Gerät entfernt wurde usw. Data synchronization is complete and the device can be safely unplugged! Die Datensynchronisation ist abgeschlossen und das Gerät kann sicher vom Stromnetz getrennt werden! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed Auswurf fehlgeschlagen favorite Lieblings- Favorites Favoriten File is not existed. Die Datei ist nicht vorhanden. Share Data Daten freigeben Trash Müll Recent Aktuell Operation not supported Vorgang wird nicht unterstützt The virtual file system does not support folder creation Das virtuelle Dateisystem unterstützt die Erstellung von Ordnern nicht Can not create a symbolic file for vfs location Es kann keine symbolische Datei für den vfs-Speicherort erstellt werden. Symbolic Link Symbolischer Link Can not create symbolic file here, %1 Symboldatei kann hier nicht erstellt werden, %1 Can not add a file to favorite directory. Eine Datei kann nicht zum Favoritenverzeichnis hinzugefügt werden. The virtual file system cannot be opened Das virtuelle Dateisystem kann nicht geöffnet werden Virtual file directories do not support move and copy operations Virtuelle Dateiverzeichnisse unterstützen keine Verschiebe- und Kopiervorgänge Default favorite vfs of peony Standard-Favoriten-VFS von Pfingstrose Details Details Mark Markieren mark this file. Markieren Sie diese Datei. Open With Öffnen mit open with. Öffnen mit. It need to synchronize before operating the device,place wait! Es muss synchronisiert werden, bevor das Gerät in Betrieb genommen wird, warten Sie! Unable to discover the file, it may have been removed or deleted. permission denied Berechtigung verweigert file not found Datei nicht gefunden duplicate Duplikat Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data Daten System Disk label Etikett Computer Computer File System Dateisystem Data Daten Failed to open file "%1": insufficient permissions. Fehler beim Öffnen der Datei '%1': Unzureichende Berechtigungen. File “%1” does not exist. Please check whether the file has been deleted. Die Datei "%1" ist nicht vorhanden. Bitte prüfen Sie, ob die Datei gelöscht wurde. burn operation has been cancelled Der Brennvorgang wurde abgebrochen is busy! ist beschäftigt! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten? Sobald der Löschvorgang beginnt, kann die Datei nicht mehr wiederhergestellt werden. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. Sind Sie sicher, dass Sie diese %1-Dateien dauerhaft löschen möchten? Sobald der Löschvorgang beginnt, können diese Dateien nicht mehr wiederhergestellt werden. Virtual file directories do not support move operations Virtuelle Dateiverzeichnisse unterstützen keine Verschiebevorgänge test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok Okay Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData AppendBurnData Disc Type: Disc-Typ: Device Name: Gerätename: OK OKAY Cancel Abbrechen Unknown Unbekannt Warning Warnung No burn data, please add! Keine Brenndaten, bitte hinzufügen! The disc name cannot be set to empty, please re-enter it! Der Disc-Name kann nicht leer gesetzt werden, bitte geben Sie ihn erneut ein! AppendBurnData operation has been finished successfully. Der AppendBurnData-Vorgang wurde erfolgreich abgeschlossen. Sorry, the appendBurnData operation is failed! Es tut uns leid, aber der appendBurnData-Vorgang ist fehlgeschlagen! Failed Misslungen Burning. Do not close this window Brennend. Dieses Fenster nicht schließen Burning this disc will append datas on it. Do you want to continue ? Beim Brennen dieser Disc werden Daten angehängt. Möchten Sie fortfahren? Burn Brennen Begin Burning Beginnen Sie mit dem Brennen Close Schließen UdfBurn::UdfFormatDialog Format Format Disc Type: Disc-Typ: Device Name: Gerätename: OK OKAY Cancel Abbrechen Unknown Unbekannt Warning Warnung The disc name cannot be set to empty, please re-enter it! Der Disc-Name kann nicht leer gesetzt werden, bitte geben Sie ihn erneut ein! Format operation has been finished successfully. Der Formatierungsvorgang wurde erfolgreich abgeschlossen. Sorry, the format operation is failed! Der Formatierungsvorgang ist leider fehlgeschlagen! Failed Misslungen Formatting. Do not close this window Formatierung. Dieses Fenster nicht schließen Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Wenn Sie diese Disc formatieren, werden alle darauf befindlichen Daten gelöscht. Bitte sichern Sie alle aufbewahrten Daten vor der Formatierung. Möchten Sie fortfahren? Begin Format Format beginnen Close Schließen UdfFormatDialog Format Format Disc Type: Disc-Typ: Device Name: Gerätename: OK OKAY Cancel Abbrechen Unknown Unbekannt Warning Warnung The disc name cannot be set to empty, please re-enter it! Der Disc-Name kann nicht leer gesetzt werden, bitte geben Sie ihn erneut ein! Format operation has been finished successfully. Der Formatierungsvorgang wurde erfolgreich abgeschlossen. Sorry, the format operation is failed! Der Formatierungsvorgang ist leider fehlgeschlagen! Failed Misslungen Formatting. Do not close this window Formatierung. Dieses Fenster nicht schließen Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Wenn Sie diese Disc formatieren, werden alle darauf befindlichen Daten gelöscht. Bitte sichern Sie alle aufbewahrten Daten vor der Formatierung. Möchten Sie fortfahren? Begin Format Format beginnen Close Schließen progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_ug.ts0000664000175000017500000114203215154271106021131 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... بەلگە باشقۇرۇش ... Remove "%1" «%1» نى چىقىرىۋېتىش delete "%1" 删除“%1” add "%1" «%1» نى قوشۇش ConnectServerDialog Connect to Sever Sever غا ئۇلاش Domain تور نامى Password ئىم Save Password پارولنى ساقلاش User ئىشلەتكۈچى Anonymous نامسىز Ok ماقۇل Cancel ئەمەلدىن قالدۇرۇش DiscControl is busy! ناھايىتى ئالدىراش! is busy! ئالدىراش not support udf at present. ھازىرچە udf نى قوللىمايدۇ. unmount disc failed before udf format. UDF فورماتىدىن بۇرۇن دىسكىنى چۈشۈرۈش مەغلۇپ بولدى. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf ھۆججىتى فورماتى. preparation failed before DVD-RW udf format. DVD-RW udf فورماتىدىن بۇرۇن تەييارلاش مەغلۇپ بولدى. FileLabelModel Red قىزىل رەڭ Orange قىىزغۇچ سېرىق رەڭ Yellow سېرىق رەڭ Green يېشىل رەڭ Blue كۆك رەڭ Purple بىنەپشە رەڭ Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error خاتالىق Label or color is duplicated. بەلگە ياكى رەڭ كۆپەيتىلگەن. FileOperationHelper Burn failed كۆيۈش مەغلۇپ بولدى Format_Dialog Dialog دىئالوگ rom_size rom_رەزمېرى system سىستېما vfat/fat32 VFAT/fat32 exfat exfat ntfs NTFS vfat VFAT ext4 ext4 device_name device_name clean it total پۈتۈنلەي تازىلاش ok ماقۇل close ياپ TextLabel TextLabel qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format فورمات Rom size: rom چوڭ-كىچىكلىكى: Filesystem: ھۆججەت سىستېمىسى: Disk name: دىسكا نامى: Completely erase(Time is longer, please confirm!) ئۈزۈل - كېسىل ئۆچۈرۈش (ۋاقىت ئۇزۇن، جەزىملەشتۈرۈڭ!) Set password پارولنى بەلگىلەش Set password for volume based on LUKS (only ext4) LUKS غا ئاساسەن ھەجىمى ئۈچۈن پارولنى بەلگىلەش (پەقەت ext4) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ext4 ھۆججەت سىستېمىسىغا فورماتلاش باشقا ئابونتلارنىڭ USB دىسكىدا ئوقۇش ياكى يازالماسلىقىنى كەلتۈرۈپ چىقىرىشى مۇمكىن Cancel ئەمەلدىن قالدۇرۇش OK ماقۇل Data سانلىق مەلۇمات Error locking device: Failed to deactivate device: Device or resource busy ئۈسكۈنىنى قۇلۇپلاشتا خاتالىق كۆرۈلدى: ئۈسكۈنىنى توختىتىش مەغلۇب بولدى: ئۈسكۈنە ياكى بايلىق ئالدىراش Warning ئاگاھلاندۇرۇش Device name cannot start with a decimal point, Please re-enter! ئۈسكۈنە نامى ئونلۇق چېكىت بىلەن باشلىغىلى بولمايدۇ، قايتا كىرگۈزۈڭ! Enter Password: پارولنى كىرگۈزۈڭ: Password too short, please retype a password more than 6 characters ئىم بەك قىسقا، 6 ھەرپتىن ئارتۇق پارولنى قايتا كىرگۈزۈڭ %1/sec, %2 remaining. %1/سېكۇنت، %2 قالدى. over one day بىر كۈندىن ئارتۇق getting progress... ئىلگىرلەش ... Error خاتالىق Block not existed! بۆلەك مەۋجۇت ئەمەس! Formatting. Do not close this window فورمات. بۇ كۆزنەكنى يېپىۋەتمەڭ KyFileDialogRename Renaming "%1" «%1» نامىنى ئۆزگەرتىش Renaming failed, the reason is: %1 ئىسىم ئۆزگەرتىش مەغلۇپ بولدى، سەۋەبى: %1 Filename too long ھۆججەت نامى بەك ئۇزۇن ئىكەن Copying "%1" «%1» نى كۆچۈرۈۋاتىدۇ To "%1" «%1» غا Copying failed, the reason is: %1 كۆچۈرۈش مەغلۇپ بولدى، سەۋەبى %1 Moving "%1" «%1» نى يۆتكەۋاتىدۇ Moving failed, the reason is: %1 يۆتكەش مەغلۇپ بولدى، سەۋەبى: %1 File operation error: ھۆججەت مەشغۇلات خاتالىقى: The reason is: %1 سەۋەبى: %1 Truncation كىسىش Save ساقلاش All applications بارلىق قوللىنىشچان پروگراممىلار Cancel ئەمەلدىن قالدۇرۇش Apply ئىلتىماس قىلىش Bytes بايت Front truncation ئالدى قىسقارتىش Post truncation كېسىش يازمىسى Description: Skip copying files of the current type چۈشەندۈرۈشى: نۆۋەتتىكى ھۆججەتلەرنى كۆچۈرۈشتىن ئاتلاپ ئۆتۈش truncate interval قىسقارتىش ئارىلىقى . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select چۈشەندۈرۈش: %1 بايتتىن ئېشىپ كەتكەن ھۆججەت نامىنى قىسقارتىپ تاللاڭ Explanation: When renaming a file name, ensure it is within %1 bytes and چۈشەندۈرۈش: ھۆججەت نامىنى ئۆزگەرتكەندە، ئۇنىڭ %1 بايت دائىرىسىدە بولۇشىغا كاپالەتلىك قىلىڭ Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". چۈشەندۈرۈش:كۆڭۈلدىكى ئەھۋالدا، %1/گىچە ساقلاش كېرەك. modify the name ئىسىمنى ئۆزگەرتىش Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip ئاتلاپ ئۆتۈپ كېتىش Skip All 全部跳过 Rename ئىسمىنى ئۆزگەرتىش Please enter a new name 请输入文件名 OK ماقۇل MainProgressBar File operation 文件操作 starting ... باشلىنىش ... cancel all file operations بارلىق ھۆججەت مەشغۇلاتلىرىنى بىكار قىلىش Minimize كىچىكلىتىش Close ياپ Are you sure to cancel all file operations? سىز چوقۇم بارلىق ھۆججەت مەشغۇلاتىنى ئەمەلدىن قالدۇرامسىز؟ Are you sure want to cancel all file operations بارلىق ھۆججەت مەشغۇلاتىنى راستتىنلا ئەمەلدىن قالدۇرامسىز OK ماقۇل File Operation ھۆججەت مەشغۇلات Cancel ئەمەلدىن قالدۇرۇش Calculating time ۋاقىت ھېسابلاش continue داۋاملاشتۇرۇش pause توختاش canceling ... ئەمەلدىن قالدۇرۇلىۋاتىدۇ ... sync ... ماس قەدەملىك ... %1Mb/s Est. time left: %2 %1Mb/s تەخمىنەن قالغان ۋاقىت: %2 MessageDialog Peony مودەنگۈل Forcibly pulling out the device may cause data loss or device exceptions! ئۈسكۈنىنى مەجبۇرىي تارتىپ چىقىرىش سانلىق مەلۇمات يوقاپ كېتىشى ياكى ئۈسكۈنىنىڭ مۇستەسنا بولۇشىنى كەلتۈرۈپ چىقىرىشى مۇمكىن! OtherButton Other queue 其它队列 Other Queue باشقا قاتار Peony::AdvanceSearchBar Key Words ئاچقۇچلۇق سۆزلەر input key words... ئاچقۇچلۇق سۆزلەرنى كىرگۈزۈش... Search Location ئورۇن ئىزدەش choose search path... ئىزدەش يولىنى تاللاڭ... browse كۆرۈش File Type ھۆججەت تىپى Choose File Type ھۆججەت تىپىنى تاللاڭ Modify Time ۋاقىتنى ئۆزگەرتىش Choose Modify Time ۋاقىتنى ئۆزگەرتىشنى تاللاش File Size ھۆججەت چوڭلۇقى Choose file size ھۆججەت چوڭلۇقىنى تاللاڭ show hidden file يۇشۇرۇن ھۆججەتنى كۆرسىتىش go back قايت hidden advance search page يۇشۇرۇن ئالدىن ئىزدەش بېتى file name ھۆججەت نامى content مەزمۇن search ئىزدەش start search ئىزدەشنى باشلاش Select path يول تاللاش Operate Tips مەشغۇلات ئەسكەرتمىسى Have no key words or search location! ئاچقۇچلۇق سۆز ياكى ئىزدەش ئورنى يوق! Search file name or content at least choose one! ھۆججەت نامى ياكى مەزمۇنىنى ئىزدەڭ، ھېچ بولمىغاندا بىرنى تاللاڭ! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File ھۆججەت ئىزدەش Peony::AdvancedPermissionsPage Permission refinement settings ئىجازەت ئىنچىكىلەشتۈرۈش تەڭشەكلىرى Permission refinement settings tip ئىجازەت ئىنچىكىلەشتۈرۈش تەڭشەكلىرى ئەسكەرتمىسى Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ھوقۇقىنى تەڭشەش ئىشلەتكۈچى گۇرۇپپىسىنىڭ ئاساسىي ئىجازەتنامىسىدە ئۆزگىرىش بولىدۇ. ACL ھوقۇقىنى داۋاملىق تەڭشەش كېرەكمۇ؟ User ئىشلەتكۈچى Read ئوقۇش Write يىزىش Executable ئىجرا قىلغىلى بولىدۇ delete ئۆچۈر Inherit permission ئىجازەتنامىگە ۋارىسلىق قىلىش Add قوش Apply ئىلتىماس قىلىش Cancel ئەمەلدىن قالدۇرۇش Peony::AllFileLaunchDialog Choose new application يېڭى پروگرامما تاللاڭ Choose an Application to open this file بۇ ھۆججەتنى ئېچىش ئۈچۈن پروگرامما تاللاڭ apply now ھازىر ئىلتىماس قىلىش OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon ئىختىيارى سىنبەلگىنى تاللاڭ Type: تىپى: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name نامى Location ئورنى move 移动 symbolLink بەلگە ئۇلانمىسى Folder ھۆججەت قىسقۇچ Include: ئۆز ئىچىگە ئالىدۇ: Move يۆتكەش Open with: ئېچىش : Description: تەسۋىرلەش: Select multiple files تەكرار ھۆججەت تاللاش Size: چوڭ-كىچىكلىكى: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: بوشلۇق ئىشلىتىش ئۇسۇلى: Time Create: ۋاقىت يارىتىش: Time Modified: ئۆزگەرتىلگەن ۋاقىت: Time Access: ۋاقىت زىيارەت قىلىش: Readonly ئوقۇغاندىن كېيىن Hidden يوشۇرۇن Readonly (just applied by subfiles) پەقەت ئوقۇلۇش (پەقەت تارماق ھۆججەتلەر قوللىنىلغان) Property: خۇسۇسىيەت: usershare ئىشلەتكۈچى ھەمبەھىرلەش %1 (%2 Bytes) %1 (%2 بايت) Images (*.png *.jpg *.jpeg *.svg) سۈرەتلەر (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. چوڭلۇقى 1MBدىن كىچىك رەسىمنى تاللاڭ. Choose a new folder: يېڭى بىر ھۆججەت قىسقۇچنى تاللاڭ: Error خاتالىق cannot move a folder to itself ! بىر ھۆججەت قىسقۇچنى ئۇنىڭ ئىچكى قىسمىغا يۆتكىگىلى بولمايدۇ! %1 Bytes %1 بايت %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 ھۆججەت، %2 ھۆججەت قىسقۇچ Can't get remote file information يىراقتىكى ھۆججەت ئۇچۇرىغا ئېرىشكىلى بولمىدى %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU نامى: CPU Core: CPU يادروسى: Memory Size: ئىچكى ساقلىغۇچ چوڭلۇقى: User Name: ئىشلەتكۈچى ئىسمى: Desktop: ئۈستەل يۈزى: You should mount this volume first سىز ئالدى بىلەن بۇ ئىمتىھاننى قاچىلاش كېرەك Name: نامى: File System 文件系统 Data سانلىق مەلۇمات System Disk سىستىما دىسكىسى Total Space: ئومۇمىي بوشلۇق: Used Space: ئىشلىتىلگەن بوشلۇق: In calculation... ھېسابلاش جەريانىدا... /root used: /root ئىشلىتىلگەن: /home used: /home ئىشلىتىلگەن: /usershare used: /ئىشلەتكۈچى ئىشلىتىلگەن: /data/* used: /data/* ئىشلىتىلگەن: Unknow (No permission) بىلمىگەن (رۇخسەت بېرىلمىگەن) Free Space: ئىشلەتكىلى بولىدىغان بوشلۇق: Type: تىپى: Kylin Burner Kylin Burner Open with: ئېچىش ئۇسۇلى: Unknown نامەلۇم Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server مۇلازىمىتېرغا ئۇلاش Ip Ip Port پورت Type تىپى Personal Collection server: شەخسىي توپلام مۇلازىمىتىرى: Add قوش Delete ئۆچۈر Connect ئۇلىنىش Ip input error, please re-enter! IP كىرگۈزگۈچتە خاتالىق كۆرۈلدى، قايتا كىرگۈزۈڭ! Port input error, please re-enter! ئېغىز كىرگۈزۈشتە خاتالىق كۆرۈلدى، قايتا كىرگۈزۈڭ! add 添加 delete 连接 删除 connect 连接 Warning ئاگاھلاندۇرۇش ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user تىزىملىتىش ئىشلەتكۈچى Please enter the %1's user name and password of the server. %1 نىڭ ئىشلەتكۈچى نامى ۋە مۇلازىمىتىرنىڭ پارولىنى كىرگۈزۈڭ. User's identity ئىشلەتكۈچىنىڭ سالاھىيىتى Guest ئىختىيارىي زىيارەتچى Name نامى Password ئىم domain تور نامى Cancel ئەمەلدىن قالدۇرۇش OK ماقۇل guest 游客(匿名登录) Registered users تىزىملاتقان ئىشلەتكۈچىلەر name 用户名 password 密码 Remember the password پارولنى ئېسىڭىزدە تۇتۇش cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop ئۈستەلئۈستىگە ئۇلانما قۇرۇش Create Link to... ئۇلانما قۇرۇش... Choose a Directory to Create Link ئۇلانما قۇرۇش ئۈچۈن مۇندەرىجە تاللاڭ Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop ئۈستەلئۈستىگە ئۇلانما قۇرۇش Peony::CreateTemplateOperation File create error ھۆججەت قۇرۇش خاتالىقى Can not create %1: Read-only mode, can not write-in %1 نى قۇرغىلى بولمىدى: پەقەت ئوقۇش ھالىتى يېزىلمىدى، يازغىلى بولمىدى NewFile يېڭى ھۆججەت Create file ھۆججەت قۇرۇش NewFolder يېڭى قاتلىغۇچ Create file error ھۆججەت خاتالىقى قۇرۇش Peony::CustomErrorHandler Is Error Handled? خاتالىق بىر تەرەپ قىلىندىمۇ؟ Error not be handled correctly خاتالىق توغرا بىر تەرەپ قىلىنمىدى Peony::DefaultAcitonWidget No default app سۈكۈتتىكى ئەپ يوق Peony::DefaultOpenWithWidget No default app سۈكۈتتىكى ئەپ يوق Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview ئالدىن كۆرمەكچى بولغان ھۆججەتنى تاللاڭ Can not preview this file بۇ ھۆججەتنى كۆرۈپ باققىلى بولمىدى Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview سۈكۈتتىكى ئالدىن كۆرۈش This is the Default Preview of peony-qt بۇ مودەنگۈل-qt نىڭ سۈكۈتتىكى ئالدىن كۆرۈش پروگراممىسى Peony::DetailsPropertiesPage Name: ھۆججەت نامى File type: ھۆججەت تىپى: Location: ئورنى: yyyy-MM-dd, HH:mm:ss yyyyيىلMMئايddكۈن, سائەت:مىنۇت:سىكۇنت Create time: ۋاقىت يېزىش: Modify time: ۋاقىتنى ئۆزگەرتىش: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: ھۆججەت چوڭلۇقى: Width: كەڭلىكى: Height: يورۇقلۇق دەرىجىسى: Owner ئىگىسى Owner: ئىگىسى: Computer ھېسابلىغۇچ Computer: كومپيۇتېر: %1 (this computer) %1 (بۇ كومپيۇتېر) Unknown نامەلۇم Can't get remote file information يىراقتىكى ھۆججەت ئۇچۇرىغا ئېرىشكىلى بولمىدى %1 px ٪1 px Peony::DirectoryView::IconView Icon View 图标视图 warn ئاگاھلاندۇرۇش This operation is not supported. بۇ مەشغۇلات قوللىمايدۇ. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ئاگاھلاندۇرۇش This operation is not supported. بۇ مەشغۇلات قوللىمايدۇ. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark خەتكۈشكە قوشۇش &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder يېڭى ھۆججەت قىسقۇچ Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name نامى File Type ھۆججەت تىپى File Size ھۆججەت چوڭلۇقى New... 新建... Open in New Window يېڭى كۆزنەكتە ئېچىش Open in New Tab يېڭى بەتكۈچتە ئېچىش Open ئېچىش Open failed ئېچىش مەغلۇپ بولدى Open directory failed, you have no permission! مۇندەرىجە ئېچىش مەغلۇپ بولدى، سىزنىڭ ئىجازەت يوق! Open with... ئېچىش بىلەن... More applications... تېخىمۇ كۆپ قوللىنىشچان... Open %1 selected files %1 تاللانغان ھۆججەتلەرنى ئېچىش New يېڭى Empty File ھۆججەت قۇرۇق Folder ھۆججەت قىسقۇچ View Type كۆرۈش تىپى Sort By بويىچە تۈرگە ئايرىش Modified Date 修改日期 Original Path ئەسلى يول Sort Order... 排序顺序... Ascending Order ئۆرلەش تەرتىپى Mount تاغ MultiSelect MultiSelect Descending Order تۆۋەنلەش تەرتىپى Sort Preferences... 排序偏好... Folder First ھۆججەت قىسقۇچ Chinese First خەنزۇ تىلى بىرىنچى Show Hidden يۇشۇرۇن كۆرسىتىش Copy كۆچۈرۈش Cancel ئەمەلدىن قالدۇرۇش File:"%1" is not exist, did you moved or deleted it? ھۆججەت:"%1" مەۋجۇت ئەمەس، يۆتكەپ قويدىڭىزمۇ ياكى ئۆچۈرۈۋەتتىڭىزمۇ؟ Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut كېسىش Delete to trash ئۆچۈرۈش ئەخلەت ساندۇقىغا Paste چاپلا Refresh يېڭىلاش Select All ھەممىنى تاللا Properties خۇسۇسىيەتلەر format فورمات Restore ئەسلىگە كەلتۈرۈش Delete ئۆچۈر Time Modified ۋاقىت ئۆزگەرتىلدى Path يول Sort Order تۈرگە ئايرىش تەرتىپى Newest to oldest ئەڭ يېڭى ۋە ئەڭ قەدىمى Oldest to newest ئەڭ قەدىمىدىن ئەڭ يېڭى Files from large to small چوڭىدىن كىچىكگىچە ھۆججەتلەر Files from small to large كىچىكدىن چوڭغىچە ھۆججەت Sort Preferences مايىللىقلارنى رەتلەش Error خاتالىق File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever مەڭگۈلۈك ئۆچۈرۈش Rename ئىسمىنى ئۆزگەرتىش Select &All 全选(&A) Reverse Select تەتۈر تاللاش P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash & ئەخلەت ساندۇقىنى تازىلاش Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All ھەممىنى تازىلاش Open Parent Folder in New Window يېڭى كۆزنەكتە ئانا ھۆججەت قىسقۇچنى ئېچىش Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager كېڭەيمىلەر باشقۇرغۇ Available extensions ئىشلەتكىلى بولىدىغان كېڭەيتمىلەر Ok ماقۇل Cancel ئەمەلدىن قالدۇرۇش Peony::FMWindow File Manager ھۆججەت باشقۇرغۇ advanced search تەپسىلىي ئىزدەش clear record خاتىرە تازىلاش Loaing... Press Esc to stop a loading. ئۆچمەنلىك... يۈكلەش توختىتىش ئۈچۈن Esc نى بېسىڭ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. ئاپتۇر: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> نەشر ھوقۇقى ئىگىدارلىق ھوقۇقى (C):2019-يىلىدىن 2020-يىلىغىچە، تيەنجىن KYLIN ئۇچۇر تېخنىكا چەكلىك شىركىتى، چەكلىك شىركىتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo ئەمەلدىن قالدۇرۇش Redo قايتا قىلىش Peony Qt مودەنگۈل Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder يېڭى ھۆججەت قىسقۇچ Peony::FileBatchRenameOperation File Rename error ھۆججەت نامىنى ئۆزگەرتىش خاتالىقى Invalid file name %1%2%3 . ھۆججەت نامى %1%2%3 ئىناۋەتسىز . File Rename warning ھۆججەت ئىسمىنى ئۆزگەرتىش ئاگاھلاندۇرۇشى Are you sure to hidden these files? سىز چوقۇم بۇ ھۆججەتلەرنى يوشۇرۇپ قويامسىز؟ Rename file error ھۆججەت نامىنى ئۆزگەرتىش خاتالىقى Peony::FileCopy Error in source or destination file path! مەنبە ياكى نىشان ھۆججەت يولىدا خاتالىق كۆرۈلدى! Error when copy file: %1, can not copy special files, skip this file and continue? ھۆججەت كۆچۈرۈشتە خاتالىق كۆرۈلدى: %1، ئالاھىدە ھۆججەتلەرنى كۆچۈرۈشكە بولمايدۇ، بۇ ھۆججەتتىن ئاتلاپ داۋاملاشتۇرامسىز؟ Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 نى كۆچۈرۈشكە بولمايدۇ، ھۆججەت مەۋجۇت ئەمەس. ھۆججەتنىڭ ئىسمى ئۆزگەرتىلدىمۇ ياكى يۆتكەپ قويۇلدىمۇ؟ The dest file "%1" has existed! dest ھۆججىتى «%1» مەۋجۇت بولدى! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32 ھۆججەت سىستېمىسى 4GBدىن ئارتۇق بوشلۇقنى ئىگەللىگەن بىرلا ھۆججەتنى قوللىمايدۇ! Error writing to file: Input/output error ھۆججەتكە يېزىش خاتالىقى: كىرگۈزۈش/چىقىرىش خاتالىقى Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 قۇرۇش مەغلۇب بولدى. ئۇنىڭ يىلتىز مۇندەرىجىسىدە ياكى ئۈسكۈنىنىڭ gphoto2 كېلىشىمىنى توغرا قوللايدىغانلىقىنى جەزملەشتۈرۈڭ. Failed to create %1. %1 قۇرۇش مەغلۇب بولدى. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! ئۈسكۈنىنىڭ ئېلىۋېتىلگەنلىكىنى تەكشۈرۈپ بېقىڭ! Write file error: There is no available disk space for device! ھۆججەت يېزىش خاتالىقى: ئۈسكۈنىنىڭ دىسكا بوشلۇقى يوق! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure ھۆججەت ئېچىلىش مەغلۇپ بولدى Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel مەشغۇلات بىكار قىلىش Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 ھۆججەت قىسقۇچ %1 قۇرۇش مەغلۇپ بولدى: %2 File copy error ھۆججەت كۆچۈرۈش خاتالىقى The file name exceeds the limit ھۆججەت نامى چەكتىن ئېشىپ كەتتى Cannot opening file, permission denied! ھۆججەتنى ئاچقىلى بولمىدى، ئىجازەت رەت قىلىندى! File:%1 was not found. ھۆججەت:%1 تېپىلمىدى. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk سىستىما دىسكىسى File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in %1 نى %2 گە كۆچۈرۈشكە بولمايدۇ: پەقەت ئوقۇش ھالىتى، يازغىلى بولمىدى Can not copy %1 to %2: Permission denied %1 نى %2 گە كۆچۈرۈشكە بولمايدۇ: ئىجازەت رەت قىلىندى Data سانلىق مەلۇمات %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 ئۈسكۈنىدە بوشلۇق قالمىدى. ھۆججەت كۆچۈرۈش چوڭلۇقى: %2GB, بوشلۇقى زۆرۈر: %3GB. Link file error ھۆججەت ئۇلاش خاتالىقى Burning does not support replacement كۆيۈش ئالماشتۇرۇشنى قوللىمايدۇ Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error ھۆججەت ئۆچۈرۈش خاتالىقى Delete file error ھۆججەت ئۆچۈرۈش خاتالىقى Invalid Operation! Can not delete "%1". ئىناۋەتسىز مەشغۇلات! «%1» نى ئۆچۈرگىلى بولمايدۇ. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled پارولنى دىئالوگ رامكىسى بىكار قىلىندى Message recipient disconnected from message bus without replying! ئۇچۇر تاپشۇرۇۋالغۇچى جاۋاب قايتۇرماي تۇرۇپلا ئۇچۇر ئاپپاراتى توسقۇنلۇقىدىن ئۈزۈلدى! Error خاتالىق Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data سانلىق مەلۇمات folder ھۆججەت قىسقۇچ file ھۆججەت text file تېكىست ھۆججىتى Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ئاگاھلاندۇرۇش Error خاتالىق Open Link failed ئۇلانمىنى ئېچىش مەغلۇپ بولدى File not exist, do you want to delete the link file? ھۆججەت مەۋجۇت ئەمەس، ئۇلانما ھۆججىتىنى ئۆچۈرەمسىز؟ Can not open path "%1",permission denied. «%1» يولنى ئاچقىلى بولمىدى،ئىجازەت رەت قىلىندى. Can not find path "%1",are you moved or renamed it? «%1» يولنى تاپالمىدى، كۆچۈرۈلدىمۇ ياكى ئۆزگەرتتىڭىزمۇ؟ Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) بالا ھۆججەت Symbol Link, بەلگە ئۇلانمىسى، System Disk سىستىما دىسكىسى File Name ھۆججەت نامى Delete Date چېسلانى ئۆچۈرۈش Create Date چېسلا قۇرۇش Time Modified ۋاقىت ئۆزگەرتىلدى File Size ھۆججەت چوڭلۇقى Original Path ئەسلى يول Path يول File %1 is existed in space, please not add file repeatly. ھۆججەت ٪1 بوشلۇقتا مەۋجۇت، قايتا ھۆججەت قوشماڭ. Operation not supported مەشغۇلات قوللىمىدى File Type ھۆججەت تىپى Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label ھۆججەت بەلگىسى قوشۇش Delete All Label بارلىق بەلگىلەرنى ئۆچۈرۈش Label Management ... بەلگە باشقۇرۇش ... Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... بەلگە باشقۇرۇش ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 نىڭ ئېچىلىش ئەندىزىسى unknown نامەلۇم No application is set to open file "%1 %2" «%1 %2» ھۆججەتنى ئېچىش ئۈچۈن ھېچقانداق پروگرامما بەلگىلەنمىگەن Still using the last opened application: تېخىچە ئەڭ ئاخىرقى ئېچىلغان پروگرامما ئىشلىتىۋاتىدۇ: known مەلۇمۇم. Open application is used by default: ئېچىلغان پروگرامما سۈكۈتتە ئىشلىتىلىدۇ: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. يۇمشاق دېتال مەركىزىدىن بۇ ھۆججەتنى ئاچالايدىغان پروگراممىنى ئىزدەپ باقسىڭىز ياكى كومپيۇتېرىڭىزدا مەۋجۇت بولغان پروگراممىلارنى تاللىسىڭىز بولىدۇ. Other application: باشقا قوللىنىشچان: Select application: پروگراممىنى تاللاڭ: Always open the %1%2 file with this application بۇ پروگرامما ئارقىلىق %1%2 ھۆججىتىنى باشتىن ئاخىر ئېچىڭ Choose other application باشقا پروگراممىلارنى تاللاڭ Go to application center قوللىنىشچان مەركىزىگە يۆتكىلىش Ok ماقۇل Cancel ئەمەلدىن قالدۇرۇش Desktop files(*.desktop) ئۈستەلئۈستى ھۆججىتى(*.desktop) Select Open Action مەشغۇلات ئېچىش تاللاش Select تاللاش Peony::FileLaunchAction Execute Directly بىۋاستە ئىجرا قىلىش Execute in Terminal تېرمىنالدا ئىجرا قىلىش Detected launching an executable file %1, you want? %1 ئىجرا ھۆججىتىنى قوزغىتىش بايقالدىمۇ؟ Delete file Warning 删除文件警告 Open Failed ئېچىش مەغلۇپ بولدى Can not open %1, file not exist, is it deleted? %1نى ئاچقىلى بولمىدى، ھۆججەت مەۋجۇت ئەمەس، ئۆچۈرۈلدىمۇ؟ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ئىجازەت بېرىلمەيدۇ File is not readable. Please check if file has read permisson. ھۆججەتنى ئوقۇغىلى بولمايدۇ. ھۆججەتتە ئىجازەت بېرىلگەنلىكىنى تەكشۈرۈپ بېقىڭ. By Default App سۈكۈتتىكى ئەپ Launch Options ئىجرا قىلىش تاللانمىلىرى Open Link failed ئۇلانمىنى ئېچىش مەغلۇپ بولدى File not exist, do you want to delete the link file? ھۆججەت مەۋجۇت ئەمەس، ئۇلانما ھۆججىتىنى ئۆچۈرەمسىز؟ Can not open %1, Please confirm you have the right authority. %1 نى ئاچقىلى بولمىدى، ھوقۇقىڭىز توغرا بارلىقىنى جەزملەشتۈرۈڭ. Open App failed ئەپنى ئېچىش مەغلۇپ بولدى The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? ئۇلانغان ئەپ ئۆزگەرتىلگەن ياكى ئۆچۈرۈۋېتىلگەن، شۇڭا نورمال ئىشلىيەلمەيدۇ. ئۇلانما ھۆججىتىنى ئۆچۈرەمسىز؟ Error خاتالىق File original path not exist, are you deleted or moved it? ھۆججەتنىڭ ئەسلى يولى مەۋجۇت ئەمەس، ئۆچۈرۈلدىمۇ ياكى يۆتكەپ قويدىڭىزمۇ؟ Can not get a default application for opening %1, do you want open it with text format? %1 نى ئېچىش ئۈچۈن سۈكۈتتىكى پروگراممىنى ئالغىلى بولمىدى، تېكىست فورماتى بىلەن ئېچىشنى خالامسىز؟ Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link سىمۋوللۇق ئۇلانما Link file error ھۆججەت ئۇلاش خاتالىقى Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error ھۆججەت يۆتكەش خاتالىقى File System 文件系统 Data سانلىق مەلۇمات %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 ئۈسكۈنىدە بوشلۇق قالمىدى. ھۆججەت كۆچۈرۈش چوڭلۇقى: %2GB, بوشلۇقى زۆرۈر: %3GB. File move error ھۆججەت يۆتكەش خاتالىقى Invalid move operation, cannot move a file into its sub directories. ئىناۋەتسىز يۆتكەش مەشغۇلاتى ئىناۋەتسىز، ھۆججەتنى تارماق مۇندەرىجە ئىچىگە يۆتكىگىلى بولمايدۇ. The file name exceeds the limit ھۆججەت نامى چەكتىن ئېشىپ كەتتى Create file error ھۆججەت خاتالىقى قۇرۇش Can not move %1 to %2: Read-only mode, can not write-in %1 نى %2 گە يۆتكىگىلى بولمىدى: پەقەت ئوقۇش ھالىتى، يازغىلى بولمىدى Can not move %1 to %2: Permission denied %1 نى %2 گە يۆتكىلىشكە بولمىدى: ئىجازەت بېرىلمىدى Cannot opening file, permission denied! ھۆججەتنى ئاچقىلى بولمىدى، ئىجازەت رەت قىلىندى! File:%1 was not found. ھۆججەت:%1 تېپىلمىدى. Invalid Operation. ئىناۋەتسىز مەشغۇلات System Disk سىستىما دىسكىسى open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error ھۆججەت ئۆچۈرۈش خاتالىقى Link file error ھۆججەت ئۇلاش خاتالىقى Burning does not support replacement كۆيۈش ئالماشتۇرۇشنى قوللىمايدۇ Burn failed 刻录失败 File delete 文件删除 Invalid Operation ئىناۋەتسىز مەشغۇلات Peony::FileOperationAfterProgressPage &More Details &تەپسىلاتلار Peony::FileOperationErrorDialog File Operation Error ھۆججەت مەشغۇلات خاتالىقى unkwon unkwon null قۇرۇق Error message: خاتالىق ئۇچۇرى: Source File: مەنبە ھۆججىتى: Dest File: Dest ھۆججىتى: Ignore پەرۋا قىلماق Ignore All ھەممىنى نەزەردىن ساقىت قىلىش Overwrite ئۈستىگە ساقلاش Overwrite All ھەممىنى ئالماشتۇرۇش Backup زاپاس ساقلاش Backup All ھەممىنى زاپاسلاش &Retry &قايتا سىناپ بېقىڭ &Cancel ئەمەلدىن قالدۇرۇش(&C) Peony::FileOperationErrorDialogBase Close ياپ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace ئالماشتۇرۇش Ignore پەرۋا قىلماق Do the same شۇنداق قىلىڭ <p>This location already contains the file '%1', Do you want to override it?</p> <p>بۇ ئورۇندا '%1' ھۆججىتىنى ئۆز ئىچىگە ئالغان، ئۇنى ئۆچۈرۈۋەتمەكچىمۇ؟</p> Unexpected error from %1 to %2 %1 دىن %2 گىچە كۈتۈلمىگەن خاتالىق كۆرۈلدى Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup زاپاس ساقلاش Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel ئەمەلدىن قالدۇرۇش Delete ئۆچۈر Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected دىسكىنىڭ تولۇق ياكى يېزىشتىن مۇداپىئەلىنىش ئەمەسلىكىنى، ھۆججەتنىڭ قوغدىلىدىغان ئەمەسلىكىنى جەزملەش Peony::FileOperationErrorDialogWarning OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Skip all ھەممىنى ئاتلاپ ئۆتۈپ كېتىش Make sure the disk is not full or write protected and that the file is not protected دىسكىنىڭ تولۇق ياكى يېزىشتىن مۇداپىئەلىنىش ئەمەسلىكىنى، ھۆججەتنىڭ قوغدىلىدىغان ئەمەسلىكىنى جەزملەش Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link سىمۋوللۇق ئۇلانما Copy كۆچۈرۈش Move يۆتكەش Rename ئىسمىنى ئۆزگەرتىش Link ئۇلانما Delete ئۆچۈر Delete Permanently مەڭگۈلۈك ئۆچۈرۈش Restore ئەسلىگە كەلتۈرۈش New يېڭى - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ئاگاھلاندۇرۇش '%1' is occupied,you cannot operate! %1 نى ئىگىلىۋالدى، تىجارەت قىلالمايسىز! No, go to settings 否,跳转到设置 OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Do you want to put selected %1 item(s) into trash? %1 تاللانغان تۈرنى ئەخلەت ساندۇقىغا تاشلىماقچىمۇ؟ Do not show again قايتا كۆرسەتمەڭ File System 文件系统 System Disk سىستىما دىسكىسى Data سانلىق مەلۇمات Insufficient storage space ساقلاش بوشلۇقى يېتەرلىك ئەمەس %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 ئۈسكۈنىدە بوشلۇق قالمىدى. ھۆججەت كۆچۈرۈش چوڭلۇقى: %2GB, بوشلۇقى زۆرۈر: %3GB. Can't delete. ئۆچۈرگىلى بولمىدى . You can't delete a file whenthe file is doing another operation ھۆججەت باشقا مەشغۇلات قىلىۋاتقاندا ھۆججەتنى ئۆچۈرەلمەيسىز File Operation is Busy ھۆججەت مەشغۇلاتى ئالدىراش There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. ئىلگىرى بىر ياكى بىرنەچچە ھۆججەت مەشغۇلاتى ئىجرا قىلىنىپ باققان. سىزنىڭ مەشغۇلاتىڭىز ئىجرا قىلىنىشنى ساقلايدۇ تاكى تاماملىنىدۇ. ئەگەر قانداقلا بولمىسۇن ھۆججەت مەشغۇلاتىنى پاراللېل ئىجرا قىلماقچى بولسىڭىز، تاللاش تىزىملىكىدىكى سۈكۈتتىكى «پاراللېل ئىجازەت بېرىش» نى ئۆزگەرتسىڭىز بولىدۇ. The long name file is saved to %1 ئۇزۇن ئىسىم ھۆججىتى %1 گە ساقلاندى Undo %1 %1 نى ئەسلىگە كەلتۈرۈش Redo %1 %1 نى قايتا ئىشلەش The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ساناق: state: شتات: Peony::FileOperationProgressPage &More Details &تەپسىلاتلار From: ئەۋەتكۈچى: To: خەت تاپشۇرۇۋالغۇچى: Peony::FileOperationProgressWizard File Manager ھۆججەت باشقۇرغۇ &Cancel ئەمەلدىن قالدۇرۇش(&C) Preparing... تەييارلىق قىلىۋاتىمىز... Handling... بىر تەرەپ قىلىش... Clearing... تازىلاۋاتىدۇ... Rollbacking... كەينىگە ياندۇرۇش... File Operation ھۆججەت مەشغۇلات A file operation is running backend... ھۆججەت مەشغۇلاتى ئارقا ئۇچ ئىجرا قىلىنىۋاتىدۇ... %1 files, %2 %1 ھۆججەت، %2 %1 done, %2 total, %3 of %4. %1 تۈگىدى، %2 جەمئىي، %3 %4. clearing: %1, %2 of %3 تازىلاش: %1, %2 %3 copying... كۆچۈرۈش... Syncing... ماس قەدەملەشتۈرۈلۈۋاتىدۇ... Peony::FilePreviewPage File Name: 文件名称: File Type: ھۆججەت تىپى: Time Access: ۋاقىت زىيارەت قىلىش: Time Modified: ئۆزگەرتىلگەن ۋاقىت: Children Count: بالىلارنىڭ سانى: Size: چوڭ-كىچىكلىكى: Location: ئورنى: Time Created: قۇرۇلغان ۋاقىت: Image resolution: سۈرەت ئېنىقلىقى: color model: رەڭ مودېلى: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>ھۆججەت ئېچىش</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>ھۆججەت مۇندەرىجىسىنى ئېچىش</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a href='#' style = 'text-decoration:none'>بوشلۇقتىن چىقىرىۋېتىش</a> Cancel ئەمەلدىن قالدۇرۇش OK ماقۇل <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>ئۆچۈرۈلگەندىن كېيىن،بوشلۇقتىكى ھۆججەتلەر توپلىنىپ يېڭىلانغاندا، بۇ ھۆججەتلەر ئەمدى كۆرۈنمەيدۇ</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>ئۆچۈرۈلگەندىن كېيىن،بوشلۇقتىكى ھۆججەتلەر توپلىنىپ يېڭىلانغاندا، بۇ ھۆججەتلەر ئەمدى كۆرۈنمەيدۇ</font> Do you want to remove this file?<br> سىز بۇ ھۆججەتنى چىقىرىۋېتەمسىز ؟ <br> Do not ask again ئەمدى سورىماڭ usershare ئىشلەتكۈچى ھەمبەھىرلەش Image size: 图片尺寸: Image format: 图片格式: %1x%2 ٪1x٪2 %1 total, %2 hidden %1 جەمئىي، %2 يۇشۇرۇن Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error ھۆججەت نامىنى ئۆزگەرتىش خاتالىقى Invalid file name %1%2%3 . ھۆججەت نامى %1%2%3 ئىناۋەتسىز . Are you sure to hidden this file? سىز چوقۇم بۇ ھۆججەتنى يوشۇرۇپ قويامسىز؟ When change the file suffix, the file may be invalid. Are you sure to change it ? ھۆججەت قوشۇمچىسى ئۆزگەرتكەندە، ھۆججەت ئىناۋەتسىز بولۇشى مۇمكىن. سىز چوقۇم ئالماشتۇرامسىز ؟ A file and a directory with the same name cannot replace each other ئوخشاش نامدىكى ھۆججەت بىلەن مۇندەرىجە بىر-بىرىنىڭ ئورنىنى ئالالمايدۇ The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning ھۆججەت ئىسمىنى ئۆزگەرتىش ئاگاھلاندۇرۇشى The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error ھۆججەت نامىنى ئۆزگەرتىش خاتالىقى Peony::FileTrashOperation File trash error ھۆججەت ئەخلەت خاتالىقى Can not trash %1: Read-only file system %1 نى ئەخلەت قىلىشقا بولمايدۇ: پەقەت ئوقۇغىلى بولىدىغان ھۆججەت سىستېمىسى trash:/// ئەخلەت:/// Trash file error ئەخلەت ساندۇقى خاتالىقى Invalid Operation! Can not trash "%1". ئىناۋەتسىز مەشغۇلات! «%1» نى ئەخلەت قىلىشقا بولمايدۇ. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. كونترول قىلغىلى بولمايدىغان توقۇنۇش مەۋجۇت. يىغىۋېلىش ساندۇقىنى تەكشۈرۈپ بېقىڭ. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error ھۆججەت ئەخلەت خاتالىقىنى بىكار قىلىش Can not find trashed file %1, might be restored or removed. %1 ئەخلەت قىلىنغان ھۆججەتنى تاپقىلى بولمىدى، ئەسلىگە كەلتۈرۈلگەن ياكى ئۆچۈرۈۋېتىلگەن بولۇشى مۇمكىن. Peony::GlobalSettings yyyy/MM/dd يىل/ئاي/كۈن HH:mm:ss AP hh:mm:ss yyyy-MM-dd يىل-ئاي-كۈن Peony::HeaderBar Spread تارقىلىش Minimize كىچىكلىتىش Close ياپ Peony::IDMActionsManager Rename Spaces بوشلۇقلارنىڭ نامىنى ئۆزگەرتىش Space Name بوشلۇق نامى Please input space name بوشلۇق نامىنى كىرگۈزۈڭ OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Rename Space بوشلۇقنى ئۆزگەرتىش Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. بوشلۇقنىڭ نامىنى ٪1 گە ٪2 قىلىپ ئۆزگەرتىش مەغلۇب بولدى، ٪2 مەۋجۇت. Edit Space Condition بوشلۇق شەرتىنى تەھرىرلەش Close dynamically دىنامىكىلىق يېپىش Open dynamically دىنامىكىلىق ئېچىش Delete Spaces بوشلۇقلارنى ئۆچۈرۈش Are you sure to delete space %1 ? ٪1 بوشلۇقنى چوقۇم ئۆچۈرەمسىز؟ Open ئېچىش Open With بىلەن ئېچىش More applications تېخىمۇ كۆپ پروگراممىلار Open The Folder Location ھۆججەت قىسقۇچ ئورنىنى ئېچىش Add File قوشۇش Choose file to add into space بوشلۇققا قوشۇش ئۈچۈن ھۆججەتنى تاللاڭ File %1 is existed in space, please not add file repeatly. ھۆججەت ٪1 بوشلۇقتا مەۋجۇت، قايتا ھۆججەت قوشماڭ. Move to space بوشلۇققا يۆتكەش Remove From Space بوشلۇقتىن چىقىرىۋېتىش <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>ئۆچۈرۈلگەندىن كېيىن،بوشلۇقتىكى ھۆججەتلەر توپلىنىپ يېڭىلانغاندا، بۇ ھۆججەتلەر ئەمدى كۆرۈنمەيدۇ</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>ئۆچۈرۈلگەندىن كېيىن،بوشلۇقتىكى ھۆججەتلەر توپلىنىپ يېڭىلانغاندا، بۇ ھۆججەتلەر ئەمدى كۆرۈنمەيدۇ</font> Do you want to remove selected %1 item(s)?<br> تاللانغان ٪1 تۈرنى چىقىرىۋېتەمسىز؟ <br> Do you want to remove this file?<br> سىز بۇ ھۆججەتنى چىقىرىۋېتەمسىز ؟ <br> Do not ask again ئەمدى سورىماڭ Copy كۆچۈرۈش Save As ساقلاش file ھۆججەت All File بارلىق ھۆججەت This location has no write permission.please change the storage location بۇ ئورۇننىڭ يېزىش ئىجازىتى يوق.ساقلاش ئورنىنى ئۆزگەرتىڭ Label بەلگە Properties خۇسۇسىيەتلەر Peony::ImageMountManager Invalid device path: %1 ئىناۋەتسىز ئۈسكۈنە يولى: %1 Cannot find loop device for path: %1 يولنىڭ دەۋرىي ئۈسكۈنىسىنى تاپقىلى بولمىدى: %1 Failed to unmount filesystem: %1 ھۆججەت سىستېمىسىنى ئاچقىلى مەغلۇب بولدى: %1 Failed to delete loop device: %1 دەۋرىي ئۈسكۈنىنى ئۆچۈرۈش مەغلۇب بولدى: %1 Peony::LabelSettings Name نامى SideBar يانبالداق Menu تىزىملىك Create New Label يېڭى بەلگە قۇرۇش Delete Label بەلگىنى ئۆچۈرۈش Display the following items in the identification area: (maximum of 6) پەرقلەندۈرۈش رايونىدا تۆۋەندىكى تۈرلەرنى كۆرسىتىش: (ئەڭ كۆپ بولغاندا 6) Rename ئىسمىنى ئۆزگەرتىش Edit Color رەڭ تەھرىرلەش Delete This Label بۇ بەلگىنى ئۆچۈرۈش Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" «%2» دىن «%1» نى ئىزدەش File System ھۆججەت سىستېمىسى Search results for all files marked in "%1" in "%2" «%2» دىكى «%1» دا بەلگە قويۇلغان بارلىق ھۆججەتلەرنىڭ ئىزدەش نەتىجىسى &Copy Directory 拷贝路径(&C) Open In New Tab يېڭى بەتكۈچتە ئېچىش Open In New Window يېڭى كۆزنەكتە ئېچىش Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory مۇندەرىجە كۆچۈرۈش Peony::MountOperation Operation Cancelled مەشغۇلات ئەمەلدىن قالدۇرۇلدى. Login failed, unknown username or password error, please re-enter! تىزىملىتىش مەغلۇپ بولدى، ئىشلەتكۈچى نامى ياكى پارولدا خاتالىق كۆرۈلمىدى، قايتا كىرگۈزۈڭ! Peony::NavigationToolBar Go Back قايت Go Forward ئالغا ئىلگىرىلەش History تارىخ Clear History تارىخنى تازىلاش Cd Up Cd دىن يۇقىرى Refresh يېڭىلاش Peony::NewFileLaunchDialog Choose new application يېڭى پروگرامما تاللاڭ Choose an Application to open this file بۇ ھۆججەتنى ئېچىش ئۈچۈن پروگرامما تاللاڭ apply now ھازىر ئىلتىماس قىلىش OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? سىز «%1%2» ھۆججىتىنى قانداق ئاچماقچى؟ Default open with: سۈكۈتتىكى ئېچىلىش ۋاقتى: Other: باشقا: Choose other application باشقا پروگراممىلارنى تاللاڭ Go to application center قوللىنىشچان مەركىزىگە يۆتكىلىش Peony::PathEdit Go To بار Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 نىشان: %1 Read and Write ئوقۇش ۋە يېزىش Readonly ئوقۇغاندىن كېيىن Group or User گۇرۇپپا ياكى ئىشلەتكۈچى (Current User) (نۆۋەتتىكى ئىشلەتكۈچى) Current User نۆۋەتتىكى ئىشلەتكۈچى Permissions modify tip ئىجازەت ئۆزگەرتىش ئەسكەرتمىسى The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? نۆۋەتتىكى ھۆججەت ياكى ھۆججەت قىسقۇچتا ACL ھوقۇقى بەلگىلەنگەن. ئىشلەتكۈچى گۇرۇپپىسىنىڭ ھوقۇقىنى ئۆزگەرتىش ACL دا بەلگىلەنگەن ئىجازەتلەرنى ئىشلەتكىلى بولمايدىغان بولۇپ قېلىشى مۇمكىن. ئىشلەتكۈچىلەر گۇرۇپپىسىنىڭ ئىجازىتىنى داۋاملىق ئۆزگەرتىشنى خالامسىز؟ Permission refinement settings ئىجازەت ئىنچىكىلەشتۈرۈش تەڭشەكلىرى The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? نۆۋەتتىكى ئابونت ئىلغار ھەمبەھىرلەشنى بەلگىلىدى. ئەگەر يەنىلا ھوقۇقنى ئۆزگەرتىشكە توغرا كەلسە، ئالدىن ھەمبەھىرلەش مەۋجۇت بولماسلىقى مۇمكىن. سىز داۋاملىق تەڭشەشنى خالامسىز ؟ Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ئىجازەت ئۇچۇرىغا ئېرىشكىلى بولمىدى. (Me) (我) Others باشقىلار Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. سىز بۇ ھۆججەتنىڭ زىيارەت قىلىش ئورنىنى ئۆزگەرتەلمەيسىز. Me User 用户 Peony::PropertiesSetDialog Confirming property settings خاسلىق تەڭشەكلىرىنى جەزىملەشتۈرىۋاتىدۇ Whether to apply to the current selected option or to selected options and subfolders and subfiles. نۆۋەتتە تاللانغان تاللانمىلارغا تەدبىقلاش كېرەكمۇ ياكى تاللانغان تاللانمىلار ۋە تارماق ھۆججەتلەرگە تەتبىقلاش كېرەكمۇ Apply the current selection نۆۋەتتىكى تاللاشنى قوللىنىش Apply the current selection as well as subfolders and subfiles نۆۋەتتىكى تاللاش ۋە تارماق ھۆججەت قىسقۇچلىرى ۋە تارماق ھۆججەتلەرنى قوللىنىش Ok ماقۇل Cancel ئەمەلدىن قالدۇرۇش Peony::PropertiesWindow Trash ئەخلەت ساندۇقى Recent يېقىندا ئشلەتكىنى Selected تاللانغان %1 Files %1 ھۆججەت usershare ئىشلەتكۈچى ھەمبەھىرلەش Data سانلىق مەلۇمات System Disk سىستىما دىسكىسى Properties خۇسۇسىيەتلەر Ok ماقۇل Cancel ئەمەلدىن قالدۇرۇش Restore ئەسلىگە كەلتۈرۈش Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. ئۆچۈرۈش جەريانىدا جەزىملەشتۈرۈش دىئالوگىنى كۆرسىتىش. Origin Path: ئەسلى نۇقتا يولى: Deletion Date: ئۆچۈرۈلگەن ۋاقىت: Size: چوڭ كىچىكلىكى: Original Location: ئەسلى ئورنى: Peony::SearchBar Input the search key of files you would like to find. سىز تاپماقچى بولغان ھۆججەتلەرنىڭ ئىزدەش كۇنۇپكىسىنى كىرگۈزۈڭ. Input search key... ئىزدەش كۇنۇپكىسى كىرگۈزۈلدى... advance search ئالدىن ئىزدەش clear record خاتىرە تازىلاش Peony::SearchBarContainer Choose File Type 选择文件类型 Search File ھۆججەت ئىزدەش Clear تازلاش all ھەممىسى file folder ھۆججەت قىسقۇچ image رەسىم video سىن text file تېكىست ھۆججىتى audio ئۈن others باشقىلار wps file WPS ھۆججىتى Peony::SharedFileLinkOperation Symbolic Link سىمۋوللۇق ئۇلانما The dest file "%1" has existed! dest ھۆججىتى «%1» مەۋجۇت بولدى! Link file error ھۆججەت ئۇلاش خاتالىقى Peony::SideBarCloudItem CloudStorage CloudStorage CloudFile CloudFile Peony::SideBarFavoriteItem Trash ئەخلەت ساندۇقى Recent يېقىندا ئشلەتكىنى Quick Access تېز زىيارەت قىلىش Quick access 快速访问 Favorite 快速访问 KmreData KmreData Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data سانلىق مەلۇمات Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties خۇسۇسىيەتلەر Delete Symbolic سىمۋوللۇق ئۆچۈرۈش Unmount ئېچىۋېتىش Eject چىقىرىش Format فورمات burndata كۆيدۈرگەن سانلىق مەلۇمات &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network تور Peony::SideBarPersonalItem Personal شەخسىي Peony::SideBarSeparatorItem (No Sub Directory) (تارماق مۇندەرىجىسى يوق) Peony::StatusBar ; %1 folders ; %1 ھۆججەت قىسقۇچلىرى ; %1 files, %2 total ; %1 ھۆججەت، جەمئىي %2 ; %1 folder ; %1 ھۆججەت قىسقۇچ ; %1 file, %2 ; %1 ھۆججەت، %2 %1 selected %1 تاللاندى Peony::SyncThread notify 温馨提示 温馨提示 Notify ئۇقتۇرۇش Peony::TagManagement General 通用 Mark بەلگە Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type تۈرگە ئايرىش تىپى File Name ھۆججەت نامى File Type ھۆججەت تىپى File Size ھۆججەت چوڭلۇقى Modified Date ئۆزگەرتىلگەن ۋاقتى Open in New window يېڭى كۆزنەكتە ئېچىش Open in new Tab يېڭى بەتكۈچتە ئېچىش Ascending ئۆرلەش تەرتىپى Descending تۆۋەنلەش Copy كۆچۈرۈش Paste چاپلا Cut كېسىش Trash ئەخلەت ساندۇقى Clean Trash ئەخلەت ساندۇقىنى تازىلاش Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore ئەسلىگە كەلتۈرۈش Options تاللاشلار Forbid Thumbnail كىچىك كۆرۈنۈشنى چەكلەش Show Hidden يۇشۇرۇن كۆرسىتىش Resident in Backend Backend دا ئولتۇرۇشلۇق Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ئەڭ ئاخىرقى كۆزنەكنى يېپىپ بولغاندىن كېيىن سىستىما يەنىلا ئىجرا قىلىنىدۇ. بۇنداق بولغاندا كېيىنكى قېتىم ئېلان قىلىش ۋاقتى قىسقارتىلىدىكەن، شۇنداقلا ئارقا كۆرۈنۈشتىكى بايلىقلارنى خورىتىدۇ. &Help ياردەم (&H) &About... توغرىسىدا(&A). Peony Qt مودەنگۈل Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. ئاپتۇرى: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> نەشر ھوقۇقى ئىگىدارلىق ھوقۇقى (C):2019-يىللىق تيەنجىن KYLIN ئۇچۇر تېخنىكا چەكلىك شىركىتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow نامەلۇم Type: تىپى: Duration: مۇددىتى: Size: چوڭ كىچىكلىكى: Loading... يۈكلىنىۋاتىدۇ... Res: Res: Mod Date: ھالەت ۋاقتى: Deleted date: ئۆچۈرۈلگەن چېسلا: Original path: ئەسلى يول: Peony::UserShareInfoManager Warning ئاگاھلاندۇرۇش Peony::VolumeManager Error خاتالىق ProgressBar starting ... باشلىنىش ... canceling ... ئەمەلدىن قالدۇرۇلىۋاتىدۇ ... sync ... ماس قەدەملىك ... continue داۋاملاشتۇرۇش pause توختاش close ياپ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View سىنبەلگىنى كۆرۈش Show the folder children as icons. ھۆججەت قىسقۇچتىكى بالىلارنى سىنبەلگە شەكلىدە كۆرسىتىش. List View تىزىملىك كۆرۈنۈشى Show the folder children as rows in a list. ھۆججەت قىسقۇچتىكى بالىلارنى تىزىملىكتىكى قۇر شەكلىدە كۆرسىتىش. Basic Preview Page 基本 Basic ئاساسىي Show the basic file properties, and allow you to modify the access and name. ئاساسىي ھۆججەت خۇسۇسىيىتىنى كۆرسىتىش ۋە زىيارەت قىلىش ۋە ئىسمىنى ئۆزگەرتىشىڭىزگە رۇخسەت قىلىڭ. Permissions Page 权限 Permissions ھوقۇق چەكلىمىسى Show and modify file's permission, owner and group. ھۆججەت ھوقۇقى، ئىگىسى ۋە گۇرۇپپىسىنى كۆرسىتىش ۋە ئۆزگەرتىش. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? ھۆججەت بەك چوڭ ئىكەن، يىغىۋېلىش ساندۇقىغا يۆتكەشكە بولمايدۇ. سىز ئۇنى مەڭگۈلۈك ئۆچۈرەمسىز؟ These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? بۇ ھۆججەتلەر بەك چوڭ ئىكەن، يىغىۋېلىش ساندۇقىغا يۆتكەشكە بولمايدۇ. سىز بۇ %1 ھۆججەتلىرىنى مەڭگۈلۈك ئۆچۈرۈۋەتمەكچىمۇ؟ Delete ئۆچۈر Clean the Trash ئەخلەت ساندۇقىنى تازىلاش OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. سىز يىغىۋېلىش ساندۇقىنى قۇرۇقۇپ، ھۆججەتلەرنى مەڭگۈلۈك ئۆچۈرەمسىز؟ باشلانغاندىن كېيىن، ئۇلارنى ئەسلىگە كەلتۈرۈشكە ئامالسىز قالدى. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties كومپيۇتېر خاسلىقلىرى Show the computer properties or items in computer. كومپيۇتېردىكى كومپيۇتېر خۇسۇسىيەتلىرى ياكى ئەزالىرىنى كۆرسىتىش. Trash and Recent Properties Page 最近/回收 Trash and Recent ئەخلەت ساندۇقى ۋە يېقىندا Show the file properties or items in trash or recent. ھۆججەت خاسلىقى ياكى ئەزالىرىنى ئەخلەت ساندۇقىدا ياكى يېقىنقى مەزمۇنلاردا كۆرسىتىش. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed فورماتى مەغلۇپ بولدى YES ھەئە Formatting successful! But failed to set the device name. فورماتلاش مۇۋەپپەقىيەتلىك بولدى! لېكىن ئۈسكۈنە نامىنى بەلگىلەش مەغلۇب بولدى. qmesg_notify ئۇقتۇرۇش Format فورمات Begin Format باشلىنىش فورماتى Close ياپ Format operation has been finished successfully. فورمات مەشغۇلاتى ئوڭۇشلۇق تاماملاندى. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! كەچۈرۈڭ، فورمات مەشغۇلاتى مەغلۇپ بولدى! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇ ھەجىمدىكى بارلىق سانلىق مەلۇماتلارنى فورماتلاش ئارقىلىق ئۆچۈرۈلىدۇ. فورماتتىن بۇرۇن ساقلانغان بارلىق سانلىق مەلۇماتلارنى زاپاسلاپ قويۇڭ. سىزنىڭ داۋاملاشتۇرغۇڭىز بارمۇ ؟ format فورمات begin format 开始 close 关闭 File Manager ھۆججەت باشقۇرغۇ Notify ئۇقتۇرۇش notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed مەجبۇرىي ئېچىش مەغلۇپ بولدى Error: %1 خاتالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! سانلىق مەلۇمات ماس قەدەملىك تاماملاندى،ئۈسكۈنە ئوڭۇشلۇق ئېچىۋېتىلدى! Unmount failed چۈشۈرۈشتىن مەغلۇپ بولدى Not authorized to perform operation. مەشغۇلات قىلىشقا ھوقۇق بېرىلمىگەن. Unable to unmount it, you may need to close some programs, such as: GParted etc. ئۇنى ئۆچۈرگىلى بولمىغاچقا، بەزى پروگراممىلارنى تاقاشقا توغرا كېلىدۇ، مەسىلەن: GParted قاتارلىقلار. Error: %1 Do you want to unmount forcely? خاتالىق: %1 زورلۇق بىلەن چۈشۈرمەكچىمۇ؟ Cancel ئەمەلدىن قالدۇرۇش Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase ئۈسكۈنىنى قوزغىتىش مەغلۇب بولدى: خاتا مەخپىي سۆز The device has been mount successfully! ئۈسكۈنە مۇۋەپپەقىيەتلىك قاچىلاندى! Eject device failed, the reason may be that the device has been removed, etc. چىقىرىش ئۈسكۈنىسى كاشىلا كۆرۈلدى، سەۋەبى ئۈسكۈنىنىڭ ئېلىۋېتىلگەنلىكى بولۇشى مۇمكىن. Data synchronization is complete and the device can be safely unplugged! سانلىق مەلۇمات ماس قەدەملىك تاماملاندى، ئۈسكۈنىنى بىخەتەر ئۈزۈۋەتكىلى بولىدۇ! Password is empty, please re-enter! مەخپىي نومۇر قۇرۇق، قايتا كىرگۈزۈڭ! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed چىقىرىش مەغلۇپ بولدى favorite ياخشى كۆرىدىغان Favorites ياخشى كۆرگۈچىلەر File is not existed. ھۆججەت مەۋجۇت ئەمەس. Share Data سانلىق مەلۇماتلاردىن ھەمبەھرلەش Trash ئەخلەت ساندۇقى Recent يېقىندا ئشلەتكىنى Operation not supported مەشغۇلات قوللىمىدى The virtual file system does not support folder creation مەۋھۇم ھۆججەت سىستېمىسى ھۆججەت قىسقۇچ قۇرۇشنى قوللىمايدۇ Can not create a symbolic file for vfs location vfs ئورنى ئۈچۈن بەلگە ھۆججىتى قۇرغىلى بولمىدى Symbolic Link سىمۋوللۇق ئۇلانما Can not create symbolic file here, %1 بۇ يەردە بەلگە ھۆججىتى قۇرغىلى بولمىدى، %1 Can not add a file to favorite directory. ياخشى كۆرىدىغان مۇندەرىجەگە ھۆججەت قوشقىلى بولمايدۇ. The virtual file system cannot be opened مەۋھۇم ھۆججەت سىستېمىسىنى ئاچقىلى بولمىدى Virtual file directories do not support move and copy operations مەۋھۇم ھۆججەت مۇندەرىجىسى كۆچۈرۈش ۋە كۆچۈرۈش مەشغۇلاتىنى قوللىمايدۇ Default favorite vfs of peony مودەنگۈلنىڭ كۆڭۈلدىكى ئەڭ ياخشى كۆرىدىغان vfs Details تەپسىلاتى Mark بەلگە mark this file. بۇ ھۆججەتكە بەلگە سېلىڭ. Open With بىلەن ئېچىش open with. ئېچىش بىلەن . It need to synchronize before operating the device,place wait! ئۈسكۈنىنى مەشغۇلات قىلىشتىن بۇرۇن ماس قەدەملىك بولۇشى كېرەك، ساقلاپ تۇرۇڭ! Unable to discover the file, it may have been removed or deleted. ھۆججەتنى بايقىيالمىسىڭىز، ئۆچۈرۈۋېتىلگەن ياكى ئۆچۈرۈلگەن بولۇشى مۇمكىن. permission denied ئىجازەت رەت قىلىندى file not found 没有发现该文件 duplicate تەكرارلاش Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data سانلىق مەلۇمات System Disk سىستىما دىسكىسى label بەلگە Computer ھېسابلىغۇچ File System 文件系统 Data سانلىق مەلۇمات Failed to open file "%1": insufficient permissions. «%1» ھۆججىتىنى ئېچىش مەغلۇب بولدى: ئىجازەت يېتەرلىك ئەمەس. File “%1” does not exist. Please check whether the file has been deleted. ھۆججەت "%1" مەۋجۇت ئەمەس. ھۆججەتنىڭ ئۆچۈرۈلگەن-ئۆچۈرۈلمىگەنلىكىنى تەكشۈرۈپ بېقىڭ. burn operation has been cancelled كۆيۈش مەشغۇلاتى ئەمەلدىن قالدۇرۇلدى. is busy! ناھايىتى ئالدىراش! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. سىز راستتىنلا بۇ ھۆججەتنى مەڭگۈلۈك ئۆچۈرمەكچىمۇ؟ ئۆچۈرۈش باشلانغان ھامان، ھۆججەتنى ئەسلىگە كەلتۈرگىلى بولمايدۇ. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. سىز راستتىنلا بۇ %1 ھۆججەتلىرىنى مەڭگۈلۈك ئۆچۈرمەكچىمۇ؟ ئۆچۈرۈش باشلانغاندىن كېيىن، بۇ ھۆججەتلەرنى ئەسلىگە كەلتۈرگىلى بولمايدۇ. Virtual file directories do not support move operations مەۋھۇم ھۆججەت مۇندەرىجىسى يۆتكەش مەشغۇلاتىنى قوللىمايدۇ test simplify vfs plugin VFS قىستۇرمىنى ئاددىيلاشتۇرۇشنى سىناق قىلىش Default custom vfs info of peony مودەنگۈلنىڭ سۈكۈتتىكى ئىختىيارى vfs ئۇچۇرى Default local vfs info of peony مودەنگۈلنىڭ سۈكۈتتىكى يەرلىك vfs ئۇچۇرى Show properties plugin window. خاسلىق قىستۇرما كۆزنىكىنى كۆرسىتىش. Intelligent Space ئەقلىي ئىقتىدارلىق بوشلۇق File %1 is existed in space, please not add file repeatly. ھۆججەت ٪1 بوشلۇقتا مەۋجۇت، قايتا ھۆججەت قوشماڭ. SpaceSaveDialog Save as space بوشلۇق قىلىپ ساقلاش Space Name بوشلۇق نامى Please input space name بوشلۇق نامىنى كىرگۈزۈڭ Dynamically Update Space Files بوشلۇق ھۆججىتىنى دىنامىكىلىق يېڭىلاش پروگراممىسى Cancel ئەمەلدىن قالدۇرۇش Ok ماقۇل Failed to create space %1,%1 is existed بوشلۇق قۇرۇش مەغلۇب بولدى ٪1,٪1 مەۋجۇت UdfBurn::UdfAppendBurnDataDialog AppendBurnData AppendBurnData Disc Type: دىسكا تىپى: Device Name: ئۈسكۈنە ئىسمى: OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Unknown نامەلۇم Warning ئاگاھلاندۇرۇش No burn data, please add! كۆيۈش سانلىق مەلۇماتى يوق، قوشۇڭ! The disc name cannot be set to empty, please re-enter it! دىسكا نامىنى بوش قىلىپ تەڭشەشكە بولمايدۇ، قايتا كىرگۈزۈڭ! AppendBurnData operation has been finished successfully. AppendBurnData مەشغۇلاتى ئوڭۇشلۇق تاماملاندى. Sorry, the appendBurnData operation is failed! كەچۈرۈڭ، appendBurnData مەشغۇلاتى مەغلۇپ بولدى! Failed مەغلۇپ بولدى Burning. Do not close this window كۆيۈپ كېتىۋاتىدۇ. بۇ كۆزنەكنى يېپىۋەتمەڭ Burning this disc will append datas on it. Do you want to continue ? بۇ دىسكىنى كۆيدۈرگەندە ئۇنىڭغا سانلىق مەلۇمات قوشۇپ قويۇلىدۇ . سىزنىڭ داۋاملاشتۇرغۇڭىز بارمۇ ؟ Burn كۆيدۈرۈش Begin Burning كۆيدۈرۈشنى باشلاش Close ياپ UdfBurn::UdfFormatDialog Format فورمات Disc Type: دىسكا تىپى: Device Name: ئۈسكۈنە ئىسمى: OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Unknown نامەلۇم Warning ئاگاھلاندۇرۇش The disc name cannot be set to empty, please re-enter it! دىسكا نامىنى بوش قىلىپ تەڭشەشكە بولمايدۇ، قايتا كىرگۈزۈڭ! Format operation has been finished successfully. فورمات مەشغۇلاتى ئوڭۇشلۇق تاماملاندى. Sorry, the format operation is failed! كەچۈرۈڭ، فورمات مەشغۇلاتى مەغلۇپ بولدى! Failed مەغلۇپ بولدى Formatting. Do not close this window فورمات. بۇ كۆزنەكنى يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇ دىسكىنى فورماتلىغاندا ئۇنىڭدىكى بارلىق سانلىق مەلۇماتلار ئۆچۈرۈلىدۇ. فورماتتىن بۇرۇن ساقلانغان بارلىق سانلىق مەلۇماتلارنى زاپاسلاپ قويۇڭ. سىزنىڭ داۋاملاشتۇرغۇڭىز بارمۇ ؟ Begin Format باشلىنىش فورماتى Close ياپ UdfFormatDialog Format فورمات Disc Type: دىسكا تىپى: Device Name: ئۈسكۈنە ئىسمى: OK ماقۇل Cancel ئەمەلدىن قالدۇرۇش Unknown نامەلۇم Warning ئاگاھلاندۇرۇش The disc name cannot be set to empty, please re-enter it! دىسكا نامىنى بوش قىلىپ تەڭشەشكە بولمايدۇ، قايتا كىرگۈزۈڭ! Format operation has been finished successfully. فورمات مەشغۇلاتى ئوڭۇشلۇق تاماملاندى. Sorry, the format operation is failed! كەچۈرۈڭ، فورمات مەشغۇلاتى مەغلۇپ بولدى! Failed مەغلۇپ بولدى Formatting. Do not close this window فورمات. بۇ كۆزنەكنى يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇ دىسكىنى فورماتلىغاندا ئۇنىڭدىكى بارلىق سانلىق مەلۇماتلار ئۆچۈرۈلىدۇ. فورماتتىن بۇرۇن ساقلانغان بارلىق سانلىق مەلۇماتلارنى زاپاسلاپ قويۇڭ. سىزنىڭ داۋاملاشتۇرغۇڭىز بارمۇ ؟ Begin Format باشلىنىش فورماتى Close ياپ progressBarHelper Time is being calculated 正在计算时间 Calculating time ۋاقىت ھېسابلاش %1day%2hrs%3mins%4sec ٪1day٪2hrs٪3mins٪4sec %1hrs%2mins%3sec ٪1hrs٪2mins٪3sec %1 mins%2sec %1 مىنۇت%2سېكۇنت %1sec %1سېكۇنت peony/translations/libpeony-qt/libpeony-qt_kk_KZ.ts0000664000175000017500000113375315154271106021541 0ustar fengfeng ColorPushButton label management ... بەلگى باسقارۋ ... Label Management ... Remove "%1" %1 نى شىعارىپ جىبەرىپتى delete "%1" 删除“%1” add "%1" %1 نى قوسادى ConnectServerDialog Connect to Sever قىزىمەت وتەۋىمىزگە جالعانۋ Domain تور مى Password قۇپيا نۇمىردى وزگەرتۋ Save Password قۇپيا نۇمىردى ساقتاۋ User پايدالانۋشٸ Anonymous اتسىز Ok ماقۇل Cancel كۇشىنەن قالدىرۋ DiscControl is busy! وتە قاربالاس! is busy! وتە قاربالاس! not support udf at present. قازىرشا udf نى قولدامايدى. unmount disc failed before udf format. udf اۋەلگى قالپنا قايتارۋ بۇرٸن دەسكانى ٴوشىرۋ جەڭىلىپ قالدى. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf ٴپىشىنى جەڭىلىپ قالدى preparation failed before DVD-RW udf format. DVD-RW udf اۋەلگى قالپنا قايتارۋ بۇرٸنعٸ دايٸندٸق جەڭىلىپ قالدى. FileLabelModel Red قىزىل Orange قىزعىش سارى رەڭ Yellow سارى رەڭ Green جاسىل Blue كوك Purple كۇلگىن رەڭ Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error قاتە Label or color is duplicated. بەلگى ياكي رەڭ تاكرارلاندى. FileOperationHelper Burn failed ويۋ جەڭىلىپ قالدى Format_Dialog Dialog ۋاقىت وزگەرتۋ rom_size rom_ولشەمى system سەستيما vfat/fat32 vfat/fat32 exfat exfat حۇجات ٴبولٸس كەستەسٸ ntfs حۇجات سەستيماسى vfat VFAT ext4 ext4 حۇجات سەستيماسى device_name اسباب-مى clean it total بۇتٸندەپ تازالاۋ ok تۇراقتاندىرۋ close تاقاۋ TextLabel تەكىسىت بەلگىسى qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format ٴپىشىنى Rom size: قىسىمى: Filesystem: حۇجات سەستيماسى: Disk name: ديسكا ديسكا اتٸ: Completely erase(Time is longer, please confirm!) بۇتٸندەپ ٴوشىرۋ (ۇزىن ۋاقىت كەتەدى، انىقتاڭىز!) Set password قۇپيا نومەر بەكٸتۋ Set password for volume based on LUKS (only ext4) LUKS عا نەگىزىنەن تومنىڭ قۇپيا نۇمىردى بەلگٸلەۋ (تەك ext 4 تەك شەكتەلىنەدى) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ext 4 حۇجات سەستاماسىعا فورماتتاۋ باسقا ٸستەتۋشٸلەردٸڭ USB قوزعالتۋ اسبابىن وقي المىعاندىعى ياكي يازالماسلىقىنى كەتىرىپ شٸعۋٸ مۇمكان Cancel كۇشىنەن قالدىرۋ OK انىقتاۋ Data ساندىق مالىمەت Error locking device: Failed to deactivate device: Device or resource busy Warning ەسكەرتۋ Device name cannot start with a decimal point, Please re-enter! اسبابٸتٸڭ مى، وندٸق قالدىق نۇكتەدەن باستالماستىعى كەرەك قاتە كىرگىزىڭىز! Enter Password: قۇپيا نۇمىردى كىرگىزىڭىز: Password too short, please retype a password more than 6 characters قۇپيا نومەر وتە قىسقا، 6 ٴارىپتەن اساتٸن قۇپيا نومەرنى قاتە كىرگىزىڭىز %1/sec, %2 remaining. %1 سەكونت، ٸشٸپ قالعان %2. over one day بٸر كۇننەن ٸشٸپ كەتتى getting progress... ىلگەرلەۋ قولعا كەلتىرۋدە... Error قاتە Block not existed! رايون بولگٸ ساقتالعان ەمەس! Formatting. Do not close this window فورماتتاۋ. نۇ تەرەزەسى تاقىۋەتمەڭ KyFileDialogRename Renaming "%1" قاتە دىمقىل بەرٸلدٸ %1 Renaming failed, the reason is: %1 قاتە دىمقىل بەرۋ جەڭىلىپ قالدى، وبالى:%1 Filename too long حۇجات اتٸ وتە ۇزىن Copying "%1" %1 نۇسقالانىپ جاتىر To "%1" %1 عادەيىن Copying failed, the reason is: %1 نۇسقالاۋ جەڭىلىپ قالدى، وبالى:%1 Moving "%1" جوتكەلىپ جاتىر %1 Moving failed, the reason is: %1 جوتكەۋ جەڭىلىپ قالدى، وبالى:%1 File operation error: حۇجات باسقارۋىنداعى قاتەلىك: The reason is: %1 وبالى:%1 Truncation كەسۋ Save ساقتاۋ All applications بارلٸق قوللىنىشچانلىق Cancel كۇشىنەن قالدىرۋ Apply جابلماس ەتۋ Bytes سوز بۋٸنٸ Front truncation الدى بولەك كەسلگەن. Post truncation كېسىۋەتكەندىن كەيىن. Description: Skip copying files of the current type تۇسىندىرۋ:كەزەكتەگى تيٸپتەگٸ حۇجاتتى كوشرۋدەن اتالىپ ٴوتۋ truncate interval كەسپە ارالٸق . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Explanation: When renaming a file name, ensure it is within %1 bytes and Explanation: Truncate the portion of the file name that exceeds 225 bytes and select ەسكەرتپەۋ:حۇجات اتىنداعى 225 بايتتىن ٸشٸپ كەتكەن قىسىمدى كەسىپ تاستاۋ، سونان تالداپ Description: By default, save to "%1/扩展". تۇسىندىرۋ:كوڭىلدەگى احۋالدا، %1/دەيىن ساقتاۋ كەرەك. modify the name اتاعىن وزگەرتۋ Explanation: When renaming a file name, ensure it is within 255 bytes and تۇسىندىرۋ:حۇجات اتاعىن قاتە اتاعاندا، ونىڭ 255 بايت ٸشٸندە بولۋٸنا كەپىلدىك ىستەڭ، ونىڭ ٷستٸنەن Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip ئاتلاندۇق Skip All 全部跳过 Rename قاتە ات فاميليا ەتۋ Please enter a new name 请输入文件名 OK انىقتاۋ MainProgressBar File operation حۇجات جوبالاۋى starting ... باستالىپ جاتىر ... cancel all file operations بارلٸق حۇجات جوبالاۋدى كۇشىنەن قالدىرۋ Minimize كىشرەيتۋ Close تىعنداۋ Are you sure to cancel all file operations? ٴسىز بارلٸق حۇجات جوبالاۋدى كۇشىنەن قالدىرۋدى جەزملەشتۈرەلەمٴسىز؟ Are you sure want to cancel all file operations راسىندا بارلٸق حۇجات جوبالاۋدى كۇشىنەن قالدۇرماقچىمۇ؟ OK انىقتاۋ File Operation حۇجات جوبالاۋى Cancel كۇشىنەن قالدىرۋ Calculating time continue جالعاستىرۋ pause ۋاقىتىنشا توقتاتۋ canceling ... نازاردان ساقتانۋ ورىندالىپ جاتىر... sync ... بۇرشاق قاداملاتپايدى ... %1Mb/s Est. time left: %2 MessageDialog Peony حۇجات باسقارۋشٸسٸ Forcibly pulling out the device may cause data loss or device exceptions! اسبابٸن ماجبۇر تارتىپ جاريالاۋ ساندىق مالىمەتتەردى كەتىرىپ جاريالاۋى مۇمكان جوعالىپ كەتۋ ياكي جابدىقتار بينورمال بولۋ! OtherButton Other queue باسقا ئۆچرەتلەر Other Queue Peony::AdvanceSearchBar Key Words شەشۋشى كەزەڭ سوز input key words... شەشۋشى كەزەڭ سوز كىرگىزۋ... Search Location ٸزدەۋ ورنى choose search path... ٸزدەۋ جولىن تالدا... browse كورۋ File Type حۇجات تۇرى Choose File Type حۇجات تيبىن تالدا Modify Time تۇزەتۋ ۋاقىتى Choose Modify Time تۇزەتۋ ۋاقىتىن تالدا File Size حۇجات ۇلكەندىگى Choose file size حۇجات ۇلكەندىگىن تالدا show hidden file جاسىرىن حۇجاتتى كورسەتۋ go back قايتۋ hidden advance search page جاسىرىن جوعارى دارەجەلىك ٸزدەۋ كۇيى file name حۇجات مى content مازمۇن search ٸزدەۋ start search ىزدەۋدى باستاۋ Select path جولىن تالداۋ Operate Tips جوبالاۋ ەسكەرتپەسٸ Have no key words or search location! شەشۋشٸ سوز ياكي ٸزدەۋ ورنى جوق! Search file name or content at least choose one! حۇجات اتٸ ياكي مازمۇندى ٸزدەۋ ٷشٸن از دەگەندە بٸرٸن تالدا! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... ٸزدەۋ مازمۇنى... Search File Peony::AdvancedPermissionsPage Permission refinement settings ۇقىق كولەمىن ئىنچىكىلەشتۈرۈپ ورنالاسترعان ەتۋ. Permission refinement settings tip ۇقىق كولەمىن ئىنچىكىلەشتۈرۈپ ورنالاسترعان ەتۋ ەسكەرتپەسٸ Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ۇقىق كولەمى ورنالاسترعان ەتۋ نەگٸزگٸ ۇقىق كولەمى بولعان ابونتتار گرۋپپاسىنىڭ ۇقىق كولەمىنىڭ وزگەرستٸ كەتىرىپ شٸعارادٸ. ACL ۇقىقىنى جالعاستى ورنالاسترعان ەتۋ كەرەكپە؟ User پايدالانۋشٸ Read وقۋ Write جازۋ Executable اتقار قىلعالى بولاتٸن حۇجات delete حابار Inherit permission مىيراسقور ەتۋ ۇقىق كولەمى Add قوسۋ Apply جابلماس ەتۋ Cancel كۇشىنەن قالدىرۋ Peony::AllFileLaunchDialog Choose new application جاڭا قولدانعىش پروگراممانى تالدا Choose an Application to open this file بٸر ئەپنى تالداپ نۇ حۇجاتتى ٴٸشڭٸز apply now دەرەۋ جابلماس ىستەڭ OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon ەرەكشە بەلگٸنٸ تالداۋ Type: تۇرى: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name ات-فاميليا Location ورنى move 移动 symbolLink بەلگى جالعاۋٸ Folder حۇجات قىسقىش Include: ٶز ىشىنە الادٸ: Move Open with: ٸشٸۋ ٴتاسٸلٸ: Description: بەينەلەۋ﹣: Select multiple files كوپ حۇجاتتى تالدا Size: ۇلكەن - كشىلگى: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: بوستٸقتان پايدالانۋ احاۋل: Time Create: ورناتىلعان ۋاقىتى: Time Modified: تۇزەتۋ كىرگىزۋ ۋاقىتى: Time Access: ۋاقىت ساپارىن: Readonly تەك قانا وقۋعا بولادٸ Hidden جاسىرىن Readonly (just applied by subfiles) Property: قاسيەتى: usershare مىناۋ جابدىقدان ھەمبەھىرلىنىش %1 (%2 Bytes) %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. 1 MB دان كشكەنە راسىمىن تالدا. Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 بايت %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 حۇجات، %2 حۇجات قىسقىش Can't get remote file information الىس جولدىق حۇجات حابارعا يە بولعالٸ بولمايدى. %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU مى: CPU Core: CPU يادىروسى: Memory Size: ٸشكٸ ساقتاعىشتىڭ ۇلكەن كشىلگى: User Name: پايدالانۋشٸ اتٸ: Desktop: ۇستەل بەتى: You should mount this volume first ٴسىز الدٸمەن نۇ ورامدى تۇسىرۋىڭىز كەرەك. Name: مى: File System حۇجات سەستيماسى Data ساندىق مالىمەت System Disk Total Space: جالپى بوستٸق: Used Space: ٸستەتكەن بوستٸق: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: ٸستەتكەلٸ بولاتٸن بوستٸق: Type: تيپى: Kylin Burner Kylin كۆيدۈرگۈچى Open with: ٸشٸۋ ٴتاسٸلٸ: Unknown كۋالىك Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server قىزىمەت وتەۋىمىزگە جالعانۋ Ip Ip Port پورت Type تۇرى Personal Collection server: جەكە جيىپ ساقتاۋ قىزىمەت وتەۋ تۇرلەرى: Add قوسۋ Delete ٴوشىرۋ Connect جالعانۋ Ip input error, please re-enter! Ip قاتە كىرىپ قاپتۇ، قاتە كىرگىزىڭىز! Port input error, please re-enter! اۋىزدى قاتە كىرگىزۋ، قاتە كىرگىزىڭىز! add 添加 delete 连接 删除 connect 连接 Warning ەسكەرتۋ ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user ئابوننتلارغا كىرۋ Please enter the %1's user name and password of the server. قىزىمەت وتەۋشى جابدىقتىڭ %1 ابونت مى ۋا قۇپيا نۇمىردى كىرگىزىڭىز. User's identity ئابۇنىچىلار كىمدىگى Guest مەيمان (اتسىز تٸزٸمدەۇ) Name ات-فاميليا Password قۇپيا نۇمىردى وزگەرتۋ domain Cancel كۇشىنەن قالدىرۋ OK انىقتاۋ guest 游客(匿名登录) Registered users تىزىمگە الدٸرعان ابونت name 用户名 password 密码 Remember the password قۇپيا نۇمىردى ەستە ۇستاۋ cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop ۇستەل بەتىنە جالعانۋ قۇرۋ Create Link to... قۇرۋ جالعاۋٸ. . . Choose a Directory to Create Link جالعانۋ ورناتپاقشى بولعان باسمازمۇندى تالدا Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop ۇستەل بەتىنە جالعانۋ قۇرۋ Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile جاڭا ورناتىلعان حۇجات Create file حۇجات قۇرۋ NewFolder جاڭا قاتتاعىش Create file error حۇجات قاتەلىگى تاقپٸرلاۋ ەتۋ Peony::CustomErrorHandler Is Error Handled? قاتە بٸر جاق ورىندالىپ بولدىما؟ Error not be handled correctly قاتە بٸر جاق ەتۋ دۇرٸس ەمەس Peony::DefaultAcitonWidget No default app كوڭىلدەگى جيۋ جوق Peony::DefaultOpenWithWidget No default app كوڭىلدەگى جيۋ جوق Peony::DefaultPreviewPage Select the file you want to preview... الدىن كورمەكشى بولعان حۇجاتتى تالدا... Select the file you want to preview Can not preview this file Can not preview this file. نۇ حۇجاتتى الدىن كورگەلى بولمايدى. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview كوڭىلدەگى الدىن كورۋ This is the Default Preview of peony-qt نۇ مۇدەن qt نىڭ كوڭىلدەگى الدىن كورۋ Peony::DetailsPropertiesPage Name: دىمقىل: File type: حۇجات تيپى: Location: ورنى: yyyy-MM-dd, HH:mm:ss yyyy-MM-dd, HH:mm:ss Create time: ۋاقىت قۇرۋ: Modify time: ۋاقىتتى وزگەرتۋ: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: حۇجات ۇلكەندىگى Width: كەڭدىگى: Height: بيٸكتٸگٸ: Owner يەسى Owner: يەسى: Computer كومپيۋتەر Computer: كومپيۋتەر: %1 (this computer) %1 (نۇ كومپيۋتەر) Unknown كۋالىك Can't get remote file information الىس جولدىق حۇجات حابارعا يە بولعالٸ بولمايدى. %1 px %1 سۋرەت ەلەمەنتى Peony::DirectoryView::IconView Icon View 图标视图 warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋدى قولدامايدى. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋدى قولدامايدى. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark جاپسىرماعا قوسىپ قويىڭىز &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭا حۇجات قىسقىش Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name ات-فاميليا File Type حۇجات تۇرى File Size حۇجات ۇلكەندىگى New... 新建... Open in New Window جاڭا تەرەزەدە ٸشٸۋ Open in New Tab جاڭا بەلگٸنٸ ٴٸشڭٸز Open ٸشٸۋ Open failed Open directory failed, you have no permission! Open with... ٸشٸۋ ٴتاسٸلٸ... More applications... الٸدە كوپ ئەپلەر.... Open %1 selected files %1 لىك راسىمىن ٸشٸۋ New جاڭا Empty File قۇرعاق حۇجات Folder حۇجات قىسقىش View Type كورىنۋ تيپى Sort By تارتٸپكە تىزۋ نەگىزىنەن Modified Date وزگەرتىلگەن ۋاقىتى Original Path وڭ جول Mount Sort Order... 排序顺序... Ascending Order ورلەۋ جاعٸ Peony-Qt Filesafe Menu Extension مۇدەن qt حۇجات حاۋىپسىزدىك تٸزٸمدٸگٸ كەڭەيتىلمىسى MultiSelect كوپتى تالداۋ Descending Order تومەندەۋ جاعٸ Sort Preferences... 排序偏好... Folder First حۇجات قىسقىش الدى مەنەن Chinese First حانزۋ تىلىن الداعٸ ورٸنعا قويۋ Show Hidden جاسىرىن تۇرلەردى كورسەتەدى Copy كوشىرۋ File:"%1" is not exist, did you moved or deleted it? حۇجات:%1 ساقتالعان ەمەس، ونى يۆتكىۋەتتىڭىزمۇ ياكي ئۆچۈرۋەتتىڭىزمۇ؟ Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension مودەن حۇجات بەلگىسى تٸزٸمدٸگٸ كەڭەيتىلمىسى &Copy 复制(&C) Cut كەسۋ Delete to trash قوقسىق تۇڭىغا تاستالۋ Paste شاپتاۋ Refresh جاڭالاۋ Select All ٴبارىن تالدا Properties سۋرەت قاسيەتى format فورماتتاۋ Restore قالپىنا كەلتىرىلگەن Delete ٴوشىرۋ Time Modified Path Sort Order تارتٸپكە تىزۋ جاعٸ Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences رەتلەشنىڭ باس تالدانباسٸ Cancel Error قاتە File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever ماڭگىلىك ٴوشىرۋ Rename قاتە ات فاميليا ەتۋ Select &All 全选(&A) Reverse Select كەرٸ باعىتتالۋ تالداۋ P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash & قوقسىق ساندىقتى تازالاۋ Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All ٴبارىن تازالاۋ Open Parent Folder in New Window جاڭا تەرەزەدە اتا حۇجات قىسقىشىنى ٸشٸۋ Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager ۇزاتىلعان رولٸ باسقارۋ جاعٸ Available extensions ٸستەتكەلٸ بولاتٸن كەڭەيتۋ Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Peony::FMWindow File Manager حۇجات باسقارۋشى advanced search جوعارعى دارەجەلىك ٸزدەۋ clear record ەستەلىكتى تازالاۋ Loaing... Press Esc to stop a loading. قارىز بەرۋ... Esc كىنوپكاسىن باسٸپ ۇلگىنى توقتات. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. اۆتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2019-يىلىدىن 2020-يىلىغىچە، تيەنجىن KYLIN حابار تەحىنيكا شەكتى سەرىكتى، شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo ٸشٸۋ Redo قاتە-قاتە Peony Qt Peony Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder جاڭا حۇجات قىسقىش Peony::FileBatchRenameOperation File Rename error قاجەتكە قاتە ات قويۋ قاتەلىگى Invalid file name %1%2%3 . كۇشكە يە ەمەس حۇجات مى %1 %2 %3. File Rename warning قاجەتكە قاتە دىمقىل بەرۋ ەسكەرتۋٸ Are you sure to hidden these files? ٴسىز نۇ حۇجاتتاردى جاسىرۋدى جەزملەشتۈرەلەمٴسىز؟ Rename file error قاجەتكە قاتە ات قويۋ قاتەلىگى Peony::FileCopy Error in source or destination file path! قاينار ياكي حۇجاتتاعى نىسانا حۇجات جولى قاتە! Error when copy file: %1, can not copy special files, skip this file and continue? حۇجات كوشىرگەندە قاتەلىك كورىلۋ:%1، ەرەكشە حۇجاتنى كوبەيتكىشىن بولمادى، نۇ حۇجاتتىن اتالىپ وتٸپ جالعاستىراسىز با؟ Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 كوبەيتكىشىن بولمايدى، حۇجات ساقتالعان ەمەس. حۇجاتكە قاتە دىمقىل بېرىلدىمۇ ياكي جوتكەلدىمە؟ The dest file "%1" has existed! حۇجاتتاعى نىسانا حۇجاتتىڭ %1 ى ساقتالعان! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT 32 حۇجات سەستيماسى 4 GB دان ارتىق بوستقتٸ يەلەيتىن جەكە حۇجاتنى قولدامايدى! Error writing to file: Input/output error حۇجات جازعاندا قاتەلىك:كىرگىزۋ/جاريالاۋ قاتەلىكى Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 نى ورناتقالى بولمايدى. ونىڭ جۇلدىز باس مازمۇنىندا ياكي ئەمەسلىكىگە كەپىلدىك ىستەڭ، ياكي اسباب gphoto 2 كەلىسىمىن دۇرٸس قولدايما جوق. Failed to create %1. %1 نى ورناتقالى بولمايدى. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! اسبابٸتٸڭ الىپ ەتىلگەن ياكي ئېلىۋېتىلمىگەنلىكىنى تەكسەرٸپ كور! Write file error: There is no available disk space for device! حۇجات جازۋ قاتەلىگى:اسبابدا ٸستەتكەلٸ بولاتٸن ماگنيتىق ديسكا ديسكا بوستٸعٸ جوق! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure حۇجاتتى ٸشٸۋ جەڭىلىپ قالدى Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel جوبالاۋ كۇشىنەن قالدىرىلدى Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 حۇجات قىسقىش قۇرۋ %1 جەڭىلىپ قالدى:%2 File copy error حۇجاتتى قاتە كوشىرىپ قويۋ The file name exceeds the limit حۇجات مى شەكتەن ٸشٸپ كەتتى Cannot opening file, permission denied! حۇجاتتى اشۋئاجرىتىششىن بولمادى، ۇقىق كولەمى رەت قىلىندى! File:%1 was not found. تابىلماعان حۇجات:%1. File System حۇجات سەستيماسى Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data ساندىق مالىمەت %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا قالدىق بوستٸق جوق. كوبەيتىلگەن حۇجات ۇلكەندىگى:%2 GB، سەزگٸرلٸگٸنە بوستٸق:%3 GB. Link file error قولدانبا حۇجات قاتەلىگى Burning does not support replacement كۆيدۈرگۈچى الماستٸرۋدٸ قولدامايدى. Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error حۇجاتتى قاتە ٴوشىرۋ Delete file error حۇجاتتى ٴوشىرۋ قاتەلىگى Invalid Operation! Can not delete "%1". كۇشكە يە ەمەس جوبالاۋ! %1 نى ٶشٸرگەلٸ بولمايدى. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled قۇپيا نومەر دىيالوگ رامكاسى كۇشىنەن قالدىرىلدى Message recipient disconnected from message bus without replying! حاباردى قابىلداۋ ورٸنداۋشى جاۋاپ قايتۇرمىغاندا، حابار باس لەنياسى مەنەن جالعانۋ ٷزٸلٸپ قالدى Error قاتە Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data ساندىق مالىمەت folder حۇجات قىسقىش file حۇجات text file تەكىسىت حۇجاتى Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ەسكەرتۋ Error قاتە Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Can not open path "%1",permission denied. %1 جولىن اشۋئاجرىتىششىن بولمايدى، ۇقىق كولەمى رەت قىلىندى. Can not find path "%1",are you moved or renamed it? %1 جولىن تاباالماعان، ول جوتكەلدىمە ياكي قاتە دىمقىل بېرىلدىمۇ؟ Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) بالا حۇجات Symbol Link, بەلگى جالعاۋٸ، System Disk File Name حۇجات مى Delete Date ساندىق مال-مۇلىكى ٴوشىرۋ Create Date ساندىق مالىمەت قۇرۋ Time Modified File Size حۇجات ۇلكەندىگى Original Path وڭ جول Path File %1 is existed in space, please not add file repeatly. Operation not supported جوبالاۋ قولدامايدى File Type حۇجات تۇرى Modified Date وزگەرتىلگەن ۋاقىتى Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label حۇجات بەلگٸسٸن قوسۋ. Delete All Label بارلٸق بەلگىلەردى ٶشٸر Label Management ... add "%1" %1 نى قوسادى Remove "%1" %1 نى شىعارىپ جىبەرىپتى Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... بەلگى باسقارۋ ... Peony::FileLabelWidget label management ... بەلگى باسقارۋ ... Label Management ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 لىك اشىلۋ كۇيى unknown كۋالىك No application is set to open file "%1 %2" ەشقانداي جيۋ حۇجاتتى ٸشٸۋ ٷشٸن %1 %2 ورىنداپ تەڭشەلمەگەن Still using the last opened application: جانەدە الداعٸ رەت اشىلعان ئەپنى ٸستەتٸپ جاتٸر: known ٴمالىم Open application is used by default: كوڭىلدەگى احۋالدا Open جيۋ دەتالىن ٸستەتۋ: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. ٴسىز جۇمساق دەتال ورتالىقتان نۇ حۇجاتتى اشۋئاجرىتىششىن بولاتٸن ئەپنى ىزدەسەڭىز بولادٸ، ياكي كومپيوتوردكى قازىر بار بولعان قولدانعىش پرٶگراممالاردى تالدا. Other application: باسقا ئەپلەر: Select application: ٶتٸنٸشتٸ تالدا: Always open the %1%2 file with this application باستان اقىرٸ نۇ ئەپنى ٸستەتٸپ %1 %2 حۇجاتتى ٴٸشڭٸز Choose other application باسقا ئەپنى تالداۋ Go to application center جيۋ ورتالىعىنا بەرۋ Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Desktop files(*.desktop) (*.desktop) ۇستەل بەتى حۇجاتتارى Select Open Action ٸشٸۋ جوبالاۋدى تالدا Select تالداۋ Peony::FileLaunchAction Execute Directly حۇجات قىسقىش Execute in Terminal تەكىسىت حۇجاتى Detected launching an executable file %1, you want? بىرباستا اتقار ەتۋ. Delete file Warning 删除文件警告 Open Failed ٸشٸۋ جەڭىلىپ قالدى Can not open %1, file not exist, is it deleted? %1 نى اشۋئاجرىتىششىن بولمادى، حۇجات ساقتالعان ەمەس، ئۆچۈرۈلدىمۇ؟ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ۇقىق بەرٸلمەگەن File is not readable. Please check if file has read permisson. حۇجاتتى وقٸعالٸ بولمايدى. حۇجاتتىڭ وقۋ ۇقىعىنا يە ياكي يە ەمەستىگىن تەكسەرٸپ كور. By Default App كوڭىلدەگى قولدانعىش پروگرامما Launch Options قوزعالتۋ تالدانباسٸ Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتنى ٶشٸرەسٸزبە؟ Can not open %1, Please confirm you have the right authority. %1 نى اشۋئاجرىتىششىن بولمادى، سىزدىڭ دۇرٸس ۇقىق كٶلەمڭىز بارلٸعٸن انىقتاڭىز. Open App failed ئەپنى ٸشٸۋ جەڭىلىپ قالدى The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? جالعانعان ئەپلەر وزگەرتٸلدٸ ياكي ٶشٸرٸلدٸ، سوندىقتان نورمال قىزىمەت قىلعالى بولمايدى. قولدانبا حۇجاتتى ٶشٸرەسٸزبە؟ Error قاتە File original path not exist, are you deleted or moved it? حۇجاتتىڭ وڭ جولى، ساقتالعان ەمەس ونى ئۆچۈرۋەتتىڭىزمۇ ياكي يۆتكىۋەتتىڭىزمۇ؟ Can not get a default application for opening %1, do you want open it with text format? %1 نى اشۋعا قولداناتىن كوڭىلدەگى قولدانعىش پرٶگرامماعا يە بولعالٸ بولمايدى، تەكىسىت فورمادا ونى ٸشٸۋ كەرەكپە؟ Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link بەلگى جالعاۋٸ Link file error قولدانبا حۇجات قاتەلىگى Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error حۇجاتتى جوتكەۋ قاتەلىگى File System حۇجات سەستيماسى Data ساندىق مالىمەت %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا قالدىق بوستٸق جوق. كوبەيتىلگەن حۇجات ۇلكەندىگى:%2 GB، سەزگٸرلٸگٸنە بوستٸق:%3 GB. File move error حۇجات جوتكەۋ قاتەلىگى Invalid move operation, cannot move a file into its sub directories. جوتكەۋ جوبالاۋى كۇشكە يە ەمەس، حۇجاتتى ونىڭ تارماق مازمۇنعا جوتكەلۋى بولمايدى. The file name exceeds the limit حۇجات مى شەكتەن ٸشٸپ كەتتى Create file error حۇجات قاتەلىگى تاقپٸرلاۋ ەتۋ Cannot opening file, permission denied! حۇجاتتى اشۋئاجرىتىششىن بولمادى، ۇقىق كولەمى رەت قىلىندى! File:%1 was not found. تابىلماعان حۇجات:%1. Invalid Operation. كۇشكە يە ەمەس جوبالاۋ. System Disk Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error حۇجاتتى قاتە ٴوشىرۋ Link file error قولدانبا حۇجات قاتەلىگى Burning does not support replacement كۆيدۈرگۈچى الماستٸرۋدٸ قولدامايدى. Burn failed 刻录失败 File delete 文件删除 Invalid Operation كۇشكە يە ەمەس جوبالاۋ Peony::FileOperationAfterProgressPage &More Details & الٸدە كوپ جٸڭٸشكەلٸكپەن Peony::FileOperationErrorDialog File Operation Error حۇجات باسقارۋىنداعى قاتەلىك unkwon كۋالىك null كۇشكە يە ەمەس Error message: قاتە حابار: Source File: قاينار حۇجات: Dest File: حۇجاتتاعى نىسانا حۇجات: Ignore نازاردان ساقتانۋ ەتۋ Ignore All بارىلىعنا سەل كوز قاراس Overwrite ٷستٸنەن ساقتاۋ Overwrite All ٴبارىن قاپتاۋ Backup زاپاستاۋ Backup All جالپىسىن زاپاس ساقتاۋ. &Retry &قاتە سىناپ كور &Cancel ۋاز قايتۋ Peony::FileOperationErrorDialogBase Close تىعنداۋ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace الماستىر Ignore نازاردان ساقتانۋ ەتۋ Do the same ۇقساس بٸر ٴىسىن ەتۋ <p>This location already contains the file '%1', Do you want to override it?</p> <p> نۇ ورىن حۇجاتتىڭ %1 نى ٶز ىشىنە العان، ونى قاپتاۋ كەرەكپە؟ Unexpected error from %1 to %2 %1 تىن %2 عادەيىن بولعان كەنەتتەن قاتەلىك Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup زاپاستاۋ Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes سونداي No جوق Cancel 取消 Delete ٴوشىرۋ Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected دەسكانىڭ تولٸق ياكي يېزىلماي قٶرعالۋىنا كەپىلدىك ىستەڭ، ونىڭ ٷستٸنەن حۇجات قورعالىمدى Peony::FileOperationErrorDialogWarning OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Skip all Make sure the disk is not full or write protected and that the file is not protected دەسكانىڭ تولٸق ياكي يېزىلماي قٶرعالۋىنا كەپىلدىك ىستەڭ، ونىڭ ٷستٸنەن حۇجات قورعالىمدى Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link بەلگى جالعاۋٸ Copy كوشىرۋ Move Rename قاتە ات فاميليا ەتۋ Link Delete ٴوشىرۋ Delete Permanently 永久删除 Restore قالپىنا كەلتىرىلگەن New جاڭا - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ەسكەرتۋ '%1' is occupied,you cannot operate! 1 نى ئىگەگورزېنتال، ٴسىز جوبالاۋ قىلالمايٴسىز! No, go to settings 否,跳转到设置 OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Do you want to put selected %1 item(s) into trash? تالدانعان %1 توردى قوقسىق ساندىعىنا سالۋ كەرەكپە؟ Do not show again قاتە كورسەتپەۋ File System حۇجات سەستيماسى System Disk Data ساندىق مالىمەت Insufficient storage space ساقتاۋ بوستٸعٸ جەتىسپەيدى %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا قالدىق بوستٸق جوق. كوبەيتىلگەن حۇجات ۇلكەندىگى:%2 GB، سەزگٸرلٸگٸنە بوستٸق:%3 GB. Can't delete. ٶشٸرگەلٸ بولمايدى. You can't delete a file whenthe file is doing another operation حۇجات باسقا جوبالاۋلاردى قىلىپ جاتقان كەزدە، نۇ حۇجاتنى ٶشٸرگەلٸ بولمايدى File Operation is Busy حۇجات جوبالاۋى قاربالاس There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. بۇرىن بٸر ياكي بٸر قانشا حۇجات جوبالاۋى اتقار قىلىنىپ جاتقان. ٴسىز تٸپتٸ تاماملانغۇچە اتقار ورىنداۋدى ساقلايٴسىز. قيسٸق شىنىندا جانداس حۇجات جوبالاۋىنى اتقار ورىنداماقشى بولساڭٸز، تالداۋ تىزىمدكتەگى كوڭىلدەگى تالداۋ تۇرىن وزگەرتەسٸز بولادٸ. The long name file is saved to %1 ۇزىن اتٸ بار حۇجات %1 عادەيىن ساقتالادى Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ھېسابلىنىۋاتىدۇ: state: كۇيى: Peony::FileOperationProgressPage &More Details & الٸدە كوپ جٸڭٸشكەلٸكپەن From: دان: To: عا: Peony::FileOperationProgressWizard File Manager حۇجات باسقارۋشى &Cancel ۋاز قايتۋ Preparing... دايٸندٸق ورىندالىپ جاتىر. . . Handling... تۇتۇۋاتىدۇ.... Clearing... تازىلىنىۋاتىدۇ... Rollbacking... قايتالانىپ جاتىر... File Operation حۇجات جوبالاۋى A file operation is running backend... حۇجات جوبالاۋى ارتى جاقتا اتقار ورىندالىپ جاتىر... %1 files, %2 %1 حۇجاتتار, %2 %1 done, %2 total, %3 of %4. %1 ورىندالدى، ، جالپٸ %2 %3، % جالپٸ %4. clearing: %1, %2 of %3 تازىلىنىۋاتىدۇ:%1، 2 بولىپ، %2 جالپٸ %3 copying... كوبەيتىپ جاتۋى... Syncing... بۇرشاق قادامدا مېڭىۋاتىدۇ... Peony::FilePreviewPage File Name: 文件名称: File Type: حۇجات تيپى: Time Access: ۋاقىت ساپارىن: Time Modified: تۇزەتۋ كىرگىزۋ ۋاقىتى: Children Count: بالا حۇجات سانى: Size: ۇلكەن - كشىلگى: Location: Time Created: ورناتىلعان ۋاقىتى: Image resolution: سۋرەت پارىقتاندىرۋ قاتىناسى: color model: رەڭ مودەلى: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare مىناۋ جابدىقدان ھەمبەھىرلىنىش Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden %بولىپ، جالپٸ 1 %2 جاسىرىن Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error قاجەتكە قاتە ات قويۋ قاتەلىگى Invalid file name %1%2%3 . كۇشكە يە ەمەس حۇجات مى %1 %2 %3. Are you sure to hidden this file? ٴسىز نۇ حۇجاتتى جاسىرۋدى جەزملەشتۈرەلەمٴسىز؟ When change the file suffix, the file may be invalid. Are you sure to change it ? حۇجات ارتى قوشىمشانى وزگەرتكەندە، حۇجات كۇشكە يە ەمەس بولۋٸ مۇمكان. ٴسىز وزگەرتۋدى جەزملەشتۈرەلەمٴسىز؟ A file and a directory with the same name cannot replace each other The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning قاجەتكە قاتە دىمقىل بەرۋ ەسكەرتۋٸ The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error قاجەتكە قاتە ات قويۋ قاتەلىگى Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// قوقسىق:/// Trash file error قوقسىق ساندىعى حۇجات قاتەلىگى Invalid Operation! Can not trash "%1". كۇشكە يە ەمەس جوبالاۋ! %1 نى تاشلىۋەتكىلى بولمايدى. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. مەڭگەرۋ قىلعالى بولمايتٸن سوقتٸعٸۋ ساقتالعان. جيىپ الۋ پونكٸتتٸ تەكسەرٸپ كور. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Untrash حۇجات قاتەلىگى Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd جىل/اي/كۇن HH:mm:ss ساعات: مينۋت: سەكونت AP hh:mm:ss AP ساعات: مينۋت: سەكونت yyyy-MM-dd جىل-اي-كۇن Peony::HeaderBar Spread تارقاتۋ Minimize كىشرەيتۋ Close تىعنداۋ Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open ٸشٸۋ Open With بٸرگە ٸشٸۋ More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy كوشىرۋ Save As file حۇجات All File This location has no write permission.please change the storage location Label Properties سۋرەت قاسيەتى Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name ات-فاميليا SideBar جان جاق ەسكەرتپە ستونى Menu تٸزٸمدٸك Create New Label جاڭا بەلگى تاقپٸرلاۋ ەتۋ Delete Label بەلگٸنٸ ٴوشىرۋ Display the following items in the identification area: (maximum of 6) پارىقتاندىرۋ رايوندا تومەندەگٸ تۇرلەر كورسەتىلدى:(ەڭ كوپ بولعاندا التى) Rename قاتە ات فاميليا ەتۋ Edit Color رەڭ تالداۋجاساۋ Delete This Label نۇ بەلگٸنٸ ٶشٸر Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" %2 دان %1 نى ٸزدەۋ File System حۇجات سەستيماسى Search results for all files marked in "%1" in "%2" %2 %1 دە بەلگى قويىلعان بارلٸق حۇجاتتاردىڭ ٸزدەۋ ناتيجەسى &Copy Directory 拷贝路径(&C) Open In New Tab جاڭا بەلگى بەتتە اشىلۋ Open In New Window جاڭا تەرەزەدە اشىلۋ Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory كوبەيتۋ باسمازمۇن Peony::MountOperation Operation Cancelled جوبالاۋ كۇشىنەن قالدىرىلدى Login failed, unknown username or password error, please re-enter! كىرۋ جەڭىلىپ قالدى، كۋالىك ابونت مى ياكي قۇپيا نومەرى قاتە، قاتە كىرگىزىڭىز! Peony::NavigationToolBar Go Back قايتۋ Go Forward الدىنا ماڭ History قويۋ تاريحى Clear History تاريحنى تازالاۋ Cd Up Cd نىڭ ٷستٸن Refresh جاڭالاۋ Peony::NewFileLaunchDialog Choose new application جاڭا قولدانعىش پروگراممانى تالدا Choose an Application to open this file بٸر ئەپنى تالداپ نۇ حۇجاتتى ٴٸشڭٸز apply now دەرەۋ جابلماس ىستەڭ OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? ٴسىز %1 %2 حۇجاتتى قانداق اشۋدٸ ٷمىت قىلىٴسىز؟ Default open with: كوڭىلدەگى ٸشٸۋ ٴتاسٸلٸ: Other: باسقا: Choose other application باسقا ئەپنى تالداۋ Go to application center جيۋ ورتالىعىنا بەرۋ Peony::PathEdit Go To بەرۋ Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 حۇجاتتاعى نىسانا:%1 Read and Write وقۋ ۋا جازۋ Readonly تەك قانا وقۋعا بولادٸ Group or User گرۋپپا ياكي ئابۇنىچىلار (Current User) (كەزەكتەگى پايدالانۋشٸ The folder containing this file is protected, and only the file owner can modify the file. Current User كەزەكتەگى پايدالانۋشٸ Permissions modify tip ۇقىق كولەمىن وزگەرتۋ ەسكەرتپەسٸ The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? كەزەكتەگى حۇجات ياكي حۇجات قىسقىشقا ACL ۇقىق كولەمى ورنالاسترعان قىلىندى. ابونتتار گرۋپپاسىنىڭ ۇقىق كولەمىنى وزگەرتۋ ACL دا ورنالاسترعان ورىندالعان ۇقىق كولەمىنى ٸستەتكەلٸ بولماۋٸن كەتىرىپ شٸعۋٸ مۇمكان. ابونتتار گرۋپپاسىنىڭ ۇقىق كولەمىنى جالعاستى وزگەرتۋ كەرەكپە؟ Permission refinement settings ۇقىق كولەمىن ئىنچىكىلەشتۈرۈپ ورنالاسترعان ەتۋ. The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? كەزەكتە پايدالانۋشٸلار جوعارعى دارەجەلىك ورتاق ٴلاززاتتانۋ بولۋٸن ورنالاسترعان ورىندادى. قيسٸق ٴسىز جانەدە ۇقىق كولەمىن وزگەرتۋگە سەزگٸرلٸگٸنە بولساڭٸز، وندا جوعارعى دارەجەلىك ورتاق ٴلاززاتتانۋ بولۋٸن ٸستەتكەلٸ بولماستٸعٸ مۇمكان. تەڭشەۋدٸ داۋاملاشتۇرامٴسىز؟ Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ۇقىق حابارعا يە بولعالٸ بولمايدى. (Me) (我) Others باسقالار Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. ٴسىز نۇ حۇجاتتىڭ ۇسىنس ەتۋ ۇقىقتى ئۆزگەرتەلمەيٴسىز. Me User 用户 Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok ماقۇل Cancel Peony::PropertiesWindow Trash قايتارىپ الۋ ساندىعى Recent جاقىنعى Selected تالداۋ %1 Files %1 حۇجات usershare مىناۋ جابدىقدان ھەمبەھىرلىنىش Data ساندىق مالىمەت System Disk Properties سۋرەت قاسيەتى Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Restore قالپىنا كەلتىرىلگەن Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. قوقسىق ساندىعىنا تاستاعاندا تۇراقتاندىرۋ رامكاسى شىعادى. Origin Path: وڭ نۇكتە جولى: Deletion Date: ٶشٸرٸلگەن ۋاقىت: Size: ۇلكەن كشىلگى: Original Location: وڭ ورنى: Peony::SearchBar Input the search key of files you would like to find. ٸزدەمەكشٸ بولعان حۇجاتتىڭ ٸزدەۋ شەشۋشٸ سوزدى كىرگىزىڭىز. Input search key... ٸزدەۋ شەشۋشٸ سوزدى كىرگىزىڭىز. . . advance search الدىن ٸزدەۋ clear record ەستەلىكتى تازالاۋ Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Clear تازالاۋ all بارلٸق file folder حۇجات قىسقىش image راسىم video سىن text file تەكىسىت حۇجاتى audio اۋا others باسقالار wps file wps حۇجاتى Peony::SharedFileLinkOperation Symbolic Link بەلگى جالعاۋٸ The dest file "%1" has existed! حۇجاتتاعى نىسانا حۇجاتتىڭ %1 ى ساقتالعان! Link file error قولدانبا حۇجات قاتەلىگى Peony::SideBarCloudItem CloudStorage CloudStorage ساقتاۋ قىزىمەت وتەۋى CloudFile Cloud حۇجاتى Peony::SideBarFavoriteItem Trash قايتارىپ الۋ ساندىعى Recent جاقىنعى Quick Access Quick access تەز ۇسىنس ەتۋ Favorite 快速访问 KmreData KmreData ساندىق مالىمەتى Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data ساندىق مالىمەت Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties سۋرەت قاسيەتى Delete Symbolic بەلگٸنٸ ٴوشىرۋ Unmount جۋىپ جىبەرۋ Eject جاريالاۋ Format ٴپىشىنى burndata ساندىق مالىمەتتەردى كۆيدۈرۈش &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network تور Peony::SideBarPersonalItem Personal جەكە Peony::SideBarSeparatorItem (No Sub Directory) (تارماق باسمازمۇن جوق) Peony::StatusBar ; %1 folders ; %1 حۇجات قىسقىش ; %1 files, %2 total ; %1 حۇجات، جالپٸ %2 ; %1 folder ; %1 حۇجات قىسقىش ; %1 file, %2 ; %1 حۇجات، %2 %1 selected %1 تالدانعان Peony::SyncThread notify 温馨提示 ۇقتٸرۋ Notify Peony::TagManagement General 通用 Mark بەلگى Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type رەتتەلگەن تيپ File Name حۇجات مى File Type حۇجات تۇرى File Size حۇجات ۇلكەندىگى Modified Date وزگەرتىلگەن ۋاقىتى Open in New window جاڭا تەرەزەدە اشٸلدٸ Open in new Tab جاڭا تالداۋ كارتاسننان ٴٸشڭٸز Ascending كىشىدەن ۇلكەنگە قاراتىپ تىزۋ Descending چوڭدىن كىچىككە قاراتىپ تىزۋ Copy كوشىرۋ Paste شاپتاۋ Cut كەسۋ Trash قايتارىپ الۋ ساندىعى Clean Trash قوقسىقتى تازالاۋ Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore قالپىنا كەلتىرىلگەن Options تالدانبالار Forbid Thumbnail قىسقارتىلعان راسىم مانى قىلىندى Show Hidden جاسىرىن تۇرلەردى كورسەتەدى Resident in Backend ارتى جاقتا تۇرۋ. Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ەڭ سوڭعٸ تەرەزەسى جاپقاننان كەيىن، پروگرامما جانەدە اتقار قىلىنسىن. نۇ، كەيىنكى رەت جارناما ەتۋ ۋاقىتىن قسقارتادى بىراق ارتى سەپتىكى بايلىقلارنىمۇ خورىتىدۇ. &Help جاردەم &About... جايٸندا(&A). Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. اۆتورى: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2019-جىلدىق تيەنجىن KYLIN حابار تەحىنيكا شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Type: تيپى: Duration: Size: ۇلكەن كشىلگى: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning ەسكەرتۋ Peony::VolumeManager Error قاتە ProgressBar starting ... باستالىپ جاتىر ... canceling ... نازاردان ساقتانۋ ورىندالىپ جاتىر... sync ... بۇرشاق قاداملاتپايدى ... continue جالعاستىرۋ pause ۋاقىتىنشا توقتاتۋ close تاقاۋ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View پىشىن كورىنۋى Show the folder children as icons. حۇجات قىسقىش تارماق تۇرىن اي كۇن ورىنداپ كورسەتۋ. List View تٸزٸمدٸك كورىنۋى Show the folder children as rows in a list. حۇجات قىسقىش تارماق تۇرىن كەستەدەگٸ قۇر دوپ كورسەتىڭىز. Basic Preview Page 基本 Basic نەگٸزگٸ Show the basic file properties, and allow you to modify the access and name. ، نەگٸزگٸ حۇجات قاسيەتىن كورسەتەدى ونىڭ ۇستىنە ۇسىنس ەتۋ ۇقىعى ۋا اتاعىن وزگەرتۋىڭىزگە جول قويادى. Permissions Page 权限 Permissions ۇقىق ولشەمى Show and modify file's permission, owner and group. حۇجات ۇقىعى، يەگەرلٸك ورٸنداۋشى ۋا گرۋپپانى كورسەتۋ ۋا وزگەرتۋ. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? حۇجات وتە ۇلكەن، جيىپ الۋ پونكيتٸنە جوتكەلۋى بولمايدى. ونى ماڭگىلىك ٶشٸرمەكشٸ؟ These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? نۇ حۇجاتتار، وتە چوڭكەن جيىپ الۋ پونكيتٸنە جوتكەلۋى بولمايدى. نۇ %1 حۇجاتتى ماڭگىلىك ٶشٸرمەكشٸ؟ Delete ٴوشىرۋ Clean the Trash قوقسىقتاردى تازالاۋ OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. جيىپ الۋ پونكٸتتٸ قۇرۇقداپ، نۇ حۇجاتتاردى ماڭگىلىك ئۆچۈرەمدۇ؟ باستالعان اقىرىندا، ولاردى قالپىنا كەلتىرۋگە امال جوق. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties كومپيۋتەر Show the computer properties or items in computer. كومپيوتوردىڭ قاسيەتى ياكي كومپيوتوردكى تۇرلەردى كورسەتەدى. Trash and Recent Properties Page 最近/回收 Trash and Recent قوقسىق ساندىعى ۋا ەڭ جىيىنداعى Show the file properties or items in trash or recent. حۇجات قاسيەتى ياكي قوقسىق ساندىقتاعى تۇر ياكي ەڭ جاقىن تۇرنى كورسەتەدى. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed فورماتتاۋ جەڭىلىپ قالدى YES قوسىلۋ Formatting successful! But failed to set the device name. فورماتتاۋ ناتيجەلى قالدى! بىراق اسبابٸتٸڭ اتاعىن بەكىتىلمەدى. qmesg_notify qmesg_ ۇقتىرۋى Format ٴپىشىنى Begin Format باستاۋ پىشىنى Close تىعنداۋ Format operation has been finished successfully. فورماتتاۋ جوبالاۋى ناتيجەلى تامامدالدٸ. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! كەشىرىڭ. فورماتتاۋ جوبالاۋى جەڭىلىپ قالدى! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ تومىن فورماتلىساق تومداعى بارلٸق ساندىق مالىمەتتە ٶشٸرٸلەدٸ. اۋەلگى قالپنا قايتارۋ نۇرۇن بارلٸق ساقتالعان ساندىق مالىمەتتەنى زاپاس ساقتا. داۋاملاشتۇرامدۇق؟ format فورماتتاۋ begin format 开始 close 关闭 File Manager حۇجات باسقارۋشى Notify Default search vfs of peony 默认文件搜索 Force unmount failed ماجبۇر دومالاتۋ جەڭىلىپ قالدى. Error: %1 قاتەلىك بايقالدٸ: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندىق مالىمەت بۇرشاق قادامدا تامامدالدٸ ، اسباب سەستيماسى ناتيجەلى قالدا يۇيۇۋېتىلدى ! Unmount failed جۋۋ جەڭىلىپ قالدى Not authorized to perform operation. جوبالاۋدى اتقار ەتۋ ۇقىعى بەرٸلمەگەن. Unable to unmount it, you may need to close some programs, such as: GParted etc. جۇكتى جۋعالى بولمايدى، ٴسىز بالكٸم الدٸمەن بارٸ پرٶگراممالاردى ئېتىۋېتىشىڭىز بولۋٸ مۇمكان، ماسەلەن، رايونعا بولىنىپ رەدەكسيا اسبابٸ قاتارلىلار. Error: %1 Do you want to unmount forcely? قاتەلىك كورىلدى: ٪1 ماجبۇر يۇيامدۇق؟ Cancel كۇشىنەن قالدىرۋ Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase اسبابٸن قوزعاتقالى بولمادى:قۇپيا نومەر سوز بٸرٸكپەسٸن دۇرٸس ەمەس The device has been mount successfully! اسپاپتاردى رايوندارعا ٴبولۋ ناتيجەلى قالدى ! Eject device failed, the reason may be that the device has been removed, etc. سەكىرىپ شىعۋ جەڭىلىپ قالدى، بالكٸم اسباپتاردىڭ ئېلىۋېتىلىشى قاتارلى سەبەپتەر بولۋٸ مۇمكان. Data synchronization is complete and the device can be safely unplugged! ساندىق مالىمەتتە بۇرشاق قادامدا تامامدالدٸ، اسپاپتاردى حاۋٸپسٸز قالدا الماقشٸ بولادٸ! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed تەز كورىنبە جەڭىلىپ قالدى favorite جيىپ ساقتاۋ Favorites جاقسى كۆرىدىغانلار File is not existed. حۇجات ساقتالعان ەمەس. Share Data جەرلىكتە ھەمبەھىرلەش Trash قايتارىپ الۋ ساندىعى Recent جاقىنعى Operation not supported جوبالاۋ قولدامايدى The virtual file system does not support folder creation جاساندى حۇجات سەستيماسى حۇجات قىسقىش قۇرۋدى قولدامايدى Can not create a symbolic file for vfs location vfs ورنى ٷشٸن بەلگى حۇجاتى ورناتقالى بولمادى Symbolic Link بەلگى جالعاۋٸ Can not create symbolic file here, %1 نۇ جەردە بەلگى حۇجاتى ورناتقالى بولمايدى، %1 Can not add a file to favorite directory. حۇجاتتى جيىپ ساقتاۋ مازمۇنعا قوسقالى بولمايدى. The virtual file system cannot be opened جاساندى حۇجات سەستاماسىن اشۋئاجرىتىششىن بولمادى Virtual file directories do not support move and copy operations جاساندى حۇجات باسمازمۇن جوتكەۋ ۋا كوبەيتۋ جوبالاۋدى قولدامايدى Default favorite vfs of peony مودەنگۈل كوڭىلدەگى جاقسى كورەتىن vfs Details ناقتىلاپ حابارى: Mark بەلگى mark this file. نۇ قاجەتكە بەلگى قويىڭىز. Open With بٸرگە ٸشٸۋ open with. ٸشٸۋ ٴتاسٸلٸ It need to synchronize before operating the device,place wait! اسبابٸن جوبالاۋ قىلۋدان بۇرٸن بۇرشاق قادامدىق ساندىق مالىمەتكە سەزگٸرلٸگٸنە، سەل ساقتاپ تۇر. Unable to discover the file, it may have been removed or deleted. نۇ حۇجاتتى بايقاعالى بولمادى، ول بالكٸم ٶشٸرٸلگەن ياكي ٶشٸرٸلگەن بولۋٸ مۇمكان. permission denied ماقۇلداۋ رەت قىلىندى file not found 没有发现该文件 duplicate كوبەيتۋ Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data ساندىق مالىمەت System Disk label بەلگى Computer كومپيۋتەر File System حۇجات سەستيماسى Data ساندىق مالىمەت Failed to open file "%1": insufficient permissions. حۇجاتتى اشۋئاجرىتىششىن بولمايدى %1:ۇقىق كولەمى جەتەرلىك ەمەس. File “%1” does not exist. Please check whether the file has been deleted. حۇجات %1 ساقتالعان ەمەس. نۇ حۇجاتنىڭ ٶشٸرٸلگەن ياكي وشىرلمەگەندكتى تەكسەرٸپ كور. burn operation has been cancelled كۆيدۈرۈش جوبالاۋى كۇشىنەن قالدىرىلدى is busy! وتە قاربالاس! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. ٴسىز نۇ حۇجاتتى ماڭگىلىك ٶشٸرۋشٸنٸ جەزملەشتۈرەلەمٴسىز؟ ٶشٸرۋگە باستاعان اقىرىندا، حۇجاتتى قالپىنا كەلتىرگەلى بولمايدى. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. ٴسىز نۇ %1 حۇجاتتى ماڭگىلىك ٶشٸرۋشٸنٸ جەزملەشتۈرەلەمٴسىز؟ ٶشٸرۋگە باستاعان اقىرىندا، نۇ حۇجاتتاردى قالپىنا كەلتىرگەلى بولمايدى. Virtual file directories do not support move operations جاساندى حۇجات باسمازمۇن كۇشەمەكشى جوبالاۋدى قولدامايدى. test simplify vfs plugin vfs قىستىرماسىن ئاددىيلاشتۇرۇشنى سىناۋ Default custom vfs info of peony peony كوڭىلدەگى ەرٸكتٸ vfs حابارى Default local vfs info of peony peony جەرلىك vfs حاباردٸ مويىنداپ ىستەيدى. Show properties plugin window. قاسيەت قىستىرما تەرەزەنى كورسەتۋ. Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok ماقۇل Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData جيۋ سان قامبانى كۆيدۈرۈشنى اقىرلاستىردى Disc Type: وپتٸكا ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ No burn data, please add! ساندىق مالىمەتتەردى ئويمىدى، قانە قوشۇڭلار! The disc name cannot be set to empty, please re-enter it! وپتٸكا ديسكا ديسكا اتاعىن قۇرعاق ورىنداپ قويۋعا بولمايدى، قاتە كىرگىزىڭىز! AppendBurnData operation has been finished successfully. AppendBurn Data جوبالاۋى ناتيجەلى تامامدالدٸ. Sorry, the appendBurnData operation is failed! كەشىرىڭ. appendBurn Data جوبالاۋى جەڭىلىپ قالدى! Failed جاڭالاۋ جەڭىلىپ قالدى Burning. Do not close this window نۇ تەرەزەسى جابىپ الماي كۆيدۈرۈش Burning this disc will append datas on it. Do you want to continue ? نۇ دەسكانى كۆيدۈرسە ٷستٸندە قوسىمشا ساندىق مالىمەت بولادٸ. داۋاملاشتۇرامدۇق؟ Burn كۆيدۈرۈش Begin Burning كۆيدۈرۈشنى باستاۋ Close تىعنداۋ UdfBurn::UdfFormatDialog Format ٴپىشىنى Disc Type: وپتٸكا ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ The disc name cannot be set to empty, please re-enter it! وپتٸكا ديسكا ديسكا اتاعىن قۇرعاق ورىنداپ قويۋعا بولمايدى، قاتە كىرگىزىڭىز! Format operation has been finished successfully. فورماتتاۋ جوبالاۋى ناتيجەلى تامامدالدٸ. Sorry, the format operation is failed! كەشىرىڭ. فورماتتاۋ جوبالاۋى جەڭىلىپ قالدى! Failed جاڭالاۋ جەڭىلىپ قالدى Formatting. Do not close this window فورماتتاۋ. نۇ تەرەزەسى تاقىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ دەسكانى فورماتلىساق تاباقتاعى بارلٸق ساندىق مالىمەتتە ٶشٸرٸلەدٸ. اۋەلگى قالپنا قايتارۋ نۇرۇن بارلٸق ساقتالعان ساندىق مالىمەتتەنى زاپاس ساقتا. جالعاستىراسىز با؟ Begin Format باستاۋ پىشىنى Close تىعنداۋ UdfFormatDialog Format ٴپىشىنى Disc Type: وپتٸكا ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK انىقتاۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ The disc name cannot be set to empty, please re-enter it! وپتٸكا ديسكا ديسكا اتاعىن قۇرعاق ورىنداپ قويۋعا بولمايدى، قاتە كىرگىزىڭىز! Format operation has been finished successfully. فورماتتاۋ جوبالاۋى ناتيجەلى تامامدالدٸ. Sorry, the format operation is failed! كەشىرىڭ. فورماتتاۋ جوبالاۋى جەڭىلىپ قالدى! Failed جاڭالاۋ جەڭىلىپ قالدى Formatting. Do not close this window فورماتتاۋ. نۇ تەرەزەسى تاقىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ دەسكانى فورماتلىساق تاباقتاعى بارلٸق ساندىق مالىمەتتە ٶشٸرٸلەدٸ. اۋەلگى قالپنا قايتارۋ نۇرۇن بارلٸق ساقتالعان ساندىق مالىمەتتەنى زاپاس ساقتا. جالعاستىراسىز با؟ Begin Format باستاۋ پىشىنى Close تىعنداۋ progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_ky_KG.ts0000664000175000017500000112235415154271106021527 0ustar fengfeng ColorPushButton label management ... этикетка башкаруу ... Label Management ... Remove "%1" "%1" жоготуу delete "%1" "%1" жоготуу add "%1" "%1" кошуу ConnectServerDialog Connect to Sever Северге туташуу Domain Домен Password Сырсөз Save Password Сырсөздү сактоо User Колдонуучу Anonymous Анонимдүү Ok Макул Cancel Жокко чыгаруу DiscControl is busy! иш менен алек! is busy! иш менен алек! not support udf at present. азыркы учурда Udf колдобойт. unmount disc failed before udf format. жарыяланбаган диск udf форматына чейин ишке ашпады. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf форматы ишке ашпай калды. preparation failed before DVD-RW udf format. даярдоо DVD-RW udf форматына чейин ишке ашпады. FileLabelModel Red Кызыл Orange Апельсин Yellow Сары Green Жашыл Blue Көк Purple Кызгылт көк Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error Ката Label or color is duplicated. Этикетка же түс дубликатталат. FileOperationHelper Burn failed Берн ишке ашпады Format_Dialog Dialog Диалог rom_size rom_size system система vfat/fat32 vfat/fat32 exfat эксфат ntfs Нтфс vfat VFAT ext4 экст4 device_name device_name clean it total аны жалпы тазалоо ok Макул close жакын TextLabel ТекстЛабель qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format Формат Rom size: Ром өлчөмү: Filesystem: Файлдар: Disk name: Дисктин аты: Completely erase(Time is longer, please confirm!) Толугу менен өчүрүү (Убакыт узагыраак, сураныч, ырастоо!) Set password Сырсөз коюу Set password for volume based on LUKS (only ext4) ЛУКС негизинде көлөмү үчүн сырсөз коюу (экст4 гана) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Ext4 файл системасына түзүү башка колдонуучулардын USB дискин окууга же жазууга мүмкүн эместигине себеп болушу мүмкүн Cancel Жокко чыгаруу OK МАКУЛ Data Маалыматтар Error locking device: Failed to deactivate device: Device or resource busy Warning Эскертүү Device name cannot start with a decimal point, Please re-enter! Орнотмонун аты-жөнү бузуку пункттан баштала албайт, кайра кириңиз! Enter Password: Сырсөз киргизүү: Password too short, please retype a password more than 6 characters Сырсөз өтө кыска, сураныч, 6 тамгадан ашык сырсөздү терүү %1/sec, %2 remaining. %1/sec, %2 калган. over one day бир күндүн ичинде getting progress... прогресс алуу... Error Ката Block not existed! Блок жок! Formatting. Do not close this window Форматтинг. Бул терезени жаппаңыз KyFileDialogRename Renaming "%1" "%1" атын алмаштыруу Renaming failed, the reason is: %1 Атын алмаштыруу ишке ашпады, себеби: %1 Filename too long Файл аты өтө узун Copying "%1" Көчүрүү "%1" To "%1" "%1"ге чейин Copying failed, the reason is: %1 Көчүрүү ишке ашпады, себеби: %1 Moving "%1" Көчүрүү "%1" Moving failed, the reason is: %1 Көчүрүү ишке ашпады, себеби: %1 File operation error: Файлдын иштөө катасы: The reason is: %1 Себеби: %1 Truncation Трункция Save Сактоо All applications Бардык иштемелер Cancel Жокко чыгаруу Apply Колдонуу Bytes Байтс Front truncation Алдыңкы трункция Post truncation Пост-трункция Description: Skip copying files of the current type Сүрөттөлүшү: Учурдагы типтеги файлдарды көчүрүү truncate interval кесүү аралыгы . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Explanation: When renaming a file name, ensure it is within %1 bytes and Explanation: Truncate the portion of the file name that exceeds 225 bytes and select Түшүндүрмө: Файл атынын 225 байттан ашкан бөлүгүн тешүү жана тандоо Description: By default, save to "%1/扩展". Сүрөттөлүшү: Дефолт боюнча "%1/扩展" сактаңыз. modify the name атын өзгөртүү Explanation: When renaming a file name, ensure it is within 255 bytes and Түшүндүрмө: Файлдын атын өзгөртүп жатканда, анын 225 байттын ичинде болушун камсыз кылуу жана {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and Түшүндүрмө: Файлдын атын өзгөртүп жатканда, анын 225 байттын ичинде болушун камсыз кылуу жана Skip Өтүү Skip All 全部跳过 Rename Атын алмаштыруу Please enter a new name 请输入文件名 OK МАКУЛ MainProgressBar File operation Файлдын иштеши starting ... баштап ... cancel all file operations бардык файлдык операцияларды жокко чыгаруу Minimize Минималдуу Close Жабуу Are you sure to cancel all file operations? Бардык файлдык операцияларды жокко чыгарарыңыз шексизби? Are you sure want to cancel all file operations Бардык файлдык операцияларды жокко чыгарууну каалайсызбы? OK МАКУЛ File Operation Файлдын иштеши Cancel Жокко чыгаруу Calculating time continue улантуу pause пауза canceling ... жокко чыгаруу ... sync ... синхрондоо ... %1Mb/s Est. time left: %2 MessageDialog Peony Пёни Forcibly pulling out the device may cause data loss or device exceptions! Аппаратты күч менен чыгаруу маалыматтарды туудурушу мүмкүн жоготуу же түзмөк өзгөчөлүктөрү! OtherButton Other queue Башка кезек Other Queue Peony::AdvanceSearchBar Key Words Негизги сөздөр input key words... негизги сөздөрдү киргизүү... Search Location Издөө орду choose search path... издөө жолун тандап... browse браузер File Type Файл түрү Choose File Type Файлдын түрүн тандоо Modify Time Убакытты өзгөртүү Choose Modify Time Убакытты өзгөртүүнү тандаңыз File Size Файл өлчөмү Choose file size Файл өлчөмүн тандоо show hidden file жашыруун файлды көрсөтүү go back Артка кайрыл hidden advance search page жашыруун алдын ала издөө баракчасы file name файлдын аты content мазмуну search издөө start search издөө баштоо Select path Жолду тандоо Operate Tips Кеңештерди колдонуу Have no key words or search location! Негизги сөздөрү же издөө орду жок! Search file name or content at least choose one! Файлдын аты-жөнүн же мазмунун издөө, жок эле дегенде, бирин тандаңыз! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... Издөө мазмуну... Search File Peony::AdvancedPermissionsPage Permission refinement settings Уруксатты тактоо параметрлери Permission refinement settings tip Уруксат тактоо параметрлери уч Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL уруксаттарын белгилөө негизги уруксаттарды колдонуучу топтун уруксаттарын өзгөртүүгө алып келет. АКЛ уруксаттарын коюуну улантуу керекпи? User Колдонуучу Read Окугула Write Жазуу Executable Аткарылышы мүмкүн delete жоготуу Inherit permission Мураска уруксат Add Кошуу Apply Колдонуу Cancel Жокко чыгаруу Peony::AllFileLaunchDialog Choose new application Жаңы иштемени тандоо Choose an Application to open this file Файлды ачуу үчүн иштемени тандоо apply now азыр колдонуу OK МАКУЛ Cancel Жокко чыгаруу Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon Колдонуучунун белгиси тандаңыз Type: Түрү: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name Аты-жөнү Location Жайгашкан жери move 移动 symbolLink символдук Линк Folder Папка Include: Камтыйт: Move Open with: менен ачуу: Description: Сүрөттөлүшү: Select multiple files Бир нече файл тандоо Size: Өлчөмү: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: Космос колдонуу: Time Create: Убакыт түзүү: Time Modified: Убакыт өзгөртүлүп берилди: Time Access: Убакыт жеткиликтүүлүгү: Readonly Окуу Hidden Жашыруун Readonly (just applied by subfiles) Property: Мүлк: usershare колдонуучулар %1 (%2 Bytes) %1 (%2 байт) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. Сураныч, 1МБ кичирээк сүрөттү тандаңыз. Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 Байт %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 файл, %2 папкалары Can't get remote file information Файлдын алыскы маалыматын алуу мүмкүн эмес %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: КПУ аты: CPU Core: КПУ өзөгү: Memory Size: Эс өлчөмү: User Name: Колдонуучунун аты: Desktop: Иш столу: You should mount this volume first Сиз бул томду адегенде бириктирүү керек Name: Аты-жөнү: File System Файл системасы Data Маалыматтар System Disk Total Space: Жалпы мейкиндик: Used Space: Колдонулган Мейкиндик: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Эркин мейкиндик: Type: Түрү: Kylin Burner Кайлин Бернер Open with: менен ачуу: Unknown Белгисиз Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server Серверге туташуу Ip Ип Port Порт Type Түрү Personal Collection server: Жеке чогултуу сервери: Add Кошуу Delete Жоготуу Connect Туташуу Ip input error, please re-enter! Ип киргизүү катасы, кайра кирүү сураныч! Port input error, please re-enter! Порт киргизүү катасы, кайра кирүү сураныч! add 添加 delete 连接 删除 connect 连接 Warning Эскертүү ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user Кирүү бедеринин колдонуучусу Please enter the %1's user name and password of the server. Сервердин %1 колдонуучусунун аты-жөнүн жана сырсөзүн киргизиңиз. User's identity Колдонуучунун идентификатору Guest Конок Name Аты-жөнү Password Сырсөз domain Cancel Жокко чыгаруу OK МАКУЛ guest 游客(匿名登录) Registered users Катталган колдонуучулар name 用户名 password 密码 Remember the password Сырсөздү эстесеңер cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop Иш столуна шилтемени түзүү Create Link to... Шилтемени түзүү... Choose a Directory to Create Link Шилтемени түзүү үчүн каталогду тандоо Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Иш столуна шилтемени түзүү Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile NewFile Create file Файлды түзүү NewFolder Жаңы папкалар Create file error Файлдын катасы Peony::CustomErrorHandler Is Error Handled? Ката иштелип чыктыбы? Error not be handled correctly Ката туура иштетилбейт Peony::DefaultAcitonWidget No default app Дефолт программасы жок Peony::DefaultOpenWithWidget No default app Дефолт программасы жок Peony::DefaultPreviewPage Select the file you want to preview... Сиз алдын ала көргүңөр келген файлды тандаңыз... Select the file you want to preview Can not preview this file Can not preview this file. Бул файлды алдын ала көрүү мүмкүн эмес. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview Дефолт алдын ала көрүү This is the Default Preview of peony-qt Бул пеони-qt дефолт алдын ала көрүү Peony::DetailsPropertiesPage Name: Аты-жөнү: File type: Файл түрү: Location: Жайгашкан жери: yyyy-MM-dd, HH:mm:ss Йы-ММ-дд, HH:mm:ss Create time: Убакыт түзүү: Modify time: Убакытты өзгөртүү: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: Файл өлчөмү: Width: Туурасы: Height: Бийиктиги: Owner Ээси Owner: Ээси: Computer Компьютер Computer: Компьютер: %1 (this computer) %1 (бул компьютер) Unknown Белгисиз Can't get remote file information Файлдын алыскы маалыматын алуу мүмкүн эмес %1 px %1 px Peony::DirectoryView::IconView Icon View 图标视图 warn эскертүү This operation is not supported. Бул операция колдолбойт. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn эскертүү This operation is not supported. Бул операция колдолбойт. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark Китеп белгисине кошуу &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Жаңы папка Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name Аты-жөнү File Type Файл түрү File Size Файл өлчөмү New... 新建... Open in New Window Жаңы терезеде ачуу Open in New Tab Жаңы таблицада ачуу Open Ачуу Open failed Open directory failed, you have no permission! Open with... менен ачык... More applications... Кененирээк арыздар... Open %1 selected files %1 тандалган файлдарды ачуу New Жаңы Empty File Бош файл Folder Папка View Type Көрүү түрү Sort By Сорттоо Modified Date Өзгөртүлгөн дата Original Path Оригиналдуу жол Sort Order... 排序顺序... Ascending Order Жогорулатуу тартиби Mount MultiSelect Мультиселект Descending Order Түшүү тартиби Sort Preferences... 排序偏好... Folder First Папка биринчи Chinese First Кытай биринчи Show Hidden Жашыруун көрсөтүү Copy Көчүрмө File:"%1" is not exist, did you moved or deleted it? Файл:"%1" жок, көчүрдүңөрбү же жоготтуңузбу? Peony-Qt filesafe menu Extension Peony-Qt файлдар менюсун кеңейтүү Peony File Labels Menu Extension «Peony File» белгилери Меню кеңейтүүсү &Copy 复制(&C) Cut Кесүү Delete to trash Таштандыларды жоготуу Paste Паста Refresh Сергитүү Select All Бардыгын тандоо Properties Касиеттери format форматы Restore Калыбына келтирүү Delete Жоготуу Time Modified Path Sort Order Тартипти сорттоо Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Ырастоолорду сорттоо Cancel Error Ката File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever Түбөлүккө жоготуу Rename Атын алмаштыруу Select &All 全选(&A) Reverse Select Кайтарым тандоо P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash Таштандыларды тазалоо Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All Бардыгын тазалоо Open Parent Folder in New Window Жаңы терезеде ата - эненин папкасы ачылган Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager Кеңейтүүлөр менеджери Available extensions Жеткиликтүү кеңейтүүлөр Ok Макул Cancel Жокко чыгаруу Peony::FMWindow File Manager Файл менеджери advanced search өнүккөн издөө clear record так жазуу Loaing... Press Esc to stop a loading. Жылаңач... Жүктөлүүнү токтотуу үчүн Эскти басуу. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Жазуучу: Юэ Лан <lanyue@kylinos.cn> Мейхонг Хэ <hemeihong@kylinos.cn> Автордук укук (С): 2019-2020, Тяньцзинь КИЛИН маалыматтык технологиялар Ко., ЛТД. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo Ундо Redo Редо Peony Qt Пеони Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder Жаңы папка Peony::FileBatchRenameOperation File Rename error Файлдын атын алмаштыруу катасы Invalid file name %1%2%3 . Туура эмес файлдын аты %1%2%3 . File Rename warning Файлдын аты эскертүү Are you sure to hidden these files? Сиз бул файлдарды жашыруу үчүн сөзсүз? Rename file error Файлдын катасын алмаштыруу Peony::FileCopy Error in source or destination file path! Булактагы же көздөгөн файл жолундагы ката! Error when copy file: %1, can not copy special files, skip this file and continue? Көчүрмө файлы: %1, атайын файлдарды көчүрүп алууга, файлды калтырып, улантууга болбоду? Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 көчүрүү мүмкүн эмес, файл жок. Файл өзгөртүлүп берилдиби же көчүрүлдүбү? The dest file "%1" has existed! "%1" дест файлы бар! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32 файл системалары 4 ГБ мейкиндигин ээлеген бир файлды колдобойт! Error writing to file: Input/output error Файлга жазуу катасы: Кирүү/чыгаруу катасы Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 түзө алган жок. Сураныч, ал тамыр каталогунда болсо, же аппарат gphoto2 протоколун туура колдогон учурда камсыз кылуу. Failed to create %1. %1 түзө алган жок. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! Сураныч, аппарат алынып салынган-алынбаганын текшерип көргүлө! Write file error: There is no available disk space for device! Файлдын катасын жазыңыз: орнотмо үчүн жеткиликтүү диск мейкиндиги жок! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure Файлдын ачылышы Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel операция жокко чыгарылган Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 %1 папка түзүү ишке ашпады: %2 File copy error Файл көчүрмө катасы The file name exceeds the limit Файлдын аты чектен ашып түшөт Cannot opening file, permission denied! Файлды ачуу мүмкүн эмес, уруксат берүүдөн баш тартылды! File:%1 was not found. Файл:%1 табылган жок File System Файл системасы Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data Маалыматтар %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 орнотмодо орун калган жок. Файл өлчөмүн көчүрүү: %2 ГБ, Мейкиндик керек: %3 ГБ. Link file error Файлдын катасы шилтемеси Burning does not support replacement Күйгүзүү алмаштыруу колдобойт Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error Файл жоготуу катасы Delete file error Файлдын катасын жоготуу Invalid Operation! Can not delete "%1". Жараксыз операция! "%1" жоготууга болбоду. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled Сырсөз диалогу кутучасы жокко чыгарылган Message recipient disconnected from message bus without replying! Билдирүүнү алуучу жооп бербестен билдирүү автобусунан ажыратылды! Error Ката Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data маалыматтар folder Папка file файл text file тексттик файл Peony::FileInfoJob Trash Таштандылар Computer Компьютер Network Тармак Recent Акыркы Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer Компьютер Network Тармак Recent Акыркы Peony::FileItem Delete file Warning 删除文件警告 Warning Эскертүү Error Ката Open Link failed Open Link ишке ашпады File not exist, do you want to delete the link file? Файл жок, шилтеме файлын жоготууну каалайсызбы? Can not open path "%1",permission denied. Жол ачууга болбоду "%1", уруксат жокко чыгарылган. Can not find path "%1",are you moved or renamed it? "%1" жолун таба албайсызбы, көчүрүлгөнбү же өзгөртүлгөнбү? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) бала (рен) Symbol Link, Символдук шилтеме, System Disk File Name Файлдын аты Delete Date Датаны жоготуу Create Date Датаны түзүү Time Modified File Size Файл өлчөмү Original Path Оригиналдуу жол Path File %1 is existed in space, please not add file repeatly. Operation not supported Операция колдолбойт File Type Файл түрү Modified Date Өзгөртүлгөн дата Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label Delete All Label 删除所有标记 Label Management ... add "%1" "%1" кошуу Remove "%1" "%1" жоготуу Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... этикетка башкаруу ... Peony::FileLabelWidget label management ... этикетка башкаруу ... Label Management ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 ачылыш режими unknown белгисиз No application is set to open file "%1 %2" "%1%2" файлын ачууга арыз коюлбайт Still using the last opened application: Дагы эле акыркы ачылган арызды колдонуп: known белгилүү Open application is used by default: Ачык арыз демейде колдонулат: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Программалык борбордо бул файлды ачууга мүмкүн болгон иштемени издөөгө же компьютериңиздеги учурдагы иштемени тандоого болот. Other application: Башка арыз: Select application: Иштемени тандоо: Always open the %1%2 file with this application Бул иштеме менен дайыма %1%2 файлын ачуу Choose other application Башка иштемени тандоо Go to application center Арыз борборуна өтүү Ok Макул Cancel Жокко чыгаруу Desktop files(*.desktop) Иш столунун файлдары (*.desktop) Select Open Action Ачык иш-аракеттерди тандоо Select Тандоо Peony::FileLaunchAction Execute Directly Түздөн - түз аткаруу Execute in Terminal Терминалда аткаруу Detected launching an executable file %1, you want? %1 аткарыла турган файлды иштетүү аныкталды, сиз каалайсызбы? Delete file Warning 删除文件警告 Open Failed Ачык ишке ашпады Can not open %1, file not exist, is it deleted? %1 ачууга болбоду, файл жок, жок кылынабы? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission Уруксат жок File is not readable. Please check if file has read permisson. Файл окулбайт. Сураныч, файлдын жол берилгенин текшерип көргүлө. By Default App Дефолт тиркемеси боюнча Launch Options Иштетүү параметрлери Open Link failed Open Link ишке ашпады File not exist, do you want to delete the link file? Файл жок, шилтеме файлын жоготууну каалайсызбы? Can not open %1, Please confirm you have the right authority. %1 ачууга болбоду, сураныч, туура бийликке ээ экениңизди тастыктаңыз. Open App failed Ачык тиркеме ишке ашпады The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Байланышта болгон тиркеме өзгөртүлгөн же иштетилбеген, ошондуктан туура иштей албайт. Шилтеме файлын жоготууну каалайсызбы? Error Ката File original path not exist, are you deleted or moved it? Файл оригиналдуу жол жок, аны жоготуп же көчүрүп жатасызбы? Can not get a default application for opening %1, do you want open it with text format? %1 ачуу үчүн дефолт арызын ала албайсызбы, текст форматы менен ачууну каалайсызбы? Warning Эскертүү Can not open the file, application is disabled Файлды ачууга болбоду, арыз өчүрүлөт Peony::FileLinkOperation Symbolic Link Символдук шилте Link file error Файлдын катасы шилтемеси Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error Файлдын катасы File System Файл системасы Data Маалыматтар %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 орнотмодо орун калган жок. Файл өлчөмүн көчүрүү: %2 ГБ, Мейкиндик керек: %3 ГБ. File move error Файлды жылдыруу катасы Invalid move operation, cannot move a file into its sub directories. Жараксыз көчүрүү операциясы, файлды өзүнүн суб-каталогдоруна көчүрүү мүмкүн эмес. The file name exceeds the limit Файлдын аты чектен ашып түшөт Create file error Файлдын катасы Cannot opening file, permission denied! Файлды ачуу мүмкүн эмес, уруксат берүүдөн баш тартылды! File:%1 was not found. Файл:%1 табылган жок Invalid Operation. Жараксыз операция. System Disk Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error Файл жоготуу катасы Link file error Файлдын катасы шилтемеси Burning does not support replacement Күйгүзүү алмаштыруу колдобойт Burn failed 刻录失败 File delete 文件删除 Invalid Operation Жараксыз операция Peony::FileOperationAfterProgressPage &More Details Кененирээк маалымат Peony::FileOperationErrorDialog File Operation Error Файлдын иштөө катасы unkwon унквон null нул Error message: Ката билдирүү: Source File: Булак файлы: Dest File: Дест файлы: Ignore Четке кагуу Ignore All Бардыгын четке кагуу Overwrite Ашыкча жазуу Overwrite All Бардыгын ашыкча жазуу Backup Резервдик Backup All Резервдик бардык &Retry &, Ретри &Cancel Жокко чыгаруу Peony::FileOperationErrorDialogBase Close Жабуу Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace Алмаштыруу Ignore Четке кагуу Do the same Ошондой кылгыла <p>This location already contains the file '%1', Do you want to override it?</p> <p> Бул жерде "%1" файлы камтылган, аны жокко чыгаргыңар келеби? </p> Unexpected error from %1 to %2 %1 -ден %2-ге чейин күтүлбөгөн ката Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup Резервдик Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes Ооба No Жок Cancel 取消 Delete Жоготуу Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected Дисктин толук эмес экенин же корголгон жазууну жана файлдын корголбогонун текшерип көргүлө Peony::FileOperationErrorDialogWarning OK МАКУЛ Cancel Жокко чыгаруу Skip all Make sure the disk is not full or write protected and that the file is not protected Дисктин толук эмес экенин же корголгон жазууну жана файлдын корголбогонун текшерип көргүлө Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link Символдук шилте Copy Көчүрмө Move Rename Атын алмаштыруу Link Delete Жоготуу Delete Permanently 永久删除 Restore Калыбына келтирүү New Жаңы - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn Эскертүү '%1' is occupied,you cannot operate! «%1» ээлик кылат, сиз иштей албайсыз! No, go to settings 否,跳转到设置 OK МАКУЛ Cancel Жокко чыгаруу Do you want to put selected %1 item(s) into trash? Тандалган %1 элементти (с) таштандыга салгыңар келеби? Do not show again Дагы көрсөтпөгүлө File System Файл системасы System Disk Data Маалыматтар Insufficient storage space Сактоо мейкиндиги жетишсиз %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 орнотмодо орун калган жок. Файл өлчөмүн көчүрүү: %2 ГБ, Мейкиндик керек: %3 ГБ. Can't delete. Жоготуу мүмкүн эмес. You can't delete a file whenthe file is doing another operation Файл башка операцияны жүргүзгөн учурда файлды жогото албайсыз File Operation is Busy Файлдын иштеши иш менен алек There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Буга чейин бир же бир нече файлдар аткарылган. Сиздиноперация аны аткарууну күтөт / алар аткарылды. Эгерде сиз, чынында эле, файлдык операцияларды параллель аткарууну кааласаңыз, анда опцион менюсунда "Параллелге жол берүү" дефолт опциясын өзгөртө аласыз. The long name file is saved to %1 Файлдын узун файлы %1 сакталат Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: эсептөө: state: мамлекеттик: Peony::FileOperationProgressPage &More Details Кененирээк маалымат From: Андан: To: үчүн: Peony::FileOperationProgressWizard File Manager Файл менеджери &Cancel Жокко чыгаруу Preparing... Даярдануу... Handling... Иштетүү... Clearing... Клиринг... Rollbacking... Кайрып берүү... File Operation Файлдын иштеши A file operation is running backend... Файл операциясы артка чуркап жатат... %1 files, %2 %1 файл, %2 %1 done, %2 total, %3 of %4. %1 аткарылды, %2 жалпы, %3 %4. clearing: %1, %2 of %3 тазалоо: %1, %2 %3 copying... көчүрүү... Syncing... Синхрондоо... Peony::FilePreviewPage File Name: 文件名称: File Type: Файл түрү: Time Access: Убакыт жеткиликтүүлүгү: Time Modified: Убакыт өзгөртүлүп берилди: Children Count: Балдардын саны: Size: Өлчөмү: Location: Time Created: Убакыт түзүлгөн: Image resolution: Сүрөттүн чечими: color model: түс модели: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare колдонуучулар Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1х%2 %1 total, %2 hidden %1 жалпы, %2 жашыруун Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error Файлдын атын алмаштыруу катасы Invalid file name %1%2%3 . Туура эмес файлдын аты %1%2%3 . Are you sure to hidden this file? Сиз бул файлды жашыруу үчүн сөзсүз? When change the file suffix, the file may be invalid. Are you sure to change it ? Файлдын суффиксин өзгөртсө, файл жараксыз болушу мүмкүн. Аны өзгөртөсүңбү ? A file and a directory with the same name cannot replace each other The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning Файлдын аты эскертүү The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error Файлдын катасын алмаштыруу Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// trash:/// Trash file error Таштанды файлы катасы Invalid Operation! Can not trash "%1". Жараксыз операция! "%1" таштандысы болбой калды. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. Башкарылгыс конфликт бар. Сураныч, кайра иштетүү бинт текшерүү. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Файлдын катасы Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Жайылтуу Minimize Минималдуу Close Жабуу Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Ачуу Open With Менен ачуу More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Көчүрмө Save As file файл All File This location has no write permission.please change the storage location Label Properties Касиеттери Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name Аты-жөнү SideBar SideBar Menu Меню Create New Label Жаңы белги түзүү Delete Label Белгини жоготуу Display the following items in the identification area: (maximum of 6) Идентификациялык аймакта төмөнкү элементтердин чагылдырылышы: (максималдуу 6) Rename Атын алмаштыруу Edit Color Түстү оңдоо Delete This Label Бул белгини жоготуу Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" "%2"-да "%1" издөө File System Файл системасы Search results for all files marked in "%1" in "%2" Бардык "%1" аныкталган файлдарды "%2"менен издөөнүн жыйынтыктары &Copy Directory 拷贝路径(&C) Open In New Tab Жаңы таблицада ачуу Open In New Window Жаңы терезеде ачуу Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory Көчүрмө каталлериясы Peony::MountOperation Operation Cancelled Операция жокко чыгарылган Login failed, unknown username or password error, please re-enter! Кирүү ишке ашпады, белгисиз колдонуучу аты же сырсөз катасы, кайра кириңиз! Peony::NavigationToolBar Go Back Артка кайрыл Go Forward Алга илгерилетүү History Тарых Clear History Тарыхты тазалоо Cd Up Cd Up Refresh Сергитүү Peony::NewFileLaunchDialog Choose new application Жаңы иштемени тандоо Choose an Application to open this file Файлды ачуу үчүн иштемени тандоо apply now азыр колдонуу OK МАКУЛ Cancel Жокко чыгаруу Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? "%1%2" файлдарын кантип ачууну каалайсыз? Default open with: Дефолт менен ачык: Other: Башка: Choose other application Башка иштемени тандоо Go to application center Арыз борборуна өтүү Peony::PathEdit Go To Баруу Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 Максат: %1 Read and Write Окуу жана жазуу Readonly Окуу Group or User Топ же колдонуучу (Current User) (Учурдагы колдонуучу) The folder containing this file is protected, and only the file owner can modify the file. Current User Учурдагы колдонуучу Permissions modify tip Кеңештерди өзгөртүүгө уруксаттар The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Учурдагы файл же папка ACL уруксаттарын койгон. Колдонуучулар тобунун уруксаттарын өзгөртүү АКЛда белгиленген уруксаттардын колдонулушуна себеп болушу мүмкүн. Колдонуучулар тобунун уруксаттарын өзгөртүүнү улантууну каалайсызбы? Permission refinement settings Уруксатты тактоо параметрлери The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Учурдагы колдонуучу өнүккөн бөлүштүрүүнү орнотту. Эгерде сиз дагы эле уруксаттарды өзгөртүү зарыл болсо, өнүккөн бөлүштүрүү жеткиликтүү болбошу мүмкүн. Орнотууну улантууну каалайсызбы? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. Уруксат маалымат алуу мүмкүн эмес. (Me) (我) Others Башкалар Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. Бул файлдын жеткиликтүүлүгүн өзгөртө албайсыз. Me User 用户 Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok Макул Cancel Peony::PropertiesWindow Trash Таштандылар Recent Акыркы Selected Тандалды %1 Files %1 Файлдар usershare колдонуучулар Data Маалыматтар System Disk Properties Касиеттери Ok Макул Cancel Жокко чыгаруу Restore Калыбына келтирүү Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. Таштандыларды таштап жатканда диалогду тастыктоо. Origin Path: Келип чыккан жол: Deletion Date: Жоготуу датасы: Size: Өлчөмү: Original Location: Оригиналдуу жайгашуу: Peony::SearchBar Input the search key of files you would like to find. Сиз тапкыңар келген файлдардын издөө ачкычын киргизүү. Input search key... Издөө ачкычын киргизүү... advance search алдын ала издөө clear record так жазуу Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Clear Тазалоо all баары file folder файл папкасы image сүрөт video видео text file тексттик файл audio аудио others башкалар wps file wps файлы Peony::SharedFileLinkOperation Symbolic Link Символдук шилте The dest file "%1" has existed! "%1" дест файлы бар! Link file error Файлдын катасы шилтемеси Peony::SideBarCloudItem CloudStorage CloudStorage CloudFile CloudFile Peony::SideBarFavoriteItem Trash Таштандылар Recent Акыркы Quick Access Favorite Сүйүктүү KmreData КмреДата Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data Маалыматтар Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties Касиеттери Delete Symbolic Символдук маанини жоготуу Unmount Жеңүү Eject Чыгаруу Format Формат burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format форматы Peony::SideBarModel Shared Data 共享数据 Network Тармак Peony::SideBarPersonalItem Personal Жеке Peony::SideBarSeparatorItem (No Sub Directory) (Суб-каталог жок) Peony::StatusBar ; %1 folders ; %1 папкалар ; %1 files, %2 total ; %1 файл, %2 жалпы ; %1 folder ; %1 папкасы ; %1 file, %2 ; %1 файлы, %2 %1 selected %1 тандалды Peony::SyncThread notify 温馨提示 билдирүү Notify Peony::TagManagement General 通用 Mark Марк Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type Түрүн сорттоо File Name Файлдын аты File Type Файл түрү File Size Файл өлчөмү Modified Date Өзгөртүлгөн дата Open in New window Жаңы терезеде ачуу Open in new Tab Жаңы таблицада ачуу Ascending Көтөрүлүш Descending Түшүп Copy Көчүрмө Paste Паста Cut Кесүү Trash Таштандылар Clean Trash Таза таштандылар Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore Калыбына келтирүү Options Параметрлер Forbid Thumbnail Тыюу салынган Миниатюра Show Hidden Жашыруун көрсөтүү Resident in Backend Backend шаарында жашагандар Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Программа акыркы терезе жабылгандан кийин да иштей берсин. Бул кийинки иштетүү убактысын кыскартат, бирок, ошондой эле артта ресурстарды керектейт. &Help Жардам &About... &, жөнүндө... Peony Qt Пеони Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Жазуучу: Юэ Лан <lanyue@kylinos.cn> Мейхонг Хэ <hemeihong@kylinos.cn> Автордук укук (С): 2019, Тяньцзинь КИЛИН маалыматтык технологиялар Ко., ЛТД. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Type: Түрү: Duration: Size: Өлчөмү: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Эскертүү Peony::VolumeManager Error Ката ProgressBar starting ... баштап ... canceling ... жокко чыгаруу ... sync ... синхрондоо ... continue улантуу pause пауза close cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View Икона көрүнүшү Show the folder children as icons. Папкадагы балдарды белги катары көрсөткүлө. List View Тизменин көрүнүшү Show the folder children as rows in a list. Папкадагы балдарды тизмедеги катарлар катары көрсөткүлө. Basic Preview Page 基本 Basic Негизги Show the basic file properties, and allow you to modify the access and name. Файлдын негизги касиеттерин көрсөтөт, ошондой эле жеткиликтүүлүктү жана ысымды өзгөртүүгө мүмкүндүк берет. Permissions Page 权限 Permissions Уруксаттар Show and modify file's permission, owner and group. Файлдын уруксатын, ээсин жана тобун көрсөтүү жана өзгөртүү. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? Файл кайра иштетүү бинтине көчүрүү үчүн өтө чоң. Аны биротоло жоготууну каалайсызбы? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Бул файлдар кайра иштетүү бинтине көчүрүү үчүн өтө чоң. Бул %1 файлдарын биротоло жоготууну каалайсызбы? Delete Жоготуу Clean the Trash Таштандыларды тазалоо OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. Кайра иштетүү бинтин бош калтырып, файлдарды биротоло жоготууну каалайсызбы? Ал башталгандан кийин аларды калыбына келтирүүгө жол жок. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties Компьютер касиеттери Show the computer properties or items in computer. Компьютердин касиеттерин же элементтерин компьютерде көрсөтүү. Trash and Recent Properties Page 最近/回收 Trash and Recent Таштандылар жана жакында Show the file properties or items in trash or recent. Файлдын касиеттерин же буюмдарын таштандыларда же жакында көрсөтүү. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed Формат ишке ашпады YES ООБА Formatting successful! But failed to set the device name. Калыптандыруу ийгиликтүү! Бирок аппараттын атын орното алган жок. qmesg_notify qmesg_notify Format Формат Begin Format Форматты баштоо Close Жабуу Format operation has been finished successfully. Формат боюнча операция ийгиликтүү аяктады. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! Кечиресиз, формат операциясы ишке ашпай калды! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Бул томду түзүү ал тууралуу бардык маалыматтарды өчүрөт. Калыптандырганга чейин сакталган маалыматтардын баарын резервдик өтүнөбүз. Мындан ары да улангың келеби ? format форматы begin format 开始 close 关闭 File Manager Файл менеджери Notify Default search vfs of peony 默认文件搜索 Force unmount failed Күчтү жеңүү ишке ашпады Error: %1 Ката: %1 Data synchronization is complete,the device has been unmount successfully! Маалыматтарды синхрондоо аяктады,аппарат ийгиликтүү аткарылды! Unmount failed Кабарды жеңүү ишке ашпады Not authorized to perform operation. Операцияны аткарууга укуктуу эмес. Unable to unmount it, you may need to close some programs, such as: GParted etc. Аны жарыялай албай, кээ бир программаларды жабуу зарыл болушу мүмкүн, мисалы: GParted ж.б. Error: %1 Do you want to unmount forcely? Ката: %1 Күч менен жарыялагыңар келеби? Cancel Жокко чыгаруу Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase Аппаратты активдештирүү ишке ашпады: Туура эмес сөз айкашы The device has been mount successfully! аппарат ийгиликтүү монтаждалган! Eject device failed, the reason may be that the device has been removed, etc. Чыгаруу орнотмосу ишке ашпады, себеби аппарат алынып салынган болушу мүмкүн, ж.б. Data synchronization is complete and the device can be safely unplugged! Маалыматтарды синхрондоо аяктады жана аппаратты коопсуз өчүрүүгө болот! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed Чыгаруу ишке ашпады favorite сүйүктүү Favorites Жактыргандар File is not existed. Файл жок. Share Data Маалыматтар менен бөлүшүү Trash Таштандылар Recent Акыркы Operation not supported Операция колдолбойт The virtual file system does not support folder creation Виртуалдык файл системасы папка түзүүнү колдобойт Can not create a symbolic file for vfs location Vfs жайгашкан жери үчүн символдук файлды түзүү мүмкүн эмес Symbolic Link Символдук шилте Can not create symbolic file here, %1 Бул жерде символдук файлды түзүүгө болбоду, %1 Can not add a file to favorite directory. Файлды сүйүктүү каталогго кошууга болбойт. The virtual file system cannot be opened Виртуалдык файл системасын ачуу мүмкүн эмес Virtual file directories do not support move and copy operations Виртуалдык файл каталогдору кыймылды жана көчүрмө операцияларды колдобойт Default favorite vfs of peony Алдамчылыктын дефолт сүйүктүү vfs Details Майда-чүйдөсүнө Mark Марк mark this file. бул файлды белгилөө. Open With Менен ачуу open with. менен ачык. It need to synchronize before operating the device,place wait! Ал аппаратты иштеткенге чейин синхрондоо керек,place күтүү! Unable to discover the file, it may have been removed or deleted. permission denied уруксаттан баш тартылды file not found файл табылган жок duplicate дубликаттоо Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data маалыматтар System Disk label этикетка Computer Компьютер File System Файл системасы Data Маалыматтар Failed to open file "%1": insufficient permissions. "%1" файлын ачуу ишке ашпады: жетишсиз уруксаттар. File “%1” does not exist. Please check whether the file has been deleted. "%1" файлы жок. Файлдын жоготулган-жоготулбаганын текшериңиз. burn operation has been cancelled күйгүзүү операциясы жокко чыгарылган is busy! иш менен алек! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Бул файлды биротоло жоготууну каалайсызбы? Жоготуу башталгандан кийин файл калыбына келтирилбейт. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. Сиз бул %1 файлдарын биротоло жоготууну каалайсызбы? Жоготуу башталгандан кийин, бул файл калыбына келтирилбейт. Virtual file directories do not support move operations Виртуалдык файл каталогдору кыймыл операцияларын колдобойт test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok Макул Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData AppendBurnData Disc Type: Диск түрү: Device Name: Орнотмо аты: OK МАКУЛ Cancel Жокко чыгаруу Unknown Белгисиз Warning Эскертүү No burn data, please add! Эч кандай күйүү маалыматтар, сураныч, кошуу! The disc name cannot be set to empty, please re-enter it! Дисктин аты бош коюлбайт, кайра кириңиз! AppendBurnData operation has been finished successfully. AppendBurnData операциясы ийгиликтүү аяктады. Sorry, the appendBurnData operation is failed! Кечиресиз, тиркемеBurnData операциясы ишке ашпады! Failed Ишке ашпады Burning. Do not close this window Күйүп жаткан. Бул терезени жаппаңыз Burning this disc will append datas on it. Do you want to continue ? Бул дискти күйгүзүү ал тууралуу маалыматтарды таратат. Мындан ары да улангың келеби ? Burn Берн Begin Burning Күйгүзө баштоо Close Жабуу UdfBurn::UdfFormatDialog Format Формат Disc Type: Диск түрү: Device Name: Орнотмо аты: OK МАКУЛ Cancel Жокко чыгаруу Unknown Белгисиз Warning Эскертүү The disc name cannot be set to empty, please re-enter it! Дисктин аты бош коюлбайт, кайра кириңиз! Format operation has been finished successfully. Формат боюнча операция ийгиликтүү аяктады. Sorry, the format operation is failed! Кечиресиз, формат операциясы ишке ашпай калды! Failed Ишке ашпады Formatting. Do not close this window Форматтинг. Бул терезени жаппаңыз Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Бул дискти түзүү ал тууралуу бардык маалыматтарды өчүрөт. Калыптандырганга чейин сакталган маалыматтардын баарын резервдик өтүнөбүз. Мындан ары да улангың келеби ? Begin Format Форматты баштоо Close Жабуу UdfFormatDialog Format Формат Disc Type: Диск түрү: Device Name: Орнотмо аты: OK МАКУЛ Cancel Жокко чыгаруу Unknown Белгисиз Warning Эскертүү The disc name cannot be set to empty, please re-enter it! Дисктин аты бош коюлбайт, кайра кириңиз! Format operation has been finished successfully. Формат боюнча операция ийгиликтүү аяктады. Sorry, the format operation is failed! Кечиресиз, формат операциясы ишке ашпай калды! Failed Ишке ашпады Formatting. Do not close this window Форматтинг. Бул терезени жаппаңыз Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Бул дискти түзүү ал тууралуу бардык маалыматтарды өчүрөт. Калыптандырганга чейин сакталган маалыматтардын баарын резервдик өтүнөбүз. Мындан ары да улангың келеби ? Begin Format Форматты баштоо Close Жабуу progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_ug_CN.ts0000664000175000017500000114077115154271106021521 0ustar fengfeng ColorPushButton label management ... بەلگە باشقارىش ... Label Management ... Remove "%1" %1 نى چىعارىپ قويوت delete "%1" 删除“%1” add "%1" %1 نى قوشوت ConnectServerDialog Connect to Sever مۇلازىمەتىرگە ۇلانۇۇ Domain تور ناامى Password جاشىرۇۇن نومۇردۇ ۅزگۅرتۉش Save Password جاشىرۇۇن نومۇردۇ ساقتوو User ىشتەتۉۉچۉ Anonymous اتى جوق Ok ماقۇل Cancel ارعادان قالتىرىش DiscControl is busy! ەرەكچە الدىراش! is busy! ەرەكچە الدىراش! not support udf at present. ازىرچا udf نى قولدوبويت. unmount disc failed before udf format. udf فورماتتونۇن مۇرۇن دىسكاسىن ۅچۉرۉۉ جەڭىلۉۉ بولدۇ . is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf فورماتى جەڭىلۉۉ بولدۇ preparation failed before DVD-RW udf format. DVD-RW udf فورماتتونۇن مۇرۇنقۇ داياردىق جەڭىلۉۉ بولدۇ . FileLabelModel Red قىزىل Orange قىزغۇچ سارى تۉس Yellow سارى تۉس Green جاشىل Blue كۅك Purple گۉلگۉن ، قىزعىلت كۅك تۉس Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error قاتاا Label or color is duplicated. بەلگە كۅرۉنۉشتۅرۉ تۉس تەكرارلىنىدۇ. FileOperationHelper Burn failed ويۇۇ جەڭىلۉۉ بولدۇ Format_Dialog Dialog ۇباقىت ۅزگۅرتۉش rom_size rom_رازمېرى system ساامالىق vfat/fat32 vfat/fat32 exfat exfat ۅجۅت بۅلۉشتۉرۉ جادىبالى ntfs ۅجۅت ساامالىعى vfat VFAT ext4 ext4 ۅجۅت ساامالىعى device_name شايمان-ناامى clean it total پۉتكۉلدۅي تازالوو ok بەكىتۉۉ close بەكىتىش TextLabel تەكىست ەنى ، تامعاسى qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format فورماتى Rom size: كۅلۅمۉ: Filesystem: ۅجۅت ساامالىعى : Disk name: دىسكا اتى : Completely erase(Time is longer, please confirm!) پۉتكۉلدۅي ۅچۉرۉۉ (ۇزۇن ۇباقىت كەتەت، ايقىنداڭ!) Set password جاشىرۇۇن نومۇر بەكىتۉۉ Set password for volume based on LUKS (only ext4) LUKS عا نەگىزىنەن تومۇنۇن جاشىرۇۇن نومۇرۇن بەلگىلۅۅ (جالاڭ عانا ext 4 مەنەن ەلە چەكتەلەت) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ext 4 ۅجۅت ساامالىعىنا فورماتتاش باشقا ىشتەتۉۉچۉلۅردۉن USB قوزعوتقۇچتۇ وقۇي الباستىعى كۅرۉنۉشتۅرۉ يازالماسلىقىنى كەلىترىپ ۅندۉرۉشۉ مۉمكۉن Cancel ارعادان قالتىرىش OK ايقىندوو Data ساندۇۇ بايانداما Error locking device: Failed to deactivate device: Device or resource busy Warning ەسكەرتۉۉ Device name cannot start with a decimal point, Please re-enter! جابدۇۇسۇنۇن ناامى ، وندۇق كەسىر چەكىتىنەن باشتالباستىعى كەرەك قايرا كىرگىزىڭ! Enter Password: جاشىرۇۇن نومۇردۇ كىرگىزىڭ: Password too short, please retype a password more than 6 characters جاشىرۇۇن نومۇر ۅتۅ قىسقا، 6 تامعانىن ئاشىدىغان جاشىرۇۇن نومۇردۇ قايرا كىرگىزىڭ %1/sec, %2 remaining. %1 سىكونت، اشىپ قالعان %2. over one day بىر كۉندۅن اشىپ كەتتى getting progress... ىلگەرلۅۅ قولعو كەلتىرىلمەكتە... Error قاتاا Block not existed! رايون ،چۅلكۅم بۅلۅگۉ باربولۇۇسۇ ەمەس ! Formatting. Do not close this window فورماتتاش . بۇل كۅزۅنۅكتۉ تاقىۋەتمەڭ KyFileDialogRename Renaming "%1" قايرا اتاق بەرىلىپ جاتات %1 Renaming failed, the reason is: %1 قايرا اتاق بەرۉۉ جەڭىلۉۉ بولدۇ ، سەبەبى :%1 Filename too long ۅجۅت اتى ۅتۅ ۇزۇن Copying "%1" %1 ۅرگۅلۅنۉپ جاتات To "%1" %1 تۉن Copying failed, the reason is: %1 ۉلگۉسۉن الۇۇ جەڭىلۉۉ بولدۇ ، سەبەبى :%1 Moving "%1" جۅتكۅلۉپ جاتات %1 Moving failed, the reason is: %1 جۅتكۅۅ جەڭىلۉۉ بولدۇ ، سەبەبى :%1 File operation error: ۅجۅت ماشعۇلاتىنداقى قاتاالىق : The reason is: %1 سەبەبى :%1 Truncation قىيىش Save ساقتوو All applications باردىق قوللىنىشچانلىق Cancel ارعادان قالتىرىش Apply ۅتۉنۉچ جاسوو ،اتقارۇۇ Bytes سۅز مۇۇنۇ Front truncation الدى بۅلۅگۉ كېسىۋېتىلگەن. Post truncation كېسىۋەتكەندىن كىيىن. Description: Skip copying files of the current type تۉشۅندۉرۉش :گەزەكتەكى تۉردۅكۉ ۅجۅتۉن كۅچۉرۉۉدۅن اتتاپ ۅتۉش truncate interval كەسمە ارالىق . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Explanation: When renaming a file name, ensure it is within %1 bytes and Explanation: Truncate the portion of the file name that exceeds 225 bytes and select ەسكەرتۉۉ:ۅجۅت اتىنداقى 225 بايتتىن اشىپ كەتكەن ،قوروعون بۅلۅگۉن كەسىپ جىبەرۉۉ، اندان تانداپ Description: By default, save to "%1/扩展". تۉشۅندۉرۉش :ويۇنداقى ابالدا، %1/گىچە ساقتوو كەرەك. modify the name اتاعىن ۅزگۅرتۉش Explanation: When renaming a file name, ensure it is within 255 bytes and تۉشۅندۉرۉش :ۅجۅت اتاعىن قايرا اتتاعاندا، انىن 255 بايت ىچىندە بولۇشۇنا ەەبولۇۇ قىلىڭ، انىن ۉستۉنۅن Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip ئاتلاندۇق Skip All 全部跳过 Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Please enter a new name 请输入文件名 OK ايقىندوو MainProgressBar File operation ۅجۅت ماشعۇلاتى starting ... باشلىنىۋاتىدۇ ... cancel all file operations باردىق ۅجۅت ماشعۇلاتىنى ارعادان قالتىرىش Minimize كىچىرەيتۉۉ Close جابۇۇ Are you sure to cancel all file operations? سىز باردىق ۅجۅت ماشعۇلاتىنى ارعادان قالتىرۇۇنۇ جەزملەشتۈرەلەمسىز؟ Are you sure want to cancel all file operations چىنعى باردىق ۅجۅت ماشعۇلاتىنى ارعادان قالدۇرماقچىمۇ؟ OK ايقىندوو File Operation ۅجۅت ماشعۇلاتى Cancel ارعادان قالتىرىش Calculating time continue جالعاشتىرىش pause ۇباقتىنچا توقتوتۇۇ canceling ... نازاردان ساق قىلىنىپ جاتات... sync ... شاي قەدەملەش ... %1Mb/s Est. time left: %2 MessageDialog Peony ۅجۅت باشقارعۇۇچۇ Forcibly pulling out the device may cause data loss or device exceptions! اسپاپتى زوردۇق مەنەن تارتىپ ۅندۉرۉش ساندۇۇ باياندامالاردى كەلىترىپ ۅندۉرۉش ى مۉمكۉن جوعولۇپ كەتۉۉ كۅرۉنۉشتۅرۉ زاپجاستار بۅتۅنچۅ بولۇش ! OtherButton Other queue باشقا ئۆچرەتلەر Other Queue Peony::AdvanceSearchBar Key Words الىعىلىقتۇۇ سۅز input key words... الىعىلىقتۇۇ سۅز كىرگىزۉۉ... Search Location ىزدۅۅ وردۇ choose search path... ىزدۅۅ جولۇن تانداڭ... browse كۅرۉۉ File Type ۅجۅت تۉرۉ Choose File Type ۅجۅت تىبىن تانداڭ Modify Time تۉزۅتۉۉ ۇباقتى Choose Modify Time تۉزۅتۉۉ ۇباقتىن تانداڭ File Size ۅجۅت چوڭدۇعۇ Choose file size ۅجۅت چوڭدۇعۇن تانداڭ show hidden file جاشىرىن ۅجۅتۉن كۅرسۅتۉۉ go back قايتۇۇ hidden advance search page جاشىرىن جوعورۇ چەكتۉۉ ىزدۅۅ بىتى file name ۅجۅت ناامى content مازمۇن search ىزدۅۅ start search ىزدەشتى باشتوو Select path جولدۇ تانداش Operate Tips ماشقۇلدانۇۇ ەسكەرتمەسى Have no key words or search location! تۉيۉندۉۉ سۅز كۅرۉنۉشتۅرۉ ىزدۅۅ وردۇ جوق! Search file name or content at least choose one! ۅجۅت اتى كۅرۉنۉشتۅرۉ مازمۇنۇن ىزدۅۅ ۉچۉن از دەگەندە بىردى تانداڭ! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... ىزدۅۅ مازمۇنۇ ... Search File Peony::AdvancedPermissionsPage Permission refinement settings ۇقۇق گۅۅلۅمۉن ئىنچىكىلەشتۈرۈپ قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ . Permission refinement settings tip ۇقۇق گۅۅلۅمۉن ئىنچىكىلەشتۈرۈپ قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ ەسكەرتمەسى Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ۇقۇق گۅۅلۅمۉ قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ نەگىزگى ۇقۇق گۅۅلۅمۉ بولعون ابونتتار توبۇنۇن ۇقۇق گۅۅلۅمۉ نىڭ ۅزگۅرۉنۉ كەلىترىپ چىعارات. ACL ۇقۇقىنى جالعاشتۇۇ قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ كەرەكبى؟ User ىشتەتۉۉچۉ Read وقۇۇ Write جازۇۇ Executable اتقارماق جاساعالى بولوتۇرعان ۅجۅت delete ۅچۉر Inherit permission مىراستىق جاسوو ،اتقارۇۇ ۇقۇق گۅۅلۅمۉ Add قوشۇۇ Apply ۅتۉنۉچ جاسوو ،اتقارۇۇ Cancel ارعادان قالتىرىش Peony::AllFileLaunchDialog Choose new application جاڭى قولدونۇشچان پراگراممانى تانداڭ Choose an Application to open this file بىر ئەپنى تانداپ بۇل ۅجۅتۉن اچىڭ apply now داروو ۅتۉنۉچ قىلىڭ OK ايقىندوو Cancel ارعادان قالتىرىش Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon قاسىيەت بەلگىنى تانداش Type: تۉرۉ: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name ات-تەك اتى Location وردۇ move 移动 symbolLink بەلگە ۇلانماسى Folder ۅجۅت قىپچىعىچ Include: ۅز ىچىنە الات: Move Open with: اچۇۇ ارعاسى: Description: سۉرۅتتۅ: Select multiple files كۅپ ۅجۅتۉن تانداڭ Size: چوڭ - كىچىكتىگى : Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: بوشتۇقتان كەرەك قىلىش ابالى: Time Create: قۇرۇلعان ۇباقتى: Time Modified: تۉزۅتۉۉ كىرگىزۉۉ ۇباقتى: Time Access: ۇباقىت زىياراتى: Readonly جالاڭ عانا وقۇۇعا بولوت Hidden جاشىرىن Readonly (just applied by subfiles) Property: قاسىيەتىن: usershare بۇل ،ۇشۇل اسپاپتان ھەمبەھىرلىنىش %1 (%2 Bytes) %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. 1 MB نان كىچىك سۉرۅتتۉ تانداڭ. Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 بايت %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 ۅجۅت، %2 ۅجۅت قىپچىعىچ Can't get remote file information ىرااق ساپاردۇۇ ۅجۅت ۇچۇرۇنا ەە بولعولۇ بولبويت . %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU ناامى : CPU Core: CPU يادروسى: Memory Size: ىچكى ساقتاعىچتىن چوڭ كىچىكتىگى : User Name: ىشتەتۉۉچۉ اتى : Desktop: شىرە بەتى: You should mount this volume first سىز الدىن بۇل ورومدۇ قاچالاشىڭىز كەرەك. Name: ناامى : File System ۅجۅت ساامالىعى Data ساندۇۇ بايانداما System Disk Total Space: بااردىعى بوشتۇق: Used Space: ىشتەتىلگەن بوشتۇق: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: ىشتەتكەلى بولوتۇرعان بوشتۇق: Type: تۉرۉ: Kylin Burner Kylin كۆيدۈرگۈچى Open with: اچۇۇ ارعاسى: Unknown بەلگىسىز Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server مۇلازىمەتىرگە ۇلانۇۇ Ip Ip Port پورت Type تۉرۉ Personal Collection server: جەكەلىك جىيىپ ساقتوو سان قاينارى: Add قوشۇۇ Delete ۅچۉرۉۉ Connect ۇلانۇۇ Ip input error, please re-enter! Ip قاتاا كىرىپ قاپتۇ، قايرا كىرگىزىڭ! Port input error, please re-enter! ووزدۇ قاتاا كىرگىزۉۉ، قايرا كىرگىزىڭ! add 添加 delete 连接 删除 connect 连接 Warning ەسكەرتۉۉ ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user ئابوننتلارغا كىرۉۉ Please enter the %1's user name and password of the server. سان قاينارىنىن %1 كەرەكتۅۅچۉ ناامى جانا جاشىرۇۇن نومۇرۇن كىرگىزىڭ. User's identity ئابۇنىچىلار كىمدىگى Guest قونوق (اتى جوق تىزىمدەتىش ) Name ات-تەك اتى Password جاشىرۇۇن نومۇردۇ ۅزگۅرتۉش domain Cancel ارعادان قالتىرىش OK ايقىندوو guest 游客(匿名登录) Registered users تىزىمگە الدىرعان كەرەكتۅۅچۉ name 用户名 password 密码 Remember the password جاشىرۇۇن نومۇردۇ دىلدە تۇقتۇۇ cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop شىرە بەتىنە ۇلانۇۇ قۇرۇۇ Create Link to... قۇرۇۇ ۇلانماسى. . . Choose a Directory to Create Link ۇلانۇۇ قۇرماقچى بولعون مازمۇۇندۇ تانداڭ Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop شىرە بەتىنە ۇلانۇۇ قۇرۇۇ Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile جاڭى قۇرۇلعان ۅجۅت Create file ۅجۅت قۇرۇۇ NewFolder جاڭى قاتتاعىچ Create file error ۅجۅت قاتالىعى پايدا قىلۇۇ جاسوو ،اتقارۇۇ Peony::CustomErrorHandler Is Error Handled? قاتاا بىر تاراپ قىلىنىپ بولدۇبۇ؟ Error not be handled correctly قاتاا بىر تاراپ جاسوو ،اتقارۇۇ تۇۇرا ەمەس Peony::DefaultAcitonWidget No default app ويۇنداقى ئەپ جوق Peony::DefaultOpenWithWidget No default app ويۇنداقى ئەپ جوق Peony::DefaultPreviewPage Select the file you want to preview... الدىن كۅرمۅكچۉ بولعون ۅجۅتۉن تانداڭ... Select the file you want to preview Can not preview this file Can not preview this file. بۇل ۅجۅتۉن الدىن كۅرگـۅلۉ بولبويت . Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview ويۇنداقى الدىن كۅرۉۉ This is the Default Preview of peony-qt بۇل مۇدەن qt نىڭ ويۇنداقى الدىن كۅرۉۉ Peony::DetailsPropertiesPage Name: اتاق: File type: ۅجۅت تۉرۉ: Location: وردۇ: yyyy-MM-dd, HH:mm:ss yyyy-MM-dd, HH:mm:ss Create time: ۇباقىت قۇرۇۇ: Modify time: ۇباقتىن ۅزگۅرتۉش : yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: ۅجۅت چوڭدۇعۇ Width: گەڭدىگى : Height: بئيىكتىگى : Owner ەەسى Owner: ەەسى : Computer كومپىيۇتەر Computer: كومپىيۇتەر: %1 (this computer) %1 (بۇل كومپىيۇتەر) Unknown بەلگىسىز Can't get remote file information ىرااق ساپاردۇۇ ۅجۅت ۇچۇرۇنا ەە بولعولۇ بولبويت . %1 px %1 پىكىسل Peony::DirectoryView::IconView Icon View 图标视图 warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇنۇ قولدوبويت. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇنۇ قولدوبويت. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark خەتكۈشكە قوشۇپ قويۇڭ &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭى ۅجۅت قىپچىعىچ Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name ات-تەك اتى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ New... 新建... Open in New Window جاڭى كۅزۅنۅكتۅ اچۇۇ Open in New Tab جاڭى بەلگىنى اچىڭ Open اچۇۇ Open failed Open directory failed, you have no permission! Open with... اچۇۇ ارعاسى... More applications... داعى ەلە كۅپ ئەپلەر.... Open %1 selected files %1 لىق سۉرۅتتۉ اچۇۇ New جاڭى Empty File كۅڭدۅي ۅجۅت Folder ۅجۅت قىپچىعىچ View Type كۅرۉنۉش تۉرۉ Sort By ىرەتكە تىزۉۉ نەگىزى Modified Date ۅزگۅرتۉلگۅن ۇباقتى Original Path العاچى جول Mount Sort Order... 排序顺序... Ascending Order جوعورۇلو تارتىبى Peony-Qt Filesafe Menu Extension مۇدەن qt ۅجۅت قووپسۇزدۇق تىزىمدىگى كېڭەيتىلمىسى MultiSelect كۅبۉن تانداش Descending Order تۅمۅندۅش تارتىبى Sort Preferences... 排序偏好... Folder First ۅجۅت قىپچىعىچ الدى مەنەن Chinese First حانزۇ تىلىن الدىنقى ورۇنعا قويۇش Show Hidden جاشىرىن تۉرلۅردۉ كۅرسۅتۅت Copy گۅچۉرۉش File:"%1" is not exist, did you moved or deleted it? ۅجۅت:%1 باربولۇۇسۇ ەمەس ، انى يۆتكىۋەتتىڭىزمۇ كۅرۉنۉشتۅرۉ ئۆچۈرۋەتتىڭىزمۇ؟ Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension مودەن ۅجۅت ەنى ، تامعاسى تىزىمدىگى كېڭەيتىلمىسى &Copy 复制(&C) Cut قىيىش Delete to trash شىپىرىندى تۇڭىغا تاشلىۋېتىش Paste چاپتوو Refresh جاڭىلوو Select All باردىعىن تانداڭ Properties سۉرۅت قاسىيەتىن format فورماتتاش Restore العاچىنا كەلتىرۉۉ Delete ۅچۉرۉۉ Time Modified Path Sort Order ىرەتكە تىزۉۉ تارتىبى Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences رەتلەشنىڭ باش تاندالماسى Cancel Error قاتاا File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever تۉبۅلۉك ۅچۉرۉۉ Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Select &All 全选(&A) Reverse Select تەسكەرى باعىتتۇۇ تانداش P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash & شىپىرىندى ساندىعىن تازالوو Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All باردىعىن تازالوو Open Parent Folder in New Window جاڭى كۅزۅنۅكتۅ اتا ۅجۅت قىپچىعىچتى اچۇۇ Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager ئۇزارتىلغان قۇربات ، جۅندۅم باشقارىش تارتىبى Available extensions ىشتەتكەلى بولوتۇرعان گەڭەيتىش Ok ماقۇل Cancel ارعادان قالتىرىش Peony::FMWindow File Manager ۅجۅت باشقارعىچ advanced search جوعورۇ چەكتۉۉ ىزدۅۅ clear record تىزىمدىكتى تازالوو Loaing... Press Esc to stop a loading. قارىز بەرۉۉ... Esc كۇنۇپكاسىن باسىپ جۉكتۅشتۉ توقتوتۇڭ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. اپتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2019-يىلىدىن 2020-يىلىغىچە، تيەنجىن KYLIN ۇچۇر تەحنىكا چەكتۉۉ شەركەتى، چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo اچۇۇ Redo قايرا-قايرا Peony Qt Peony Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder جاڭى ۅجۅت قىپچىعىچ Peony::FileBatchRenameOperation File Rename error ۅجۅتكۅ قايرا ات قويۇش قاتالىعى Invalid file name %1%2%3 . ەسەپ ەمەس ۅجۅت ناامى %1 %2 %3. File Rename warning ۅجۅتكۅ قايرا اتاق بەرۉۉ ەسكەرتىشى Are you sure to hidden these files? سىز بۇل ۅجۅتتۅرۉن جاشىرۇۇنۇ جەزملەشتۈرەلەمسىز؟ Rename file error ۅجۅتكۅ قايرا ات قويۇش قاتالىعى Peony::FileCopy Error in source or destination file path! كەلۉۉ جەر جانى كۅرۉنۉشتۅرۉ نىشان ۅجۅت جولۇ قاتاا! Error when copy file: %1, can not copy special files, skip this file and continue? ۅجۅت كۅچۉرگۅندۅ قاتاالىق كۅرۉلۉۉ:%1، ۆزگۆچۆ ۅجۅتنى كۅبۅيتكۅلۉ بولبودۇ، بۇل ۅجۅتتىن اتتاپ ۅتۉپ جالعاشتىراسىزبى؟ Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 كۅبۅيتكۅلۉ بولبويت ، ۅجۅت باربولۇۇسۇ ەمەس . ۅجۅتكە قايرا اتاق بېرىلدىمۇ كۅرۉنۉشتۅرۉ يۆتكەلدىمۇ؟ The dest file "%1" has existed! نىشان ۅجۅتتۉن %1 ى باربولۇۇسۇ ! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT 32 ۅجۅت ساامالىعى 4 GB نان ارتىق بوشتۇقتۇ ئىگىلەيدىغان جەكە ۅجۅتنى قولدوبويت! Error writing to file: Input/output error ۅجۅت جازعاندا قاتاالىق :كىرگىزۉۉ/ۅندۉرۉش قاتاالىق ى Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 نى قۇرۇۇعا بولبويت . انىن جىلدىز تىزىمدىگىندە كۅرۉنۉشتۅرۉ ەمەستىگىنە ەەبولۇۇ قىلىڭ، كۅرۉنۉشتۅرۉ شايمان gphoto 2 كەلىشىمدى تۇۇرا قوللامدۇ جوق. Failed to create %1. %1 نى قۇرۇۇعا بولبويت . Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! جابدۇۇسۇنۇن ئېلىۋېتىلگەن كۅرۉنۉشتۅرۉ ئېلىۋېتىلمىگەنلىكىنى تەكشەرىپ باعىڭ! Write file error: There is no available disk space for device! ۅجۅت جازۇۇ قاتالىعى:شايماندا ىشتەتكەلى بولوتۇرعان ماگىنىتتۉ دىسكا بوشتۇعۇ جوق! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure ۅجۅتۉن اچۇۇ جەڭىلۉۉ بولدۇ Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel ماشقۇلدانۇۇ ارعادان قالتىرىلدى Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 ۅجۅت قىپچىعىچ قۇرۇۇ %1 جەڭىلۉۉ بولدۇ :%2 File copy error ۅجۅتۉن قاتاا گۅچۉرۉپ قويۇش The file name exceeds the limit ۅجۅت ناامى چەكتەن اشىپ كەتتى Cannot opening file, permission denied! ۅجۅتۉن اچقالى بولبودۇ، ۇقۇق گۅۅلۅمۉ قاتار اتقارىلدى ! File:%1 was not found. تابىلباعان ۅجۅت:%1. File System ۅجۅت ساامالىعى Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data ساندۇۇ بايانداما %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا قالدىق بوشتۇق جوق. كۅبۅيتۉلگۅن ۅجۅت چوڭدۇعۇ :%2 GB، ەتىياجدۇۇ بوشتۇق:%3 GB. Link file error جالعانما ۅجۅت قاتالىعى Burning does not support replacement كۆيدۈرگۈچى الماشتىرۇۇنۇ قولدوبويت. Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error ۅجۅتۉن قاتاا ۅچۉرۉۉ Delete file error ۅجۅتۉن ۅچۉرۉۉ قاتالىعى Invalid Operation! Can not delete "%1". ەسەپ ەمەس ماشقۇلدانۇۇ ! %1 نى ۅچۉرگۅلۉ بولبويت . Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled جاشىرۇۇن نومۇر دىيالوگ كەرەنەسى ارعادان قالتىرىلدى Message recipient disconnected from message bus without replying! ۇچۇردۇ قابىلدوو قىلۇۇچۇ جووپ قايتۇرمىغاندا، ۇچۇر باش لەنىياسى مەنەن ۇلانۇۇ ۉزۉلۉپ قالدى Error قاتاا Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data ساندۇۇ بايانداما folder ۅجۅت قىپچىعىچ file ۅجۅت text file تەكىست ۅجۅتۉۉ Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ەسكەرتۉۉ Error قاتاا Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتنى ۅچۉرۅسۉزبۉ؟ Can not open path "%1",permission denied. %1 جولدۇ اچقالى بولبويت ، ۇقۇق گۅۅلۅمۉ قاتار اتقارىلدى . Can not find path "%1",are you moved or renamed it? %1 جولدۇ تابالباعان ، ال يۆتكەلدىمۇ كۅرۉنۉشتۅرۉ قايرا اتاق بېرىلدىمۇ؟ Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) بالا ۅجۅت Symbol Link, بەلگە ۇلانماسى، System Disk File Name ۅجۅت ناامى Delete Date ساندۇۇ باياندامانى ۅچۉرۉۉ Create Date ساندۇۇ بايانداما قۇرۇۇ Time Modified File Size ۅجۅت چوڭدۇعۇ Original Path العاچى جول Path File %1 is existed in space, please not add file repeatly. Operation not supported ماشقۇلدانۇۇ قولدوبويت File Type ۅجۅت تۉرۉ Modified Date ۅزگۅرتۉلگۅن ۇباقتى Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label ۅجۅت ەنىن قوشۇۇ . Delete All Label باردىق ەندەردى ۅچۉرۉپ اتىڭ Label Management ... add "%1" %1 نى قوشوت Remove "%1" %1 نى چىعارىپ قويوت Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... بەلگە باشقارىش ... Peony::FileLabelWidget label management ... بەلگە باشقارىش ... Label Management ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 لىق اچىلىش ابالى unknown بەلگىسىز No application is set to open file "%1 %2" ەچقانداي ئەپ ۅجۅتۉن اچۇۇ ۉچۉن %1 %2 جاساپ تەڭشەلبەگەن Still using the last opened application: داعى ەلە الدىنقى ىرەت اچىلعان ئەپنى ىشتەتىپ جاتات: known بەلگىلۉۉ Open application is used by default: ويۇنداقى ابالدا Open ئەپ تەتىگىن ىشتەتىش : You can search in the Software Center for an application that can open this file, or select an existing application on your computer. سىز جۇمشاق تەتىك بوربورۇنان بۇل ۅجۅتۉن اچقالى بولوتۇرعان ئەپنى ىزدەسەڭىز بولوت ، كۅرۉنۉشتۅرۉ كومپىيۇتەردەگى ازىر بار بولعون قولدونۇشچان پىروگىراممالاردى تانداڭ. Other application: باشقا ئەپلەر: Select application: ئلتىماستى تانداڭ: Always open the %1%2 file with this application باشتان ارقاسى بۇل ئەپنى ىشتەتىپ %1 %2 ۅجۅتۉن اچىڭ Choose other application باشقا ئەپنى تانداش Go to application center ئەپ بوربورۇنا بەرۉۉ Ok ماقۇل Cancel ارعادان قالتىرىش Desktop files(*.desktop) (*.desktop) شىرە بەتى ۅجۅتتۅرۉ Select Open Action اچۇۇ ماشعۇلاتىنى تانداڭ Select تانداش Peony::FileLaunchAction Execute Directly ۅجۅت قىپچىعىچ Execute in Terminal تەكىست ۅجۅتۉۉ Detected launching an executable file %1, you want? تىكەلەي ، تۉز ەلە اتقارماق جاسوو ،اتقارۇۇ . Delete file Warning 删除文件警告 Open Failed اچۇۇ جەڭىلۉۉ بولدۇ Can not open %1, file not exist, is it deleted? %1 نى اچقالى بولبودۇ، ۅجۅت باربولۇۇسۇ ەمەس ، ئۆچۈرۈلدىمۇ؟ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ۇقۇق بەرىلبەگەن File is not readable. Please check if file has read permisson. ۅجۅتۉن وقۇعالى بولبويت . ۅجۅتۉنڭ وقۇۇ ۇقۇعۇنا ەە بولموق كۅرۉنۉشتۅرۉ ەە بولموق ەمەستىگىن تەكشەرىپ باعىڭ. By Default App ويۇنداقى قولدونۇشچان پراگرامما Launch Options قوزعوتۇۇ تاندالماسى Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتنى ۅچۉرۅسۉزبۉ؟ Can not open %1, Please confirm you have the right authority. %1 نى اچقالى بولبودۇ، سىزدىن تۇۇرا ۇقۇق چۅلكۅمۉڭۉز باردىعىن ايقىنداڭ. Open App failed ئەپنى اچۇۇ جەڭىلۉۉ بولدۇ The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? جالعانعان ئەپلەر ۅزگۅرتۉلدۉ كۅرۉنۉشتۅرۉ ۅچۉرۉلدۉ، وشوعو نورماال قىزمات جاساعالى بولبويت . جالعانما ۅجۅتۉن ۅچۉرۅسۉزبۉ؟ Error قاتاا File original path not exist, are you deleted or moved it? ۅجۅتتۉن العاچى جولۇ، باربولۇۇسۇ ەمەس انى ئۆچۈرۋەتتىڭىزمۇ كۅرۉنۉشتۅرۉ يۆتكىۋەتتىڭىزمۇ؟ Can not get a default application for opening %1, do you want open it with text format? %1 نى اچىشقا ىشتەتىلەتۇرعان ويۇنداقى قولدونۇشچان پىروگىرامماعا ەە بولعولۇ بولبويت ، تەكىست كەبەتەسىندە انى اچۇۇ كەرەكبى؟ Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link بەلگە ۇلانماسى Link file error جالعانما ۅجۅت قاتالىعى Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error ۅجۅتۉن جۅتكۅۅ قاتالىعى File System ۅجۅت ساامالىعى Data ساندۇۇ بايانداما %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا قالدىق بوشتۇق جوق. كۅبۅيتۉلگۅن ۅجۅت چوڭدۇعۇ :%2 GB، ەتىياجدۇۇ بوشتۇق:%3 GB. File move error ۅجۅت جۅتكۅۅ قاتالىعى Invalid move operation, cannot move a file into its sub directories. جۅتكۅۅ ماشعۇلاتى ەسەپ ەمەس، ۅجۅتۉن انىن بۅلۉمچۅ مازمۇۇنۇنا جۅتكۅگۅلۉۉ بولبويت . The file name exceeds the limit ۅجۅت ناامى چەكتەن اشىپ كەتتى Create file error ۅجۅت قاتالىعى پايدا قىلۇۇ جاسوو ،اتقارۇۇ Cannot opening file, permission denied! ۅجۅتۉن اچقالى بولبودۇ، ۇقۇق گۅۅلۅمۉ قاتار اتقارىلدى ! File:%1 was not found. تابىلباعان ۅجۅت:%1. Invalid Operation. ەسەپ ەمەس ماشقۇلدانۇۇ . System Disk Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error ۅجۅتۉن قاتاا ۅچۉرۉۉ Link file error جالعانما ۅجۅت قاتالىعى Burning does not support replacement كۆيدۈرگۈچى الماشتىرۇۇنۇ قولدوبويت. Burn failed 刻录失败 File delete 文件删除 Invalid Operation ەسەپ ەمەس ماشقۇلدانۇۇ Peony::FileOperationAfterProgressPage &More Details & داعى ەلە كۅپ جۉرۉشتۅر Peony::FileOperationErrorDialog File Operation Error ۅجۅت ماشعۇلاتىنداقى قاتاالىق unkwon بەلگىسىز null كۉچۉنۅ ەە بولموق ەمەس Error message: قاتاا ۇچۇر: Source File: كەلۉۉ جەر جانى ۅجۅت: Dest File: نىشان ۅجۅت: Ignore نازاردان ساق جاسوو ،اتقارۇۇ Ignore All باردىعىنا سەل قاروو Overwrite ۉستۉنۅن ساقتوو Overwrite All باردىعىن قاپلىماق Backup زاپاستوو Backup All باردىعىن دايار ، دايىن ساقتوو. &Retry &قايرا سىناپ باعىڭ &Cancel بەل قويۇپ ۅتۉ كەچىگۉۉ Peony::FileOperationErrorDialogBase Close جابۇۇ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace الماشتىر Ignore نازاردان ساق جاسوو ،اتقارۇۇ Do the same وقشوش بىر جۇمۇشتۇ جاسوو ،اتقارۇۇ <p>This location already contains the file '%1', Do you want to override it?</p> <p> بۇل ورۇن ۅجۅتتۉن %1 نى ۅز ىچىنە العان، انى قاپتوو كەرەكبى؟ Unexpected error from %1 to %2 %1 تىن %2 تۉن بولعون قوقۇستان قاتاالىق Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup زاپاستوو Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes وشوندوي No جوق Cancel 取消 Delete ۅچۉرۉۉ Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected نۇر تاقتاسىنىن تولۇق كۅرۉنۉشتۅرۉ يېزىلماي قورعولۇۇعا ەەبولۇۇ قىلىڭ، انىن ۉستۉنۅن ۅجۅت قورعولبودۇ Peony::FileOperationErrorDialogWarning OK ايقىندوو Cancel ارعادان قالتىرىش Skip all Make sure the disk is not full or write protected and that the file is not protected نۇر تاقتاسىنىن تولۇق كۅرۉنۉشتۅرۉ يېزىلماي قورعولۇۇعا ەەبولۇۇ قىلىڭ، انىن ۉستۉنۅن ۅجۅت قورعولبودۇ Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link بەلگە ۇلانماسى Copy گۅچۉرۉش Move Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Link Delete ۅچۉرۉۉ Delete Permanently 永久删除 Restore العاچىنا كەلتىرۉۉ New جاڭى - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ەسكەرتۉۉ '%1' is occupied,you cannot operate! 1 نى ەەلەگەن، سىز ماشقۇلدانۇۇ قىلا البايسىز! No, go to settings 否,跳转到设置 OK ايقىندوو Cancel ارعادان قالتىرىش Do you want to put selected %1 item(s) into trash? تاندالعان %1 تۉردۉ شىپىرىندى ساندىققا سالۇۇ كەرەكبى؟ Do not show again قايرا جولجوبوولۇ File System ۅجۅت ساامالىعى System Disk Data ساندۇۇ بايانداما Insufficient storage space ساقتوو بوشتۇعۇ جەتىشبەيت %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا قالدىق بوشتۇق جوق. كۅبۅيتۉلگۅن ۅجۅت چوڭدۇعۇ :%2 GB، ەتىياجدۇۇ بوشتۇق:%3 GB. Can't delete. ۅچۉرگۅلۉ بولبويت . You can't delete a file whenthe file is doing another operation ۅجۅت باشقا ماشعۇلاتتاردى اتقارىپ جاتقان ۇچۇردا ، بۇل ۅجۅتنى ۅچۉرگۅلۉ بولبويت File Operation is Busy ۅجۅت ماشعۇلاتى الدىراش There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. الدىدا ، مۇردا ، بىر كۅرۉنۉشتۅرۉ بىر قانچا ۅجۅت ماشعۇلاتى اتقارماق اتقارىلىپ جاتقان . سىز كۉچۅ تاماملانغۇچە اتقارماق جاسوونۇ ساقتايسىز. ەگەر ىراس ەلە جانداش ۅجۅت ماشعۇلاتىنى اتقارماق قىلماقچى بولسوڭۇز، تانداش تىزىمدەگىندەكى ويۇنداقى تانداش تۉرۉن ۅزگۅرتسۅڭۉز بولوت . The long name file is saved to %1 ۇزۇن اتى بار ۅجۅت %1 تۉن ساقتالات Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ھېسابلىنىۋاتىدۇ: state: ابالى: Peony::FileOperationProgressPage &More Details & داعى ەلە كۅپ جۉرۉشتۅر From: نان: To: عا: Peony::FileOperationProgressWizard File Manager ۅجۅت باشقارعىچ &Cancel بەل قويۇپ ۅتۉ كەچىگۉۉ Preparing... داياردىق قىلىپ جاتات. . . Handling... تۇتۇۋاتىدۇ.... Clearing... تازىلىنىۋاتىدۇ... Rollbacking... قايتىلىنىۋاتىدۇ... File Operation ۅجۅت ماشعۇلاتى A file operation is running backend... ۅجۅت ماشعۇلاتى ارقا تاراپتا اتقارماق قىلىنىپ جاتات... %1 files, %2 %1 ۅجۅتتۅر, %2 %1 done, %2 total, %3 of %4. %1 اتقارىلدى، ، باردىعى %2 %3، % باردىعى %4. clearing: %1, %2 of %3 تازىلىنىۋاتىدۇ:%1، 2 بولۇپ، %2 باردىعى %3 copying... كۅبۅيتۉپ جاتات... Syncing... شاي قادامدا مېڭىۋاتىدۇ... Peony::FilePreviewPage File Name: 文件名称: File Type: ۅجۅت تۉرۉ: Time Access: ۇباقىت زىياراتى: Time Modified: تۉزۅتۉۉ كىرگىزۉۉ ۇباقتى: Children Count: بالا ۅجۅت سانى : Size: چوڭ - كىچىكتىگى : Location: Time Created: قۇرۇلعان ۇباقتى: Image resolution: سۉرۅت ايىرمالاندىرىش قاتىشى: color model: تۉس نۇسقا ، قالپ: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare بۇل ،ۇشۇل اسپاپتان ھەمبەھىرلىنىش Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden %بولۇپ، باردىعى 1 %2 جاشىرىن Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error ۅجۅتكۅ قايرا ات قويۇش قاتالىعى Invalid file name %1%2%3 . ەسەپ ەمەس ۅجۅت ناامى %1 %2 %3. Are you sure to hidden this file? سىز بۇل ۅجۅتۉن جاشىرۇۇنۇ جەزملەشتۈرەلەمسىز؟ When change the file suffix, the file may be invalid. Are you sure to change it ? ۅجۅت ارقا قوشۇمچاسىن ۅزگۅرتكۅندۅ، ۅجۅت ەسەپ ەمەس بولۇۇسۇ مۉمكۉن. سىز ۅزگۅرتۉشتۉ جەزملەشتۈرەلەمسىز؟ A file and a directory with the same name cannot replace each other The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning ۅجۅتكۅ قايرا اتاق بەرۉۉ ەسكەرتىشى The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error ۅجۅتكۅ قايرا ات قويۇش قاتالىعى Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// شىپىرىندى :/// Trash file error شىپىرىندى ساندىعى ۅجۅت قاتالىعى Invalid Operation! Can not trash "%1". ەسەپ ەمەس ماشقۇلدانۇۇ ! %1 نى تاشلىۋەتكىلى بولبويت . Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. تىزگىندۅۅ جاساعالى بولبويتۇرعان توقۇنۇسۇ باربولۇۇسۇ . جىيناش پونكىتى تەكشەرىپ باعىڭ. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Untrash ۅجۅت قاتالىعى Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd جىل/اي/كۉن HH:mm:ss ساات : مىنۇت: سىكونت AP hh:mm:ss AP ساات : مىنۇت: سىكونت yyyy-MM-dd جىل-اي-كۉن Peony::HeaderBar Spread تارقاتۇۇ Minimize كىچىرەيتۉۉ Close جابۇۇ Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open اچۇۇ Open With بىرگە اچۇۇ More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy گۅچۉرۉش Save As file ۅجۅت All File This location has no write permission.please change the storage location Label Properties سۉرۅت قاسىيەتىن Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name ات-تەك اتى SideBar ۇقۇق ،امال تاراپ تۉشۉنۉك بەرۉۉ ىستونۇ Menu تىزىمدىك Create New Label جاڭى بەلگە پايدا قىلۇۇ جاسوو ،اتقارۇۇ Delete Label بەلگىنى ۅچۉرۉۉ Display the following items in the identification area: (maximum of 6) ايىرمالاندىرىش رايونۇندا تۅمۅندۅكۉ تۉرلۅر كۅرسۅتۉلۅت :(ەڭ كۅپ بولعوندو التى ) Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Edit Color تۉس تۅپتۅش Delete This Label بۇل بەلگىنى ۅچۉرۉپ اتىڭ Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" %2 نان %1 نى ىزدۅۅ File System ۅجۅت ساامالىعى Search results for all files marked in "%1" in "%2" %2 %1 دە بەلگە قويۇلعان باردىق ۅجۅتتۅردۉن ىزدۅۅ ناتىيجاسى &Copy Directory 拷贝路径(&C) Open In New Tab جاڭى بەلگە بەتتە اچىلىش Open In New Window جاڭى كۅزۅنۅكتۅ اچىلىش Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory كۅبۅيتۉۉ مازمۇۇنۇ Peony::MountOperation Operation Cancelled ماشقۇلدانۇۇ ارعادان قالتىرىلدى Login failed, unknown username or password error, please re-enter! كىرۉۉ جەڭىلۉۉ بولدۇ ، بەلگىسىز كەرەكتۅۅچۉ ناامى كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇ قاتاا، قايرا كىرگىزىڭ! Peony::NavigationToolBar Go Back قايتۇۇ Go Forward الدىنا ماڭ History قويۇش بايىرقى Clear History تارىخنى تازالوو Cd Up Cd نىڭ ۉستۉ Refresh جاڭىلوو Peony::NewFileLaunchDialog Choose new application جاڭى قولدونۇشچان پراگراممانى تانداڭ Choose an Application to open this file بىر ئەپنى تانداپ بۇل ۅجۅتۉن اچىڭ apply now داروو ۅتۉنۉچ قىلىڭ OK ايقىندوو Cancel ارعادان قالتىرىش Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? سىز %1 %2 ۅجۅتۉن قانداي اچۇۇنۇ ۉمۉت قىلاسىز؟ Default open with: ويۇنداقى اچۇۇ ارعاسى: Other: باشقا: Choose other application باشقا ئەپنى تانداش Go to application center ئەپ بوربورۇنا بەرۉۉ Peony::PathEdit Go To بەرۉۉ Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 نىشان:%1 Read and Write وقۇۇ جانا جازۇۇ Readonly جالاڭ عانا وقۇۇعا بولوت Group or User توپ كۅرۉنۉشتۅرۉ ئابۇنىچىلار (Current User) (گەزەكتەكى ىشتەتۉۉچۉ The folder containing this file is protected, and only the file owner can modify the file. Current User گەزەكتەكى ىشتەتۉۉچۉ Permissions modify tip ۇقۇق گۅۅلۅمۉن ۅزگۅرتۉش ەسكەرتمەسى The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? گەزەكتەكى ۅجۅت كۅرۉنۉشتۅرۉ ۅجۅت قىسقىچقا ACL ۇقۇق گۅۅلۅمۉ قۇرۇۇ ، اچۇۇ ، باشتوو اتقارىلدى . ابونتتار توبۇنۇن ۇقۇق گۅۅلۅمۉ نى ۅزگۅرتۉش ACL دا قۇرۇۇ ، اچۇۇ ، باشتوو اتقارىلعان ۇقۇق گۅۅلۅمۉ نى ىشتەتكەلى بولبوستۇعۇن كەلىترىپ ۅندۉرۉشۉ مۉمكۉن. ابونتتار توبۇنۇن ۇقۇق گۅۅلۅمۉ نى جالعاشتۇۇ ۅزگۅرتۉش كەرەكبى؟ Permission refinement settings ۇقۇق گۅۅلۅمۉن ئىنچىكىلەشتۈرۈپ قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ . The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? گەزەكتە ىشتەتكۉۉچۉلۅر جوعورۇ چەكتۉۉ ورتوق باارلانۇۇ بولۇۇنۇ قۇرۇۇ ، اچۇۇ ، باشتوو قىلدى. ەگەر سىز داعى ەلە ۇقۇق گۅۅلۅمۉن ۅزگـۅرتۉۉگـۅ ەتىياجدۇۇ بولسوڭۇز، اندايدا جوعورۇ چەكتۉۉ ورتوق باارلانۇۇ بولۇۇنۇ ىشتەتكەلى بولبوستۇعۇ مۉمكۉن. تەڭشەشتى جالعاشتىراسىزبى؟ Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ۇقۇق ۇچۇرۇنا ەە بولعولۇ بولبويت . (Me) (我) Others باشقالار Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. سىز بۇل ۅجۅتتۉن زىيارات جاسوو ،اتقارۇۇ ۇقۇعۇنۇ ۅزگۅرتۅ البايسىز. Me User 用户 Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok ماقۇل Cancel Peony::PropertiesWindow Trash قايتارىپ الۇۇ ساندىعى Recent جاقىندا Selected تانداش %1 Files %1 ۅجۅت usershare بۇل ،ۇشۇل اسپاپتان ھەمبەھىرلىنىش Data ساندۇۇ بايانداما System Disk Properties سۉرۅت قاسىيەتىن Ok ماقۇل Cancel ارعادان قالتىرىش Restore العاچىنا كەلتىرۉۉ Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. شىپىرىندى ساندىققا تاشتاعاندا بەكىتۉۉ كەرەنەسى چىعات. Origin Path: العاچى تۉيۉن جولۇ: Deletion Date: ۅچۉرۉلگەن ۇباقىت: Size: چوڭ كىچىكتىگى : Original Location: العاچى وردۇ: Peony::SearchBar Input the search key of files you would like to find. ىزدەمەكچى بولعون ۅجۅتتۉن ىزدۅۅ تۉيۉندۉۉ سۅزۉن كىرگىزىڭ. Input search key... ىزدۅۅ تۉيۉندۉۉ سۅزۉن كىرگىزىڭ. . . advance search الدىن ىزدۅۅ clear record تىزىمدىكتى تازالوو Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Clear تازالوو all باردىق file folder ۅجۅت قىپچىعىچ image سۉرۅت video ايىپ text file تەكىست ۅجۅتۉۉ audio دووش others باشقالار wps file wps ۅجۅتۉۉ Peony::SharedFileLinkOperation Symbolic Link بەلگە ۇلانماسى The dest file "%1" has existed! نىشان ۅجۅتتۉن %1 ى باربولۇۇسۇ ! Link file error جالعانما ۅجۅت قاتالىعى Peony::SideBarCloudItem CloudStorage CloudStorage ساقتوو سان قاينارى CloudFile Cloud ۅجۅتۉۉ Peony::SideBarFavoriteItem Trash قايتارىپ الۇۇ ساندىعى Recent جاقىندا Quick Access Quick access تەز زىيارات جاسوو ،اتقارۇۇ Favorite 快速访问 KmreData KmreData ساندۇۇ بايانداماسى Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data ساندۇۇ بايانداما Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties سۉرۅت قاسىيەتىن Delete Symbolic بەلگىنى ۅچۉرۉۉ Unmount جۇۇپ جىبەر Eject ۅندۉرۉش Format فورماتى burndata ساندۇۇ باياندامالاردى كۆيدۈرۈش &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network تور Peony::SideBarPersonalItem Personal جەكەلىك Peony::SideBarSeparatorItem (No Sub Directory) (بۅلۉمچۅ مازمۇۇنۇ جوق) Peony::StatusBar ; %1 folders ; %1 ۅجۅت قىپچىعىچ ; %1 files, %2 total ; %1 ۅجۅت، باردىعى %2 ; %1 folder ; %1 ۅجۅت قىپچىعىچ ; %1 file, %2 ; %1 ۅجۅت، %2 %1 selected %1 تاندالعان Peony::SyncThread notify 温馨提示 ۇقتۇرۇۇ Notify Peony::TagManagement General 通用 Mark بەلگە Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type ىرەتتەلگەن تىپ File Name ۅجۅت ناامى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ Modified Date ۅزگۅرتۉلگۅن ۇباقتى Open in New window جاڭى كۅزۅنۅكتۅ اچىلات Open in new Tab جاڭى تانداش كارتاسىنان اچىڭ Ascending كىچىكتەن چوڭعو قاراتىپ تىزۉۉ Descending چوڭدىن كىچىككە قاراتىپ تىزۉۉ Copy گۅچۉرۉش Paste چاپتوو Cut قىيىش Trash قايتارىپ الۇۇ ساندىعى Clean Trash ئەخلەتنى تازالوو Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore العاچىنا كەلتىرۉۉ Options تاندالباعاندار Forbid Thumbnail قىسقارتىلعان سۉرۅت چەكتۅۅ جاسالات Show Hidden جاشىرىن تۉرلۅردۉ كۅرسۅتۅت Resident in Backend ارقا تاراپتا تۇرۇش . Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ەڭ سوڭعۇ كۅزۅنۅكتۉ تاقاعاندان كىيىن، پراگرامما داعى ەلە اتقارماق قىلىنسۇن. بۇل، كىيىنكى ىرەت جارنااما جاسوو ،اتقارۇۇ ۇباقتىن قىسقارتىدۇ بىروق ارقا سەپتىكى بايلىقلارنىمۇ خورىتىدۇ. &Help جەرلىك &About... تۇراسىندا(&A). Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. اپتورۇ: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2019-جلدىق تيەنجىن KYLIN ۇچۇر تەحنىكا چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Type: تۉرۉ: Duration: Size: چوڭ كىچىكتىگى : Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning ەسكەرتۉۉ Peony::VolumeManager Error قاتاا ProgressBar starting ... باشلىنىۋاتىدۇ ... canceling ... نازاردان ساق قىلىنىپ جاتات... sync ... شاي قەدەملەش ... continue جالعاشتىرىش pause ۇباقتىنچا توقتوتۇۇ close بەكىتىش cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View تۉر گۅرۉنۉشۉ Show the folder children as icons. ۅجۅت قىپچىعىچ بۅلۉمچۅ تۉرۉن شارتتۇۇ بەلگى جاساپ كۅرسۅتۉۉ . List View تىزىمدىك گۅرۉنۉشۉ Show the folder children as rows in a list. ۅجۅت قىپچىعىچ بۅلۉمچۅ تۉرۉن جادىبالىنداقى قۇر دەپ كۅرسۅتۉۉڭ. Basic Preview Page 基本 Basic نەگىزگى Show the basic file properties, and allow you to modify the access and name. ، نەگىزگى ۅجۅت قاسىيەتىن كۅرسۅتۅت داعى زىيارات جاسوو ،اتقارۇۇ ۇقۇعۇ جانا اتاعىن ۅزگۅرتۉۉڭۉزگۅ جول قويوت . Permissions Page 权限 Permissions ۇقۇق چەكتەمەسى Show and modify file's permission, owner and group. ۅجۅت ۇقۇعۇ، ەەلىك قىلۇۇچۇ جانا گۇرۇپپانى كۅرسۅتۉۉ جانا ۅزگۅرتۉش . Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? ۅجۅت ۅتۅ چوڭ، جىيناش پونكىتىنە جۅتكۅگۅلۉۉ بولبويت . انى تۉبۅلۉك ۅچۉرمۅكچۉبۉ؟ These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? بۇلل ۅجۅتتۅر، ۅتۅ چوڭكەن جىيناش پونكىتىنە جۅتكۅگۅلۉۉ بولبويت . بۇلل %1 ۅجۅتۉن تۉبۅلۉك ۅچۉرمۅكچۉبۉ؟ Delete ۅچۉرۉۉ Clean the Trash ئەخلەتلەرنى تازالوو OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. جىيناش پونكىتى قۇرۇقداپ، بۇل ۅجۅتتۅرۉن تۉبۅلۉك ئۆچۈرەمدۇ؟ باشتالعان امان، الاردى العاچىنا گەلتىرىشكە ايلا جوق. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties كومپىيۇتەر Show the computer properties or items in computer. ەلەكتىروندۇق مەە قاسىيەتىن كۅرۉنۉشتۅرۉ كومپىيۇتەردەگى تۉرلۅردۉ كۅرسۅتۅت. Trash and Recent Properties Page 最近/回收 Trash and Recent شىپىرىندى ساندىعى جانا ەڭ جاقىنداقى Show the file properties or items in trash or recent. ۅجۅت قاسىيەتىن كۅرۉنۉشتۅرۉ شىپىرىندى ساندىقتاقى تۉر كۅرۉنۉشتۅرۉ ەڭ جاقىن تۉرنى كۅرسۅتۅت. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed فورماتتاش جەڭىلۉۉ بولدۇ YES قوشۇلۇۇ Formatting successful! But failed to set the device name. فورماتتاش جەڭىشتۉۉ بولدۇ ! بىروق جابدۇۇسۇنۇن اتاعىن بەكىتىلبەدى. qmesg_notify qmesg_ ۇقتۇرۇشتۇ Format فورماتى Begin Format باشتوو كەبەتەسى ، تۇرپاتى Close جابۇۇ Format operation has been finished successfully. فورماتتاش ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! كەچىرۉۉ. فورماتتاش ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل تومدۇ فورماتلىساق تومدوقۇ باردىق ساندۇۇ باياندامالار ۅچۉرۉلەت . فورماتتونۇن بۇلرۇن باردىق ساقتالعان ساندۇۇ باياندامالار نى دايار ، دايىن ساقتاڭ. داۋاملاشتۇرامدۇق؟ format فورماتتاش begin format 开始 close 关闭 File Manager ۅجۅت باشقارعىچ Notify Default search vfs of peony 默认文件搜索 Force unmount failed زوردۇق مەنەن تۉشۉرۉ جەڭىلۉۉ بولدۇ . Error: %1 قاتاالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندۇۇ بايانداما شاي قادامدا بۉتۉردۉ دىققات ، شايمان ساامالىعى جەڭىشتۉۉ ابالدا يۇيۇۋېتىلدى ! Unmount failed جۇۇش جەڭىلۉۉ بولدۇ Not authorized to perform operation. ماشقۇلدانۇۇنۇ اتقارماق جاسوو ،اتقارۇۇ ۇقۇعۇ بەرىلبەگەن. Unable to unmount it, you may need to close some programs, such as: GParted etc. يۈكنى جۇۇعالى بولبويت ، سىز بالكىم الدىن گەەبىر پىروگىراممالاردى ئېتىۋېتىشىڭىز بولۇۇسۇ مۉمكۉن، مىسالى، رايونۇنا بۅلۉنۉپ راداكسىيالاعىچ قاتارلۇۇلار. Error: %1 Do you want to unmount forcely? قاتاالىق كۅرۉلدۉ: ٪1 زوردۇق مەنەن يۇيامدۇق؟ Cancel ارعادان قالتىرىش Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase اسپاپتى قوزعوتقولۇ بولبودۇ:جاشىرۇۇن نومۇر سۅز بىرىكمەسى تۇۇرا ەمەس The device has been mount successfully! زاپچاستارى رايوندورعو بۅلۉۉ جەڭىشتۉۉ بولدۇ ! Eject device failed, the reason may be that the device has been removed, etc. سەكىرىپ سىندىرۇۇ جەڭىلۉۉ بولدۇ ، بالكىم ئۈسكۈنىلەرنىڭ ئېلىۋېتىلىشى قاتارلۇۇ سەبەپتەر بولۇۇسۇ مۉمكۉن. Data synchronization is complete and the device can be safely unplugged! ساندۇۇ باياندامالار شاي قادامدا بۉتۉردۉ دىققات، زاپچاستارى قووپسۇز ابالدا الىپتاشتاعالى بولوت ! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed تەز كۅرۉنمۅ جەڭىلۉۉ بولدۇ favorite جىيىپ ساقتوو Favorites جاقشى كۆرىدىغانلار File is not existed. ۅجۅت باربولۇۇسۇ ەمەس . Share Data جەرلىكتە ھەمبەھىرلەش Trash قايتارىپ الۇۇ ساندىعى Recent جاقىندا Operation not supported ماشقۇلدانۇۇ قولدوبويت The virtual file system does not support folder creation جورۇما ۅجۅت ساامالىعى ۅجۅت قىپچىعىچ قۇرۇشتۇ قولدوبويت Can not create a symbolic file for vfs location vfs وردۇ ۉچۉن بەلگە ۅجۅتۉۉ قۇرۇۇعا بولبودۇ Symbolic Link بەلگە ۇلانماسى Can not create symbolic file here, %1 بۇل جەردە بەلگە ۅجۅتۉۉ قۇرۇۇعا بولبويت ، %1 Can not add a file to favorite directory. ۅجۅتۉن جىيىپ ساقتوو مازمۇۇنۇنا قوشقولۇ بولبويت . The virtual file system cannot be opened جورۇما ۅجۅت سەستىمانى اچقالى بولبودۇ Virtual file directories do not support move and copy operations جورۇما ۅجۅت مازمۇۇنۇ جۅتكۅۅ جانا كۅبۅيتۉۉ ماشعۇلاتىنى قولدوبويت Default favorite vfs of peony مودەنگۈل ويۇنداقى جاقشى كۅرۅتۇرعان vfs Details ىچكەلەي ، قۇنت قويۇپ ۇچۇرۇ : Mark بەلگە mark this file. بۇل ۅجۅتكۅ بەلگە قويۇڭ. Open With بىرگە اچۇۇ open with. اچۇۇ ارعاسى It need to synchronize before operating the device,place wait! اسپاپتى ماشقۇلدانۇۇ قاسوودون ،اتقارۇۇدان مۇرۇن شاي قادامدۇۇ ساندۇۇ مالىماتقا ەتىياجدۇۇ، سەل ساقتاپ تۇرۇڭ. Unable to discover the file, it may have been removed or deleted. بۇل ۅجۅتۉن بايقاعالى بولبودۇ، ال بالكىم ۅچۉرۉلگەن كۅرۉنۉشتۅرۉ ۅچۉرۉلگەن بولۇۇسۇ مۉمكۉن. permission denied ۇرۇقسات قاتار اتقارىلدى file not found 没有发现该文件 duplicate كۅبۅيتۉۉ Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data ساندۇۇ بايانداما System Disk label بەلگە Computer كومپىيۇتەر File System ۅجۅت ساامالىعى Data ساندۇۇ بايانداما Failed to open file "%1": insufficient permissions. ۅجۅتۉن اچقالى بولبويت %1:ۇقۇق گۅۅلۅمۉ جەتەرلۉۉ ەمەس . File “%1” does not exist. Please check whether the file has been deleted. ۅجۅت %1 باربولۇۇسۇ ەمەس . بۇل ۅجۅتنىڭ ۅچۉرۉلگەن كۅرۉنۉشتۅرۉ ۅچۉرۉلبۅگۅندۉگۉن تەكشەرىپ باعىڭ. burn operation has been cancelled كۆيدۈرۈش ماشعۇلاتى ارعادان قالتىرىلدى is busy! ەرەكچە الدىراش! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. سىز بۇل ۅجۅتۉن تۉبۅلۉك ۅچۉرۉۉنۉ جەزملەشتۈرەلەمسىز؟ ۅچۉرۉۉگۅ باشتاعان امان، ۅجۅتۉن العاچىنا كەلتىرگەلى بولبويت . Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. سىز بۇلل %1 ۅجۅتۉن تۉبۅلۉك ۅچۉرۉۉنۉ جەزملەشتۈرەلەمسىز؟ ۅچۉرۉۉگۅ باشتاعان امان، بۇلل ۅجۅتتۅرۉن العاچىنا كەلتىرگەلى بولبويت . Virtual file directories do not support move operations جورۇما ۅجۅت مازمۇۇنۇ كۅچمۅ ماشقۇلدانۇۇنۇ قولدوبويت. test simplify vfs plugin vfs قىستۇرمىسىنى ئاددىيلاشتۇرۇشنى سىنوو Default custom vfs info of peony peony ويۇنداقى ۅزەركى مەنەن vfs ۇچۇرۇ Default local vfs info of peony peony جەردىك vfs ۇچۇردۇ مويۇندوو جاسايت . Show properties plugin window. قاسىيەت قىستىرما كۅزۅنۅگۉن كۅرسۅتۉۉ . Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok ماقۇل Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData ئەپ سالقىنداما كەپىچتى كۆيدۈرۈشنى ئاخىرلاشتۇردى Disc Type: وپتىك دىسكا تۉرۉ: Device Name: شايمان اتى : OK ايقىندوو Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ No burn data, please add! ساندۇۇ باياندامالاردى ئويمىدى، عىن قوشۇڭلار! The disc name cannot be set to empty, please re-enter it! وپتىك دىسكا اتاعىن كۅڭدۅي جاساپ قويۇشقا بولبويت ، قايرا كىرگىزىڭ! AppendBurnData operation has been finished successfully. AppendBurn Data ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the appendBurnData operation is failed! كەچىرۉۉ. appendBurn Data ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جاڭىلوو جەڭىلۉۉ بولدۇ Burning. Do not close this window بۇل كۅزۅنۅكتۉ ئېتىۋەتمەي كۆيدۈرۈش Burning this disc will append datas on it. Do you want to continue ? بۇل دىسكاسىن كۆيدۈرسە ۉستۉندۆ قوشۇمچا ساندۇۇ بايانداما بولوت . داۋاملاشتۇرامدۇق؟ Burn كۆيدۈرۈش Begin Burning كۆيدۈرۈشنى باشتوو Close جابۇۇ UdfBurn::UdfFormatDialog Format فورماتى Disc Type: وپتىك دىسكا تۉرۉ: Device Name: شايمان اتى : OK ايقىندوو Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ The disc name cannot be set to empty, please re-enter it! وپتىك دىسكا اتاعىن كۅڭدۅي جاساپ قويۇشقا بولبويت ، قايرا كىرگىزىڭ! Format operation has been finished successfully. فورماتتاش ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the format operation is failed! كەچىرۉۉ. فورماتتاش ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جاڭىلوو جەڭىلۉۉ بولدۇ Formatting. Do not close this window فورماتتاش . بۇل كۅزۅنۅكتۉ تاقىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل دىسكاسىن فورماتلىساق دىسكاداعى باردىق ساندۇۇ باياندامالار ۅچۉرۉلەت . فورماتتونۇن بۇلرۇن باردىق ساقتالعان ساندۇۇ باياندامالار نى دايار ، دايىن ساقتاڭ. جالعاشتىراسىزبى؟ Begin Format باشتوو كەبەتەسى ، تۇرپاتى Close جابۇۇ UdfFormatDialog Format فورماتى Disc Type: وپتىك دىسكا تۉرۉ: Device Name: شايمان اتى : OK ايقىندوو Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ The disc name cannot be set to empty, please re-enter it! وپتىك دىسكا اتاعىن كۅڭدۅي جاساپ قويۇشقا بولبويت ، قايرا كىرگىزىڭ! Format operation has been finished successfully. فورماتتاش ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the format operation is failed! كەچىرۉۉ. فورماتتاش ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جاڭىلوو جەڭىلۉۉ بولدۇ Formatting. Do not close this window فورماتتاش . بۇل كۅزۅنۅكتۉ تاقىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل دىسكاسىن فورماتلىساق دىسكاداعى باردىق ساندۇۇ باياندامالار ۅچۉرۉلەت . فورماتتونۇن بۇلرۇن باردىق ساقتالعان ساندۇۇ باياندامالار نى دايار ، دايىن ساقتاڭ. جالعاشتىراسىزبى؟ Begin Format باشتوو كەبەتەسى ، تۇرپاتى Close جابۇۇ progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_mn.ts0000664000175000017500000126527115154271106021143 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... ᠲᠡᠮᠳᠡᠭ ᠤᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ ᠶᠢᠨ ᠁ Remove "%1" ᠢ ᠬᠠᠰᠤᠪᠠ "%1" delete "%1" 删除“%1” add "%1" ᠨᠡᠮᠡᠪᠡ "%1" ConnectServerDialog Connect to Sever ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦᠡᠷ᠎ᠲᠠᠢ ᠵᠠᠯᠭᠠᠬᠤ Domain ᠳ᠋ᠤᠮᠠᠢᠨ ᠄ Password ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ Save Password ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠢ᠋ ᠴᠡᠭᠡᠵᠢᠯᠡᠬᠦ User ᠬᠡᠷᠡᠭ᠌ᠯᠡᠭ᠌ᠴᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ Anonymous ᠨᠡᠷ᠎ᠡ ᠪᠤᠷᠤᠭᠤᠯᠠᠵᠤ ᠨᠡᠪᠳᠡᠷᠡᠬᠦ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Cancel ᠪᠣᠯᠢᠬᠤ DiscControl is busy! ᠡᠵᠡᠯᠡᠭᠳᠡᠪᠡ! is busy! ᠡᠵᠡᠯᠡᠭᠳᠡᠪᠡ ! not support udf at present. ᠤᠳᠤᠬᠠᠨ ᠳ᠋ᠤ᠌ udf ᠹᠤᠷᠮᠠᠲ᠎ᠢ᠋ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ unmount disc failed before udf format. udf ᠹᠤᠷᠮᠠᠲ᠎ᠠ᠋ᠴᠠ ᠡᠮᠦᠨ᠎ᠡ ᠳ᠋ᠢᠰᠺ᠎ᠢ᠋ ᠪᠠᠭᠤᠯᠭᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠃ is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf ᠬᠡᠯᠪᠡᠷᠢ ᠶᠢᠨ ᠢᠯᠠᠭᠳᠠᠯ ᠳᠤ ᠢᠯᠠᠭᠳᠠᠵᠠᠢ preparation failed before DVD-RW udf format. DVD —RWudf ᠹᠤᠷᠮᠠᠲ᠎ᠠ᠋ᠴᠠ ᠡᠮᠦᠨ᠎ᠡ ᠪᠡᠯᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠃ FileLabelModel Red ᠤᠯᠠᠭᠠᠨ ᠤᠯᠠᠭᠠᠨ ᠤᠯᠠᠭᠠᠨ Orange ᠤᠯᠠᠪᠤᠷ ᠥᠩᠭᠡ Yellow ᠰᠢᠷ᠎ᠠ ᠦᠩᠭᠡ Green ᠨᠣᠭᠣᠭᠠᠨ Blue ᠬᠥᠬᠡ ᠬᠥᠬᠡ Purple ᠪᠣᠷᠣ Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error ᠪᠤᠷᠤᠭᠤ Label or color is duplicated. ᠱᠣᠰᠢᠭ᠎ᠠ ᠪᠤᠶᠤ ᠥᠩᠭᠡ ᠳᠠᠪᠬᠤᠷᠳᠠᠬᠤ FileOperationHelper Burn failed ᠰᠡᠶᠢᠯᠦᠮᠡᠯ ᠢᠯᠠᠭᠳᠠᠵᠠᠢ Format_Dialog Dialog ᠶᠠᠷᠢᠯᠴᠠᠭ᠎ᠠ ᠃ rom_size ᠪᠠᠭᠲᠠᠭᠠᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ system ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠪᠠᠢᠳᠠᠯ vfat/fat32 vfat/fat32 exfat ᠦᠷᠬᠡᠳᠬᠡᠯ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠤᠪᠢᠶᠠᠷᠢᠯᠠᠯᠲᠠ᠎ᠶ᠋ᠢᠨ ᠬᠦᠰᠦᠨᠦᠭᠲᠦ ntfs ᠰᠢᠨ᠎ᠡ ᠮᠡᠷᠭᠡᠵᠢᠯ᠎ᠦ᠋ᠨ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ vfat VFAT ext4 ᠳᠥᠷᠪᠡᠳᠦᠭᠡᠷ ᠦᠶ᠎ᠡ᠎ᠶ᠋ᠢᠨ ᠥᠷᠭᠡᠳᠬᠡᠯ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ device_name ᠳᠦᠬᠦᠬᠡᠷᠦᠮᠵᠢ ᠵᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ clean it total ᠪᠦᠷᠢᠮᠦᠰᠦᠨ ᠪᠠᠯᠠᠯᠠᠬᠤ (᠎ᠴᠠᠭ ᠨᠡᠯᠢᠶᠡᠳ ᠤᠷᠲᠤ᠂ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ ! ) ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠬᠦ close ᠬᠠᠭᠠᠬᠤ TextLabel ᠲᠸᠺᠰᠲ ᠱᠤᠰᠢᠭ᠎ᠠ qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format ᠹᠦᠷᠮᠠᠲᠯᠠᠬᠤ Rom size: ᠪᠠᠭᠳᠠᠭᠠᠮᠵᠢ: Filesystem: ᠹᠠᠢᠯ ᠦ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ: Disk name: ᠬᠤᠪᠢᠶᠠᠷᠢ ᠲᠤᠭᠤᠷᠢᠭ ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ: Completely erase(Time is longer, please confirm!) ᠪᠦᠷᠢᠨ ᠠᠷᠢᠯᠭᠠᠪᠠ ( ᠤᠷᠳᠤ ᠴᠠᠭ ᠪᠠᠷᠠᠪᠠ᠂ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ!) Set password ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ Set password for volume based on LUKS (only ext4) ext4 ᠬᠤᠪᠢᠶᠠᠷᠢ ᠲᠤᠭᠤᠷᠢᠭ ᠲᠤ᠌ LUKS ᠲᠤ᠌/ ᠳ᠋ᠤ᠌ ᠰᠠᠭᠤᠷᠢᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋᠎ᠢ᠋ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ᠬᠡᠯᠪᠡᠷᠢᠵᠢᠭᠦᠯᠦᠯᠲᠡ ᠨᠢ ext4 ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠪᠣᠯᠵᠤ ᠪᠤᠰᠤᠳ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠢ USB ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠢ ᠤᠩᠰᠢᠬᠤ ᠪᠤᠶᠤ ᠪᠢᠴᠢᠵᠦ ᠳᠡᠶᠢᠯᠬᠦ ᠦᠭᠡᠶ ᠮᠠᠭᠠᠳ Cancel ᠪᠣᠯᠢᠬᠤ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ Error locking device: Failed to deactivate device: Device or resource busy ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠣᠨᠢᠰᠤᠯᠠᠬᠤ ᠦᠶ᠎ᠡ᠎ᠳ᠋ᠦ᠍ ᠲᠠᠰᠢᠶᠠᠷᠠᠪᠠ ᠄ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠤᠶᠤ ᠡᠬᠢ ᠪᠠᠶᠠᠯᠢᠭ ᠶᠠᠭ ᠶᠠᠭᠠᠷᠠᠤ Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Device name cannot start with a decimal point, Please re-enter! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ ᠨᠢ ᠠᠷᠪᠠᠲᠤ᠎ᠶ᠋ᠢᠨ ᠪᠤᠲᠠᠷᠬᠠᠢ᠎ᠶ᠋ᠢᠨ ᠴᠡᠭ᠎ᠡᠴᠡ ᠡᠬᠢᠯᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Enter Password: ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠄ Password too short, please retype a password more than 6 characters ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠬᠡᠳᠦ ᠣᠬᠣᠷ᠂ 6 ᠣᠷᠣᠨ᠎ᠠ᠋ᠴᠠ ᠶᠡᠬᠡ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋᠎ᠢ᠋ ᠳᠠᠬᠢᠨ ᠤᠷᠤᠭᠤᠯᠤᠭᠠᠷᠠᠢ %1/sec, %2 remaining. 1/ᠰᠧᠺᠦᠢᠨᠳ᠋᠂ ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠨᠢ 2 over one day ᠨᠢᠭᠡ ᠡᠳᠦᠷ ᠢ᠋ ᠳᠠᠪᠠᠵᠠᠢ getting progress... ᠣᠯᠣᠯᠲᠠ ᠶᠢᠨ ᠠᠬᠢᠴᠠ ᠁ Error ᠪᠤᠷᠤᠭᠤ Block not existed! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠠᠢᠬᠤ ᠦᠭᠡᠢ ! Formatting. Do not close this window ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠂ ᠪᠢᠲᠡᠭᠡᠢ ᠬᠠᠭᠠᠭᠠᠷᠠᠢ KyFileDialogRename Renaming "%1" "%1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠴᠤ ᠪᠠᠢᠨ᠎ᠠ Renaming failed, the reason is: %1 ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠴᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠰᠢᠯᠲᠠᠭᠠᠨ ᠨᠢ ᠄ % 1 Filename too long ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ ᠬᠡᠳᠦ ᠤᠷᠲᠤ Copying "%1" "%1" ᠢ᠋/ ᠵᠢ ᠺᠤᠫᠢᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ To "%1" "%1" ᠲᠤ᠌/᠎ᠳ᠋ᠦ᠍ ᠬᠦᠷᠬᠦ Copying failed, the reason is: %1 ᠺᠤᠫᠢᠳᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠰᠢᠯᠳᠠᠭᠠᠨ ᠨᠢ ᠄ % 1 Moving "%1" "%1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠰᠢᠯᠵᠢᠭᠦᠯᠵᠦ ᠪᠠᠢᠨ᠎ᠠ Moving failed, the reason is: %1 ᠰᠢᠯᠵᠢᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠰᠢᠯᠲᠠᠭᠠᠨ ᠨᠢ᠄ % 1 File operation error: ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠪᠤᠷᠤᠭᠤᠳᠠᠪᠠ: The reason is: %1 ᠰᠢᠯᠲᠠᠭᠠᠨ᠄ %1 Truncation ᠲᠠᠰᠤᠯᠤᠨ᠎ᠠ Save ᠰᠢᠷᠪᠢᠬᠡᠳ All applications ᠪᠤᠢ ᠪᠥᠬᠥᠢ ᠬᠡᠷᠡᠭ᠍ᠯᠡᠭᠡᠨ Cancel ᠪᠣᠯᠢᠬᠤ Apply ᠪᠠᠳᠤᠯᠠᠬᠤ Bytes ᠦᠰᠦᠭ᠎ᠤᠨ ᠦᠶ᠎ᠡ Front truncation ᠡᠮᠦᠨᠡᠬᠢ ᠵᠢ ᠳᠠᠰᠤᠯᠬᠤ Post truncation ᠬᠤᠢᠨᠠᠬᠢ ᠵᠢ ᠳᠠᠰᠤᠯᠬᠤ Description: Skip copying files of the current type ᠳᠦᠷᠰᠦᠯᠡᠨ ᠲᠣᠭᠠᠴᠢᠬᠤ ᠨᠢ ᠄ ᠣᠳᠣᠬᠠᠨ ᠤ ᠲᠥᠷᠥᠯ ᠬᠡᠯᠪᠡᠷᠢ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠪᠠᠭᠤᠯᠭᠠᠨ᠎ᠠ truncate interval ᠳᠠᠰᠤᠯᠬᠤ ᠬᠡᠰᠡᠭ . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select ᠳᠤᠳᠤᠷᠬᠠᠢᠯᠠᠯᠳᠠ᠄ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ ᠵᠢᠨ ᠬᠡᠳᠦᠷᠡᠭᠰᠡᠨ %1 ᠪᠠᠰ ᠤ᠋ᠨ ᠬᠡᠰᠡᠭ ᠢ᠋ ᠳᠠᠰᠤᠯᠵᠤ ᠬᠠᠶᠠᠬᠤ᠂ ᠰᠣᠩᠭᠣᠬᠤ ᠬᠡᠷᠡᠭᠳᠡᠢ Explanation: When renaming a file name, ensure it is within %1 bytes and ᠳᠤᠳᠤᠷᠬᠠᠢᠯᠠᠯᠳᠠ᠄ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠯᠡᠭᠰᠡᠨ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ %1 ᠪᠠᠰ ᠤ᠋ᠨ ᠳᠤᠳᠤᠷ᠎ᠠ ᠪᠠᠢᠬᠤ ᠵᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠬᠡᠷᠡᠭᠳᠡᠢ᠃ Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". ᠳᠦᠷᠰᠦᠯᠡᠨ ᠲᠤᠭᠠᠴᠢᠯᠲᠠ  ᠳᠤᠭᠤᠢ ᠮᠡᠲᠡᠷᠡᠭᠰᠡᠨ ᠪᠠᠶᠢᠲᠠᠯ ᠤᠨ ᠲᠤᠤᠷ᠎ᠠ ᠂  アッ ᠦᠷᠬᠡᠳᠬᠡᠭᠦ  ᠪᠤᠯᠤᠨ᠎ᠠ modify the name ᠨᠡᠷᠡᠢᠳᠦᠯ ᠢ᠋ ᠵᠠᠰᠠᠬᠤ Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip ᠦᠰᠦᠷᠴᠤ᠌ ᠭᠠᠷᠬᠤ Skip All 全部跳过 Rename ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ Please enter a new name 请输入文件名 OK ᠪᠠᠳᠤᠯᠠᠬᠤ MainProgressBar File operation 文件操作 starting ... ᠶᠠᠭ ᠡᠬᠢᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ ᠁ cancel all file operations ᠪᠦᠬᠦ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠦᠬᠡᠢᠰᠬᠡᠬᠦ Minimize ᠬᠠᠮᠤᠭ ᠤ᠋ᠨ ᠪᠠᠭᠠᠴᠢᠯᠠᠯ Close ᠬᠠᠭᠠᠬᠤ Are you sure to cancel all file operations? ᠪᠤᠢ ᠪᠥᠬᠥᠢ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠬᠤ ᠶ᠋ᠢ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠠᠷ ᠲᠣᠭᠲᠠᠭᠠᠨ᠎ᠠ ᠤᠤ ? Are you sure want to cancel all file operations ᠲᠠ ᠪᠦᠬᠦ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠯᠠᠪᠳᠠᠢ ᠦᠭᠡᠢᠰᠬᠡᠬᠦ ᠤᠤ ? OK ᠪᠠᠳᠤᠯᠠᠬᠤ File Operation ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ Cancel ᠪᠣᠯᠢᠬᠤ Calculating time ᠴᠠᠭ ᠢ᠋ ᠪᠤᠳᠤᠵᠤ ᠪᠠᠢᠨ᠎ᠠ continue ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠬᠦ᠌ pause ᠲᠦᠷ ᠵᠣᠭᠰᠣᠭᠠᠶ᠎ᠠ canceling ... ᠦᠬᠡᠢᠰᠬᠡᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ sync ... ᠶᠠᠭ ᠢᠵᠢᠯ ᠠᠯᠬᠤᠮᠴᠢᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ %1Mb/s Est. time left: %2 %1Mb/s ᠳᠦᠰᠦᠬᠡᠯᠡᠵᠤ ᠪᠤᠢ ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠴᠠᠭ: %2 MessageDialog Peony ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Forcibly pulling out the device may cause data loss or device exceptions! ᠠᠯᠪᠠᠳᠠᠯᠭ᠎ᠠ ᠪᠠᠷ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠭᠠᠷᠭᠠᠬᠤ ᠨᠢ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ ᠡᠭᠦᠰᠭᠡᠬᠦ ᠪᠣᠯᠣᠮᠵᠢ ᠲᠠᠶ᠃ ᠬᠡᠬᠡᠭᠳᠡᠬᠦ ᠪᠤᠶᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠨᠢ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ ! OtherButton Other queue 其它队列 Other Queue ᠪᠤᠰᠤᠳ ᠪᠦᠯᠬᠦᠮ ᠤ᠋ᠨ ᠵᠢᠭᠰᠠᠭᠠᠯᠳᠠ Peony::AdvanceSearchBar Key Words ᠵᠠᠩᠭᠢᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠦᠭᠡ input key words... ᠵᠠᠩᠭᠢᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠦᠭᠡ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠁ Search Location ᠬᠠᠢᠬᠤ ᠵᠢᠮ choose search path... ᠬᠠᠢᠬᠤ ᠪᠠᠢᠷᠢᠯᠠᠯ ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ . . . browse ᠦᠵᠡᠬᠦ File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ Choose File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠡᠯᠪᠡᠷᠢ ᠮᠠᠶᠢᠭ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Modify Time ᠴᠠᠭ ᠢᠶᠠᠨ ᠵᠠᠰᠠᠨ᠎ᠠ ᠃ Choose Modify Time ᠵᠠᠰᠠᠭᠰᠠᠨ ᠴᠠᠭ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ Choose file size ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ show hidden file ᠨᠢᠭᠤᠭᠳᠠᠮᠠᠯ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ go back ᠤᠬᠤᠷᠢᠬᠤ hidden advance search page ᠳᠡᠭᠡᠳᠦ ᠵᠡᠷᠭᠡ᠎ᠶ᠋ᠢᠨ ᠬᠠᠢᠯᠳᠠ᠎ᠶ᠋ᠢᠨ ᠵᠠᠭᠠᠭ ᠭᠠᠳᠠᠷᠭᠤ᠎ᠶ᠋ᠢ ᠨᠢᠭᠤᠴᠠᠯᠠᠬᠤ file name ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ content ᠠᠭᠤᠯᠭ᠎ᠠ search ᠪᠦᠬᠦ ᠳᠠᠯ᠎ᠠ ᠪᠡᠷ ᠬᠠᠢᠬᠤ start search ᠡᠬᠢᠯᠡᠵᠤ ᠬᠠᠢᠬᠤ Select path ᠵᠠᠮ ᠰᠤᠩᠭ᠋ᠤᠬᠤ Operate Tips ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ Have no key words or search location! ᠵᠠᠩᠭᠢᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠦᠰᠦᠭ ᠪᠤᠶᠤ ᠵᠢᠮ ᠦᠭᠡᠢ ! Search file name or content at least choose one! ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ ᠪᠤᠶᠤ ᠠᠭᠤᠯᠭ᠎ᠠ᠎ᠶ᠋ᠢ ᠬᠠᠢᠬᠤ ᠦᠶᠡᠰ ᠠᠳᠠᠭ᠎ᠲᠠᠭᠠᠨ ᠨᠢᠭᠡ᠎ᠶ᠋ᠢ ᠲᠣᠭᠲᠠᠭᠠᠷᠠᠢ ! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ᠎ᠶ᠋ᠢ ᠬᠠᠢᠬᠤ Peony::AdvancedPermissionsPage Permission refinement settings ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠤ᠋ᠨ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠭ᠎ᠠ ᠶ᠋ᠢ ᠰᠢᠯᠢᠳᠡᠭᠵᠢᠬᠦᠯᠬᠦ Permission refinement settings tip ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠢ᠋ ᠰᠢᠯᠢᠳᠡᠭᠵᠢᠭᠦᠯᠦᠨ ᠪᠠᠢᠷᠢᠯᠠᠭᠤᠯᠬᠤ ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ ᠶ᠋ᠢ ᠰᠢᠯᠢᠳᠡᠭᠵᠢᠬᠦᠯᠬᠦ Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ ᠨᠢ ᠦᠨᠳᠦᠰᠦᠨ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠢ᠋ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠤ᠋ᠨ ᠪᠦᠯᠦᠭ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠳ᠋ᠤ᠌ ᠬᠤᠪᠢᠷᠠᠯᠲᠠ ᠭᠠᠷᠬᠤ ᠪᠣᠯᠤᠨ᠎ᠠ᠃ ACL ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠢ᠋ ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠨ ᠪᠠᠢᠷᠢᠯᠠᠭᠤᠯᠬᠤ ᠴᠢᠬᠤᠯᠠᠳᠠᠢ ᠤᠤ? User ᠬᠡᠷᠡᠭ᠌ᠯᠡᠭ᠌ᠴᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ Read ᠤᠩᠰᠢᠬᠤ Write ᠪᠢᠴᠢᠬᠦ Executable ᠭᠦᠢᠴᠡᠳᠬᠡᠵᠦ ᠪᠣᠯᠬᠤ delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Inherit permission ᠵᠠᠯᠭᠠᠮᠵᠢᠯᠠᠬᠤ ᠡᠷᠬᠡ ᠶᠢᠨ ᠬᠢᠵᠠᠭᠠᠷ Input domain/user name Add Other User Add ᠨᠡᠮᠡᠬᠦ Apply ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Error ᠪᠤᠷᠤᠭᠤ Please enter a user name User does not exist User already exists in list Peony::AllFileLaunchDialog Choose new application ᠨᠢᠭᠡ ᠰᠢᠨ᠎ᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ ᠵᠢ ᠰᠣᠩᠭᠣᠬᠤ Choose an Application to open this file ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠵᠤ ᠲᠤᠰ ᠹᠠᠢᠯ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠬᠦ apply now ᠳᠠᠷᠤᠢ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon ᠦᠪᠡᠷᠳᠡᠭᠡᠨ ᠲᠣᠭᠲᠠᠭᠠᠭᠰᠠᠨ ᠢᠺᠤᠨ ᠵᠢᠷᠤᠭ ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Type: ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name ᠨᠡᠷ᠎ᠡ Location ᠪᠠᠢᠷᠢᠰᠢᠯ move 移动 symbolLink ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ Folder ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠤ᠋ ᠪᠦᠯᠦᠭ Include: ᠪᠠᠭᠲᠠᠭᠠᠬᠤ: Move ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ Open with: ᠨᠡᠭᠡᠭᠡᠬᠦ ᠠᠷᠭ᠎ᠠ᠄ Description: ᠳᠦᠷᠰᠦᠯᠡᠬᠦ᠄ Select multiple files ᠣᠯᠠᠨ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Size: ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠬᠡᠷᠡᠭᠯᠡᠯᠲᠡ ᠄ Time Create: ᠴᠠᠭ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠄ Time Modified: ᠵᠠᠰᠠᠭᠰᠠᠨ ᠴᠠᠭ ᠄ Time Access: ᠰᠤᠷᠪᠤᠯᠵᠢᠯᠠᠬᠤ ᠴᠠᠭ ᠄ Readonly ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ Hidden ᠨᠢᠭᠤᠴᠠᠯᠠᠬᠤ Readonly (just applied by subfiles) ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ( ᠵᠥᠪᠬᠡᠨ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤᠨ ᠤ᠋ ᠳᠤᠤᠷᠠᠬᠢ ᠹᠠᠢᠯ) Property: ᠬᠠᠷᠢᠶᠠᠯᠠᠯ: usershare ᠲᠤᠰ ᠮᠠᠰᠢᠨ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ %1 (%2 Bytes) %1 (%2 ᠪᠠᠢᠲ ) Images (*.png *.jpg *.jpeg *.svg) ᠵᠢᠷᠤᠭ  .png .jpg .jpeg .svg  Please select a image that is smaller than 1MB. 1MB ᠡᠴᠡ ᠪᠠᠭ᠎ᠠ ᠵᠢᠷᠤᠭ ᠢ ᠰᠣᠩᠭᠣᠭᠠᠷᠠᠢ Choose a new folder: ᠨᠢᠭᠡᠨ ᠰᠢᠨ᠎ᠡ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠵᠢ ᠰᠣᠩᠭᠣᠬᠤ ᠄ Error ᠪᠤᠷᠤᠭᠤ cannot move a folder to itself ! ᠨᠢᠭᠡ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠵᠢ ᠲᠡᠭᠦᠨ᠎ᠦ᠌ ᠳᠤᠳᠤᠭᠠᠳᠤ ᠳ᠋ᠤ᠌ ᠰᠢᠯᠵᠢᠬᠦᠯᠵᠤ ᠪᠣᠯᠬᠤ ᠥᠬᠡᠢ! %1 Bytes %1 ᠪᠠᠰ %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 ᠹᠠᠢᠯ᠂ %2 ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ Can't get remote file information ᠠᠯᠤᠰ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ᠎ᠶ᠋ᠢ ᠣᠯᠵᠤ ᠳᠡᠢᠯᠬᠦ ᠦᠭᠡᠢ %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠭᠦᠷ : CPU Core: ᠭᠣᠣᠯ ᠲᠤᠭ᠎ᠠ: Memory Size: ᠳᠣᠲᠣᠭᠠᠳᠤ ᠬᠠᠳᠠᠭᠠᠯᠠᠭᠤᠷ ᠄ User Name: ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ : Desktop: ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ᠎ᠤ᠋ᠨ ᠣᠷᠴᠢᠨ ᠲᠣᠭᠣᠷᠢᠨ: You should mount this volume first ᠴᠢ ᠲᠤᠰ ᠡᠪᠬᠡᠮᠡᠯ᠎ᠢ᠋ ᠡᠯᠭᠦᠨ ᠪᠢᠴᠢᠪᠡᠯ ᠰᠠᠶᠢ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ᠎ᠶ᠋ᠢ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠦᠵᠡᠵᠦ ᠪᠣᠯᠤᠨ᠎ᠠ Name: ᠬᠤᠪᠢᠶᠠᠷᠢ ᠲᠤᠭᠤᠷᠢᠭ ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ ᠄ File System 文件系统 Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ Total Space: ᠶᠡᠷᠦᠩᠬᠡᠢ ᠪᠠᠭᠲᠠᠭᠠᠮᠵᠢ ᠄ Used Space: ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ ᠣᠷᠣᠨ ᠵᠠᠢ ᠄ In calculation... ᠪᠤᠳᠤᠵᠤ ᠪᠠᠢᠨ᠎ᠠ··· /root used: /root ᠡᠵᠡᠯᠡᠪᠡ: /home used: /homeᠡᠵᠡᠯᠡᠪᠡ: /usershare used: /usershare ᠡᠵᠡᠯᠡᠪᠡ: /data/* used: /data/* ᠡᠵᠡᠯᠡᠪᠡ: Unknow (No permission) ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ( ᠪᠠᠢᠴᠠᠭᠠᠠᠬᠤ ᠡᠷᠬᠡ ᠥᠬᠡᠢ) Free Space: ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠣᠷᠣᠨ ᠵᠠᠢ ᠄ Type: ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠄ Kylin Burner ᠺᠧᠯᠦᠳ᠋ᠡᠬᠦ Open with: ᠨᠡᠭᠡᠭᠡᠬᠦ ᠄ Unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠪᠯᠡᠯ Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦᠷ ᠲᠤ᠌ ᠴᠥᠷᠬᠡᠯᠡᠬᠦ Ip ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦᠷ Port ᠫᠣᠷᠲ Type ᠠᠰᠠᠭᠤᠳᠠᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ ᠬᠡᠯᠪᠡᠷᠢ Personal Collection server: ᠬᠤᠪᠢ ᠬᠥᠮᠦᠨ᠎ᠦ᠌ ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠦᠷ: Add ᠨᠡᠮᠡᠬᠦ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Connect ᠴᠦᠷᠬᠡᠯᠡᠬᠡ Ip input error, please re-enter! ip ᠢ᠋/ ᠵᠢ ᠤᠷᠤᠭᠤᠯᠤᠭᠰᠠᠨ ᠨᠢ ᠪᠤᠷᠤᠭᠤ᠂ ᠳᠠᠬᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Port input error, please re-enter! ᠦᠵᠦᠬᠦᠷ ᠢ᠋ ᠤᠷᠤᠭᠤᠯᠤᠭᠰᠠᠨ ᠨᠢ ᠪᠤᠷᠤᠭᠤ᠂ ᠳᠠᠬᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! add 添加 delete 连接 删除 connect 连接 Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user ᠨᠡᠪᠳᠡᠷᠡᠬᠦ ᠪᠡᠶ᠎ᠡ ᠵᠢᠨ ᠭᠠᠷᠤᠯ Please enter the %1's user name and password of the server. %1 ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠦᠷ ᠤ᠋ᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ ᠪᠠ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋᠎ᠢ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃ User's identity ᠴᠦᠷᠬᠡᠯᠡᠬᠦ ᠪᠡᠶ᠎ᠡ ᠵᠢᠨ ᠭᠠᠷᠤᠯ Guest ᠵᠤᠷᠴᠢᠭᠴᠢ (᠎ᠨᠡᠷ᠎ᠡ ᠪᠤᠷᠤᠭᠤᠯᠠᠨ ᠨᠡᠪᠳᠡᠷᠡᠬᠦ) Name ᠨᠡᠷ᠎ᠡ Password ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ domain ᠨᠸᠲ᠎ᠦᠨ ᠬᠠᠶᠢᠭ ᠄ Cancel ᠪᠣᠯᠢᠬᠤ OK ᠪᠠᠳᠤᠯᠠᠬᠤ guest 游客(匿名登录) Registered users ᠳᠠᠩᠰᠠᠯᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ name 用户名 password 密码 Remember the password ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠢ᠋ ᠴᠡᠭᠡᠵᠢᠯᠡᠬᠦ cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠤ᠋ᠨ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠳ᠋ᠤ᠌ ᠢᠯᠡᠬᠡᠬᠦ Create Link to... ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠵᠢ ᠢᠯᠡᠬᠡᠬᠡᠳ ... Choose a Directory to Create Link ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠴᠦᠷᠬᠡᠯᠡᠬᠡ ᠵᠢᠨ ᠭᠠᠷᠴᠠᠭ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠤ᠋ᠨ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠳ᠋ᠤ᠌ ᠢᠯᠡᠬᠡᠬᠦ Peony::CreateTemplateOperation File create error ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠹᠠᠢᠯ ᠪᠤᠷᠤᠭᠤ Can not create %1: Read-only mode, can not write-in %1 ᠢ᠋\ ᠵᠢ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ: ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ ᠮᠤᠳ᠋ᠸᠯ᠂ ᠪᠢᠴᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ NewFile ᠰᠢᠨ᠎ᠡ ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠹᠠᠢᠯ Create file ᠹᠠᠢᠯ ᠪᠠᠢᠭᠤᠯᠬᠤ NewFolder ᠰᠢᠨ᠎ᠡ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠪᠠᠢᠭᠤᠯᠬᠤ Create file error ᠹᠠᠢᠯ ᠢ᠋ ᠪᠠᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Peony::CustomErrorHandler Is Error Handled? ᠪᠤᠷᠤᠭᠤ᠎ᠶ᠋ᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠭᠰᠡᠨ ᠤᠤ ? Error not be handled correctly ᠪᠤᠷᠤᠭᠤ᠎ᠶ᠋ᠢ ᠵᠥᠪ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠭᠰᠡᠨ ᠦᠭᠡᠢ Peony::DefaultAcitonWidget No default app ᠠᠶᠠᠳᠠᠯ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠠᠷᠭ᠎ᠠ᠎ᠶ᠋ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ Peony::DefaultOpenWithWidget No default app ᠠᠶᠠᠳᠠᠯ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠠᠷᠭ᠎ᠠ᠎ᠶ᠋ᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview ᠦᠵᠡᠬᠦ ᠬᠡᠵᠤ ᠪᠤᠢ ᠹᠠᠢᠯ ᠵᠢᠨᠨ ᠰᠣᠩᠭᠣᠭᠠᠷᠠᠢ Can not preview this file ᠲᠤᠰ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠤᠷᠢᠳᠴᠢᠯᠠᠨ ᠦᠵᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠃ Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview ᠳᠡᠯᠬᠡᠷᠡᠩᠬᠦᠢ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠬᠢ This is the Default Preview of peony-qt ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠳᠡᠯᠭᠡᠷᠡᠩᠬᠦᠢ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ᠎ᠶ᠋ᠢ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Peony::DetailsPropertiesPage Name: ᠨᠡᠷᠡᠢᠳᠦᠯ: File type: ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠲᠦᠷᠦᠯ ᠬᠡᠯᠪᠡᠷᠢ Location: ᠪᠠᠢᠷᠢᠰᠢᠯ: yyyy-MM-dd, HH:mm:ss yyyy ᠤᠨ ᠤ᠋ MM ᠰᠠᠷ᠎ᠠ᠎ᠶ᠋ᠢᠨ dd ᠤ᠋ ᠡᠳᠦᠷ᠂ HH:mm:ss Create time: ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠴᠠᠭ ᠄ Modify time: ᠵᠠᠰᠠᠭᠰᠠᠨ ᠴᠠᠭ ᠄ yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ: Width: ᠥᠷᠭᠡᠨ᠎ᠦ᠌ ᠬᠡᠮᠵᠢᠶ᠎ᠡ : Height: ᠥᠨᠳᠥᠷ᠎ᠦ᠋ᠨ ᠬᠡᠮᠵᠢᠶ᠎ᠡ ᠄ Owner ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ Owner: ᠡᠵᠡᠮᠰᠢᠭᠴᠢ: Computer ᠺᠣᠮᠫᠢᠦᠢᠲ᠋ᠧᠷ Computer: ᠺᠣᠮᠫᠢᠦ᠋ᠲ᠋ᠸᠷ: %1 (this computer) %1 ( ᠲᠤᠰ ᠺᠣᠮᠫᠢᠦ᠋ᠲ᠋ᠧᠷ ) Unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠪᠯᠡᠯ Can't get remote file information ᠠᠯᠤᠰ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ᠎ᠶ᠋ᠢ ᠣᠯᠵᠤ ᠳᠡᠢᠯᠬᠦ ᠦᠭᠡᠢ %1 px %1 ᠫᠢᠺᠰᠧᠯ Peony::DirectoryView::IconView Icon View 图标视图 warn ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ This operation is not supported. ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠬᠡᠢ᠃ Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ This operation is not supported. ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠬᠡᠢ᠃ Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark ᠲᠦᠷᠭᠡᠨ ᠰᠤᠷᠪᠤᠯᠵᠢᠯᠠᠭ᠎ᠠ᠎ᠳ᠋ᠤ᠌ ᠨᠡᠮᠡᠬᠦ &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder ᠰᠢᠨ᠎ᠡ᠎ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name ᠨᠡᠷ᠎ᠡ File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ New... 新建... Open in New Window ᠰᠢᠨ᠎ᠡ ᠴᠤᠩᠬᠤᠨ ᠳᠡᠭᠡᠷ᠎ᠡ ᠨᠡᠬᠡᠬᠡᠬᠦ Open in New Tab ᠰᠢᠨ᠎ᠡ ᠱᠤᠰᠢᠭ᠎ᠠ ᠵᠢᠨ ᠨᠢᠭᠤᠷ ᠳᠡᠭᠡᠷ᠎ᠡ ᠨᠡᠬᠡᠬᠡᠬᠦ Open ᠨᠡᠬᠡᠬᠡᠬᠦ Open failed ᠨᠡᠬᠡᠬᠡᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ Open directory failed, you have no permission! ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠲᠠᠨ ᠳ᠋ᠤ᠌ ᠳᠤᠰ ᠭᠠᠷᠴᠠᠭ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ! Open with... ᠨᠡᠬᠡᠬᠡᠬᠦ ᠠᠷᠭ᠎ᠠ… More applications... ᠤᠯᠠᠮ ᠤᠯᠠᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ… Open %1 selected files %1 ᠰᠣᠩᠭᠣᠭᠳᠠᠭᠰᠠᠨ ᠹᠧᠢᠯ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ New ᠰᠢᠨ᠎ᠡ ᠡᠬᠦᠳᠭᠦ Empty File ᠬᠣᠭᠣᠰᠣᠨ ᠲᠧᠺᠰᠲ Folder ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠤ᠋ ᠪᠦᠯᠦᠭ View Type ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ ᠤ᠋ᠨ ᠵᠠᠭᠪᠤᠷ Sort By ᠵᠢᠭᠰᠠᠭᠠᠬᠤ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶ᠋ᠢᠭ Modified Date 修改日期 Original Path ᠤᠭ ᠤ᠋ᠨ ᠵᠢᠮ Sort Order... 排序顺序... Ascending Order ᠥᠭᠰᠥᠬᠦ ᠶᠠᠪᠤᠴᠠ Mount ᠡᠯᠬᠦᠬᠦ MultiSelect ᠢᠯᠡᠭᠦᠦ ᠰᠣᠩᠭᠣᠨ᠎ᠠ Descending Order ᠪᠠᠭᠤᠷᠠᠬᠤ Sort Preferences... 排序偏好... Folder First ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠤᠷᠢᠳᠠᠪᠡᠷ Chinese First ᠬᠢᠲᠠᠳ ᠬᠡᠯᠡ ᠤᠷᠢᠳᠠᠪᠡᠷ Show Hidden ᠨᠢᠭᠤᠭᠳᠠᠮᠠᠯ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Copy ᠺᠤᠫᠢᠳᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ File:"%1" is not exist, did you moved or deleted it? ᠹᠠᠢᠯ:"%1" ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠲᠠ ᠨᠢᠭᠡᠨᠲᠡ ᠬᠠᠰᠤᠭᠰᠠᠨ ᠪᠤᠶᠤ ᠥᠭᠡᠷ᠎ᠡ ᠭᠠᠵᠠᠷ ᠰᠢᠯᠵᠢᠭᠦᠯᠦᠭᠰᠡᠨ ᠦᠦ ? Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut ᠬᠠᠢᠴᠢᠯᠠᠬᠤ Delete to trash ᠬᠠᠰᠤᠵᠤ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠤᠷᠤᠭᠤᠯᠬᠤ Paste ᠨᠠᠭᠠᠬᠤ Refresh ᠰᠢᠨᠡᠳᠬᠡᠬᠦ Select All ᠪᠦᠬᠦᠨ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Properties ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠲᠤ ᠴᠢᠨᠠᠷ format ᠠᠩᠬᠠᠵᠢᠭᠤᠯᠬᠤ Restore ᠰᠡᠷᠭᠦᠭᠡᠬᠦ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Time Modified ᠴᠠᠭ ᠢᠶᠠᠨ ᠵᠠᠰᠠᠨ᠎ᠠ ᠃ Path ᠵᠠᠮ Sort Order ᠳᠠᠷᠠᠭᠠᠯᠠᠭᠤᠯᠬᠤ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ Newest to oldest ᠰᠢᠨ᠎ᠡ ᠡᠴᠡ ᠬᠠᠭᠤᠴᠢᠨ ᠳ᠋ᠤ᠌ Oldest to newest ᠬᠠᠭᠤᠴᠢᠨ ᠡᠴᠡ ᠰᠢᠨ᠎ᠡ ᠳ᠋ᠤ᠌ Files from large to small ᠶᠡᠬᠡ ᠡᠴᠡ ᠪᠠᠭ᠎ᠠ ᠳ᠋ᠤ᠌ Files from small to large ᠪᠠᠭ᠎ᠠ ᠡᠴᠡ ᠶᠡᠬᠡ ᠳ᠋ᠤ᠌ Sort Preferences ᠵᠢᠭᠰᠠᠭᠠᠯᠳᠠ ᠶ᠋ᠢᠨ ᠣᠨᠴᠠ ᠳᠤᠷᠠᠰᠢᠯ Error ᠪᠤᠷᠤᠭᠤ File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever ᠦᠨᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ Rename ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ Select &All 全选(&A) Reverse Select ᠭᠡᠳᠡᠷᠭᠦ ᠰᠤᠩᠭᠤᠬᠤ P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠢ᠋ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ (&C ) Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All ᠪᠦᠬᠦᠨ᠎ᠢ᠋ ᠠᠷᠢᠯᠭᠠᠬᠤ Open Parent Folder in New Window ᠰᠢᠨ᠎ᠡ ᠴᠣᠩᠬᠣᠨ᠎ᠳ᠋ᠤ᠌ ᠹᠠᠢᠯ ᠪᠠᠢᠬᠤ ᠭᠠᠷᠴᠠᠭ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ ᠶᠢᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠥᠷᠭᠡᠳᠬᠡᠨ᠎ᠡ Available extensions ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠥᠷᠭᠡᠳᠬᠡᠵᠦ ᠪᠣᠯᠣᠨ᠎ᠠ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Cancel ᠪᠣᠯᠢᠬᠤ Peony::FMWindow File Manager ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ advanced search ᠳᠡᠭᠡᠳᠦ ᠳᠡᠰ ᠤ᠋ᠨ ᠬᠠᠢᠯᠳᠠ clear record ᠲᠡᠦᠬᠡ᠎ᠶ᠋ᠢ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ Loaing... Press Esc to stop a loading. ᠶᠠᠭ ᠠᠴᠢᠶᠠᠯᠠᠵᠤ ᠪᠣᠢ᠂ Esc ᠳᠠᠷᠤᠪᠴᠢ᠎ᠶ᠋ᠢ ᠳᠠᠷᠤᠵᠤ ᠦᠬᠡᠢᠰᠬᠡᠵᠤ ᠪᠤᠯᠤᠨ᠎ᠠ᠃ Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. ᠵᠤᠬᠢᠶᠠᠭᠴᠢ: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> ᠬᠡᠪᠯᠡᠯ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠨᠢ(C): 2019-2020, ᠲᠢᠶᠠᠨᠵᠢᠨ ᠤᠤ ᠴᠢ ᠯᠢᠨ ᠮᠡᠳᠡᠭᠡ ᠵᠠᠩᠬᠢ ᠵᠢᠨ ᠮᠡᠷᠭᠡᠵᠢᠯ ᠤ᠋ᠨ ᠬᠢᠵᠠᠭᠠᠷᠳᠤ ᠺᠤᠮᠫᠠᠨᠢ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo ᠬᠦᠴᠦᠨ ᠦᠬᠡᠢ ᠪᠣᠯᠭᠠᠬᠤ Redo ᠰᠡᠷᠬᠦᠬᠡᠬᠦ Peony Qt ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder ᠰᠢᠨ᠎ᠡ᠎ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ Peony::FileBatchRenameOperation File Rename error ᠹᠠᠢᠯ ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠴᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Invalid file name %1%2%3 . ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠹᠠᠢᠯ᠎ᠦ᠋ᠨ ᠨᠡᠷ᠎ᠡ %1%2%3 . File Rename warning ᠹᠠᠢᠯ᠎ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ ᠵᠢ ᠰᠡᠷᠡᠮᠵᠢᠯᠡᠬᠦᠯᠬᠦ Are you sure to hidden these files? ᠲᠠ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠢᠭᠤᠬᠤ ᠪᠠᠷ ᠲᠣᠭᠲᠠᠬᠤ ᠤᠤ ? Rename file error ᠹᠠᠢᠯ᠎ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Peony::FileCopy Error in source or destination file path! ᠡᠬᠢ ᠡᠬᠦᠰᠪᠦᠷᠢ ᠬᠠᠶᠢᠭ ᠡᠰᠡᠬᠦᠯ᠎ᠡ ᠬᠠᠷᠠᠯᠳᠠᠳᠤ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠵᠢᠮ ᠠᠯᠳᠠᠭ᠎ᠠ ᠭᠠᠷᠪᠠ! Error when copy file: %1, can not copy special files, skip this file and continue? ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠄ ᠁ 1 ᠴᠠᠭ ᠲᠤ ᠪᠤᠷᠤᠭᠤ ᠭᠠᠷᠴᠤ ᠂ ᠣᠨᠴᠠᠭᠠᠢ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠪᠠᠭᠤᠯᠭᠠᠵᠤ ᠳᠡᠶᠢᠯᠬᠦ ᠦᠭᠡᠢ ᠂ ᠡᠨᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠦᠰᠦᠷᠦᠨ ᠳᠠᠪᠠᠵᠤ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠭᠦᠯᠬᠦ ᠪᠣᠯᠪᠠᠤ ? Can not copy %1, file doesn't exist. Has the file been renamed or moved? ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠶ ᠪᠣᠯ 1᠂ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠶ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠯᠡᠭ᠍ᠰᠡᠨ ᠪᠤᠶᠤ ᠰᠢᠯᠵᠢᠭᠦᠯᠦᠭ᠍ᠰᠡᠨ ᠦᠦ ? The dest file "%1" has existed! ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ "%1" ᠨᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠣᠢ ! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32 ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠨᠢ ᠳᠠᠩ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠡᠵᠡᠯᠡᠬᠦ ᠣᠷᠣᠨ ᠵᠠᠢ᠎ᠶ᠋ᠢ 4g ᠠ᠋ᠴᠠ ᠶᠡᠬᠡ ᠪᠠᠢᠬᠤ᠎ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ! Error writing to file: Input/output error ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠤ ᠪᠢᠴᠢᠵᠦ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠦᠶ᠎ᠡ ᠳᠦ ᠪᠤᠷᠤᠭᠤ ᠭᠠᠷᠭᠠᠨ᠎ᠠ ᠄ ᠣᠷᠣᠭᠤᠯᠬᠤ / ᠭᠠᠷᠭᠠᠬᠤ ᠪᠤᠷᠤᠭᠤ Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠶ ᠲᠡᠭᠦᠨ ᠦ ᠦᠨᠳᠦᠰᠦᠨ ᠭᠠᠷᠴᠠᠭ ᠲᠤ ᠪᠠᠶᠢᠬᠤ ᠡᠰᠡᠬᠦ ᠂ ᠡᠰᠡᠬᠦᠯ᠎ᠡ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠨᠢ gphoto2 ᠤᠨ ᠬᠡᠯᠡᠯᠴᠡᠭᠡᠷ ᠢ ᠵᠥᠪ ᠳᠡᠮᠵᠢᠬᠦ ᠡᠰᠡᠬᠦ ᠶᠢ ᠦᠨᠡᠨᠬᠦ ᠪᠠᠲᠤᠯᠠᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠢ Failed to create %1. ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠶ Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠨᠢ ᠬᠠᠰᠤᠭᠳᠠᠭᠰᠠᠨ ᠡᠰᠡᠬᠦ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ ! Write file error: There is no available disk space for device! ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠪᠤᠷᠤᠭᠤ ᠪᠢᠴᠢᠵᠦ ᠣᠷᠣᠭᠤᠯᠤᠨ᠎ᠠ ᠄ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠳᠦ ᠬᠡᠷᠡᠭ᠍ᠯᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠰᠣᠷᠢᠨᠵᠢᠨ ᠫᠠᠨᠰᠠ ᠶᠢᠨ ᠣᠷᠣᠨ ᠵᠠᠢ ᠪᠠᠶᠢᠬᠤ ᠦᠭᠡᠢ ! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure ᠹᠠᠢᠯ᠎ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠦᠬᠡᠢᠰᠬᠡᠬᠦ Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 ᠭᠠᠷᠴᠠᠭ %1 ᠢ᠋/᠎ᠶ᠋ᠢ ᠪᠠᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠄ %2 File copy error ᠹᠠᠢᠯ ᠢ᠋ ᠺᠤᠪᠢᠳᠠᠭᠰᠠᠨ ᠪᠤᠷᠤᠭᠤ The file name exceeds the limit ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠨᠡᠷ᠎ᠡ ᠨᠢ ᠬᠢᠵᠠᠭᠠᠷᠯᠠᠯ ᠠᠴᠠ ᠬᠡᠲᠦᠷᠡᠵᠡᠢ Cannot opening file, permission denied! ᠹᠠᠢᠯ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ᠂ ᠡᠷᠬᠡ᠎ᠦᠭᠡᠢ ! File:%1 was not found. ᠹᠠᠢᠯ᠎ᠢ᠋ ᠡᠷᠢᠵᠦ ᠣᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠄ %1 open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in %1 ᠡᠴᠡ ᠺᠤᠫᠢᠳᠠᠭᠠᠳ %2 ᠬᠦᠷᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠄ ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ ᠮᠤᠳ᠋ᠸᠯ᠂ ᠪᠢᠴᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ Can not copy %1 to %2: Permission denied %1 ᠡᠴᠡ ᠺᠤᠫᠢᠳᠠᠭᠠᠳ %2 ᠬᠦᠷᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠄ ᠡᠷᠬᠡ ᠬᠦᠷᠬᠦ ᠥᠬᠡᠢ Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. 1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠳᠡᠭᠡᠷ᠎ᠡ ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠣᠷᠣᠨ ᠵᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠦᠭᠡᠶ ᠪᠠᠭᠤᠯᠭᠠᠪᠤᠷᠢ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ ᠄ 2 GB ᠂ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠣᠷᠣᠨ ᠵᠠᠶ ᠄ 3 GB Link file error ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠴᠥᠷᠬᠡ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Burning does not support replacement ᠰᠡᠢᠯᠦᠮᠡᠯ ᠤ᠋ᠨ ᠲᠡᠮᠳᠡᠭᠯᠡᠯ ᠨᠢ ᠰᠣᠯᠢᠬᠤ ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ ᠃ Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error ᠹᠠᠢᠯ ᠢ᠋ ᠬᠠᠰᠤᠭᠰᠠᠨ ᠪᠤᠷᠤᠭᠤ Delete file error ᠪᠤᠷᠤᠭᠤ᠎ᠶ᠋ᠢ ᠬᠠᠰᠤᠬᠤ Invalid Operation! Can not delete "%1". ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ ! " % 1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠬᠠᠰᠤᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ᠃ Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠤᠨ ᠶᠠᠷᠢᠯᠴᠠᠭᠠᠨ ᠤ ᠬᠦᠷᠢᠶ᠎ᠡ ᠶᠢ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠪᠣᠯᠭᠠᠪᠠ Message recipient disconnected from message bus without replying! ᠮᠡᠳᠡᠭᠡ ᠬᠦᠯᠢᠶᠡᠨ ᠠᠪᠤᠭᠴᠢ ᠬᠠᠷᠢᠭᠤ ᠦᠭᠡᠢ ᠪᠠᠢᠳᠠᠯ ᠳᠣᠣᠷ᠎ᠠ ᠮᠡᠳᠡᠭᠡᠨ᠎ᠦ᠌ ᠶᠡᠷᠦᠩᠬᠡᠢ ᠤᠲᠠᠰᠤ᠎ᠲᠠᠢ ᠵᠠᠯᠭᠠᠯᠳᠤᠬᠤ᠎ᠪᠠᠨ ᠲᠠᠰᠤᠯᠤᠭᠠᠷᠠᠢ ! Error ᠪᠤᠷᠤᠭᠤ Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ folder ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ file ᠹᠠᠢᠯ text file ᠲᠧᠺᠰᠲ Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Error ᠪᠤᠷᠤᠭᠤ Open Link failed ᠴᠦᠷᠬᠡᠯᠡᠭᠡ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ File not exist, do you want to delete the link file? ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠲᠤᠰ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶᠢᠭ᠎ᠢ᠋ ᠬᠠᠰᠤᠨ᠎ᠠ ᠤᠤ ? Can not open path "%1",permission denied. "%1" ᠵᠢᠮ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠡᠷᠬᠡ ᠲᠡᠪᠴᠢᠭᠳᠡᠪᠡ᠃ Can not find path "%1",are you moved or renamed it? ᠵᠢᠮ᠎ᠢ᠋ ᠡᠷᠢᠵᠦ ᠣᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠄ "%1"᠂ ᠲᠠ ᠨᠢᠭᠡᠨᠲᠡ ᠰᠢᠯᠵᠢᠬᠦᠯᠦᠭᠰᠡᠨ ᠪᠤᠶᠤ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠭᠰᠡᠨ ᠦᠦ ? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) ᠰᠠᠯᠠᠭ᠎ᠠ ᠳᠦᠷᠦᠯ Symbol Link, ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠂ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ File Name ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ Delete Date ᠬᠠᠰᠤᠭᠰᠠᠨ ᠡᠳᠦᠷ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ Create Date ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ Time Modified ᠴᠠᠭ ᠢᠶᠠᠨ ᠵᠠᠰᠠᠨ᠎ᠠ ᠃ File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ Original Path ᠤᠭ ᠤ᠋ᠨ ᠵᠢᠮ Path ᠵᠠᠮ File %1 is existed in space, please not add file repeatly. ᠣᠷᠣᠨ ᠵᠠᠶ ᠳᠤ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ 1 ᠣᠷᠣᠰᠢᠵᠤ ᠂ ᠳᠠᠪᠬᠤᠷᠳᠠᠭᠤᠯᠤᠨ ᠨᠡᠮᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠃ Operation not supported ᠠᠵᠢᠯᠯᠠᠬᠤ ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠶ File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label ᠲᠡᠮᠳᠡᠭ ᠨᠡᠮᠡᠬᠦ Delete All Label ᠪᠦᠬᠦ ᠲᠡᠮᠳᠡᠭ᠎ᠢ᠋ ᠤᠰᠠᠳᠬᠠᠬᠤ Label Management ... ᠲᠡᠮᠳᠡᠭ ᠤᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ ᠶᠢᠨ ᠁ add "%1" ᠨᠡᠮᠡᠪᠡ "%1" Remove "%1" ᠢ ᠬᠠᠰᠤᠪᠠ "%1" Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... ᠲᠡᠮᠳᠡᠭ ᠤᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ ᠶᠢᠨ ᠁ Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 1% 2 ᠨᠡᠭᠡᠭᠡᠬᠦ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶ᠋ᠢᠭ unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ No application is set to open file "%1 %2" ᠶᠠᠮᠠᠷᠪᠠ ᠬᠡᠷᠡᠬᠯᠡᠭᠡᠨ ᠤ ᠫᠷᠦᠭᠷᠠᠮ ᠢ  アイ  ᠪᠤᠯᠭᠠᠵᠤ ᠲᠤᠭᠢᠷᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ Still using the last opened application: ᠳᠡᠭᠡᠷ᠎ᠡ ᠤᠳᠠᠭ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠭᠰᠡᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠦ ᠫᠷᠦᠭ᠍ᠷᠠᠮ ᠢ ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠪᠠᠶᠢᠨ᠎ᠠ ᠄ known ᠮᠡᠳᠡᠭᠰᠡᠨ Open application is used by default: ᠨᠡᠬᠡᠬᠡᠯᠲᠡᠲᠦ ᠬᠡᠯᠪᠡᠷᠢ ᠶᠢᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠦ ᠫᠷᠦᠭᠷᠠᠮ ᠢ ᠳᠤᠪ ᠳᠤᠭᠤᠢ ᠮᠡᠳᠡᠷᠡᠵᠦ ᠪᠠᠶᠢᠨ᠎ᠠ ᠄ You can search in the Software Center for an application that can open this file, or select an existing application on your computer. ᠵᠥᠭᠡᠯᠡᠨ ᠲᠣᠨᠣᠭ ᠤᠨ ᠲᠥᠪ ᠡᠴᠡ ᠡᠨᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠬᠡᠷᠡᠭ᠍ᠯᠡᠬᠦ ᠫᠷᠦᠭ᠍ᠷᠠᠮ ᠢ ᠨᠡᠭᠡᠭᠡᠵᠦ ᠪᠣᠯᠣᠨ᠎ᠠ ᠂ ᠡᠰᠡᠭᠦᠯ᠎ᠡ ᠺᠣᠮᠫᠢᠦᠢᠲ᠋ᠧᠷ ᠳᠡᠭᠡᠷᠡᠬᠢ ᠣᠳᠣ ᠶᠢᠨ ᠬᠡᠷᠡᠭ᠍ᠯᠡᠭᠡᠨ ᠦ ᠫᠷᠦᠭ᠍ᠷᠠᠮ ᠢ ᠰᠣᠩᠭᠣᠵᠤ ᠪᠣᠯᠣᠨ᠎ᠠ Other application: ᠪᠤᠰᠤᠳ ᠬᠡᠷᠡᠭᠯᠡᠯᠲᠡ ᠄ Select application: ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠦ ᠳᠡᠰ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ ᠢ ᠰᠣᠩᠭᠣᠬᠤ Always open the %1%2 file with this application ᠡᠨᠡᠬᠦ ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ ᠦ ᠫᠷᠦᠭᠷᠠᠮ ᠢ ᠢᠮᠠᠭᠲᠠ ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠂ 1% 2 ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ Choose other application ᠪᠤᠰᠤᠳ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ Go to application center ᠰᠣᠹᠲ᠎ᠤ᠋ᠨ ᠲᠥᠪ ᠲᠤ᠌ ᠴᠢᠬᠤᠯᠠ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Cancel ᠪᠣᠯᠢᠬᠤ Desktop files(*.desktop) ᠰᠢᠷᠡᠭᠡᠨ ᠨᠢᠭᠤᠷ ᠤ᠋ᠨ ᠹᠠᠢᠯ (*.desktop) Select Open Action  ᠨᠡᠬᠡᠬᠡᠵᠦ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠬᠤ  ᠶᠢ ᠰᠤᠩᠭ᠋ᠤᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠢ Select ᠰᠤᠩᠭᠤᠬᠤ Peony::FileLaunchAction Execute Directly ᠰᠢᠭᠤᠳ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ Execute in Terminal ᠦᠵᠦᠭᠦᠷ᠎ᠲᠦ᠍ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ Detected launching an executable file %1, you want? ᠶᠠᠭ ᠨᠢᠭᠡᠨ ᠬᠡᠷᠡᠭᠵᠢᠭᠦᠯᠵᠦ ᠪᠣᠯᠬᠤ ᠹᠠᠢᠯ %1 ᠢ᠋/᠎ᠶ᠋ᠢ ᠨᠡᠭᠡᠭᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠲᠠ ᠶᠠᠭᠤ ᠵᠢ ᠬᠦᠰᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ ? Delete file Warning 删除文件警告 Open Failed ᠨᠡᠭᠡᠭᠡᠵᠦ ᠳᠡᠶᠢᠯᠬᠦ ᠦᠭᠡᠢ ᠃ Can not open %1, file not exist, is it deleted? %1 ᠢ᠋/᠎ᠶ᠋ᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠂ ᠹᠠᠢᠯ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠨᠢᠭᠡᠨᠲᠡ ᠬᠠᠰᠤᠭᠳᠠᠭᠰᠠᠨ ᠡᠰᠡᠬᠦ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ᠃ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠦᠭᠡᠢ File is not readable. Please check if file has read permisson. ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠤᠩᠰᠢᠵᠤ ᠪᠣᠯᠣᠰᠢ ᠦᠭᠡᠢ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠨᠢ ᠤᠩᠰᠢᠵᠤ ᠠᠪᠬᠤ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠲᠡᠢ ᠡᠰᠡᠬᠦ ᠶᠢ ᠪᠠᠢ᠌ᠴᠠᠭᠠᠭᠠᠷᠠᠢ By Default App ᠠᠶᠠᠳᠠᠯ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠬᠡᠯᠪᠡᠷᠢ᠎ᠶ᠋ᠢ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ Launch Options ᠰᠣᠩᠭᠣᠯᠲᠠ ᠭᠦᠢᠴᠡᠳᠬᠡᠬᠦ Open Link failed ᠴᠦᠷᠬᠡᠯᠡᠭᠡ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ File not exist, do you want to delete the link file? ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠲᠤᠰ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠮᠠᠶᠢᠭ᠎ᠢ᠋ ᠬᠠᠰᠤᠨ᠎ᠠ ᠤᠤ ? Can not open %1, Please confirm you have the right authority. %1 ᠢ᠋/᠎ᠶ᠋ᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠂ ᠲᠠᠨ᠎ᠤ᠋ ᠣᠨᠣᠪᠴᠢᠲᠠᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠡᠷᠬᠡ ᠬᠢᠵᠠᠭᠠᠷ᠎ᠲᠠᠢ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ᠃ Open App failed ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠠᠰᠠᠭᠤᠳᠠᠯ ᠲᠠᠢ The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? ᠲᠤᠰ ᠴᠦᠷᠬᠡᠯᠡᠭᠡ᠎ᠶ᠋ᠢᠨ ᠵᠢᠭᠠᠭᠰᠠᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ ᠨᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠥᠭᠡᠷᠡᠴᠢᠯᠡᠭᠳᠡᠬᠦ ᠪᠤᠶᠤ ᠪᠠᠭᠤᠯᠭᠠᠭᠳᠠᠭᠰᠠᠨ ᠪᠣᠯᠬᠣᠷ ᠲᠤᠰ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠨᠢ ᠬᠡᠪ᠎ᠦ᠋ᠨ ᠶᠣᠰᠣᠭᠠᠷ ᠠᠵᠢᠯᠯᠠᠵᠤ ᠴᠢᠳᠠᠬᠤ ᠦᠭᠡᠢ ᠃ ᠲᠤᠰ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠵᠢ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ? Error ᠪᠤᠷᠤᠭᠤ File original path not exist, are you deleted or moved it? ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠤᠤᠯ ᠵᠠᠮ ᠳᠤ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ᠡᠰᠡᠬᠦᠯ᠎ᠡ ᠰᠢᠯᠵᠢᠭ᠍ᠰᠡᠨ ᠦᠦ ? Can not get a default application for opening %1, do you want open it with text format? %1 ᠤ᠋ᠨ/ ᠵᠢᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ᠎ᠶ᠋ᠢ ᠠᠶᠠᠳᠠᠯ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠲᠧᠺᠰᠲ ᠨᠠᠢᠷᠠᠭᠤᠯᠤᠭᠤᠷ᠎ᠢ᠋ᠶ᠋ᠠᠷ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ ᠦᠦ ? Operate Tips ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ Sorry, the system currently does not have an application that supports .%1 (%2) files. ᠤᠷᠢᠳᠠᠭᠠᠳᠠ ᠪᠠᠢ᠃ ᠥᠩᠭᠡᠷᠡᠭᠡ ᠡᠳᠦᠷ ᠳᠦ %1 (%2) ᠵᠠᠭᠤᠨ ᠦ ᠥᠩᠭᠡᠷᠡᠯᠡᠬᠦ ᠪᠣᠯᠭᠠᠬᠤ �ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠ ᠪᠠᠢᠢᠭᠠᠳ ᠬᠣᠤᠴᠢᠬᠤ ᠦᠭᠡᠢ᠃ Please search the software store for programs that can run %1 applications, or select an existing application on your computer to open it. %1 ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠᠨ ᠤ ᠵᠠᠪᠠᠬᠤ ᠢᠶᠠᠨ ᠥᠩᠭᠡᠷᠡᠭᠡ ᠶᠢᠨ ᠳᠠᠬᠢᠨ ᠳᠤ ᠡᠷᠬᠡ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠᠨ ᠤ ᠵᠠᠪᠠᠭᠠᠷ ᠤᠳᠠᠷᠠᠬᠤ ᠡᠴᠡ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠ ᠪᠠᠨ ᠨᠡᠪᠡᠷᠡᠬᠦ ᠡᠴᠡ ᠲᠠᠨᠤ ᠳᠡᠭᠡᠷ᠎ᠡ ᠪᠠᠶᠢᠨᠠ᠃ Sorry, the system currently does not have a default application set for opening "xxx.xxx" file format. ᠤᠷᠢᠳᠠᠭᠠᠳᠠ ᠪᠠᠢ᠃ ᠥᠩᠭᠡᠷᠡᠭᠡ ᠡᠳᠦᠷ ᠳᠦ "xxx.xxx" ᠵᠠᠭᠤᠨ ᠦ ᠥᠩᠭᠡᠷᠡᠯᠡᠬᠦ ᠠᠨᠤ ᠦᠨᠡᠬᠦ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠ ᠪᠠᠢᠢᠭᠠᠳ ᠬᠣᠤᠴᠢᠬᠤ ᠦᠭᠡᠢ᠃ Please search the software store for applications that can open this file, or select an existing application in the system. ᠡᠨᠡ ᠵᠠᠭᠤᠨ ᠢ ᠥᠩᠭᠡᠷᠡᠯᠡᠬᠦ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠᠨ ᠤ ᠵᠠᠪᠠᠬᠤ ᠢᠶᠠᠨ ᠥᠩᠭᠡᠷᠡᠭᠡ ᠶᠢᠨ ᠳᠠᠬᠢᠨ ᠳᠤ ᠡᠷᠬᠡ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠᠨ ᠤ ᠵᠠᠪᠠᠭᠠᠷ ᠤᠳᠠᠷᠠᠬᠤ ᠡᠴᠡ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠ ᠪᠠᠨ ᠨᠡᠪᠡᠷᠡᠬᠦ ᠡᠴᠡ ᠲᠠᠨᠤ ᠳᠡᠭᠡᠷ᠎ᠡ ᠪᠠᠶᠢᠨᠠ᠃ Search Software Store ᠥᠩᠭᠡᠷᠡᠭᠡ ᠶᠢᠨ ᠳᠠᠬᠢᠨ ᠳᠤ ᠬᠠᠢᠢᠷᠠᠬᠤ Select Application... ᠪᠣᠯᠭᠠᠬᠤ ᠪᠡᠶᠡ ᠪᠠᠭᠤᠯᠭᠠ ᠪᠠᠨ ᠨᠡᠪᠡᠷᠡᠬᠦ... Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ Link file error ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠴᠥᠷᠬᠡ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error ᠹᠠᠢᠯ ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ ᠪᠤᠷᠤᠭᠤ File System 文件系统 Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. 1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠳᠡᠭᠡᠷ᠎ᠡ ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠣᠷᠣᠨ ᠵᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠦᠭᠡᠶ ᠪᠠᠭᠤᠯᠭᠠᠪᠤᠷᠢ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ ᠄ 2 GB ᠂ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠣᠷᠣᠨ ᠵᠠᠶ ᠄ 3 GB File move error ᠹᠠᠢᠯ ᠢ᠋ ᠰᠢᠯᠵᠢᠬᠦᠯᠦᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Invalid move operation, cannot move a file into its sub directories. ᠬᠦᠴᠦᠨ ᠦᠭᠡᠶ ᠰᠢᠯᠵᠢᠮᠡᠯ ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠨᠢ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢᠶᠠᠨ ᠲᠡᠭᠦᠨ ᠦ ᠭᠠᠷᠴᠠᠭ ᠲᠤ ᠰᠢᠯᠵᠢᠭᠦᠯᠵᠦ ᠳᠡᠶᠢᠯᠬᠦ ᠦᠭᠡᠶ The file name exceeds the limit ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠨᠡᠷ᠎ᠡ ᠨᠢ ᠬᠢᠵᠠᠭᠠᠷᠯᠠᠯ ᠠᠴᠠ ᠬᠡᠲᠦᠷᠡᠵᠡᠢ Create file error ᠹᠠᠢᠯ ᠢ᠋ ᠪᠠᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Can not move %1 to %2: Read-only mode, can not write-in %1 ᠡᠴᠡ%2 ᠲᠤ᠌\ ᠳ᠋ᠤ᠌ ᠰᠢᠯᠵᠢᠬᠦᠯᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠄ ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ ᠮᠤᠳ᠋ᠸᠯ᠂ ᠪᠢᠴᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ Can not move %1 to %2: Permission denied %1 ᠡᠴᠡ%2 ᠲᠤ᠌\ ᠳ᠋ᠤ᠌ ᠰᠢᠯᠵᠢᠬᠦᠯᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠄ ᠡᠷᠬᠡ ᠬᠦᠷᠬᠦ ᠥᠬᠡᠢ Cannot opening file, permission denied! ᠹᠠᠢᠯ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ᠂ ᠡᠷᠬᠡ᠎ᠦᠭᠡᠢ ! File:%1 was not found. ᠹᠠᠢᠯ᠎ᠢ᠋ ᠡᠷᠢᠵᠦ ᠣᠯᠤᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠄ %1 Invalid Operation. ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error ᠹᠠᠢᠯ ᠢ᠋ ᠬᠠᠰᠤᠭᠰᠠᠨ ᠪᠤᠷᠤᠭᠤ Link file error ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠴᠥᠷᠬᠡ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Burning does not support replacement ᠰᠡᠢᠯᠦᠮᠡᠯ ᠤ᠋ᠨ ᠲᠡᠮᠳᠡᠭᠯᠡᠯ ᠨᠢ ᠰᠣᠯᠢᠬᠤ ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ ᠃ Burn failed 刻录失败 File delete 文件删除 Invalid Operation ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ Peony::FileOperationAfterProgressPage &More Details ᠳᠡᠯᠬᠡᠷᠡᠩᠬᠦᠢ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ (&M ) Peony::FileOperationErrorDialog File Operation Error ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠪᠤᠷᠤᠭᠤ unkwon ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠰᠢᠯᠲᠠᠭᠠᠨ null ᠬᠣᠭᠣᠰᠣᠨ ᠃ Error message: ᠪᠤᠷᠤᠭᠤ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ: Source File: ᠡᠬᠢ ᠹᠠᠢᠯ: Dest File: ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ: Ignore ᠰᠤᠷᠠᠭ ᠵᠠᠩᠬᠢ ᠵᠢ ᠤᠮᠳᠤᠭᠠᠢᠯᠠᠬᠤ Ignore All ᠪᠦᠬᠦᠨ ᠢ᠋ ᠤᠮᠳᠤᠭᠠᠢᠯᠠᠬᠤ Overwrite ᠪᠦᠷᠬᠦᠬᠦ Overwrite All ᠪᠦᠬᠦᠨ᠎ᠢ᠋ ᠪᠦᠷᠬᠦᠬᠦ Backup ᠨᠥᠭᠡᠴᠡᠯᠡᠬᠦ Backup All ᠪᠦᠬᠦ ᠨᠦᠭᠡᠴᠡ &Retry ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ (&R ) &Cancel ᠦᠬᠡᠢᠰᠬᠡᠬᠦ(&C) Peony::FileOperationErrorDialogBase Close ᠬᠠᠭᠠᠬᠤ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace ᠰᠤᠯᠢᠬᠤ Ignore ᠰᠤᠷᠠᠭ ᠵᠠᠩᠬᠢ ᠵᠢ ᠤᠮᠳᠤᠭᠠᠢᠯᠠᠬᠤ Do the same ᠪᠦᠬᠦ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ <p>This location already contains the file '%1', Do you want to override it?</p> <p> ᠪᠠᠢᠷᠢᠯᠠᠯ ᠳ᠋ᠤ᠌ ᠨᠢᠭᠡᠨᠳᠡ '%1' ᠨᠡᠷ᠎ᠡ᠎ᠲᠡᠢ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠪᠠᠭᠲᠠᠭᠠᠵᠤ ᠪᠣᠢ᠂ ᠲᠠ ᠲᠡᠭᠦᠨ᠎ᠢ᠋ ᠰᠣᠯᠢᠬᠤ ᠤᠤ ? </p> Unexpected error from %1 to %2 %1 ᠡᠴᠡ %2 ᠬᠦᠷᠬᠦ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠬᠡᠪ᠎ᠦ᠋ᠨ ᠪᠤᠰᠤ ᠠᠯᠳᠠᠭ᠎ᠠ ᠭᠠᠷᠪᠠ Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup ᠨᠥᠭᠡᠴᠡᠯᠡᠬᠦ Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel ᠪᠣᠯᠢᠬᠤ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected ᠳ᠋ᠢᠰᠺ ᠨᠢ ᠭᠦᠢᠴᠡᠳ ᠦᠭᠡᠢ ᠪᠤᠶᠤ ᠬᠠᠮᠠᠭᠠᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠮᠥᠷᠲᠡᠭᠡᠨ ᠹᠠᠢᠯ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ ᠦᠭᠡᠢ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ Peony::FileOperationErrorDialogNotice OK Cancel Make sure the disk is not full or write protected and that the file is not protected ᠳ᠋ᠢᠰᠺ ᠨᠢ ᠭᠦᠢᠴᠡᠳ ᠦᠭᠡᠢ ᠪᠤᠶᠤ ᠬᠠᠮᠠᠭᠠᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠮᠥᠷᠲᠡᠭᠡᠨ ᠹᠠᠢᠯ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ ᠦᠭᠡᠢ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ Peony::FileOperationErrorDialogSkip Skip ᠦᠰᠦᠷᠴᠤ᠌ ᠭᠠᠷᠬᠤ Cancel Skip all ᠪᠦᠬᠦᠨ ᠢ᠋ ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠬᠤ Make sure the disk is not full or write protected and that the file is not protected ᠳ᠋ᠢᠰᠺ ᠨᠢ ᠭᠦᠢᠴᠡᠳ ᠦᠭᠡᠢ ᠪᠤᠶᠤ ᠬᠠᠮᠠᠭᠠᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠮᠥᠷᠲᠡᠭᠡᠨ ᠹᠠᠢᠯ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ ᠦᠭᠡᠢ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ Peony::FileOperationErrorDialogWarning OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Skip all ᠪᠦᠬᠦᠨ ᠢ᠋ ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠬᠤ Make sure the disk is not full or write protected and that the file is not protected ᠳ᠋ᠢᠰᠺ ᠨᠢ ᠭᠦᠢᠴᠡᠳ ᠦᠭᠡᠢ ᠪᠤᠶᠤ ᠬᠠᠮᠠᠭᠠᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠮᠥᠷᠲᠡᠭᠡᠨ ᠹᠠᠢᠯ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ ᠦᠭᠡᠢ᠎ᠶ᠋ᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ Copy ᠺᠤᠫᠢᠳᠠᠬᠤ Move ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ Rename ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ Link ᠴᠥᠷᠬᠡᠯᠡᠬᠦ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Delete Permanently ᠦᠨᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ Restore ᠰᠡᠷᠭᠦᠭᠡᠬᠦ New ᠰᠢᠨ᠎ᠡ ᠡᠬᠦᠳᠭᠦ - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ᠰᠡᠷᠡᠮᠵᠢᠯᠡᠬᠦᠯᠬᠦ '%1' is occupied,you cannot operate! '%1' ᠨᠢᠭᠡᠨᠲᠡ ᠡᠵᠡᠯᠡᠭᠳᠡᠭᠰᠡᠨ᠂ ᠲᠠ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ᠎ᠶ᠋ᠢ ᠶᠠᠪᠤᠭᠳᠠᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ ! No, go to settings 否,跳转到设置 OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Do you want to put selected %1 item(s) into trash? ᠰᠣᠩᠭᠣᠭᠰᠠᠨ %1 ᠵᠤᠷᠪᠤᠰ᠎ᠢ᠋ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠬᠢᠬᠦ ᠵᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠤᠤ ? Do not show again ᠳᠠᠬᠢᠵᠤ ᠢᠯᠡᠷᠡᠬᠦᠯᠬᠦ ᠦᠬᠡᠢ File System 文件系统 System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ Insufficient storage space ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠬᠦᠷᠦᠯᠴᠡᠬᠦ ᠦᠭᠡᠶ %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. 1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠳᠡᠭᠡᠷ᠎ᠡ ᠦᠯᠡᠳᠡᠭᠰᠡᠨ ᠣᠷᠣᠨ ᠵᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠦᠭᠡᠶ ᠪᠠᠭᠤᠯᠭᠠᠪᠤᠷᠢ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ ᠄ 2 GB ᠂ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠣᠷᠣᠨ ᠵᠠᠶ ᠄ 3 GB Can't delete. ᠬᠠᠰᠤᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ You can't delete a file whenthe file is doing another operation ᠨᠢᠭᠡᠨ ᠶᠠᠭ ᠪᠤᠰᠤᠳ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ ᠬᠢᠵᠦ ᠪᠠᠢᠭ᠎ᠠ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠬᠠᠰᠤᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ File Operation is Busy ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠶᠠᠭᠠᠷᠠᠤ There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. ᠲᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ᠎ᠶ᠋ᠢ ᠭᠦᠢᠴᠡᠳᠬᠡᠬᠦ᠎ᠡᠴᠡ ᠡᠮᠦᠨ᠎ᠡ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠳᠠᠭᠤᠰᠤᠭᠠᠳᠤᠢ᠂ ᠲᠡᠷᠡ ᠨᠢ ᠳᠡᠭᠡᠷ᠎ᠡ ᠨᠢᠭᠡ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ᠎ᠶ᠋ᠢ ᠳᠠᠭᠤᠰᠬᠠᠭᠰᠠᠨ᠎ᠤ᠋ ᠳᠠᠷᠠᠭ᠎ᠠ ᠳᠠᠬᠢᠨ ᠭᠦᠢᠴᠡᠳᠬᠡᠬᠦ ᠴᠢᠬᠤᠯᠠᠲᠠᠢ ᠃ ᠬᠡᠷᠪᠡ ᠲᠠ ᠹᠠᠢᠯ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠶᠠᠪᠤᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠬᠦᠰᠡᠪᠡᠯ ᠲᠣᠪᠶᠣᠭ ᠳᠠᠬᠢ 《 ᠪᠠᠢᠯᠭᠠᠬᠤ᠎ᠶ᠋ᠢ ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠬᠦ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠶᠠᠪᠤᠭᠳᠠᠭᠤᠯᠬᠤ 》 ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯᠲᠠ᠎ᠶ᠋ᠢ ᠥᠭᠡᠷᠡᠴᠢᠯᠡᠵᠦ ᠪᠣᠯᠤᠨ᠎ᠠ ᠃ The long name file is saved to %1 ᠤᠷᠲᠤ ᠨᠡᠷᠡᠶᠢᠳᠦᠯ ᠦᠨ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ 1 ᠳᠦ ᠬᠠᠳᠠᠭᠠᠯᠠᠨ᠎ᠠ Undo %1 ᠬᠠᠰᠤᠬᠤ%1 Redo %1 ᠳᠠᠬᠢᠵᠤ ᠬᠢᠬᠦ%1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ᠨᠡᠢᠳᠡ: state: ᠲᠥᠯᠥᠪ ᠪᠠᠢᠳᠠᠯ ᠄ Peony::FileOperationProgressPage &More Details ᠳᠡᠯᠬᠡᠷᠡᠩᠬᠦᠢ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠭᠢ (&M ) From: ᠡᠬᠢᠯᠡᠬᠦ: To: ᠬᠦᠯᠢᠶᠡᠨ ᠠᠪᠤᠭᠴᠢ : Peony::FileOperationProgressWizard File Manager ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ &Cancel ᠦᠬᠡᠢᠰᠬᠡᠬᠦ(&C) Preparing... ᠪᠡᠯᠡᠳᠬᠡᠵᠤ ᠪᠠᠢᠨ᠎ᠠ᠁ Handling... ᠶᠠᠭ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ ᠁ Clearing... ᠶᠠᠭ ᠴᠡᠪᠡᠷᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ ᠁ Rollbacking... ᠥᠩᠬᠥᠷᠢᠭᠦᠯᠬᠦ ᠳᠤᠮᠳᠠ᠁ File Operation ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ A file operation is running backend... ᠨᠢᠭᠡ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠨᠢ ᠶᠠᠭ ᠠᠷᠤ ᠲᠠᠪᠴᠠᠩ᠎ᠤ᠋ᠨ ᠶᠠᠪᠤᠭᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ %1 files, %2 %1 ᠹᠠᠢᠯ᠂ ᠨᠡᠢᠲᠡ %2 %1 done, %2 total, %3 of %4. %1 ᠢ᠋/᠎ᠶ᠋ᠢ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠵᠦ ᠂ ᠨᠡᠢᠲᠡ %2 %4 ᠡᠴᠡ %3 ᠬᠦᠷᠬᠦ clearing: %1, %2 of %3 ᠶᠠᠭ ᠴᠡᠪᠡᠷᠯᠡᠵᠦ ᠪᠣᠢ ᠄ %1᠂ %2 ᠡᠴᠡ %3 copying... ᠺᠤᠫᠢᠳᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ Syncing... ᠶᠠᠭ ᠢᠵᠢᠯ ᠠᠯᠬᠤᠮᠴᠢᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ Peony::FilePreviewPage File Name: 文件名称: File Type: ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ: Time Access: ᠰᠤᠷᠪᠤᠯᠵᠢᠯᠠᠬᠤ ᠴᠠᠭ ᠄ Time Modified: ᠵᠠᠰᠠᠭᠰᠠᠨ ᠴᠠᠭ ᠄ Children Count: ᠹᠠᠢᠯ ᠪᠠᠭᠲᠠᠭᠠᠬᠤ: Size: ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ: Location: ᠪᠠᠢᠷᠢᠰᠢᠯ: Time Created: ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠴᠠᠭ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ ᠄ Image resolution: ᠢᠯᠭᠠᠮᠵᠢ: color model: ᠥᠩᠭᠡ᠎ᠶ᠋ᠢᠨ ᠵᠠᠭᠪᠤᠷ: <a href='#' style = 'text-decoration:none'>Open File</a> <a href】】〉】〈text-decoation᠄ none〉> ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢᠶᠠᠨ ᠨᠡᠭᠡᠭᠡᠨ</a>᠎ᠡ᠃ <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href】】〉】〈teft decoation ᠄ none〉 > ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠪᠠᠶᠢᠷᠢ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠨ</a>᠎ᠡ ᠃ <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a ahef=】#〈text decoation ᠄ none 〉 > ᠲᠤᠰ ᠣᠷᠣᠨ ᠵᠠᠶ ᠠᠴᠠ ᠠᠷᠢᠯᠭᠠᠨ</a>᠎ᠠ ᠃ Cancel ᠪᠣᠯᠢᠬᠤ OK ᠪᠠᠳᠤᠯᠠᠬᠤ <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color=〈gray〉 > ᠰᠢᠯᠵᠢᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠡᠶᠢᠯᠡᠭᠦᠯᠦᠨ ᠰᠢᠨᠡᠳᠬᠡᠬᠦ ᠦᠶ᠎ᠡ ᠳᠦ ᠂ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠠᠬᠢᠨ ᠢᠯᠡᠷᠡᠬᠦ ᠦᠭᠡᠶ</font> ᠃ <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color=〈gray〉 > ᠰᠢᠯᠵᠢᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠡᠶᠢᠯᠡᠭᠦᠯᠦᠨ ᠰᠢᠨᠡᠳᠬᠡᠬᠦ ᠦᠶ᠎ᠡ ᠳᠦ ᠂ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠠᠬᠢᠨ ᠢᠯᠡᠷᠡᠬᠦ ᠦᠭᠡᠶ</font> ᠃ Do you want to remove this file?<br> ᠲᠤᠰ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ ᠭᠡᠵᠦ ᠲᠣᠭᠲᠠᠭᠠᠨ᠎ᠠ ᠤᠤ ? Do not ask again ᠳᠠᠬᠢᠵᠤ ᠯᠠᠪᠯᠠᠬᠤ ᠥᠬᠡᠢ usershare ᠲᠤᠰ ᠮᠠᠰᠢᠨ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden ᠨᠡᠢᠲᠡ %1 ᠭᠡᠰᠢᠭᠦᠨ ᠂ ᠡᠭᠦᠨ᠎ᠳ᠋ᠦ᠍ %2 ᠨᠢᠭᠤᠭᠳᠠᠮᠠᠯ ᠹᠠᠢᠯ Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error ᠹᠠᠢᠯ ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠴᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Invalid file name %1%2%3 . ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠹᠠᠢᠯ᠎ᠦ᠋ᠨ ᠨᠡᠷ᠎ᠡ %1%2%3 . Are you sure to hidden this file? ᠲᠠ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ᠋ ᠨᠢᠭᠤᠬᠤ ᠪᠠᠷ ᠲᠣᠭᠲᠠᠬᠤ ᠤᠤ ? When change the file suffix, the file may be invalid. Are you sure to change it ? ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢᠶᠠᠨ ᠥᠭᠡᠷᠡᠴᠢᠯᠡᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ ᠪᠠᠢ᠌ᠵᠤ ᠮᠡᠳᠡᠨ᠎ᠡ ᠲᠠ ᠲᠡᠭᠦᠨ ᠢ ᠥᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠭᠡᠵᠦ ᠲᠣᠭᠲᠠᠭᠠᠨ᠎ᠠ ᠤᠤ ? A file and a directory with the same name cannot replace each other ᠠᠳᠠᠯᠢ ᠨᠡᠷ᠎ᠡ᠎ᠲᠡᠢ ᠹᠠᠢᠯ ᠪᠠ ᠭᠠᠷᠴᠠᠭ᠎ᠢ᠋ ᠬᠠᠷᠢᠯᠴᠠᠨ ᠰᠣᠯᠢᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning ᠹᠠᠢᠯ᠎ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ ᠵᠢ ᠰᠡᠷᠡᠮᠵᠢᠯᠡᠬᠦᠯᠬᠦ The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error ᠹᠠᠢᠯ᠎ᠢ᠋ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Peony::FileTrashOperation File trash error ᠹᠠᠢᠯ ᠢ᠋ ᠤᠰᠠᠳᠬᠠᠭᠠᠳ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠬᠢᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Can not trash %1: Read-only file system %1 ᠢ᠋\ ᠵᠢ ᠤᠰᠠᠳᠬᠠᠭᠠᠳ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠬᠢᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠄ ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ trash:/// ᠬᠣᠭ:/// Trash file error ᠹᠠᠢᠯ᠎ᠢ᠋ ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠲᠤ᠌ ᠬᠢᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Invalid Operation! Can not trash "%1". ᠬᠠᠤᠯᠢ ᠪᠤᠰᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ! "%1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠪᠤᠴᠠᠭᠠᠨ ᠬᠤᠷᠢᠶᠠᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. ᠡᠵᠡᠮᠰᠢᠵᠦ ᠳᠡᠶᠢᠯᠬᠦ ᠦᠭᠡᠢ ᠮᠥᠷᠭᠥᠯᠳᠥᠭᠡᠨ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠠᠶᠢᠨ᠎ᠠ ᠬᠤᠷᠢᠶᠠᠨ ᠠᠪᠬᠤ ᠥᠷᠲᠡᠭᠡ ᠶᠢ ᠪᠠᠢ᠌ᠴᠠᠭᠠᠭᠠᠷᠠᠢ The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error ᠹᠠᠢᠯ ᠢ᠋ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠡᠴᠡ ᠰᠡᠷᠬᠦᠬᠡᠭᠰᠡᠨ ᠪᠤᠷᠤᠭᠤ Can not find trashed file %1, might be restored or removed. ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠬᠢᠭᠰᠡᠨ %1 ᠹᠠᠢᠯ ᠢ᠋ ᠡᠷᠢᠵᠤ ᠤᠯᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ᠂ ᠹᠠᠢᠯ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠦᠭᠰᠡᠨ ᠪᠤᠶᠤ ᠤᠰᠠᠳᠬᠠᠭᠰᠠᠨ ᠪᠠᠢᠵᠤ ᠮᠡᠳᠡᠨ᠎ᠡ᠃ Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread ᠳᠡᠯᠭᠡᠷᠡᠭᠦᠯᠦᠨ᠎ᠡ Minimize ᠬᠠᠮᠤᠭ ᠤ᠋ᠨ ᠪᠠᠭᠠᠴᠢᠯᠠᠯ Close ᠬᠠᠭᠠᠬᠤ Peony::IDMActionsManager Rename Spaces ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠯᠡᠨ᠎ᠡ ᠃ Space Name ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠨᠡᠷᠡᠶᠢᠳᠦᠯ ᠃ Please input space name ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢᠨ ᠨᠡᠷᠡᠶᠢᠳᠦᠯ ᠢ ᠣᠷᠣᠭᠤᠯᠵᠤ ᠢᠷᠡᠭᠡᠷᠡᠢ ᠃ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Rename Space ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠯᠡᠨ᠎ᠡ ᠃ Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. ᠨᠡᠷᠡᠶᠢᠳᠬᠦ ᠣᠷᠣᠨ ᠵᠠᠶ ᠨᠢ 1 ᠨᠢ 2% ᠪᠠᠶᠢᠵᠤ ᠂ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ 2 ᠨᠢᠭᠡᠨᠲᠡ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠠᠶᠢᠨ᠎ᠠ ᠃ Edit Space Condition ᠨᠠᠢ᠌ᠷᠠᠭᠤᠯᠬᠤ ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢᠨ ᠨᠥᠬᠥᠴᠡᠯ ᠃ Close dynamically ᠬᠠᠭᠠᠬᠤ ᠬᠥᠳᠡᠯᠦᠩᠭᠦᠶ ᠰᠢᠨᠡᠴᠢᠯᠡᠯᠲᠡ ᠶᠢ ᠬᠠᠭᠠᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ ᠃ Open dynamically ᠬᠥᠳᠡᠯᠦᠩᠭᠦᠶ ᠰᠢᠨᠡᠴᠢᠯᠡᠯᠲᠡ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ ᠃ Delete Spaces ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢ ᠬᠠᠰᠤᠨ᠎ᠠ ᠃ Are you sure to delete space %1 ? ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢ ᠬᠠᠰᠤᠬᠤ ᠪᠠᠷ ᠲᠣᠭᠲᠠᠭᠠᠬᠤ ᠳᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ 1 ᠶᠢ ᠬᠠᠰᠤᠬᠤ ᠪᠠᠷ ᠲᠣᠭᠲᠠᠭᠠᠨ᠎ᠠ ᠤᠤ ? Open ᠨᠡᠬᠡᠬᠡᠬᠦ Open With ᠨᠡᠭᠡᠭᠡᠬᠦ ᠬᠡᠯᠪᠡᠷᠢ More applications ᠨᠡᠩ ᠠᠷᠪᠢᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠳᠡᠨ᠎ᠡ ᠃ Open The Folder Location ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠪᠠᠢ᠌ᠷᠢ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ ᠃ Add File ᠨᠡᠮᠡᠬᠦ Choose file to add into space ᠣᠷᠣᠨ ᠵᠠᠢ ᠳᠤ ᠨᠡᠮᠡᠬᠦ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠰᠣᠩᠭᠣᠨ᠎ᠠ ᠃ File %1 is existed in space, please not add file repeatly. ᠣᠷᠣᠨ ᠵᠠᠶ ᠳᠤ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ 1 ᠣᠷᠣᠰᠢᠵᠤ ᠂ ᠳᠠᠪᠬᠤᠷᠳᠠᠭᠤᠯᠤᠨ ᠨᠡᠮᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠃ Move to space ᠣᠷᠣᠨ ᠵᠠᠶ ᠳᠤ ᠰᠢᠯᠵᠢᠭᠦᠯᠦᠨ᠎ᠡ ᠃ Remove From Space ᠲᠤᠰ ᠣᠷᠣᠨ ᠵᠠᠢ ᠳᠣᠲᠣᠷ᠎ᠠ ᠠᠴᠠ ᠠᠷᠢᠯᠭᠠᠬᠤ ᠃ <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color=〈gray〉 > ᠰᠢᠯᠵᠢᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠡᠶᠢᠯᠡᠭᠦᠯᠦᠨ ᠰᠢᠨᠡᠳᠬᠡᠬᠦ ᠦᠶ᠎ᠡ ᠳᠦ ᠂ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠠᠬᠢᠨ ᠢᠯᠡᠷᠡᠬᠦ ᠦᠭᠡᠶ</font> ᠃ <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color=〈gray〉 > ᠰᠢᠯᠵᠢᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠨᠡᠶᠢᠯᠡᠭᠦᠯᠦᠨ ᠰᠢᠨᠡᠳᠬᠡᠬᠦ ᠦᠶ᠎ᠡ ᠳᠦ ᠂ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠠᠬᠢᠨ ᠢᠯᠡᠷᠡᠬᠦ ᠦᠭᠡᠶ</font> ᠃ Do you want to remove selected %1 item(s)?<br> ᠡᠨᠡ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ ᠪᠡᠷ ᠲᠣᠭᠲᠠᠬᠤ ᠤᠤ ? <br> Do you want to remove this file?<br> ᠲᠤᠰ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠰᠢᠯᠵᠢᠭᠦᠯᠬᠦ ᠭᠡᠵᠦ ᠲᠣᠭᠲᠠᠭᠠᠨ᠎ᠠ ᠤᠤ ? Do not ask again ᠳᠠᠬᠢᠵᠤ ᠯᠠᠪᠯᠠᠬᠤ ᠥᠬᠡᠢ Copy ᠺᠤᠫᠢᠳᠠᠬᠤ Save As ᠦᠬᠡᠷ᠎ᠡ ᠭᠠᠵᠠᠷ ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ file ᠹᠠᠢᠯ All File ᠪᠦᠬᠦᠳᠡ ᠮᠠᠲ᠋ᠸᠷᠢᠶᠠᠯ This location has no write permission.please change the storage location ᠡᠨᠡ ᠪᠠᠶᠢᠷᠢ ᠳᠤ ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠦᠭᠡᠢ ᠂ ᠣᠷᠣᠨ ᠪᠠᠶᠢᠷᠢ ᠪᠠᠨ ᠰᠣᠯᠢᠬᠤ ᠶᠢ ᠰᠠᠨᠠᠭᠤᠯᠵᠠᠢ ᠃ Label ᠱᠣᠰᠢᠭ᠎ᠠ Properties ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠲᠤ ᠴᠢᠨᠠᠷ Peony::ImageMountManager Invalid device path: %1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠵᠠᠮ ᠬᠦᠴᠦᠨ ᠦᠭᠡᠢ : %1 Cannot find loop device for path: %1 ᠵᠠᠮ %1᠎ᠦ᠌ ᠡᠷᠭᠢᠯᠲᠡ᠎ᠶ᠋ᠢᠨ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠡᠷᠢᠵᠦ ᠣᠯᠬᠤ ᠦᠭᠡᠢ Failed to unmount filesystem: %1 ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠢ᠋ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠢᠯᠠᠭᠳᠠᠬᠤ: %1 Failed to delete loop device: %1 ᠣᠷᠴᠢᠯ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠬᠠᠰᠤᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠭᠡᠢ: %1 Peony::LabelSettings Name ᠨᠡᠷ᠎ᠡ SideBar ᠬᠠᠰᠢᠯᠭ᠎ᠠ ᠃ Menu ᠲᠣᠪᠶᠣᠭ Create New Label ᠳᠡᠮᠳᠡᠭ ᠪᠠᠢᠭᠤᠯᠬᠤ Delete Label ᠱᠣᠰᠢᠭ᠎ᠠ ᠶᠢ ᠬᠠᠰᠤᠬᠤ Display the following items in the identification area: (maximum of 6) ᠢᠯᠭᠠᠬᠤ ᠣᠷᠣᠨ ᠪᠦᠰᠡ ᠳᠦ ᠳᠣᠤᠷᠠᠬᠢ ᠲᠥᠷᠥᠯ ᠵᠦᠢᠯ ᠢ ᠢᠯᠡᠷᠡᠭᠦᠯᠪᠡ ᠄ ( ᠬᠠᠮᠤᠭ ᠠᠷᠪᠢᠨ ᠳᠠᠭᠠᠨ 6 ) Rename ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ Edit Color ᠦᠩᠬᠡ ᠵᠢ ᠨᠠᠢᠷᠠᠭᠤᠯᠬᠤ Delete This Label ᠡᠨᠡ ᠲᠡᠮᠳᠡᠭ ᠢ ᠬᠠᠰᠤᠨ᠎ᠠ Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" "%2"᠎ᠠ᠋ᠴᠠ "%1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠬᠠᠢᠬᠤ File System ᠹᠠᠢᠯ᠎ᠤᠨ ᠱᠢᠰᠲ᠋ᠧᠮ Search results for all files marked in "%1" in "%2" "%2" ᠳᠤᠮᠳᠠ ᠡᠴᠡ ᠪᠦᠬᠦ "%1" ᠢᠯᠡᠷᠬᠡᠢᠯᠡᠭᠴᠢ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠦᠷ᠎ᠡ ᠳ᠋ᠦᠩ ᠢ᠋ ᠬᠠᠢᠬᠤ &Copy Directory 拷贝路径(&C) Open In New Tab ᠰᠢᠨ᠎ᠡ ᠱᠣᠰᠢᠭ᠎ᠠ ᠵᠢᠨ ᠨᠢᠭᠤᠷ᠎ᠲᠤ ᠨᠡᠭᠡᠭᠡᠬᠦ Open In New Window ᠰᠢᠨ᠎ᠡ ᠴᠤᠨᠭᠬᠤᠨ ᠳᠣᠲᠣᠷ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠬᠦ Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory ᠺᠤᠫᠢᠳᠠᠬᠤ ᠵᠢᠮ Peony::MountOperation Operation Cancelled ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠦᠬᠡᠢᠰᠬᠡᠭᠳᠡᠪᠡ Login failed, unknown username or password error, please re-enter! ᠨᠡᠪᠳᠡᠷᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠪᠤᠷᠤᠭᠤᠳᠠᠪᠠ᠂ ᠳᠠᠬᠢᠨ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Peony::NavigationToolBar Go Back ᠤᠬᠤᠷᠢᠬᠤ Go Forward ᠤᠷᠤᠭᠰᠢᠯᠠᠬᠤ History ᠲᠡᠤᠬᠡ Clear History ᠳᠡᠤᠬᠡ ᠵᠢ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ Cd Up ᠳᠡᠭᠡᠭᠰᠢ Refresh ᠰᠢᠨᠡᠳᠬᠡᠬᠦ Peony::NewFileLaunchDialog Choose new application ᠨᠢᠭᠡ ᠰᠢᠨ᠎ᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ ᠵᠢ ᠰᠣᠩᠭᠣᠬᠤ Choose an Application to open this file ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠵᠤ ᠲᠤᠰ ᠹᠠᠢᠯ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠬᠦ apply now ᠳᠠᠷᠤᠢ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? ᠲᠠ %1%2 ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ᠋ ᠬᠡᠷᠬᠢᠨ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠪᠤᠢ ? Default open with: ᠠᠶᠠᠳᠠᠯ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠬᠡᠯᠪᠡᠷᠢ ᠄ Other: ᠪᠤᠰᠤᠳ ᠄ Choose other application ᠪᠤᠰᠤᠳ ᠬᠡᠷᠡᠭᠯᠡᠭᠡ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ Go to application center ᠰᠣᠹᠲ᠎ᠤ᠋ᠨ ᠲᠥᠪ ᠲᠤ᠌ ᠴᠢᠬᠤᠯᠠ Peony::PathEdit Go To ᠦᠰᠦᠷᠦᠨ ᠰᠢᠯᠵᠢᠬᠦ Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 ᠬᠠᠷᠠᠯᠳᠠ: %1 Read and Write ᠤᠩᠰᠢᠵᠤ ᠠᠪᠬᠤ ᠪᠠ ᠪᠢᠴᠢᠵᠦ ᠣᠷᠣᠭᠤᠯᠤᠨ᠎ᠠ Readonly ᠵᠥᠪᠬᠡᠨ ᠤᠩᠰᠢᠬᠤ Group or User ᠳᠤᠭᠤᠶᠢᠯᠠᠩ ᠪᠤᠶᠤ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ (Current User) ( ᠣᠳᠣᠬᠠᠨ ᠤ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ) The folder containing this file is protected, and only the file owner can modify the file. Current User ᠣᠳᠣᠬᠠᠨ ᠤ᠋ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ Permissions modify tip ᠡᠷᠬᠡ ᠳ᠋ᠤ᠌ ᠵᠠᠰᠠᠪᠤᠷᠢ ᠤᠷᠤᠭᠤᠯᠬᠤ ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? ᠣᠳᠣᠬᠠᠨ ᠤ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠪᠤᠶᠤ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠬᠠᠪᠲᠠᠰᠤ ᠶᠢ ᠨᠢᠭᠡᠨᠲᠡ ACL ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠵᠠᠶ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠦᠨ ᠳᠤᠭᠤᠶᠢᠯᠠᠩ ᠳᠤ ᠵᠠᠰᠠᠪᠤᠷᠢ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠨᠢ ACL ᠶᠢᠨ ᠳᠣᠲᠣᠷ᠎ᠠ ᠪᠠᠶᠢᠷᠢᠯᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠢ ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠶ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠦᠨ ᠳᠤᠭᠤᠶᠢᠯᠠᠩ ᠤᠨ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠳᠦ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠨ ᠵᠠᠰᠠᠪᠤᠷᠢ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠤᠤ ? Permission refinement settings ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠤ᠋ᠨ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠭ᠎ᠠ ᠶ᠋ᠢ ᠰᠢᠯᠢᠳᠡᠭᠵᠢᠬᠦᠯᠬᠦ The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? ᠣᠳᠣᠬᠠᠨ ᠳᠤ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠨᠢᠭᠡᠨᠲᠡ ᠳᠡᠭᠡᠳᠦ ᠵᠡᠷᠭᠡ ᠶᠢᠨ ᠬᠠᠮᠲᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ ᠪᠡᠷ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠵᠠᠶ ᠬᠡᠷᠪᠡ ᠲᠠ ᠡᠷᠬᠡ ᠮᠡᠳᠡᠯ ᠳᠦ ᠵᠠᠰᠠᠪᠤᠷᠢ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠢ ᠪᠣᠯ ᠳᠡᠭᠡᠳᠦ ᠵᠡᠷᠭᠡ ᠶᠢᠨ ᠬᠠᠮᠲᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ ᠳᠦ ᠬᠡᠷᠡᠭ᠍ᠯᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠪᠠᠢ᠌ᠵᠤ ᠮᠡᠳᠡᠨ᠎ᠡ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠨ ᠪᠠᠶᠢᠷᠢᠯᠠᠭᠤᠯᠬᠤ ᠤᠤ ? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠡᠷᠬᠡ᠎ᠶ᠋ᠢᠨ ᠬᠢᠵᠠᠭᠠᠷ᠎ᠤ᠋ᠨ ᠬᠠᠮᠢᠶ᠎ᠠ ᠪᠦᠬᠦᠢ ᠵᠠᠩᠭᠢ᠎ᠶ᠋ᠢ ᠣᠯᠬᠤ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠃ (Me) (我) Others ᠪᠤᠰᠤᠳ Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. ᠲᠠ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠵᠢ ᠵᠠᠰᠠᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠬᠡᠢ᠃ Me User 用户 Peony::PropertiesSetDialog Confirming property settings ᠬᠠᠷᠢᠶᠠᠯᠠᠯ ᠤ᠋ᠨ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠭ᠎ᠠ ᠵᠢ ᠪᠠᠳᠤᠯᠠᠬᠤ Whether to apply to the current selected option or to selected options and subfolders and subfiles. ᠣᠳᠣᠬᠠᠨ ᠤ᠋ ᠰᠣᠩᠭᠣᠭᠰᠠᠨ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ᠎ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ ᠡᠰᠡᠬᠦ᠂ ᠡᠰᠡᠬᠦᠯ᠎ᠡ ᠰᠣᠩᠭᠣᠭᠰᠠᠨ ᠭᠡᠰᠢᠭᠦᠨ ᠵᠢᠴᠢ ᠰᠠᠯᠠᠭ᠎ᠠ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ ᠪᠠ ᠰᠠᠯᠠᠭ᠎ᠠ ᠹᠠᠢᠯ᠎ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ ᠡᠰᠡᠬᠦ Apply the current selection ᠣᠳᠣᠬᠠᠨ ᠤ᠋ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ Apply the current selection as well as subfolders and subfiles ᠣᠳᠣᠬᠠᠨ ᠤ᠋ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ ᠵᠢᠴᠢ ᠰᠠᠯᠠᠭ᠎ᠠ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠢᠰᠤ ᠪᠤᠯᠤᠨ ᠰᠠᠯᠠᠭ᠎ᠠ ᠹᠠᠢᠯ ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Cancel ᠪᠣᠯᠢᠬᠤ Peony::PropertiesWindow Trash ᠬᠤᠭᠯᠠᠭᠤᠷ Recent ᠣᠷᠴᠢᠮ ᠤ᠋ᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ Selected ᠰᠣᠩᠭᠣᠬᠤ %1 Files % ᠹᠠᠢᠯ usershare ᠲᠤᠰ ᠮᠠᠰᠢᠨ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ Properties ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠲᠤ ᠴᠢᠨᠠᠷ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Cancel ᠪᠣᠯᠢᠬᠤ Restore ᠰᠡᠷᠭᠦᠭᠡᠬᠦ Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠲᠤ᠌ ᠬᠠᠰᠤᠬᠤ ᠦᠶᠡᠰ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ᠎ᠦ᠋ᠨ ᠪᠣᠺᠰ ᠦᠰᠦᠷᠦᠨ ᠭᠠᠷᠤᠨ᠎ᠠ ᠃ Origin Path: ᠤᠭ ᠵᠢᠮ ᠄ Deletion Date: ᠬᠠᠰᠤᠭᠰᠠᠨ ᠡᠳᠦᠷ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ ᠄ Size: ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ ᠄ Original Location: ᠤᠭ ᠵᠢᠮ᠄ Peony::SearchBar Input the search key of files you would like to find. ᠵᠠᠩᠭᠢᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠦᠭᠡ ᠣᠷᠣᠭᠤᠯᠵᠤ ᠲᠠᠨ᠎ᠤ᠋ ᠡᠷᠢᠬᠦ ᠭᠡᠵᠦ ᠪᠠᠢᠭ᠎ᠠ ᠹᠠᠢᠯ᠎ᠢ᠋ᠶ᠋ᠡᠨ ᠡᠷᠢᠬᠦ Input search key... ᠵᠠᠩᠭᠢᠯᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠦᠭᠡ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠁ advance search ᠳᠡᠭᠡᠳᠦ ᠳᠡᠰ ᠤ᠋ᠨ ᠬᠠᠢᠯᠳᠠ clear record ᠲᠡᠦᠬᠡ᠎ᠶ᠋ᠢ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ Peony::SearchBarContainer Choose File Type 选择文件类型 Search File ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ᠎ᠶ᠋ᠢ ᠬᠠᠢᠬᠤ Clear ᠪᠠᠯᠠᠯᠠᠬᠤ all ᠪᠦᠬᠦᠢᠯᠡ file folder ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ image ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ video ᠸᠢᠳᠢᠤ᠋ text file ᠲᠧᠺᠰᠲ audio ᠠᠦ᠋ᠳᠢᠤ᠋ others ᠪᠤᠰᠤᠳ wps file WPS ᠹᠠᠢᠯ Peony::SharedFileLinkOperation Symbolic Link ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ The dest file "%1" has existed! ᠬᠠᠷᠠᠯᠲᠠ ᠹᠠᠢᠯ "%1" ᠨᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠣᠢ ! Link file error ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠴᠥᠷᠬᠡ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Peony::SideBarCloudItem CloudStorage ᠡᠭᠦᠯᠡᠨ ᠬᠠᠳᠠᠭᠠᠯᠠᠮᠵᠢ CloudFile ᠡᠭᠦᠯᠡᠨ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ Peony::SideBarFavoriteItem Trash ᠬᠤᠭᠯᠠᠭᠤᠷ Recent ᠣᠷᠴᠢᠮ ᠤ᠋ᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ Quick Access ᠳᠦᠷᠬᠡᠨ ᠠᠢᠯᠴᠢᠯᠠᠬᠤ Quick access 快速访问 Favorite 快速访问 KmreData ᠺᠮᠧᠷᠲ᠋ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠲᠤ ᠴᠢᠨᠠᠷ Delete Symbolic ᠬᠠᠰᠤᠬᠤ Remove from bookmark ᠬᠤᠷᠳᠤᠨ ᠬᠠᠨᠳᠠᠯᠲᠤᠢᠠᠴᠠ ᠰᠠᠯᠭᠠᠬᠤ Unmount ᠤᠰᠠᠳᠬᠠᠬᠤ Eject ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠬᠤ Format ᠹᠦᠷᠮᠠᠲᠯᠠᠬᠤ burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network ᠨᠧᠲ Peony::SideBarPersonalItem Personal ᠬᠤᠪᠢ ᠬᠥᠮᠦᠨ Peony::SideBarSeparatorItem (No Sub Directory) (᠎ᠬᠣᠭᠣᠰᠣᠨ ) Peony::StatusBar ; %1 folders ; %1 ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ; %1 files, %2 total ; %1 ᠹᠠᠢᠯ᠂ ᠨᠡᠢᠲᠡ %2 ; %1 folder ; %1 ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ; %1 file, %2 ; %1 ᠹᠠᠢᠯ᠂ %2 %1 selected %1 ᠳᠦᠷᠦᠯ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Peony::SyncThread notify 温馨提示 温馨提示 Notify ᠰᠠᠨᠠᠭᠤᠯᠬᠤ Peony::TagManagement General 通用 Mark ᠲᠡᠮᠳᠡᠭ Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type ᠳᠠᠷᠠᠭᠠᠯᠠᠯ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ ᠵᠦᠢᠯ File Name ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ Modified Date ᠡᠳᠦᠷ ᠰᠠᠷ᠎ᠠ ᠵᠢ ᠵᠠᠰᠠᠬᠤ Open in New window ᠰᠢᠨ᠎ᠡ ᠴᠣᠩᠬᠣᠨ ᠳᠣᠲᠣᠷ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠵᠡᠢ ᠃ Open in new Tab ᠰᠢᠨ᠎ᠡ ᠱᠤᠰᠢᠭ᠎ᠠ ᠵᠢᠨ ᠨᠢᠭᠤᠷ ᠳᠡᠭᠡᠷ᠎ᠡ ᠨᠡᠬᠡᠬᠡᠬᠦ Ascending ᠥᠭᠰᠥᠬᠦ ᠶᠠᠪᠤᠴᠠ Descending ᠪᠠᠭᠤᠷᠠᠬᠤ Copy ᠺᠤᠫᠢᠳᠠᠬᠤ Paste ᠨᠠᠭᠠᠬᠤ Cut ᠬᠠᠢᠴᠢᠯᠠᠬᠤ Trash ᠬᠤᠭᠯᠠᠭᠤᠷ Clean Trash ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠢ᠋ ᠬᠣᠭᠣᠰᠣᠯᠠᠬᠤ Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore ᠰᠡᠷᠭᠦᠭᠡᠬᠦ Options ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ Forbid Thumbnail ᠪᠠᠭᠠᠰᠬᠠᠭᠰᠠᠨ ᠵᠢᠷᠤᠭ᠎ᠢ᠋ ᠴᠠᠭᠠᠵᠠᠯᠠᠬᠤ Show Hidden ᠨᠢᠭᠤᠭᠳᠠᠮᠠᠯ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Resident in Backend ᠠᠷᠤ ᠵᠢᠨ ᠳᠠᠪᠴᠠᠩ ᠳ᠋ᠤ᠌ ᠪᠠᠢᠩᠭᠤ ᠰᠠᠭᠤᠬᠤ Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ᠹᠠᠢᠯ ᠬᠠᠮᠢᠶᠠᠷᠠᠭᠤᠷ ᠨᠢ ᠪᠣᠢ ᠪᠦᠬᠦᠢ ᠴᠣᠩᠬᠣ᠎ᠶ᠋ᠢ ᠬᠠᠭᠠᠭᠰᠠᠨ᠎ᠤ᠋ ᠰᠡᠭᠦᠯᠡᠷ ᠮᠥᠨ ᠠᠵᠢᠯᠯᠠᠳᠠᠭ ᠂ ᠡᠨᠡ ᠨᠢ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠳᠠᠭ᠎ᠠ᠎ᠶ᠋ᠢᠨ ᠡᠬᠢᠯᠡᠬᠦ ᠦᠶ᠎ᠡ᠎ᠶ᠋ᠢᠨ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠴᠠᠭ᠎ᠢ᠋ ᠪᠣᠭᠣᠨᠢᠰᠬᠠᠨ᠎ᠠ ᠂ ᠭᠡᠪᠡᠴᠦ ᠪᠠᠰᠠ ᠡᠬᠢ ᠪᠠᠶᠠᠯᠢᠭ᠎ᠢ᠋ ᠨᠡᠢᠳᠡᠮ ᠡᠵᠡᠯᠡᠨ ᠬᠡᠷᠡᠭᠯᠡᠳᠡᠭ ᠃ &Help ᠬᠠᠪᠰᠤᠷᠤᠯᠭ᠎ᠠ(&H) &About... ᠲᠤᠬᠠᠢ (&A)... Peony Qt ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. ᠵᠤᠬᠢᠶᠠᠭᠴᠢ: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> ᠬᠡᠪᠯᠡᠯ ᠤ᠋ᠨ ᠡᠷᠬᠡ (C): 2019-2020, ᠲᠢᠶᠠᠨᠵᠢᠨ ᠤ᠋ ᠴᠢ ᠯᠢᠨ ᠮᠡᠳᠡᠭᠡ ᠵᠠᠩᠬᠢ ᠵᠢᠨ ᠮᠡᠷᠭᠡᠵᠢᠯ ᠤ᠋ᠨ ᠬᠢᠵᠠᠭᠠᠷᠳᠤ ᠺᠤᠮᠫᠠᠨᠢ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ Type: ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠄ Duration: ᠴᠠᠭ ᠤᠨ ᠳᠠᠷᠤᠭ᠎ᠠ Size: ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ ᠄ Loading... ᠠᠴᠢᠶᠠᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ··· Res: ᠢᠯᠭᠠᠮᠵᠢ: Mod Date: ᠵᠠᠰᠠᠭᠰᠠᠨ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ: Deleted date: ᠬᠠᠰᠤᠬᠤ ᠡᠳᠦᠷ ᠬᠤᠭᠤᠴᠠᠭ᠎ᠠ ᠶᠢ ᠬᠠᠰᠤᠬᠤ Original path: ᠤᠤᠯ ᠵᠠᠮ ᠳ᠋ᠢᠶᠠᠮᠧᠲ᠋ᠷ ᠄ Peony::UserShareInfoManager Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Peony::VolumeManager Error ᠪᠤᠷᠤᠭᠤ ProgressBar starting ... ᠶᠠᠭ ᠡᠬᠢᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ ᠁ canceling ... ᠦᠬᠡᠢᠰᠬᠡᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ sync ... ᠶᠠᠭ ᠢᠵᠢᠯ ᠠᠯᠬᠤᠮᠴᠢᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠁ continue ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠬᠦ᠌ pause ᠲᠦᠷ ᠵᠣᠭᠰᠣᠭᠠᠶ᠎ᠠ close ᠬᠠᠭᠠᠬᠤ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View ᠰᠢᠪᠠᠭ᠎ᠠ ᠵᠢᠨ ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ Show the folder children as icons. ᠢᠺᠦᠨ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠡᠯᠪᠡᠷᠢ᠎ᠪᠡᠷ ᠭᠠᠷᠴᠠᠭ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ List View ᠵᠢᠭᠰᠠᠭᠠᠭᠰᠠᠨ ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ Show the folder children as rows in a list. ᠵᠢᠭᠰᠠᠭᠠᠯᠳᠠ ᠵᠢᠨ ᠬᠡᠯᠪᠡᠷᠢ᠎ᠪᠡᠷ ᠭᠠᠷᠴᠠᠭ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Basic Preview Page 基本 Basic ᠦᠨᠳᠦᠰᠦᠨ Show the basic file properties, and allow you to modify the access and name. ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠦᠨᠳᠦᠰᠦᠨ ᠰᠢᠨᠵᠢ ᠴᠢᠨᠠᠷ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠵᠦ ᠂ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ᠎ᠢ᠋ ᠵᠠᠰᠠᠬᠤ᠎ᠶ᠋ᠢ ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠨ᠎ᠡ ᠃ Permissions Page 权限 Permissions ᠡᠷᠬᠡ Show and modify file's permission, owner and group. ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠵᠢ ᠪᠠᠢᠴᠠᠭᠠᠵᠤ ᠦᠵᠡᠬᠦ ᠪᠠ ᠵᠠᠰᠠᠬᠤ Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠳᠡᠩᠳᠡᠭᠦᠦ ᠶᠡᠬᠡ ᠪᠣᠯᠬᠣᠷ ᠬᠤᠷᠢᠶᠠᠨ ᠠᠪᠬᠤ ᠥᠷᠲᠡᠭᠡᠨ ᠳᠦ ᠰᠢᠯᠵᠢᠬᠦ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠲᠡᠭᠦᠨ ᠢ ᠡᠭᠦᠷᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠨᠢ ᠬᠡᠲᠦᠷᠬᠡᠢ ᠶᠡᠬᠡ ᠂ ᠬᠤᠷᠢᠶᠠᠨ ᠠᠪᠬᠤ ᠥᠷᠲᠡᠭᠡᠨ ᠳᠦ ᠰᠢᠯᠵᠢᠬᠦ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠡᠳᠡᠭᠡᠷ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠡᠭᠦᠷᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ? Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Clean the Trash ᠠᠭᠠᠷ ᠢ ᠡᠭᠡᠭᠦᠯᠦᠨ ᠬᠤᠷᠢᠶᠠᠬᠤ ᠥᠷᠲᠡᠭᠡ ᠶᠢ ᠴᠡᠪᠡᠷᠯᠡᠨ ᠬᠤᠷᠢᠶᠠᠨ OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠲᠠᠬᠢ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠥᠨᠢᠳᠡ ᠬᠣᠭᠣᠰᠣᠯᠠᠬᠤ ᠤᠤ ? ᠬᠠᠰᠤᠭᠰᠠᠨ᠎ᠤ᠋ ᠳᠠᠷᠠᠭ᠎ᠠ ᠰᠡᠷᠭᠦᠭᠡᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠃ Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties ᠺᠣᠮᠫᠢᠦ᠋ᠲ᠋ᠧᠷ᠎ᠦ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠯᠠᠯ Show the computer properties or items in computer. ᠺᠣᠮᠫᠢᠦ᠋ᠲ᠋ᠧᠷ᠎ᠦ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠯᠠᠯ ᠪᠤᠶᠤ ᠺᠣᠮᠫᠢᠦ᠋ᠲ᠋ᠧᠷ᠎ᠦ᠋ᠨ ᠳᠦᠷᠦᠯ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Trash and Recent Properties Page 最近/回收 Trash and Recent ᠬᠤᠭᠯᠠᠭᠤᠷ / ᠣᠷᠴᠢᠮ Show the file properties or items in trash or recent. " ᠬᠤᠭᠯᠠᠭᠤᠷ" ᠪᠤᠶᠤ" ᠤᠢᠷ᠎ᠠ ᠵᠢᠨ" ᠳᠤᠮᠳᠠᠬᠢ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠯᠠᠯ ᠡᠰᠡᠪᠡᠯ ᠳᠦᠷᠦᠯ ᠵᠦᠢᠯ ᠢ᠋ ᠢᠯᠡᠷᠡᠬᠦᠯᠬᠦ. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ YES ᠲᠡᠢᠮᠦ Formatting successful! But failed to set the device name. ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠭᠠᠳ ᠠᠮᠵᠢᠯᠲᠠ ᠣᠯᠪᠠ ! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷ᠎ᠡ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠃ qmesg_notify ᠮᠡᠳᠡᠭᠳᠡᠯ Format ᠹᠦᠷᠮᠠᠲᠯᠠᠬᠤ Begin Format ᠡᠬᠢᠯᠡᠬᠦ Close ᠬᠠᠭᠠᠬᠤ Format operation has been finished successfully. ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠡᠶᠡᠯᠡᠭᠳᠡᠪᠡ ᠃ Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! ᠠᠭᠤᠴᠢᠯᠠᠭᠠᠷᠠᠢ᠂ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠢᠯᠠᠭᠳᠠᠪᠠ᠂ ᠲᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? ᠲᠤᠰ ᠡᠪᠬᠡᠮᠡᠯ᠎ᠢ᠋ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠨᠢ ᠲᠡᠭᠦᠨ᠎ᠦ᠌ ᠳᠡᠭᠡᠷᠡᠬᠢ ᠪᠦᠬᠦ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠴᠡᠪᠡᠷᠯᠡᠬᠦ ᠪᠣᠯᠤᠨ᠎ᠠ ᠃ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ᠎ᠠ᠋ᠴᠠ ᠡᠮᠦᠨ᠎ᠡ ᠦᠯᠡᠳᠡᠭᠡᠭᠰᠡᠨ ᠪᠦᠬᠦ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠪᠡᠯᠡᠳᠬᠡᠭᠡᠷᠡᠢ ᠃ ᠲᠠ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠭᠦᠯᠬᠦ ᠦᠦ ? format ᠠᠩᠬᠠᠵᠢᠭᠤᠯᠬᠤ begin format 开始 close 关闭 File Manager ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Notify ᠰᠠᠨᠠᠭᠤᠯᠬᠤ notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed ᠠᠯᠪᠠᠳᠠᠯᠭ᠎ᠠ᠎ᠪᠠᠷ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Error: %1 ᠪᠤᠷᠤᠭᠤ: %1 Data synchronization is complete,the device has been unmount successfully! ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠪᠡ ᠂ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠠᠮᠵᠢᠯᠲᠠ᠎ᠲᠠᠢ ᠪᠠᠭᠤᠯᠭᠠᠪᠠ ! Unmount failed ᠠᠴᠢᠶ᠎ᠠ ᠪᠠᠭᠤᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ Not authorized to perform operation. ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠨᠢ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠭᠰᠠᠨ ᠦᠭᠡᠢ ᠃ Unable to unmount it, you may need to close some programs, such as: GParted etc. ᠪᠠᠭᠤᠯᠭᠠᠬᠤ᠎ᠶ᠋ᠢ ᠬᠠᠰᠤᠬᠤ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠂ ᠲᠠ ᠪᠠᠷᠤᠭ ᠤᠷᠢᠳᠠᠪᠡᠷ ᠵᠠᠷᠢᠮ ᠫᠷᠤᠭ᠌ᠷᠠᠮ᠎ᠢ᠋ ᠬᠠᠭᠠᠬᠤ ᠴᠢᠬᠤᠯᠠᠲᠠᠢ ᠂ ᠵᠢᠱ᠌ᠢᠶᠡᠯᠡᠪᠡᠯ ᠬᠤᠪᠢᠶᠠᠷᠢ ᠲᠤᠭᠤᠷᠢᠭ ᠤ᠋ᠨ ᠨᠠᠢᠷᠠᠭᠤᠯᠤᠭᠤᠷ ᠵᠡᠷᠭᠡ ᠃ Error: %1 Do you want to unmount forcely? ᠪᠤᠷᠤᠭᠤ: %1 ᠠᠯᠪᠠ ᠪᠡᠷ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠤᠤ? Cancel ᠪᠣᠯᠢᠬᠤ Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠢᠳᠡᠪᠬᠢᠵᠢᠭᠦᠯᠬᠦ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠄ ᠪᠤᠷᠤᠭᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ The device has been mount successfully! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠡᠯᠭᠦᠨ ᠠᠴᠢᠶᠠᠯᠠᠪᠠ ! Eject device failed, the reason may be that the device has been removed, etc. ᠰᠤᠮᠤ ᠭᠠᠷᠭᠠᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠠᠴᠠ ᠪᠣᠯᠵᠤ ᠂ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠠᠷᠢᠯᠭᠠᠭᠳᠠᠭᠰᠠᠨ ᠵᠡᠷᠭᠡ ᠮᠠᠭᠠᠳ Data synchronization is complete and the device can be safely unplugged! ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠪᠡ ᠂ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠰᠤᠭᠤᠯᠵᠤ ᠪᠣᠯᠤᠨ᠎ᠠ ! Password is empty, please re-enter! ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠬᠣᠭᠣᠰᠣᠨ᠂ ᠳᠠᠬᠢᠵᠤ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠴᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ favorite ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ Favorites ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ File is not existed. ᠹᠠᠢᠯ ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ Share Data ᠲᠤᠰ ᠭᠠᠵᠠᠷ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ Trash ᠬᠤᠭᠯᠠᠭᠤᠷ Recent ᠣᠷᠴᠢᠮ ᠤ᠋ᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠰᠡᠨ Operation not supported ᠠᠵᠢᠯᠯᠠᠬᠤ ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠶ The virtual file system does not support folder creation ᠬᠡᠢᠰᠪᠦᠷᠢ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠳᠣᠣᠷ᠎ᠠ ᠰᠢᠨ᠎ᠡ ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠪᠠᠢᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ Can not create a symbolic file for vfs location ᠬᠡᠢᠰᠪᠦᠷᠢ ᠭᠠᠷᠴᠠᠭ᠎ᠲᠤ᠌ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ Symbolic Link ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ Can not create symbolic file here, %1 ᠡᠨᠳᠡ ᠲᠦᠳᠡ ᠠᠷᠭ᠎ᠠ ᠵᠢ ᠪᠠᠢᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ %1 Can not add a file to favorite directory. ᠹᠠᠢᠯ᠎ᠢ᠋ ᠬᠠᠳᠠᠭᠠᠯᠠᠭᠤᠷ᠎ᠲᠤ᠌ ᠨᠡᠮᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ The virtual file system cannot be opened ᠵᠢᠱ᠌ᠢᠭᠰᠡᠨ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠬᠡᠢ Virtual file directories do not support move and copy operations ᠵᠢᠱ᠌ᠢᠭᠰᠡᠨ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠵᠢᠮ ᠨᠢ ᠰᠢᠯᠵᠢᠬᠦᠯᠬᠦ ᠪᠤᠶᠤ ᠺᠤᠫᠢᠳᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠬᠡᠢ Default favorite vfs of peony ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ ᠬᠡᠢᠰᠪᠦᠷᠢ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠢ᠋ ᠠᠶᠠᠳᠠᠯ ᠲᠦᠷᠭᠡᠨ ᠰᠤᠷᠪᠤᠯᠵᠢᠯᠠᠬᠤ Details ᠨᠠᠷᠢᠨ ᠵᠠᠩᠭᠢ Mark ᠲᠡᠮᠳᠡᠭ mark this file. ᠡᠨᠡᠬᠦ ᠹᠠᠢᠯ ᠳ᠋ᠤ᠌᠎ᠲᠡᠮᠳᠡᠭ ᠲᠠᠯᠪᠢᠬᠤ Open With ᠨᠡᠭᠡᠭᠡᠬᠦ ᠬᠡᠯᠪᠡᠷᠢ open with. ᠨᠡᠬᠡᠬᠡᠬᠦ ᠠᠷᠭ᠎ᠠ It need to synchronize before operating the device,place wait! ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠡᠴᠡ ᠡᠮᠦᠨ᠎ᠡ ᠢᠵᠢᠯ ᠠᠯᠬᠤᠮᠴᠢᠯᠠᠬᠤ ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠬᠡᠷᠡᠭᠲᠡᠢ ᠂ ᠲᠦᠷ ᠬᠦᠯᠢᠶᠡᠬᠡᠷᠡᠢ ! Unable to discover the file, it may have been removed or deleted. ᠹᠠᠢᠯ ᠢ᠋ ᠡᠷᠢᠵᠤ ᠣᠯᠤᠭᠰᠠᠨ ᠥᠬᠡᠢ᠂ ᠰᠢᠯᠵᠢᠬᠦᠯᠦᠭᠳᠡᠭᠰᠡᠨ ᠪᠤᠶᠤ ᠤᠰᠠᠳᠬᠠᠭᠳᠠᠭᠰᠠᠨ ᠪᠠᠢᠵᠤ ᠮᠡᠳᠡᠨ᠎ᠡ᠃ permission denied ᠡᠷᠬᠡ ᠥᠬᠡᠢ file not found 没有发现该文件 duplicate ᠬᠠᠭᠤᠯᠪᠤᠷᠢ ᠳᠡᠪᠲᠡᠷ Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ label ᠱᠣᠰᠢᠭ᠎ᠠ Computer ᠺᠣᠮᠫᠢᠦᠢᠲ᠋ᠧᠷ File System 文件系统 Data ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢᠨ ᠲᠠᠪᠠᠭ Failed to open file "%1": insufficient permissions. ᠹᠠᠢᠯ "%1" ᠢ᠋/᠎ᠶ᠋ᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠄ ᠡᠷᠬᠡ ᠦᠭᠡᠢ ᠃ File “%1” does not exist. Please check whether the file has been deleted. ᠹᠠᠢᠯ “%1” ᠣᠷᠣᠰᠢᠬᠤ ᠦᠭᠡᠢ ᠂ ᠹᠠᠢᠯ ᠨᠢ ᠬᠠᠰᠤᠭᠳᠠᠭᠰᠠᠨ ᠡᠰᠡᠬᠦ᠎ᠶ᠋ᠢ ᠪᠠᠢᠴᠠᠭᠠᠬᠤ burn operation has been cancelled ᠺᠧᠯᠤᠳ᠋ᠡᠬᠦ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠦᠬᠡᠢᠰᠬᠡᠬᠦ is busy! ᠡᠵᠡᠯᠡᠭᠳᠡᠪᠡ! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. ᠡᠨᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠦᠨᠡᠬᠡᠷ ᠡᠭᠦᠷᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ? ᠬᠠᠰᠤᠵᠤ ᠡᠬᠢᠯᠡᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢᠶᠠᠨ ᠰᠡᠷᠭᠦᠭᠡᠬᠦ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠪᠣᠯᠣᠨ᠎ᠠ Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠦᠨᠡᠬᠡᠷ ᠡᠭᠦᠷᠢᠳᠡ ᠬᠠᠰᠤᠬᠤ ᠤᠤ ? ᠬᠠᠰᠤᠵᠤ ᠡᠬᠢᠯᠡᠭᠰᠡᠨ ᠦ ᠳᠠᠷᠠᠭ᠎ᠠ ᠂ ᠡᠳᠡᠭᠡᠷ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠰᠡᠷᠭᠦᠭᠡᠬᠦ ᠶᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠪᠣᠯᠣᠨ᠎ᠠ Virtual file directories do not support move operations ᠬᠡᠶᠢᠰᠪᠤᠷᠢ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠭᠠᠷᠴᠠᠭ ᠨᠢ ᠰᠢᠯᠵᠢᠮᠡᠯ ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠶ test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space ᠤᠶᠤᠨᠲᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠃ New Intelligent Space Шинэ Оюун Ухаант Орон Зай File %1 is existed in space, please not add file repeatly. ᠣᠷᠣᠨ ᠵᠠᠶ ᠳᠤ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ 1 ᠣᠷᠣᠰᠢᠵᠤ ᠂ ᠳᠠᠪᠬᠤᠷᠳᠠᠭᠤᠯᠤᠨ ᠨᠡᠮᠡᠵᠦ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠃ SpaceSaveDialog Save as space ᠤᠶᠤᠨᠲᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠠᠶᠢᠨ᠎ᠠ ᠃ Space Name ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠨᠡᠷᠡᠶᠢᠳᠦᠯ ᠃ Please input space name ᠣᠷᠣᠨ ᠵᠠᠢ ᠶᠢᠨ ᠨᠡᠷᠡᠶᠢᠳᠦᠯ ᠢ ᠣᠷᠣᠭᠤᠯᠵᠤ ᠢᠷᠡᠭᠡᠷᠡᠢ ᠃ Dynamically Update Space Files ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠪᠢᠴᠢᠭ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠢ ᠬᠥᠳᠡᠯᠦᠩᠭᠦᠶ ᠪᠡᠷ ᠰᠢᠨᠡᠳᠬᠡᠨ᠎ᠡ ᠃ Cancel ᠪᠣᠯᠢᠬᠤ Ok ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠪᠡ Failed to create space %1,%1 is existed ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠨᠢ 1 ᠢᠯᠠᠭᠳᠠᠵᠤ᠂ 1 ᠨᠢᠭᠡᠨᠲᠡ ᠣᠷᠣᠰᠢᠵᠤ ᠪᠠᠶᠢᠨ᠎ᠠ᠃ UdfBurn::UdfAppendBurnDataDialog AppendBurnData ᠲᠡᠮᠳᠡᠭᠯᠡᠯ ᠦᠨ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ ᠶᠢ ᠨᠡᠮᠡᠬᠦ ᠬᠡᠷᠡᠭᠲᠡᠶ Disc Type: ᠳ᠋ᠢᠰᠺ ᠤ᠋ᠨ ᠲᠦᠷᠦᠯ: Device Name: ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ ᠄ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠪᠯᠡᠯ Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ No burn data, please add! ᠰᠢᠲᠠᠭᠠᠵᠤ ᠰᠢᠷᠬᠠᠲᠤᠭᠰᠠᠨ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ ᠪᠠᠶᠢᠬᠤ ᠦᠭᠡᠢ ᠪᠣᠯ ᠨᠥᠬᠥᠪᠥᠷᠢᠯᠡᠭᠡᠷᠡᠢ ! The disc name cannot be set to empty, please re-enter it! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ᠎ᠢ᠋ ᠬᠣᠭᠣᠰᠣᠨ ᠪᠣᠯᠭᠠᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠂ ᠳᠠᠬᠢᠨ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! AppendBurnData operation has been finished successfully. ᠨᠡᠮᠡᠵᠦ ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ ᠶᠢᠨ ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠠᠮᠵᠢᠯᠲᠠ ᠲᠠᠶ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠪᠡ Sorry, the appendBurnData operation is failed! ᠠᠭᠤᠴᠢᠯᠠᠭᠠᠷᠠᠢ᠂ ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢ ᠨᠡᠮᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ! Failed ᠰᠢᠨᠡᠴᠢᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Burning. Do not close this window ᠰᠦᠷᠴᠢᠭᠦᠷ ᠡᠪᠡᠳᠬᠦ ᠡᠨᠡ ᠴᠣᠩᠬᠣ ᠶᠢ ᠪᠢᠲᠡᠭᠡᠢ ᠬᠠᠭᠠ Burning this disc will append datas on it. Do you want to continue ? ᠡᠨᠡ ᠭᠡᠷᠡᠯ ᠫᠠᠨᠰᠠ ᠶᠢ ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠨᠢ ᠲᠡᠭᠦᠨ ᠦ ᠳᠡᠭᠡᠷ᠎ᠡ ᠲᠣᠭ᠎ᠠ ᠪᠠᠷᠢᠮᠲᠠ ᠨᠡᠮᠡᠬᠦ ᠪᠣᠯᠣᠨ᠎ᠠ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠬᠦ ᠦᠦ ? Burn ᠰᠢᠲᠠᠭᠠᠬᠤ Begin Burning ᠡᠬᠢᠯᠡᠨ ᠲᠡᠮᠳᠡᠭ᠍ᠯᠡᠵᠦ ᠡᠬᠢᠯᠡᠪᠡ Close ᠬᠠᠭᠠᠬᠤ UdfBurn::UdfFormatDialog Format ᠹᠦᠷᠮᠠᠲᠯᠠᠬᠤ Disc Type: ᠳ᠋ᠢᠰᠺ ᠤ᠋ᠨ ᠲᠦᠷᠦᠯ: Device Name: ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ ᠄ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠪᠯᠡᠯ Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ The disc name cannot be set to empty, please re-enter it! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ᠎ᠢ᠋ ᠬᠣᠭᠣᠰᠣᠨ ᠪᠣᠯᠭᠠᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠂ ᠳᠠᠬᠢᠨ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Format operation has been finished successfully. ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠡᠶᠡᠯᠡᠭᠳᠡᠪᠡ ᠃ Sorry, the format operation is failed! ᠠᠭᠤᠴᠢᠯᠠᠭᠠᠷᠠᠢ᠂ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠢᠯᠠᠭᠳᠠᠪᠠ᠂ ᠲᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ! Failed ᠰᠢᠨᠡᠴᠢᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Formatting. Do not close this window ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠂ ᠪᠢᠲᠡᠭᠡᠢ ᠬᠠᠭᠠᠭᠠᠷᠠᠢ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? ᠲᠤᠰ ᠳ᠋ᠢᠰᠺ ᠳᠡᠭᠡᠷ᠎ᠡ ᠪᠦᠬᠦ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠪᠠᠯᠠᠯᠠᠬᠤ ᠃ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠡᠴᠡ ᠡᠮᠦᠨ᠎ᠡ ᠪᠦᠬᠦ ᠦᠯᠡᠳᠡᠭᠡᠭᠰᠡᠨ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠨᠥᠭᠡᠴᠡᠯᠡᠭᠡᠷᠡᠢ ᠃ ᠲᠠ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠭᠦᠯᠬᠦ ᠦᠦ ? Begin Format ᠡᠬᠢᠯᠡᠬᠦ Close ᠬᠠᠭᠠᠬᠤ UdfFormatDialog Format ᠹᠦᠷᠮᠠᠲᠯᠠᠬᠤ Disc Type: ᠳ᠋ᠢᠰᠺ ᠤ᠋ᠨ ᠲᠦᠷᠦᠯ: Device Name: ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ ᠄ OK ᠪᠠᠳᠤᠯᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ Unknown ᠦᠯᠦ ᠮᠡᠳᠡᠬᠦ ᠬᠡᠪᠯᠡᠯ Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ The disc name cannot be set to empty, please re-enter it! ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ᠎ᠢ᠋ ᠬᠣᠭᠣᠰᠣᠨ ᠪᠣᠯᠭᠠᠵᠤ ᠪᠣᠯᠬᠤ ᠦᠭᠡᠢ ᠂ ᠳᠠᠬᠢᠨ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Format operation has been finished successfully. ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠭ᠎ᠠ ᠨᠢᠭᠡᠨᠲᠡ ᠪᠡᠶᠡᠯᠡᠭᠳᠡᠪᠡ ᠃ Sorry, the format operation is failed! ᠠᠭᠤᠴᠢᠯᠠᠭᠠᠷᠠᠢ᠂ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠢᠯᠠᠭᠳᠠᠪᠠ᠂ ᠲᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ! Failed ᠰᠢᠨᠡᠴᠢᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Formatting. Do not close this window ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠵᠤ ᠪᠠᠢᠨ᠎ᠠ ᠂ ᠪᠢᠲᠡᠭᠡᠢ ᠬᠠᠭᠠᠭᠠᠷᠠᠢ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? ᠲᠤᠰ ᠳ᠋ᠢᠰᠺ ᠳᠡᠭᠡᠷ᠎ᠡ ᠪᠦᠬᠦ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠪᠠᠯᠠᠯᠠᠬᠤ ᠃ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠬᠤ ᠡᠴᠡ ᠡᠮᠦᠨ᠎ᠡ ᠪᠦᠬᠦ ᠦᠯᠡᠳᠡᠭᠡᠭᠰᠡᠨ ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠨᠥᠭᠡᠴᠡᠯᠡᠭᠡᠷᠡᠢ ᠃ ᠲᠠ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠭᠦᠯᠬᠦ ᠦᠦ ? Begin Format ᠡᠬᠢᠯᠡᠬᠦ Close ᠬᠠᠭᠠᠬᠤ progressBarHelper Time is being calculated 正在计算时间 Calculating time ᠴᠠᠭ ᠢ᠋ ᠪᠤᠳᠤᠵᠤ ᠪᠠᠢᠨ᠎ᠠ %1day%2hrs%3mins%4sec %1 ᠡᠳᠦᠷ%2 ᠴᠠᠭ%3 ᠮᠢᠨᠦ᠋ᠲ%4 ᠰᠸᠺᠦ᠋ᠨ᠋ᠲ %1hrs%2mins%3sec %1 ᠴᠠᠭ%2 ᠮᠢᠨᠦ᠋ᠲ%3 ᠰᠸᠺᠦ᠋ᠨ᠋ᠲ %1 mins%2sec %1 ᠮᠢᠨᠦ᠋ᠲ%2 ᠰᠸᠺᠦ᠋ᠨ᠋ᠲ %1sec %1 ᠰᠸᠺᠦ᠋ᠨ᠋ᠲ peony/translations/libpeony-qt/libpeony-qt_zh_HK.ts0000664000175000017500000110676715154271106021540 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... 識別管理 ... Remove "%1" 拿掉%1 delete "%1" 删除“%1” add "%1" 添加%1 ConnectServerDialog Connect to Sever 連接到伺服器 Domain 功能變數名稱 Password 密碼 Save Password 記住密碼 User 使用者名 Anonymous 匿名登錄 Ok 確定 Cancel 取消 DiscControl is busy! 被佔用! is busy! 被佔用! not support udf at present. 目前不支援udf格式化 unmount disc failed before udf format. 在 udf 格式之前卸載磁碟失敗。 is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf格式化失敗 preparation failed before DVD-RW udf format. DVD-RW udf 格式之前的準備失敗。 FileLabelModel Red 紅色 Orange 橙色 Yellow 黃色 Green 綠色 Blue 藍色 Purple 紫色 Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error 錯誤 Label or color is duplicated. 標籤或者顏色重複 FileOperationHelper Burn failed 燒錄失敗 Format_Dialog Dialog 格式化 rom_size 容量大小 system 檔案系統 vfat/fat32 vfat/fat32 exfat exfat ntfs NTFS vfat VFAT ext4 Ext4 device_name 設備名稱 clean it total 完全擦除(時間較長,請確認!) ok 確定 close 關閉 TextLabel 容量 qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format 格式化 Rom size: 容量大小 Filesystem: 檔案系統 Disk name: 設備名稱 Completely erase(Time is longer, please confirm!) 完全擦除(時間較長,請確認!) Set password 設置密碼 Set password for volume based on LUKS (only ext4) 為ext4分區設置基於LUKS的密碼 Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive 格式化為ext4文件系統時可能會導致其他用戶無法讀寫U盤 Cancel 關閉 OK 確定 Data 數據盤 Error locking device: Failed to deactivate device: Device or resource busy 鎖定設備失敗:設備或者資源忙,無法停止。 Warning 警告 Device name cannot start with a decimal point, Please re-enter! 設備名稱不能以小數點開始,請重新輸入! Enter Password: 輸入密碼: Password too short, please retype a password more than 6 characters 密碼過短, 請重新輸入大於6位的密碼 %1/sec, %2 remaining. % 1/秒, 剩餘% 2. over one day 超過一天 getting progress... 取得進度... Error 錯誤 Block not existed! 設備不存在! Formatting. Do not close this window 正在格式化, 請勿關閉 KyFileDialogRename Renaming "%1" 正在重新命名%1 Renaming failed, the reason is: %1 重新命名失敗, 原因: %1 Filename too long 檔名過長 Copying "%1" 複製%1 To "%1" 到%1” Copying failed, the reason is: %1 複製失敗, 原因: %1 Moving "%1" 正在移動%1 Moving failed, the reason is: %1 移動失敗, 原因: %1 File operation error: 檔案操作錯誤: The reason is: %1 原因: %1 Truncation 截斷 Save 保存 All applications 全部應用 Cancel 取消 Apply 應用 Bytes 位元組 Front truncation 前截斷 Post truncation 後截斷 Description: Skip copying files of the current type 說明:跳過當前類型檔的複製 truncate interval 截斷區間 . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select 說明:截斷檔名超過 %1 位元組的部分,去選擇 Explanation: When renaming a file name, ensure it is within %1 bytes and 說明:使用者重命名檔名,保證在 %1 位元組內,去 Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". 說明:預設保存至“%1/擴展”。 modify the name 修改命名 Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip 跳過 Skip All 全部跳过 Rename 重新命名 Please enter a new name 请输入文件名 OK 確定 MainProgressBar File operation 文件操作 starting ... 開始 ... cancel all file operations 取消所有檔操作 Minimize 最小化 Close 關閉 Are you sure to cancel all file operations? 確定取消所有檔操作? Are you sure want to cancel all file operations 確定要取消所有檔案操作? OK 確定 File Operation 檔操作 Cancel 取消 Calculating time 正在計算時間 continue 繼續 pause 暫停 canceling ... 取消中 ... sync ... 同步... %1MB/s Est. time left: %2 %1MB/s 預計剩餘時間: %2 %1Mb/s Est. time left: %2 %1Mb/s 預計剩餘時間: %2 MessageDialog Peony 檔管理員 Forcibly pulling out the device may cause data loss or device exceptions! 強制拔出設備可能會導致數據丟失 或數據異常! OtherButton Other queue 其它队列 Other Queue 其它佇列 Peony::AdvanceSearchBar Key Words 關鍵詞 input key words... 輸入關鍵字... Search Location 搜索路徑 choose search path... 選擇要搜尋的位置... browse 流覽 File Type 檔案類型 Choose File Type 選擇檔案類型 Modify Time 修改時間 Choose Modify Time 選擇修改時間 File Size 檔大小 Choose file size 選擇檔案大小 show hidden file 顯示隱藏檔案 go back 後退 hidden advance search page 隱藏高級搜索介面 file name 檔名 content 內容 search 搜索 start search 開始搜索 Select path 選擇路徑 Operate Tips 提示 Have no key words or search location! 沒有關鍵字或路徑! Search file name or content at least choose one! 搜索檔名或者內容請至少指定一個! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 yesterday last week last month last year year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File 搜索檔 Peony::AdvancedPermissionsPage Permission refinement settings 許可權細化設置 Permission refinement settings tip 許可權細化設置提示 Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? 設置檔的ACL許可權將改變用檔基本許可權中使用者組的許可權,是否繼續設置檔的ACL許可權? User 使用者 Read 可讀 Write 可寫 Executable 可執行 delete 刪除 Inherit permission 繼承許可權 Input domain/user name Add Other User Add 添加 Apply 應用 Cancel 取消 Error 錯誤 Please enter a user name User does not exist User already exists in list Peony::AllFileLaunchDialog Choose new application 選擇一個新的應用 Choose an Application to open this file 選擇一個應用打開這個檔 apply now 立即應用 OK 確定 Cancel 取消 Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon 選擇自訂圖示 Type: 類型: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name 名稱 Location 位置 move 移动 symbolLink 快捷方式 Folder 資料夾 Include: 包含: Move 移動 Open with: 開啟方式: Description: 描述: Select multiple files 選取多個檔案 Size: 檔案大小: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: 佔用空間: Time Create: 建立時間: Time Modified: 變更時間: Time Access: 存取時間: Readonly 唯讀 Hidden 隱藏 Readonly (just applied by subfiles) 唯讀(只對資料夾下檔案 ) Property: 屬性: usershare 本機共用 %1 (%2 Bytes) % 1 (% 2 位元組 ) Images (*.png *.jpg *.jpeg *.svg) 圖片(*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. 請選擇小於1MB的圖片。 Choose a new folder: 選擇新的資料夾: Error 錯誤 cannot move a folder to itself ! 不能移動一個資料夾到它內部! %1 Bytes %1 位元組 %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 個檔案, %2 個資料夾 Can't get remote file information 未能獲取遠端文件資訊 %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: 處理器: CPU Core: 核心數: Memory Size: 記憶體: User Name: 使用者名稱: Desktop: 桌面環境: You should mount this volume first 你需要掛載該卷才能查看資訊 Name: 分區名稱: File System 文件系统 Data 數據盤 System Disk 系統盤 Total Space: 總容量: Used Space: 使用空間: In calculation... 計算中... /root used: /root 佔用: /home used: /home 佔用: /usershare used: /usershare 佔用: /data/* used: /data/* 佔用: Unknow (No permission) 未知(無權限檢視) Free Space: 剩餘空間: Type: 檔案系統: Kylin Burner 燒錄 Open with: 開啟: Unknown 未知的分區 Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server 連接伺服器 Ip 伺服器 Port Type 類型 Personal Collection server: 個人收藏伺服器 Add 添加 Delete 刪除 Connect 連接 Ip input error, please re-enter! IP 輸入錯誤, 請重新輸入! Port input error, please re-enter! 連接埠號輸入錯誤, 請重新輸入! add 添加 delete 连接 删除 connect 连接 Warning 警告 ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user 登錄身份 Please enter the %1's user name and password of the server. 請輸入伺服器 %1 的使用者名稱和密碼。 User's identity 連接身份 Guest 遊客(匿名登錄) Name 名稱 Password 密碼 domain Cancel 取消 OK 確定 guest 游客(匿名登录) Registered users 註冊使用者 name 用户名 password 密码 Remember the password 記住密碼 cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop 發送到桌面快捷方式 Create Link to... 傳送快捷方式到... Choose a Directory to Create Link 選擇創建連結的目錄 Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop 發送到桌面快捷方式 Peony-Qt Share File menu Extension Tag with Menu. Peony::CreateTemplateOperation File create error 創建檔案錯誤 Can not create %1: Read-only mode, can not write-in 無法建立 %1:唯讀模式,無法寫入 NewFile 新建檔 Create file 檔案創建 NewFolder 新建資料夾 Create file error 創建檔案錯誤 Peony::CustomErrorHandler Is Error Handled? 錯誤是否已處理? Error not be handled correctly 錯誤未被正確處理 Peony::DefaultAcitonWidget No default app 沒有設置預設打開方式 Peony::DefaultOpenWithWidget No default app 沒有設置預設打開方式 Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview 選擇你想要預覽的檔 Can not preview this file 不能預覽該檔 Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview 詳細資訊 This is the Default Preview of peony-qt 顯示文件的詳細資訊 Peony::DetailsPropertiesPage Name: 名稱: File type: 檔案類型: Location: 路徑: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss Create time: 建立時間: Modify time: 變更時間: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: 檔案大小: Width: 寬度: Height: 高度: Owner 擁有者 Owner: 擁有者: Computer 計算機 Computer: 電腦: %1 (this computer) %1 (這台電腦) Unknown 未知的分區 Can't get remote file information 不能獲取遠端文件資訊 %1 px %1 像素 Peony::DirectoryView::IconView Icon View 图标视图 warn 警告 This operation is not supported. 不支援此操作。 Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn 警告 This operation is not supported. 不支援此操作。 Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark 添加到快速訪問 &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建資料夾 Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name 檔名稱 File Type 檔案類型 File Size 檔大小 New... 新建... Open in New Window 在新視窗中打開 Open in New Tab 在新標籤頁中打開 Open 打開 Open failed 無法打開 Open directory failed, you have no permission! 無法打開資料夾,沒有許可權! Open with... 打開方式 More applications... 更多應用 Open %1 selected files 打開%1個選取檔案 New 新建 Empty File 空文本 Folder 資料夾 View Type 視圖類型 Sort By 排序類型 Modified Date 修改日期 Original Path 原始路徑 Sort Order... 排序顺序... Ascending Order 升序 Mount 掛載 MultiSelect 多選 Descending Order 降序 Sort Preferences... 排序偏好... Folder First 資料夾優先 Chinese First 中文優先 Show Hidden 顯示隱藏檔案 Copy 複製 Cancel 取消 File:"%1" is not exist, did you moved or deleted it? 檔 %s 不存在,你是否已經刪除或移動到別處? Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut 剪切 Delete to trash 刪除到回收站 Paste 粘貼 Refresh 刷新 Select All 全選 Properties 屬性 format 格式化 Restore 還原 Delete 刪除 Time Modified 修改時間 Path 路徑 Sort Order 排序順序 Newest to oldest 從新到舊 Oldest to newest 從舊到新 Files from large to small 從大到小 Files from small to large 從小到大 Sort Preferences 排序偏好 Error 錯誤 File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever 永久刪除 Rename 重新命名 Select &All 全选(&A) Reverse Select 反選 P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash 清空回收站(&C) Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All 清空全部 Open Parent Folder in New Window 在新視窗中打開檔所在目錄 Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager 外掛程式管理設置 Available extensions 可使用的外掛程式 Ok 確定 Cancel 取消 Peony::FMWindow File Manager 檔管理員 advanced search 高級搜索 clear record 清空歷史 Loaing... Press Esc to stop a loading. 載入... 按下Esc鍵取消. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2019-2020,天津麒麟資訊技術有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo 撤銷 Redo 重做 Peony Qt 檔管理員 Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder 新建資料夾 Peony::FileBatchRenameOperation File Rename error 檔案重新命名錯誤 Invalid file name %1%2%3 . 非法的檔案名%1% 2% 3. File Rename warning 檔重新命名警告 Are you sure to hidden these files? 確定隱藏這些檔? Rename file error 重新命名檔案錯誤 Peony::FileCopy Error in source or destination file path! 源位址或者目標檔路徑出錯! Error when copy file: %1, can not copy special files, skip this file and continue? 拷貝檔: %1 時出錯,不能拷貝特殊類型檔,是否跳過此檔並繼續? Can not copy %1, file doesn't exist. Has the file been renamed or moved? 無法拷貝 %1, 檔案不存在. 是否被重命名或移動? The dest file "%1" has existed! 目標檔案 %1 已經存在! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! vfat/fat32文件系統不支援單檔所佔空間大於4g Error writing to file: Input/output error 寫如檔出錯:輸入輸出錯誤 Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. 創建檔案 %1 失敗,請確認是否是在根目錄創建,或者設備是否正確支援個gphoto2協定。 Failed to create %1. 創建檔案 %1 失敗。 Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! 請確認設備是否被移除! Write file error: There is no available disk space for device! 寫入檔案錯誤: 裝置上沒有足夠可用空間! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure 打開文件失敗 Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel 操作取消 Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 建立目錄%1失敗: %2 File copy error 檔案複製錯誤 The file name exceeds the limit 檔名長度超出限制 Cannot opening file, permission denied! 無法打開檔,許可權不夠! File:%1 was not found. 找不到檔案:% 1. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk 系統盤 File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in 無法複製 %1 到 %2:唯讀模式,無法寫入 Can not copy %1 to %2: Permission denied 無法複製 %1 到 %2:權限不夠 Data 數據盤 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 Link file error 創建檔案連結失敗 Burning does not support replacement 燒錄操作不支援替換檔 Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error 檔刪除錯誤 Delete file error 刪除錯誤 Invalid Operation! Can not delete "%1". 非法的操作! 無法刪除%1. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled 密碼對話框被取消 Message recipient disconnected from message bus without replying! 消息接收者在沒有回復的情況下與消息總線斷開連接! Error 錯誤 Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data 數據盤 folder 資料夾 file text file 文字檔 Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning 警告 Error 錯誤 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 目標資料夾不存在,是否刪除該無效快捷方式? Can not open path "%1",permission denied. 打開路徑 %1 失敗,許可權被拒絕。 Can not find path "%1",are you moved or renamed it? 找不到路徑:「%1」,您是否已經移動或者重新命名? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) 個子項 Symbol Link, 快捷方式, System Disk 系統盤 File Name 檔名稱 Delete Date 刪除日期 Create Date 創建時間 Time Modified 修改時間 File Size 檔大小 Original Path 原始路徑 Path 路徑 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 Operation not supported 操作不支援 File Type 檔案類型 Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label 添加標記 Delete All Label 刪除所有標記 Label Management ... 識別管理 ... add "%1" 添加%1 Remove "%1" 拿掉%1 Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... 識別管理 ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1%2 開啟方式 unknown 未知 No application is set to open file "%1 %2" 未設定用來打開檔案「%1%2」 的應用程式。 Still using the last opened application: 仍使用最後開啟的應用: known 已知 Open application is used by default: 預設使用開啟的應用程式: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. 您可以在軟體中心搜索能夠打開此檔案的應用程式,或者選取電腦上的現有應用程式。 Other application: 其他應用程式: Select application: 選取應用程式: Always open the %1%2 file with this application 始終用該應用打開%1%2檔 Choose other application 選擇其他應用 Go to application center 去軟體中心安裝應用 Ok 確定 Cancel 取消 Desktop files(*.desktop) 桌面檔(*.desktop) Select Open Action 選擇打開方式 Select 選擇 Peony::FileLaunchAction Execute Directly 直接運行 Execute in Terminal 在終端運行 Detected launching an executable file %1, you want? 正在打開一個可執行檔案%1, 你希望? Delete file Warning 删除文件警告 Open Failed 無法打開 Can not open %1, file not exist, is it deleted? 無法開啟%1,檔案不存在,請確認是否已被刪除? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission 沒有許可權 File is not readable. Please check if file has read permisson. 檔案不可讀,請確認當前使用者擁有檔的讀許可權。 By Default App 使用默認打開方式 Launch Options 執行選項 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 目標檔不存在,您需要刪除該連結嗎? Can not open %1, Please confirm you have the right authority. 無法開啟%1,請確認您有正確的打開許可權。 Open App failed 快捷方式存在問題 The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? 該連結指向的應用已經被修改或者卸載,因此該快捷方式無法正常工作。 是否刪除該快捷方式? Error 錯誤 File original path not exist, are you deleted or moved it? 檔案原始路徑未找到,您是否已經移動或刪除了它? Can not get a default application for opening %1, do you want open it with text format? 沒有找到預設開啟% 1 的應用程式, 是否用文字編輯器開啟? Operate Tips 提示 Sorry, the system currently does not have an application that supports .%1 (%2) files. 抱歉,當前系統暫無支持. %1(%2)的應用程序。 Please search the software store for programs that can run %1 applications, or select an existing application on your computer to open it. 請在軟件商店蒐索能運行%1應用的程式,或選取電腦上現有的應用程序打開。 Sorry, the system currently does not have a default application set for opening "xxx.xxx" file format. 抱歉,當前系統暫未設定打開“xxx.xxx”檔案格式的應用程序。 Please search the software store for applications that can open this file, or select an existing application in the system. 請在軟件商店蒐索可以打開此檔案的應用程序,或選取系統中現有的應用程序。 Search Software Store 蒐索軟件商店 Select Application... 選取應用程序. .. Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link 快捷方式 Link file error 創建檔案連結失敗 Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error 移動檔案錯誤 File System 文件系统 Data 數據盤 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 File move error 檔案移動錯誤 Invalid move operation, cannot move a file into its sub directories. 非法的移動操作,不能移動資料夾到自身路徑下。 The file name exceeds the limit 檔名長度超出限制 Create file error 創建檔案錯誤 Can not move %1 to %2: Read-only mode, can not write-in 無法移動 %1 到 %2:唯讀模式,無法寫入 Can not move %1 to %2: Permission denied 無法移動 %1 到 %2:權限不夠 Cannot opening file, permission denied! 無法打開檔,許可權不夠! File:%1 was not found. 找不到檔案:% 1. Invalid Operation. 非法的操作. System Disk 系統盤 open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error 檔刪除錯誤 Link file error 創建檔案連結失敗 Burning does not support replacement 燒錄操作不支援替換檔 Burn failed 刻录失败 File delete 文件删除 Invalid Operation 非法的操作 Peony::FileOperationAfterProgressPage &More Details 詳細資訊(&M) Peony::FileOperationErrorDialog File Operation Error 檔操作錯誤 unkwon 未知原因 null Error message: 錯誤資訊: Source File: 來源檔: Dest File: 目標檔案: Ignore 忽略 Ignore All 全部忽略 Overwrite 覆蓋 Overwrite All 全部覆蓋 Backup 備份 Backup All 全部備份 &Retry 重試(&R) &Cancel 取消(&C) Peony::FileOperationErrorDialogBase Close 關閉 Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace 替換 Ignore 忽略 Do the same 全部應用 <p>This location already contains the file '%1', Do you want to override it?</p> <p>此位置已包含名稱為「%1」 的檔案,您確定要取代它嗎? </p> Unexpected error from %1 to %2 從 %1 至 %2 操作發生異常錯誤 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup 備份 Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel 取消 Delete 刪除 Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Peony::FileOperationErrorDialogNotice OK 確定 Cancel 取消 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Peony::FileOperationErrorDialogSkip Skip 跳過 Cancel 取消 Skip all 全部跳過 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Peony::FileOperationErrorDialogWarning OK 確定 Cancel 取消 Skip all 全部跳過 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link 快捷方式 Copy 複製 Move 移動 Rename 重新命名 Link 連結 Delete 刪除 Delete Permanently 永久刪除 Restore 還原 New 新建 - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn 警告 '%1' is occupied,you cannot operate! “%1”已被佔用,您無法進行操作! No, go to settings 否,跳转到设置 OK 刪除 Cancel 取消 Do you want to put selected %1 item(s) into trash? 確認要將選取的 %1 項放入回收站嗎? Do not show again 不再顯示 File System 文件系统 System Disk 系統盤 Data 數據盤 Insufficient storage space 存儲空間不足 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 Can't delete. 不能刪除 You can't delete a file whenthe file is doing another operation 不能刪除一個正在進行其它操作的檔 File Operation is Busy 操作正忙 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. 在執行該操作之前有操作未完成,它需要等待上一個操作完成後再執行。 如果你希望檔操作並行,你可以更改選項功能表中的「允許操作並行」配置。 The long name file is saved to %1 長檔被保存到%1 Undo %1 撤銷 %1 Redo %1 重做 %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: 總計: state: 狀態: Peony::FileOperationProgressPage &More Details 詳細資訊(&M) From: 從: To: 到: Peony::FileOperationProgressWizard File Manager 檔管理員 &Cancel 取消(&C) Preparing... 準備中... Handling... 處理... Clearing... 正在清理... Rollbacking... 回滾中... File Operation 檔操作 A file operation is running backend... 檔案操作正在後台執行中... %1 files, %2 %1個檔,共%2 %1 done, %2 total, %3 of %4. 完成%1,共%2,%4中的第%3個。 clearing: %1, %2 of %3 正在清理:%1,%3中的第%2個 copying... 複製中... Syncing... 同步... Peony::FilePreviewPage File Name: 文件名称: File Type: 類型 Time Access: 上次打開時間 Time Modified: 修改時間 Children Count: 包含檔案 Size: 大小 Location: 所在位置: Time Created: 創建時間 Image resolution: 解析度 color model: 色彩模式 <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>打開檔</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>打開檔位置</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a href='#' style = 'text-decoration:none'>從該空間移除</a> Cancel 取消 OK 確定 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> Do you want to remove this file?<br> 確定要移除該檔嗎? Do not ask again 不再提醒 usershare 本機共用 Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden 共%1項,其中%2個隱藏檔 Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error 檔案重新命名錯誤 Invalid file name %1%2%3 . 非法的檔案名%1% 2% 3. Are you sure to hidden this file? 確定隱藏該檔? When change the file suffix, the file may be invalid. Are you sure to change it ? 改變擴展名可能導致檔不可用,確認更改嗎? A file and a directory with the same name cannot replace each other 同名的文件和資料夾,無法相互替換。 The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning 檔重新命名警告 The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error 重新命名檔案錯誤 Peony::FileTrashOperation File trash error 刪除檔到回收站錯誤 Can not trash %1: Read-only file system 無法刪除 %1 到回收站:唯讀檔案系統 trash:/// trash:/// Trash file error 刪除檔到回收站錯誤 Invalid Operation! Can not trash "%1". 非法的操作! 不能回收 %1. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. 存在無法處理的衝突,請檢查回收站。 The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error 從回收站恢復文件錯誤 Can not find trashed file %1, might be restored or removed. 無法找到回收的檔案 %1,檔案可能被還原或者刪除。 Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread 最大化 Minimize 最小化 Close 關閉 Peony::IDMActionsManager Rename Spaces 重新命名空間 Space Name 空間名稱 Please input space name 請輸入空間名稱 OK 確定 Cancel 取消 Rename Space 重新命名空間 Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. 無法重新命名空間%1為%2,空間%2已存在。 Edit Space Condition 編輯空間條件 Close dynamically 關閉動態更新 Open dynamically 打開動態更新 Delete Spaces 刪除空間 Are you sure to delete space %1 ? 確定要刪除空間%1? Open 打開 Open With 打開方式 More applications 更多應用 Open The Folder Location 打開檔所在位置 Add File 添加檔 Choose file to add into space 選擇要添加到空間的檔 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 Move to space 移動至空間 Remove From Space 從該空間內移除 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> Do you want to remove selected %1 item(s)?<br> 確定要移除這 %1項檔案嗎? <br> Do you want to remove this file?<br> 確定要移除該檔嗎? Do not ask again 不再提醒 Copy 複製 Save As 另存為 file All File 所有檔 This location has no write permission.please change the storage location 該位置無儲存許可權,建議更換位置 Label 標記 Properties 屬性 Peony::ImageMountManager Invalid device path: %1 設備路徑不可用:%1 Cannot find loop device for path: %1 無法找到虛擬塊設備路徑:%1 Failed to unmount filesystem: %1 卸載檔系統失敗:%1 Failed to delete loop device: %1 刪除虛擬塊設備失敗:%1 Peony::LabelSettings Name 標記名 SideBar 邊欄 Menu 右鍵功能表 Create New Label 新建標識 Delete Label 刪除標識 Display the following items in the identification area: (maximum of 6) 在識別區顯示如下項:(最多6個) Rename 重新命名 Edit Color 修改標識顏色 Delete This Label 刪除此標識 Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" 在“%2”中搜索“%1” File System 檔案系統 Search results for all files marked in "%1" in "%2" 在「%2」 中搜索所有「%1」標識文件的結果 &Copy Directory 拷贝路径(&C) Open In New Tab 在新標籤頁中打開 Open In New Window 在新視窗中打開 Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory 拷貝路徑 Peony::MountOperation Operation Cancelled 操作被取消 Login failed, unknown username or password error, please re-enter! 驗證失敗,未知的使用者名或者密碼錯誤,請重新輸入! Peony::NavigationToolBar Go Back 後退 Go Forward 前進 History 歷史 Clear History 清空歷史 Cd Up 向上 Refresh 刷新 Peony::NewFileLaunchDialog Choose new application 選擇一個新的應用 Choose an Application to open this file 選擇一個應用打開這個檔 apply now 立即應用 OK 確定 Cancel 取消 Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? 您希望以什麼方式打開「%1%2」檔? Default open with: 預設開啟方式: Other: 其他: Choose other application 選擇其他應用 Go to application center 去軟體中心 Peony::PathEdit Go To 跳轉 Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 物件名稱: %1 Read and Write 讀寫 Readonly 唯讀 Group or User 使用者或組 (Current User) (當前使用者) The folder containing this file is protected, and only the file owner can modify the file. Current User 當前使用者 Permissions modify tip 許可權修改提示 The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? 當前檔或目錄已經設置了ACL許可權,修改使用者組許可權可能導致ACL許可權不可用,是否繼續修改使用者組許可權? Permission refinement settings 許可權細化設置 The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? 當前使用者已經設置了高級共用,如果修改許可權,高級共用可能不可用,是否希望繼續設置? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. 無法獲取檔案許可權相關信息。 (Me) (我) Others 其他 Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. 你無法修改該文件的許可權。 Me User 用户 Peony::PropertiesSetDialog Confirming property settings 確認屬性設置 Whether to apply to the current selected option or to selected options and subfolders and subfiles. 是否應用於當前所選項,還是應用於所選項以及子資料夾和子檔。 Apply the current selection 應用於當前所選項 Apply the current selection as well as subfolders and subfiles 應用於目前所選項以及子資料夾和子檔 Ok 確定 Cancel 取消 Peony::PropertiesWindow Trash 回收站 Recent 最近 Selected 選中 %1 Files %1 個檔案 usershare 本機共用 Data 數據盤 System Disk 系統盤 Properties 屬性 Ok 確定 Cancel 取消 Restore 還原 Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. 刪除到回收站時彈出確認框。 Origin Path: 原路徑: Deletion Date: 刪除日期: Size: 檔案大小: Original Location: 原路徑: Peony::SearchBar Input the search key of files you would like to find. 輸入關鍵字以搜尋你想搜尋的檔案. Input search key... 輸入關鍵字... advance search 高級搜索 clear record 清空歷史 Peony::SearchBarContainer Choose File Type 选择文件类型 Search File 搜索檔 Clear 清空 all 全部 file folder 資料夾 image 圖片 video 視頻 text file 文本 audio 音訊 others 其它 wps file WPS檔 Peony::SharedFileLinkOperation Symbolic Link 快捷方式 The dest file "%1" has existed! 目標檔案 %1 已經存在! Link file error 創建檔案連結失敗 Peony::SideBarCloudItem CloudStorage 雲存儲 CloudFile 雲檔 Peony::SideBarFavoriteItem Trash 回收站 Recent 最近 Quick Access 快速訪問 Quick access 快速访问 Favorite 快速访问 KmreData 移動應用 Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data 數據盤 Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties 屬性 Delete Symbolic 刪除 Remove from bookmark 從“快速訪問”取消固定 Unmount 卸載 Eject 彈出 Format 格式化 burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network 網路 Peony::SideBarPersonalItem Personal 個人 Peony::SideBarSeparatorItem (No Sub Directory) (空) Peony::StatusBar ; %1 folders ; %1個資料夾 ; %1 files, %2 total ; %1個檔案,總共%2 ; %1 folder ; %1個資料夾 ; %1 file, %2 ; %1 個檔案,%2 %1 selected 選中%1項 Peony::SyncThread notify 温馨提示 温馨提示 Notify 溫馨提示 Peony::TagManagement General 通用 Mark 標記 Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type 排序類型 File Name 檔名稱 File Type 檔案類型 File Size 檔大小 Modified Date 修改日期 Open in New window 在新視窗中打開 Open in new Tab 在新標籤頁中打開 Ascending 升序 Descending 降序 Copy 複製 Paste 粘貼 Cut 剪切 Trash 刪除 Clean Trash 清空回收站 Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore 還原 Options 選項 Forbid Thumbnail 禁用縮圖 Show Hidden 顯示隱藏檔案 Resident in Backend 常駐後台 Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. 讓檔管理員在關閉所有視窗后仍然運行,這將縮短下次啟動所需要的時間,但是也會一直佔用資源。 &Help 說明(&H) &About... 關於... (&A) Peony Qt 檔管理員 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2019,天津麒麟資訊技術有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow 未知 Type: 類型: Duration: 時長: Size: 大小: Loading... 載入中... Res: 解析度: Mod Date: 變更日期: Deleted date: 刪除日期: Original path: 原路徑: Peony::UserShareInfoManager Warning 警告 Peony::VolumeManager Error 錯誤 ProgressBar starting ... 開始 ... canceling ... 取消中 ... sync ... 同步... continue 繼續 pause 暫停 close 關閉 cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View 圖示檢視 Show the folder children as icons. 以圖示形式顯示目錄. List View 清單檢視 Show the folder children as rows in a list. 以清單形式顯示目錄. Basic Preview Page 基本 Basic 基本 Show the basic file properties, and allow you to modify the access and name. 顯示檔案的基本屬性,允許修改檔名稱。 Permissions Page 权限 Permissions 權限 Show and modify file's permission, owner and group. 查看和修改文件的許可權。 Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? 檔過大,不可移入回收站。 是否永久刪除該檔? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? 檔過大,不可移入回收站。 是否永久刪除這 %1 項檔? Delete 刪除 Clean the Trash 清空回收站 OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. 確認要清空回收站內的檔嗎? 此操作無法撤銷。 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties 計算機屬性 Show the computer properties or items in computer. 顯示電腦屬性或計算機中的項。 Trash and Recent Properties Page 最近/回收 Trash and Recent 回收站/最近 Show the file properties or items in trash or recent. 顯示「回收站」或「最近」中的文件屬性或專案。 eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed 格式化失敗 YES 確認 Formatting successful! But failed to set the device name. 格式化成功! 設備名設置失敗。 qmesg_notify 通知 Format 格式化 Begin Format 開始 Close 關閉 Format operation has been finished successfully. 格式化操作已成功完成。 Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷將清除其上的所有數據。 請在格式化之前備份所有保留的數據。 您想繼續嗎? format 格式化 begin format 开始 close 关闭 File Manager 檔管理員 Notify 溫馨提示 notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed 強制卸載失敗 Error: %1 錯誤: %1 Data synchronization is complete,the device has been unmount successfully! 數據同步完成,設備已經成功卸載! Unmount failed 卸載失敗 Not authorized to perform operation. 操作未獲得授權。 Unable to unmount it, you may need to close some programs, such as: GParted etc. 無法卸載,您可能需要先關閉一些程式,如分區編輯器等。 Error: %1 Do you want to unmount forcely? 錯誤: %1 是否強制卸載? Cancel 取消 Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase 無法啟動裝置: 錯誤的口令 The device has been mount successfully! 設備掛載成功! Eject device failed, the reason may be that the device has been removed, etc. 彈出設備失敗,可能是設備已經被移除等原因。 Data synchronization is complete and the device can be safely unplugged! 數據同步完成,設備可以安全拔出! Password is empty, please re-enter! 密碼為空,請重新輸入! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed 彈出失敗 favorite 快速訪問 Favorites 快速訪問 File is not existed. 檔案不存在. Share Data 本機共用 Trash 回收站 Recent 最近 Operation not supported 操作不支援 The virtual file system does not support folder creation 虛擬檔案系統下不支援創建新資料夾 Can not create a symbolic file for vfs location 無法為虛擬目錄創建快捷方式 Symbolic Link 快捷方式 Can not create symbolic file here, %1 無法在此建立快捷方式, %1 Can not add a file to favorite directory. 檔案不能被添加到我的最愛. The virtual file system cannot be opened 虛擬檔案系統無法打開 Virtual file directories do not support move and copy operations 虛擬檔案路徑不支援移動和複製操作 Default favorite vfs of peony 檔管理員虛擬檔案系統預設快速訪問 Details 詳細資訊 Mark 標記 mark this file. 標記這個檔。 Open With 打開方式 open with. 打開方式。 It need to synchronize before operating the device,place wait! 操作設備前需要同步數據,請稍等! Unable to discover the file, it may have been removed or deleted. 未找到檔,可能被移動或刪除。 permission denied 沒有許可權 file not found 没有发现该文件 duplicate 副本 Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data 數據盤 System Disk 系統盤 label 標記 Computer 計算機 File System 文件系统 Data 數據盤 Failed to open file "%1": insufficient permissions. 打開檔案%1 失敗:許可權不足。 File “%1” does not exist. Please check whether the file has been deleted. 檔%1 不存在,請檢查檔是否被刪除。 burn operation has been cancelled 燒錄操作已取消 is busy! 被佔用! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. 確定永久刪除該檔嗎? 一旦開始刪除,檔將不可恢復。 Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. 確定永久刪除這 %2 項檔案嗎? 一旦開始刪除,檔將不可恢復。 Virtual file directories do not support move operations 虛擬檔案路徑不支援移動和複製操作 test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space 智能空間 New Intelligent Space 新建智能空間 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 SpaceSaveDialog Save as space 存為智能空間 Space Name 空間名稱 Please input space name 請輸入空間名稱 Dynamically Update Space Files 動態更新空間檔 Cancel 取消 Ok 確定 Failed to create space %1,%1 is existed 創建空間%1失敗,%1已存在。 UdfBurn::UdfAppendBurnDataDialog AppendBurnData 追加刻錄 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 No burn data, please add! 沒有燒錄資料, 請新增! The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! AppendBurnData operation has been finished successfully. 追加刻錄操作已完成。 Sorry, the appendBurnData operation is failed! 抱歉, 追加刻錄操作出錯! Failed 失敗 Burning. Do not close this window 燒錄中, 請勿關閉此視窗 Burning this disc will append datas on it. Do you want to continue ? 燒錄此光碟將在其後追加數據, 是否繼續? Burn 燒錄 Begin Burning 開始燒錄 Close 關閉 UdfBurn::UdfFormatDialog Format 格式化 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Failed 失敗 Formatting. Do not close this window 正在格式化, 請勿關閉 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光碟將擦除其上的所有數據。 請在格式化前備份所有保留的數據。 要繼續嗎 ? Begin Format 開始 Close 關閉 UdfFormatDialog Format 格式化 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Failed 失敗 Formatting. Do not close this window 正在格式化, 請勿關閉 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光碟將擦除其上的所有數據。 請在格式化前備份所有保留的數據。 要繼續嗎 ? Begin Format 開始 Close 關閉 progressBarHelper Time is being calculated 正在计算时间 Calculating time 正在計算時間 %1day%2hrs%3mins%4sec %1天%2小時%3分鐘%4秒 %1hrs%2mins%3sec %1小時%2分鐘%3秒 %1 mins%2sec %1 分鐘%2秒 %1sec %1秒 peony/translations/libpeony-qt/libpeony-qt_fr.ts0000664000175000017500000103472315154271106021134 0ustar fengfeng ColorPushButton Label Management ... Remove "%1" add "%1" ConnectServerDialog Connect to Sever Connectez-vous au serveur Domain Domaine Password Mot de passe Save Password Sauvegarder le mot de passe User Utilisateur Anonymous Anonyme Ok Ok Cancel Annuler DiscControl is busy! is busy! not support udf at present. unmount disc failed before udf format. DVD+RW udf format fail. preparation failed before DVD-RW udf format. FileLabelModel Red Rouge Orange Orange Yellow Jaune Green Vert Blue Bleu Purple Violet Gray Gris Transparent Transparent Delete file Warning Dosya Silme Uyarısı Error Erreur Label or color is duplicated. L'étiquette ou la couleur est dupliquée. FileOperationHelper Burn failed Format_Dialog Dialog Dialogue rom_size rom_size system système vfat/fat32 exfat ntfs ntfs vfat vfat ext4 ext4 device_name device_name clean it total effacer le total ok ok close Fermer TextLabel qmesg_notify qmesg_notify Format operation has been finished successfully. L'opération de formatage s'est terminée avec succès. Sorry, the format operation is failed! Désolé, l'opération de formatage a échoué ! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Le formatage de ce volume effacera toutes les données qu'il contient. Veuillez sauvegarder toutes les données conservées avant le formatage. Voulez-vous continuer ? format formatage begin format commencer le formatage format_success Biçimlentirme başarılı format_err Biçimlendirme hatalı Format Rom size: Filesystem: Disk name: Completely erase(Time is longer, please confirm!) Set password Set password for volume based on LUKS (only ext4) Warning Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Cancel Annuler OK OK Data Device name cannot start with a decimal point, Please re-enter! Enter Password: Password too short, please retype a password more than 6 characters %1/sec, %2 remaining. over one day getting progress... Error Erreur Block not existed! Formatting. Do not close this window Error locking device: Failed to deactivate device: Device or resource busy KyFileDialogRename Renaming "%1" Renaming failed, the reason is: %1 Filename too long Copying "%1" To "%1" Copying failed, the reason is: %1 Moving "%1" Moving failed, the reason is: %1 File operation error: The reason is: %1 Skip Truncation Save Rename Renommer All applications Cancel Annuler Apply Bytes Front truncation Post truncation OK OK Description: Skip copying files of the current type truncate interval . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Description: By default, save to "%1/扩展". modify the name Explanation: When renaming a file name, ensure it is within %1 bytes and MainProgressBar File operation Opération du fichier starting ... démarrage... Calculating time cancel all file operations annuler toutes les opérations sur les fichiers Are you sure want to cancel all file operations Voulez-vous vraiment annuler toutes les opérations sur les fichiers continue pause canceling ... annulation ... sync ... %1Mb/s Est. time left: %2 OK OK File Operation Opération de fichier Minimize Close Kapat Are you sure to cancel all file operations? Cancel Annuler MessageDialog Peony Forcibly pulling out the device may cause data loss or device exceptions! OtherButton Other queue Autre fichier en attente Other Queue Peony::AdvanceSearchBar Key Words Mots clés input key words... saisir les mots clés... Search Location Rechercher un emplacement choose search path... choisir le chemin de recherche... browse naviguer File Type Type de fichier Choose File Type Choisir le type de fichier Modify Time Modifier l'heure Choose Modify Time Choisir la modification de l'heure File Size Taille du fichier Choose file size Choisir la taille du fichier show hidden file afficher les fichiers cachés go back retourner hidden advance search page page de recherche avancée masquée file name nom de fichier content contenu search chercher start search lancer la recherche Select path Sélectionner le chemin Operate Tips Conseils d'utilisation Have no key words or search location! N'ayez pas de mots clés ni de lieu de recherche ! Search file name or content at least choose one! Rechercher le nom du fichier ou le contenu en choisir au moins un ! Search content or file name at least choose one! İçeriği veya dosya adını en az birini seçin! all tout file folder dossier de fichiers image image video vidéo text file fichier texte audio audio others autres wps file fichier wps today aujourd'hui this week cette semaine this month ce mois-ci this year cette année year ago il y'a un an tiny(0-16K) minuscule (0-16K) small(16k-1M) petit (16k-1M) medium(1M-100M) moyen (1M-100M) big(100M-1G) grand (100M-1G) large(>1G) large (> 1G) Peony::AdvancedLocationBar Search Content... Rechercher dans le contenu... Search File Peony::AdvancedPermissionsPage Permission refinement settings Permission refinement settings tip Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? User Utilisateur Read Write Executable delete supprimer Inherit permission Add Apply Cancel Annuler Peony::AllFileLaunchDialog Choose new application Choose an Application to open this file Choisir une application pour ouvrir ce fichier apply now OK OK Cancel Annuler Peony::AudioPlayManager Operation file Warning Avertissement de fichier d'opération Peony::BasicPropertiesPage Type: Type : Display Name: Afficher un nom : Location: Emplacement : Overview: Aperçu : Time Created: Heure de création : Time Modified: Heure modifiée : Name Nom Location symbolLink Folder Include: Move Open with: Description: Select multiple files Size: Taille : Time Access: Heure d'accès : Readonly Hidden Readonly (just applied by subfiles) Property: usershare %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. Choose a new folder: Error Erreur cannot move a folder to itself ! Choose a custom icon Space Usage: Time Create: %1 Bytes %1 files, %2 folders Can't get remote file information %1 files (include root files), %2 hidden %1 fichiers (y compris les fichiers racine), %2 masqués %1 total %1 au total Peony::ComputerPropertiesPage CPU Name: Nom du processeur : CPU Core: Noyau CPU : Memory Size: Taille mémoire : User Name: Nom d'utilisateur : Desktop: Bureau : You should mount this volume first Vous devez d'abord monter ce volume Name: Nom : File System Système de fichiers Data System Disk Total Space: Espace total : Used Space: Espace utilisé : In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Espace libre : Type: Type : Kylin Burner Open with: Unknown Inconnu Peony::ConnectServerDialog connect to server connecter au serveur ip ip port Port type type Connect to server Ip Port Type Type Personal Collection server: Serveur de collection personnelle : Add Delete Connect Warning Ip input error, please re-enter! Port input error, please re-enter! add ajouter delete supprimer connect connecter Peony::ConnectServerLogin The login user L'utilisateur connecté Please enter the %1's user name and password of the server. Veuillez entrer le nom d'utilisateur et le mot de passe du serveur %1. User's identity Identité de l'utilisateur Guest Name Nom Password Mot de passe domain Cancel Annuler OK OK guest client Registered users Utilisateurs enregistrés name Nom password mot de passe Remember the password Se souvenir du mot de passe cancel Annuler ok ok Peony::CreateLinkInternalPlugin Create Link to Desktop Créer un lien vers le bureau Create Link to... Créer un lien vers... Choose a Directory to Create Link Choisir un répertoire pour créer un lien Peony-Qt Create Link Extension Extension de lien de création de Peony-Qt Create Link Menu Extension. Créer une extension de menu de lien. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Créer un lien vers le bureau Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile Nouveau fichier Create file Créer un fichier NewFolder Nouveau dossier Create file error Créer une erreur de fichier Peony::CustomErrorHandler Is Error Handled? Error not be handled correctly Peony::DefaultAcitonWidget No default app Peony::DefaultOpenWithWidget No default app Peony::DefaultPreviewPage Select the file you want to preview... Sélectionner le fichier que vous souhaitez prévisualiser... Can not preview this file. Impossible de prévisualiser ce fichier. Can not preivew this file. Bu dosya önizlemesi görüntülenemiyor. Select the file you want to preview Can not preview this file Peony::DefaultPreviewPageFactory Default Preview Aperçu par défaut This is the Default Preview of peony-qt Ceci est l'aperçu par défaut de peony-qt Peony::DetailsPropertiesPage Name: File type: Location: Emplacement : Create time: Modify time: Heure de modification : yyyy-MM-dd, HH:mm:ss File size: Taille du fichier : Width: Height: Owner Propriétaire Owner: Computer Ordinateur Computer: %1 (this computer) Unknown Inconnu Can't get remote file information %1 px Peony::DirectoryView::IconView Icon View Affichage des icônes warn This operation is not supported. Peony::DirectoryView::IconView2 Icon View Simge Görünümü Peony::DirectoryView::ListView List View Vue en liste warn This operation is not supported. Peony::DirectoryView::ListView2 List View Liste Görünümü Peony::DirectoryViewFactoryManager Icon View Simge Görünümü Peony::DirectoryViewMenu Open in &New Window Ouvrir dans une &nouvelle fenêtre Open in New &Tab Ouvrir dans un nouvel onglet Add to bookmark Ajouter au signet &Open "%1" &Ouvrir "%1" Open "%1" in &New Window Ouvrir "%1" dans une &nouvelle fenêtre Open "%1" in New &Tab Ouvrir "%1" dans un nouveau &onglet Open "%1" with... Ouvrir "%1" avec... &More applications... &Plus d'applications... &Open &Ouvert &Open %1 selected files &Ouvrir %1 fichiers sélectionnés &New... &Yeni Empty &File &Fichier vide &Folder &Dossier New Folder Nouveau dossier Icon View Simge Görünümü List View Liste Görünümü View Type... Type de vue... Sort By... Trier par... Name Nom File Type Type de fichier File Size Taille du fichier New... Nouveau... Open in New Window Open in New Tab Open Open failed Open directory failed, you have no permission! Open with... More applications... Open %1 selected files New Empty File Folder Modified Date Date modifiée Sort Order... Ordre de tri... Ascending Order Ordre croissant Descending Order Ordre décroissant Sort Preferences... Préférences de tri... Folder First Dossier d'abord Chinese First Chinois d'abord Show Hidden Afficher les éléments masqués Copy Copier File:"%1" is not exist, did you moved or deleted it? &Copy &Copier Cut Couper Delete to trash Paste Coller Delete View Type Sort By Time Modified Original Path Path Sort Order Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Refresh Rafraîchir Select All Properties Propriétés format Restore Restaurer Cancel Annuler Error Erreur Mount MultiSelect File:"%1 is not exist, did you moved or deleted it? Fichier : "%1 n'existe pas, l'avez-vous déplacé ou supprimé ? Cu&t &Kes &Delete to trash &Supprimer dans la corbeille Delete forever Kalıcı Olarak Sil Rename Renommer Select &All Tout sélectionner Reverse Select Sélection inverse P&roperties &Özellikler &Delete &Supprimer &Rename &Yeniden Adlandır &Paste &Coller &Refresh &Rafraîchir &Properties Özellikler &Clean the Trash &Vider la corbeille Delete file Warning Dosyayı Sil Uyarısı Delete Permanently Supprimer définitivement Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. &Restore &Restaurer Clean All Tout effacer Open Parent Folder in New Window Ouvrir le dossier parent dans une nouvelle fenêtre Peony::DirectoryViewWidget Directory View Dizin Görünümü Peony::ExtensionsManagerWidget Extensions Manager Available extensions Ok Ok Cancel Annuler Peony::FMWindow File Manager Gestionnaire de fichiers advanced search Recherche avancée clear record effacer l'enregistrement Loaing... Press Esc to stop a loading. Chargement... Appuyer sur Echap pour arrêter un chargement. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Auteurs : Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C) : 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Ctrl+H Show|Hidden Ctrl+H Undo Annuler Redo Rétablir Peony Qt Peony Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. New Folder Nouveau dossier Peony::FileBatchRenameOperation File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden these files? Rename file error Renommer l'erreur du fichier Peony::FileCopy Error in source or destination file path! Error when copy file: %1, can not copy special files, skip this file and continue? Can not copy %1, file doesn't exist. Has the file been renamed or moved? The dest file "%1" has existed! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Error writing to file: Input/output error Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. Failed to create %1. Please check whether the device has been removed! Write file error: There is no available disk space for device! File opening failure operation cancel Peony::FileCopyOperation File copy Dosya kopyalama Create folder %1 failed: %2 File copy error Erreur de copie du fichier Cannot opening file, permission denied! The file name exceeds the limit File:%1 was not found. Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Link file error Erreur de fichier de lien Burning does not support replacement Peony::FileDeleteOperation File delete Dosya silme File delete error Erreur de suppression du fichier Delete file error Invalid Operation! Can not delete "%1". Peony::FileEnumerator Delete file Warning Dosyayı Sil Uyarısı The password dialog box is canceled Message recipient disconnected from message bus without replying! Error Erreur Did not find target path, do you move or deleted it? Vous n'avez pas trouvé le chemin cible, l'avez-vous déplacé ou supprimé ? Peony::FileInfo data folder file text file fichier texte Peony::FileInfoJob Trash Corbeille Computer Ordinateur Peony::FileInformationLabel File location: Emplacement du fichier : File size: Taille du fichier : Modify time: Heure de modification : Peony::FileItem Delete file Warning Dosyayı Sil Uyarısı Warning Error Erreur Open Link failed L'ouverture du lien a échoué File not exist, do you want to delete the link file? Le fichier n'existe pas, voulez-vous supprimer le fichier de lien ? Can not open path "%1",permission denied. Impossible d'ouvrir le chemin d'accès "%1",permission refusée. Can not find path "%1",are you moved or renamed it? Impossible de trouver le chemin "%1". Avez-vous déplacé ou renommé le chemin ? Peony::FileItemModel child(ren) enfant(s) Symbol Link, Lien symbolique, System Disk File Name Nom de fichier Delete Date Create Date Time Modified File Size Taille du fichier Original Path Path File %1 is existed in space, please not add file repeatly. Operation not supported File Type Type de fichier Modified Date Date modifiée Peony::FileLabelInternalMenuPlugin Add File Label... Ajouter une étiquette de fichier... Add File Label Delete All Label Supprimer toutes les étiquettes Label Management ... add "%1" Remove "%1" Peony File Labels Menu Extension Extension du menu des étiquettes de fichier de Peony Tag a File with Menu. Marquer un fichier avec Menu. Peony::FileLabelWidget Label Management ... Peony::FileLauchDialog Applications Applications Choose an Application to open this file Choisir une application pour ouvrir ce fichier Set as Default Définir par défaut OK OK The opening mode of the %1 %2 unknown No application is set to open file "%1 %2" Still using the last opened application: known Open application is used by default: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Other application: Select application: Always open the %1%2 file with this application Choose other application Go to application center Ok Ok Cancel Annuler Desktop files(*.desktop) Select Open Action Select Peony::FileLaunchAction Execute Directly Exécuter directement Execute in Terminal Exécuter dans le terminal Detected launching an executable file %1, you want? Détection du lancement d'un fichier exécutable %1, voulez-vous ? Delete file Warning Dosyayı Sil Uyarısı Open Failed Échec de l'ouverture Can not open %1, file not exist, is it deleted? Impossible d'ouvrir %1, le fichier n'existe pas, est-il supprimé ? File not exist, is it deleted or moved to other path? Dosya mevcut değil, silinmiş veya başka bir yere taşınmış olabilir Can not open %1 %1 açılamadı No Permission File is not readable. Please check if file has read permisson. By Default App Application par défaut Launch Options Options de lancement Open Link failed L'ouverture du lien a échoué File not exist, do you want to delete the link file? Le fichier n'existe pas, voulez-vous supprimer le fichier de lien ? Can not open %1, Please confirm you have the right authority. Impossible d'ouvrir %1. Veuillez confirmer que vous disposez des droits appropriés. Open App failed L'ouverture de l'application a échoué The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? L'application liée est modifiée ou désinstallée, elle ne peut donc pas fonctionner correctement. Voulez-vous supprimer le fichier de lien ? Error Erreur File original path not exist, are you deleted or moved it? Can not get a default application for opening %1, do you want open it with text format? Impossible d'obtenir une application par défaut pour ouvrir %1, voulez-vous l'ouvrir au format texte ? Peony::FileLinkOperation Symbolic Link Lien symbolique Link file error Erreur de fichier de lien Link file Dosyayı bağla Peony::FileMoveOperation Invalid move operation, cannot move a file itself. Geçersiz taşıma işlemi, bir dosyanın kendisini taşıyamaz. Move file Dosyayı taşı Create file Dosya oluştur Move file error Erreur de déplacement du fichier System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. File move error Invalid move operation, cannot move a file into its sub directories. Cannot opening file, permission denied! The file name exceeds the limit Create file error Créer une erreur du fichier Link file error Erreur de fichier de lien Burning does not support replacement Invalid Operation. Opération invalide. File:%1 was not found. Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error Erreur de suppression du fichier File delete Dosya silme Invalid Operation Opération invalide Peony::FileOperationAfterProgressPage &More Details &Plus de détails Peony::FileOperationErrorDialog File Operation Error Erreur d'opération de fichier unkwon inconnu null nul Error message: Message d'erreur : Source File: Fichier source : Dest File: Fichier de destination : Ignore Ignorer Ignore All Tout ignorer Overwrite Écraser Overwrite All Tout remplacer Backup Sauvegarde Backup All Tout sauvegarder &Retry &Réessayer &Cancel &Annuler Peony::FileOperationErrorDialogBase Close Kapat Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. Cet emplacement contient déjà un fichier du même nom. Please select the file to keep Veuillez sélectionner le fichier à conserver Replace Remplacer Ignore Ignorer Do the same <p>This location already contains the file '%1', Do you want to override it?</p> Unexpected error from %1 to %2 Then do the same thing in a similar situation Ensuite, faites la même chose dans une situation similaire Backup Sauvegarde Cancel Annuler OK OK Peony::FileOperationErrorDialogNotSupported Cancel Annuler Delete Make sure the disk is not full or write protected and that the file is not protected Assurez-vous que le disque n'est pas plein ou protégé en écriture et que le fichier n'est pas protégé Peony::FileOperationErrorDialogWarning OK OK Cancel Annuler Skip all Make sure the disk is not full or write protected and that the file is not protected Assurez-vous que le disque n'est pas plein ou protégé en écriture et que le fichier n'est pas protégé Please make sure the disk is not full or not is write protected, or file is not being used. Lütfen diskin dolu olmadığından veya yazmaya karşı korumalı olmadığından veya dosyanın kullanılmadığından emin olun. Peony::FileOperationInfo Symbolic Link Lien symbolique Copy Copier Move Rename Renommer Link Delete Delete Permanently Restore Restaurer New - Symbolic Link - Symbolik Link Peony::FileOperationManager Delete file Warning Dosyayı Sil Uyarısı Warn '%1' is occupied,you cannot operate! OK OK Cancel Annuler Do you want to put selected %1 item(s) into trash? Do not show again System Disk Data Insufficient storage space %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Can't delete. Impossible de supprimer. You can't delete a file whenthe file is doing another operation Vous ne pouvez pas supprimer un fichier lorsque le fichier effectue une autre opération File Operation is Busy L'opération de fichier est occupée There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Une ou plusieurs opération(s) de fichier ont déjà été exécutées. Votre opération attendra son exécution jusqu'à ce qu'elle soit terminée. Si vous voulez vraiment exécuter des opérations sur les fichiers parallèlement de toute façon, vous pouvez changer l'option par défaut "Autoriser le parallèle" dans le menu d'options. The long name file is saved to %1 Undo %1 Redo %1 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. Daha önce bir veya daha fazla dosya işlemi yürütüldü. Operasyonunuz tamamlanana kadar yürütmeyi bekleyecektir. Peony::FileOperationPreparePage counting: compteur : state: État : Peony::FileOperationProgressPage &More Details &Plus de détails From: De : To: À : Peony::FileOperationProgressWizard File Manager Gestionnaire de fichiers &Cancel &Annuler Preparing... Préparation... Handling... Manipulation... Clearing... Effacement... Rollbacking... Restauration en cours... File Operation Opération de fichier A file operation is running backend... Une opération de fichier s'exécute en arrière-plan... %1 files, %2 %1 fichiers, %2 %1 done, %2 total, %3 of %4. %1 terminé, %2 total, %3 sur %4. clearing: %1, %2 of %3 effacement : %1, %2 sur %3 copying... copie en cours... Syncing... Synchronisation... Peony::FilePreviewPage File Name: Nom de fichier : File Type: Type de fichier : Time Access: Heure d'accès : Time Modified: Heure de modification : Children Count: Nombre d'enfants : Size: Taille : Location: Emplacement : Time Created: Heure de création : Image resolution: color model: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel Annuler OK OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare Image size: Taille de l'image : Image format: Format de l'image : %1x%2 %1x%2 %1 total, %2 hidden %1 total, %2 masqué Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) Les noms ajoutent automatiquement des numéros de série (par exemple, 1,2,3...) Cancel Annuler New file name Nouveau nom de fichier Please enter the file name Veuillez saisir le nom du fichier OK OK Peony::FileRenameOperation Rename file Dosyayı yeniden isimlendir File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden this file? When change the file suffix, the file may be invalid. Are you sure to change it ? A file and a directory with the same name cannot replace each other Rename file error Renommer l'erreur du fichier Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// trash:/// Trash file error Erreur de fichier de la corbeille Invalid Operation! Can not trash "%1". An unmanageable conflict exists. Please check the recycle bin. Can not trash Impossible de jeter Trash file Çöp dosyası Peony::FileUntrashOperation Untrash file Dosyayı geri al Untrash file error Erreur de suppression du fichier de la corbeille Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Minimize Close Kapat Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK OK Cancel Annuler Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Open With More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Copier Save As file All File This location has no write permission.please change the storage location Label Properties Propriétés Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name Nom SideBar Menu Create New Label Delete Label Display the following items in the identification area: (maximum of 6) Rename Renommer Edit Color Delete This Label Peony::LocationBar click the blank area for edit cliquer sur la zone vide pour modifier Search "%1" in "%2" Rechercher "%1" dans "%2" File System Système de fichiers Search results for all files marked in "%1" in "%2" &Copy Directory &Copier le répertoire Open In New Tab Open In New Window Open In New &Tab Ouvrir dans un nouvel onglet Open In &New Window Ouvrir dans une nouvelle fenêtre Copy Directory ">Dizini Kopyala Peony::MountOperation Operation Cancelled Opération annulée Login failed, unknown username or password error, please re-enter! Peony::NavigationToolBar Go Back Revenir en arrière Go Forward Aller en avant History Histoire Clear History Effacer l'historique Cd Up Cd Up Refresh Rafraîchir Peony::NewFileLaunchDialog Choose new application Choose an Application to open this file Choisir une application pour ouvrir ce fichier apply now OK OK Cancel Annuler Peony::OpenWithPropertiesPage How do you want to open "%1%2" files ? Default open with: Other: Choose other application Go to application center Peony::PathEdit Go To Aller à Peony::PermissionsPropertiesPage User or Group Utilisateur ou groupe Type Type Readable Lisible Writeable Inscriptible Excuteable Excutable File: %1 Fichier : %1 Target: %1 Group or User Read and Write Readonly (Current User) The folder containing this file is protected, and only the file owner can modify the file. Current User Permissions modify tip The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Permission refinement settings The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Can not get the permission info. Impossible d'obtenir les informations d'autorisation. (Me) (Moi) Others Autres Owner Propriétaire Group Groupe Other Users Autres utilisateurs You can not change the access of this file. Vous ne pouvez pas modifier l'accès à ce fichier. Me Moi User Utilisateur Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok Ok Cancel Annuler Peony::PropertiesWindow Trash Corbeille Recent Selected %1 Files usershare Data System Disk Properties Propriétés Ok Ok Cancel Annuler Restore Restaurer Close Kapat Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing. Origin Path: Chemin d'origine : Deletion Date: Size: Taille : Original Location: Emplacement d'origine : Peony::SearchBar Input the search key of files you would like to find. Entrer la clé de recherche des fichiers que vous souhaitez trouver. Input search key... Clé de recherche en entrée... advance search recherche avancée clear record Effacer l'enregistrement Peony::SearchBarContainer Choose File Type Choisir le type de fichier Search File Clear Effacer all tout file folder dossier de fichiers image image video vidéo text file fichier texte audio audio others autres wps file fichier wps Peony::SharedFileLinkOperation Symbolic Link Lien symbolique The dest file "%1" has existed! Link file error Erreur de fichier de lien Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Favorite Favori Trash Corbeille Recent Quick Access KmreData Peony::SideBarFileSystemItem Computer Ordinateur File System Système de fichiers Data Peony::SideBarMenu &Properties Özellikler P&roperties Özellikler Properties Propriétés Delete Symbolic Unmount Eject Format burndata &Delete Symbolic &Supprimer symbolique &Unmount &Démonter &Eject &Éjecter format formater Peony::SideBarModel Network Peony::SideBarPersonalItem Personal Personnel Peony::SideBarSeparatorItem (No Sub Directory) (Pas de sous-répertoire) Peony::StatusBar ; %1 folders ; %1 dossiers ; %1 files, %2 total ; %1 fichiers, %2 total ; %1 folder ; %1 dossier ; %1 file, %2 ; %1 fichier, %2 %1 selected %1 sélectionné Peony::SyncThread Notify Peony::TagManagement Mark Peony::ToolBar Open in new &Window Yeni Pencerede Aç Open in &New window Ouvrir dans une &nouvelle fenêtre Open in new &Tab Ouvrir dans un nouvel onglet Sort Type Type de tri File Name Nom de fichier File Type Type de fichier File Size Taille du fichier Modified Date Date modifiée Open in New window Open in new Tab Ascending Ascendant Descending Descendant Copy Copier Paste Coller Cut Couper Trash Corbeille Clean Trash Vider la corbeille Delete file Warning Dosyayı Sil Uyarısı Delete Permanently Supprimer définitivement Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Restore Restaurer Options Options Forbid Thumbnail Interdire la miniature Show Hidden Afficher masqué Resident in Backend Résident en arrière-plan Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Laisser le programme s'exécuter encore après la fermeture de la dernière fenêtre. Cela réduira le temps pour le prochain lancement, mais cela consommera également des ressources en arrière-plan. &Help &Aide &About... &À propos... Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Auteurs : Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C) : 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Peony::TooltipsManager Unknow Type: Type : Duration: Size: Taille : Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Peony::VolumeManager Error Erreur ProgressBar starting ... démarrage... canceling ... annulation... sync ... continue pause close Fermer cancel file operation annuler l'opération de fichier Are you sure want to cancel the current selected file operation Voulez-vous vraiment annuler l'opération de fichier actuellement sélectionnée OK OK Cancel Annuler QObject Icon View Affichage des icônes Show the folder children as icons. Afficher les enfants du dossier sous forme d'icônes. List View Vue en liste Show the folder children as rows in a list. Afficher les enfants du dossier sous forme de lignes dans une liste. Basic Preview Page Page d'aperçu de base Basic Show the basic file properties, and allow you to modify the access and name. Afficher les propriétés de base du fichier et vous permettre de modifier l'accès et le nom. Permissions Page Page des autorisations Permissions Show and modify file's permission, owner and group. Afficher et modifier l'autorisation, le propriétaire et le groupe du fichier. Can not trash Impossible de jeter Can not trash these files. You can delete them permanently. Are you sure doing that? Impossible de supprimer ces fichiers. Vous pouvez les supprimer définitivement. Êtes-vous sûr de le faire ? Delete Permanently supprimer définitivement Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Are you sure that you want to delete %1? Once you start a deletion, the files deleting will never be restored again. Voulez-vous vraiment supprimer %1 ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Are you sure that you want to delete these %1 files? Once you start a deletion, the files deleting will never be restored again. Voulez-vous vraiment supprimer ces fichiers %1 ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Computer Properties Page Page des propriétés de l'ordinateur Computer Properties Show the computer properties or items in computer. Afficher les propriétés de l'ordinateur ou les éléments de l'ordinateur. Trash and Recent Properties Page Page de la corbeille et des propriétés récentes Trash and Recent Show the file properties or items in trash or recent. Afficher les propriétés du fichier ou les éléments dans la corbeille ou récents. eject device failed Aygıtı çıkarma başarısız oldu Please check whether the device is occupied and then eject the device again Lütfen cihazın dolu olup olmadığını kontrol edin ve ardından cihazı tekrar çıkarın Format failed Échec du formatage YES OUI Formatting successful! But failed to set the device name. qmesg_notify qmesg_notify Format Begin Format Close Kapat Format operation has been finished successfully. L'opération de formatage s'est terminée avec succès. Sorry, the format operation is failed! Désolé, l'opération de formatage a échoué ! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Le formatage de ce volume effacera toutes les données qu'il contient. Veuillez sauvegarder toutes les données conservées avant le formatage. Voulez-vous continuer ? format begin format commencer le formatage close Fermer File Manager Gestionnaire de fichiers Notify Default search vfs of peony Recherche par défaut vfs de peony Force unmount failed Échec du démontage forcé Error: %1 Erreur : %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Échec du démontage Not authorized to perform operation. Unable to unmount it, you may need to close some programs, such as: GParted etc. Error: %1 Do you want to unmount forcely? Erreur : %1 Voulez-vous démonter de force ? Eject failed Échec de l'éjection The file is too large to be moved to the recycle bin. Do you want to permanently delete it? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Delete Cancel Annuler Clean the Trash Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. Eject Anyway Éjecter quand même Failed to activate device: Incorrect passphrase The device has been mount successfully! Eject device failed, the reason may be that the device has been removed, etc. Data synchronization is complete and the device can be safely unplugged! Password is empty, please re-enter! Unable to eject %1 Impossible d'éjecter %1 Details Mark mark this file. Open With open with. Unable to discover the file, it may have been removed or deleted. permission denied It need to synchronize before operating the device,place wait! favorite Favorites File is not existed. Share Data Operation not supported Virtual file directories do not support move and copy operations Trash Corbeille Recent The virtual file system does not support folder creation Can not create a symbolic file for vfs location Symbolic Link Lien symbolique Can not create symbolic file here, %1 Can not add a file to favorite directory. The virtual file system cannot be opened Default favorite vfs of peony duplicate data System Disk Failed to open file "%1": insufficient permissions. File “%1” does not exist. Please check whether the file has been deleted. Computer Ordinateur Data File System Système de fichiers Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. burn operation has been cancelled is busy! test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Intelligent Space File %1 is existed in space, please not add file repeatly. Virtual file directories do not support move operations label Show properties plugin window. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Annuler Ok Ok Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData Disc Type: Device Name: OK OK Cancel Annuler Unknown Inconnu Warning No burn data, please add! The disc name cannot be set to empty, please re-enter it! AppendBurnData operation has been finished successfully. Sorry, the appendBurnData operation is failed! Failed Burning. Do not close this window Burning this disc will append datas on it. Do you want to continue ? Burn Begin Burning Close Kapat UdfBurn::UdfFormatDialog Format Disc Type: Device Name: OK OK Cancel Annuler Unknown Inconnu Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. L'opération de formatage s'est terminée avec succès. Sorry, the format operation is failed! Désolé, l'opération de formatage a échoué ! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat UdfFormatDialog Format Disc Type: Device Name: OK OK Cancel Annuler Unknown Inconnu Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. L'opération de formatage s'est terminée avec succès. Sorry, the format operation is failed! Désolé, l'opération de formatage a échoué ! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_ky.ts0000664000175000017500000113671715154271106021156 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... بەلگە باشقارىش ... Remove "%1" «%1» نى چىعارۇۇ delete "%1" 删除“%1” add "%1" «%1» نى قوشۇۇ ConnectServerDialog Connect to Sever Sever عا ۇلوو Domain تور ناامى Password سىرسۅز Save Password پارولدۇ ساقتوو User ىشتەتۉۉچۉ Anonymous اتى جوق Ok ماقۇل Cancel ارعادان قالتىرىش DiscControl is busy! ەرەكچە الدىراش! is busy! الدىراش not support udf at present. ازىرچا udf نى قولدوبويت. unmount disc failed before udf format. UDF فورماتىنان مۇرۇن دىسكاسىن تۉشۉرۉ جەڭىلۉۉ بولدۇ . is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf ۅجۅتۉۉ فورماتى. preparation failed before DVD-RW udf format. DVD-RW udf فورماتىنان مۇرۇن داياردوو جەڭىلۉۉ بولدۇ . FileLabelModel Red قىزىل تۉس Orange تەمپەراتۇرا سارى تۉس Yellow سارى تۉس Green جاشىل تۉس Blue كۅك تۉس Purple گۉلگۉن ، قىزعىلت كۅك تۉس Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error قاتاالىق Label or color is duplicated. بەلگە كۅرۉنۉشتۅرۉ تۉس كۅبۅيتۉلگۅن. FileOperationHelper Burn failed كۉيگۉزۉۉ جەڭىلۉۉ بولدۇ Format_Dialog Dialog كۅزۅنۅك rom_size rom_ رىزمەر system ساامالىق vfat/fat32 exfat ntfs vfat VFAT ext4 device_name clean it total پۉتكۉلدۅي تازالوو ok ماقۇل close جابۇۇ TextLabel qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format فورمات Rom size: rom چوڭ-كىچىكتىگى : Filesystem: ۅجۅت ساامالىعى : Disk name: دىسكا ناامى : Completely erase(Time is longer, please confirm!) ۉزۉل - كەسىل ۅچۉرۉۉ (ۇباقىت ۇزۇن ، بەكىتىڭ!) Set password پارولدۇ بەلگىلۅۅ Set password for volume based on LUKS (only ext4) LUKS عا نەگىزىنەن كۅلۅمۉ ۉچۉن پارولدۇ بەلگىلۅۅ (جالاڭ عانا ext4) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ext4 ۅجۅت ساامالىعىنا فورماتتاش باشقا ابونىتتاردىن USB دىسكادا وقۇۇ كۅرۉنۉشتۅرۉ يازالماسلىقىنى كەلىترىپ ۅندۉرۉشۉ مۉمكۉن Cancel ارعادان قالتىرىش OK ماقۇل Data ساندۇۇ بايانداما Error locking device: Failed to deactivate device: Device or resource busy اسپاپتى لوقاۇتتا. قاتاالىق كۅرۉلدۉ: اسپاپتى توقتوتۇۇ جەڭىلۉۉ بولدۇ : شايمان كۅرۉنۉشتۅرۉ بايلىق الدىراش Warning ەسكەرتۉۉ Device name cannot start with a decimal point, Please re-enter! شايمان ناامى وندۇق چەكىت مەنەن باشتاعالى بولبويت ، قايرا كىرگىزىڭ! Enter Password: پارولدۇ كىرگىزىڭ: Password too short, please retype a password more than 6 characters سىرسۅز ۅتۅ قىسقا، 6 تامعانىن ارتىق پارولدۇ قايرا كىرگىزىڭ %1/sec, %2 remaining. %1/سىكونت، %2 قالدى. over one day بىر كۉندۅن ارتىق getting progress... ىلگەرلۅۅ ... Error قاتاالىق Block not existed! بۅلۉك باربولۇۇسۇ ەمەس ! Formatting. Do not close this window فورمات. بۇل كۅزۅنۅكتۉ يېپىۋەتمەڭ KyFileDialogRename Renaming "%1" «%1» اتاعىن ۅزگۅرتۉش Renaming failed, the reason is: %1 ات ۅزگۅرتۉش جەڭىلۉۉ بولدۇ ، سەبەبى : %1 Filename too long ۅجۅت ناامى ۅتۅ ۇزۇن ەكەن Copying "%1" «%1» نى كۅچۉرۉپ جاتات To "%1" «%1» عا Copying failed, the reason is: %1 گۅچۉرۉش جەڭىلۉۉ بولدۇ ، سەبەبى %1 Moving "%1" «%1» نى جۅتكۅپ جاتات Moving failed, the reason is: %1 جۅتكۅۅ جەڭىلۉۉ بولدۇ ، سەبەبى : %1 File operation error: ۅجۅت ماشقۇلدانۇۇ قاتالىعى: The reason is: %1 سەبەبى : %1 Truncation قىسقارتۇۇ Save ساقتوو All applications باردىق پراگراممالار Cancel ارعادان قالتىرىش Apply ۅتۉنۉچ جاسوو ،اتقارۇۇ Bytes بايت Front truncation الدى بۅلۅگۉ ۅچۉرۉلگۅن.. Post truncation قىيىش بىلدىرۉۉ Description: Skip copying files of the current type تۉشۉندۉرۉسۉ: گەزەكتەكى ۅجۅتتۅرۉن كۅچۉرۉۉدۅن اتتاپ ۅتۉش truncate interval قىسقارتۇۇ ارالىعى . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select تۉشۅندۉرۉش : %1 بايت اشىپ كەتكەن ،قوروعون ۅجۅت اتاعىن قىسقارتىپ تانداڭ Explanation: When renaming a file name, ensure it is within %1 bytes and تۉشۅندۉرۉش : ۅجۅت اتاعىن ۅزگۅرتكۅندۅ، انىن %1 بايت چۅلكۅمۉندۅ بولۇشۇنا ەەبولۇۇ قىلىڭ Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". تۉشۅندۉرۉش :ويۇنداقى ابالدا، %1/گىچە ساقتوو كەرەك. modify the name اتتى ۅزگۅرتۉش Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip اتتاپ ۅتۉپ كەتۉۉ Skip All 全部跳过 Rename اتىن ۅزگۅرتۉش Please enter a new name 请输入文件名 OK ماقۇل MainProgressBar File operation 文件操作 starting ... باشتالۇۇ ... cancel all file operations باردىق ۅجۅت وپەراتسىيالار بەكەر جاسوو ،اتقارۇۇ Minimize كىچىرەيتۉۉ Close جابۇۇ Are you sure to cancel all file operations? سىز سۅزسۉز باردىق ۅجۅت ماشعۇلاتىنى ارعادان قالتىراسىبزبى؟ Are you sure want to cancel all file operations باردىق ۅجۅت ماشعۇلاتىنى ىراس ەلە ارعادان قالتىراسىبزبى OK ماقۇل File Operation ۅجۅت ماشقۇلدانۇۇ Cancel ارعادان قالتىرىش Calculating time ۇباقىت ەسەپتۅۅ continue جالعاشتىرىش pause ۇباقتىلۇۇ توقتوش canceling ... ارعادان قالدىرىلىپ جاتات ... sync ... شاي قادامدۇۇ ... %1Mb/s Est. time left: %2 %1Mb/s بوجومول قالعان ۇباقىت: %2 MessageDialog Peony پئون Forcibly pulling out the device may cause data loss or device exceptions! اسپاپتى زوردۇق مەنەن تارتىپ ۅندۉرۉش ساندۇۇ بايانداما جوعولۇپ كەتۉۉسۉ كۅرۉنۉشتۅرۉ اسپاپتىڭ مۇستەسنا بولۇشۇن كەلىترىپ ۅندۉرۉش ى مۉمكۉن! OtherButton Other queue 其它队列 Other Queue باشقا قاتار Peony::AdvanceSearchBar Key Words تۉيۉندۉۉ سۅزدۅر input key words... تۉيۉندۉۉ سۅزدۅردۉ كىرگىزۉۉ... Search Location ورۇن ىزدۅۅ choose search path... ىزدۅۅ جولۇن تانداڭ... browse كۅرۉۉ File Type ۅجۅت تۉرۉ Choose File Type ۅجۅت تىبىن تانداڭ Modify Time ۇباقتىن ۅزگۅرتۉش Choose Modify Time ۇباقتىن ۅزگۅرتۉشتۉ تانداش File Size ۅجۅت چوڭدۇعۇ Choose file size ۅجۅت چوڭدۇعۇن تانداڭ show hidden file جاشىرىن ۅجۅتۉن كۅرسۅتۉۉ go back قايت hidden advance search page جاشىرىن الدىن ىزدۅۅ بىتى file name ۅجۅت ناامى content مازمۇن search ىزدۅۅ start search ىزدەشتى باشتوو Select path جول تانداش Operate Tips ماشقۇلدانۇۇ ەسكەرتمەسى Have no key words or search location! تۉيۉندۉۉ سۅز كۅرۉنۉشتۅرۉ ىزدۅۅ وردۇ جوق! Search file name or content at least choose one! ۅجۅت ناامى كۅرۉنۉشتۅرۉ مازمۇنۇن ىزدەڭ، ەچ بولبوعوندو بىردى تانداڭ! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File ۅجۅت ىزدۅۅ Peony::AdvancedPermissionsPage Permission refinement settings ۇرۇقسات تاقتوو تەڭشەكتەرى Permission refinement settings tip ۇرۇقسات تاقتوو تەڭشەكتەرى ەسكەرتمەسى Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ۇقۇعۇنۇ تەڭشۅۅ ىشتەتۉۉچۉ توبۇنۇن نەگىزگى لىتسەنزىيالانعان. ۅزگۅرۉش بولوت . ACL ۇقۇعۇنۇ جالعاشتۇۇ تەڭشۅۅ كەرەكبى؟ User ىشتەتۉۉچۉ Read وقۇۇ Write جازۇ Executable اتقارماق جاساعالى بولوت delete ۅچۉر Inherit permission ماقۇلداما مىراستىق جاسوو ،اتقارۇۇ Add قوشۇۇ Apply ۅتۉنۉچ جاسوو ،اتقارۇۇ Cancel ارعادان قالتىرىش Peony::AllFileLaunchDialog Choose new application جاڭى پراگرامما تانداڭ Choose an Application to open this file بۇل ۅجۅتۉن اچۇۇ ۉچۉن پراگرامما تانداڭ apply now ازىر ۅتۉنۉچ جاسوو ،اتقارۇۇ OK ماقۇل Cancel ارعادان قالتىرىش Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon ۅزەركى مەنەن شارتتۇۇ بەلگىنى تانداڭ Type: تۉرۉ: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name ناامى Location وردۇ move 移动 symbolLink بەلگە ۇلانماسى Folder ۅجۅت قىپچىعىچ Include: ۅز ىچىنە الات: Move جۅتكۅۅ Open with: اچۇۇ : Description: سۉرۅتتۅ: Select multiple files تەكرار ، قايتالوو ۅجۅت تانداش Size: چوڭ-كىچىكتىگى : Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: بوشتۇق ىشتەتىش ارعاسى: Time Create: ۇباقىت جاراتۇۇ: Time Modified: ۅزگۅرتۉلگۅن ۇباقىت: Time Access: ۇباقىت زىيارات جاسوو ،اتقارۇۇ : Readonly وقۇعاندىعن كىيىن Hidden جاشىرىن Readonly (just applied by subfiles) جالاڭ عانا وقۇلۇۇ (جالاڭ عانا بۅلۉمچۅ ۅجۅتتۅر قولدونۇلعان ) Property: ەرەكچەلىك: usershare ىشتەتۉۉچۉ بۅلۉشۉۉ %1 (%2 Bytes) %1 (%2 بايت) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. چوڭدۇعۇ 1MBنان كىچىك سۉرۅتتۉ تانداڭ. Choose a new folder: Error قاتاالىق cannot move a folder to itself ! %1 Bytes %1 بايت %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 ۅجۅت، %2 ۅجۅت قىپچىعىچ Can't get remote file information ىرااقتاقى ۅجۅت ۇچۇرۇنا ەە بولعولۇ بولبودۇ %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU ناامى : CPU Core: CPU يادرو: Memory Size: ىچكى ساقتاعىچ چوڭدۇعۇ : User Name: ىشتەتۉۉچۉ اتى : Desktop: شىرە بەتى: You should mount this volume first سىز الدى مەنەن بۇل ئىمتىھاننى قاچالوو كەرەك Name: ناامى : File System 文件系统 Data ساندۇۇ بايانداما System Disk سەستىما دىسكاسى Total Space: بااردىعى بوشتۇق: Used Space: ىشتەتىلگەن بوشتۇق: In calculation... ەسەپتۅۅ بارىشندا... /root used: /root ىشتەتىلگەن: /home used: /home ىشتەتىلگەن: /usershare used: /ىشتەتۉۉچۉ ىشتەتىلگەن: /data/* used: /data/* ىشتەتىلگەن: Unknow (No permission) بىلمىگەن (ۇرۇقسات بەرىلبەگەن) Free Space: ىشتەتكەلى بولوتۇرعان بوشتۇق: Type: تۉرۉ: Kylin Burner Open with: اچۇۇ ارعاسى: Unknown بەلگىسىز Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server سان قاينارىنا ۇلوو Ip Port پورت Type تۉرۉ Personal Collection server: جەكەلىك جىيناق تەيلەمەسى: Add قوشۇۇ Delete ۅچۉرۉۉ Connect ۇلانۇۇ Ip input error, please re-enter! IP ىمپورتەردە قاتاالىق كۅرۉلدۉ، قايرا كىرگىزىڭ! Port input error, please re-enter! ووز كىرگىزۉۉدۅ قاتاالىق كۅرۉلدۉ، قايرا كىرگىزىڭ! add 添加 delete 连接 删除 connect 连接 Warning ەسكەرتۉۉ ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user تىزىمدەتىش ىشتەتۉۉچۉ Please enter the %1's user name and password of the server. %1 نىڭ ىشتەتۉۉچۉ ناامى جانا سان قاينارىنىن سىر سۅزدۉ كىرگىزىڭ. User's identity ىشتەتكۉۉچۉنۉن كۉبۅلۉگۉ Guest قونوق Name ناامى Password سىرسۅز domain تور ناامى Cancel ارعادان قالتىرىش OK ماقۇل guest 游客(匿名登录) Registered users تىزىمدەتكەن ىشتەتكۉۉچۉلۅر name 用户名 password 密码 Remember the password پارولدۇ ەسىڭىزدە تۇقتۇۇ cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop ئۈستەلئۈستىگە جالعانما قۇرۇۇ Create Link to... جالعانما قۇرۇۇ... Choose a Directory to Create Link جالعانما قۇرۇۇ ۉچۉن تىزىمدىك تانداڭ Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop ئۈستەلئۈستىگە جالعانما قۇرۇۇ Peony::CreateTemplateOperation File create error ۅجۅت قۇرۇۇ قاتالىعى Can not create %1: Read-only mode, can not write-in %1 نى قۇرۇۇعا بولبودۇ: جالاڭ عانا وقۇۇ ابالى جازىلبادى، جازعالى بولبودۇ NewFile جاڭى ۅجۅت Create file ۅجۅت قۇرۇۇ NewFolder جاڭى قاتتاعىچ Create file error ۅجۅت قاتالىعى قۇرۇۇ Peony::CustomErrorHandler Is Error Handled? قاتاالىق بىر تاراپ بۉتتۉبۉ؟ Error not be handled correctly قاتاالىق تۇۇرا بىر تاراپ قىلىنبادى Peony::DefaultAcitonWidget No default app الدىنالا تىركەمە جوق Peony::DefaultOpenWithWidget No default app الدىنالا تىركەمە جوق Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview الدىن كۅرمۅكچۉ بولعون ۅجۅتۉن تانداڭ Can not preview this file Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview الدىنالا الدىن كۅرۉۉ This is the Default Preview of peony-qt بۇل پئون-qt نىڭ الدىنالا الدىن كۅرۉۉ پىروگىرامماسى Peony::DetailsPropertiesPage Name: ناامى : File type: ۅجۅت تۉرۉ: Location: وردۇ: yyyy-MM-dd, HH:mm:ss yyyyجىلMMايddكۉن , ساات :مىنۇت:سىكونت Create time: ۇباقىت جازۇۇ: Modify time: ۇباقتىن ۅزگۅرتۉش : yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: ۅجۅت چوڭدۇعۇ : Width: گەڭدىگى : Height: جارىقتىق داراجاسى: Owner ەەسى Owner: ەەسى : Computer ەسەپتەگۉچ Computer: كومپىيۇتەر: %1 (this computer) %1 (بۇل كومپىيۇتەر) Unknown بەلگىسىز Can't get remote file information ىرااقتاقى ۅجۅت ۇچۇرۇنا ەە بولعولۇ بولبودۇ %1 px Peony::DirectoryView::IconView Icon View 图标视图 warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇ قولدوبويت. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇ قولدوبويت. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark تەع قوشۇۇ &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭى ۅجۅت قىپچىعىچ Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name ناامى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ New... 新建... Open in New Window جاڭى كۅزۅنۅكتۅ اچۇۇ Open in New Tab جاڭى ۋقلادقادا اچۇۇ Open اچۇۇ Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! تىزىمدىك اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇرۇقسات جوق! Open with... اچۇۇ مەنەن... More applications... داعى ەلە كۅپ تىركەمەلەر.... Open %1 selected files %1 لىق سۉرۅتتۉ اچۇۇ New جاڭى Empty File ۅجۅت كۅڭدۅي Folder ۅجۅت قىپچىعىچ View Type كۅرۉۉ تۉرۉ Sort By بويۇنچا تۉرگۅ بۆلۉش Modified Date 修改日期 Original Path العاچى جول Sort Order... 排序顺序... Ascending Order جوعورۇلو تارتىبى Mount توو MultiSelect Descending Order تۅمۅندۅش تارتىبى Sort Preferences... 排序偏好... Folder First ۅجۅت قىپچىعىچ Chinese First حانزۇ تىلى بىرىنچى Show Hidden جاشىرىن كۅرسۅتۉۉ Copy گۅچۉرۉش Cancel ارعادان قالتىرىش File:"%1" is not exist, did you moved or deleted it? ۅجۅت:"%1" باربولۇۇسۇ ەمەس ، جۅتكۅپ قويدىڭىزمۇ كۅرۉنۉشتۅرۉ ئۆچۈرۈۋەتتىڭىزمۇ؟ Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut قىيىش Delete to trash شىپىرىندى چەلەك تاشلىۋېتىش Paste چاپتوو Refresh جاڭىلوو Select All باردىعىن تانداڭ Properties قاسىيەتىن format فورمات Restore العاچىنا كەلتىرۉۉ Delete ۅچۉرۉۉ Time Modified Path جول Sort Order تۉرگۅ بۆلۉش تارتىبى Newest to oldest ەڭ جاڭى جانا ەڭ قادامى Oldest to newest ەڭ بايىرقى ەڭ جاڭى Files from large to small چوڭۇرااق. كىچىكگىچە ۅجۅتتۅر Files from small to large كىچىكدىن چوڭغىچە ۅجۅت Sort Preferences ىراستوولور قاتارلاش Error قاتاالىق File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever تۉبۅلۉك ۅچۉرۉۉ Rename اتىن ۅزگۅرتۉش Select &All 全选(&A) Reverse Select تەسكەرى تانداش P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash & شىپىرىندى ساندىعىن تازالوو Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All باردىعىن تازالوو Open Parent Folder in New Window جاڭى كۅزۅنۅكتۅ ەنە ۅجۅت قىپچىعىچتى اچۇۇ Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager كەڭەيتۉۉلۅر ادمئنىستراتور Available extensions ىشتەتكەلى بولوتۇرعان كەڭەيتۉۉلۅر Ok ماقۇل Cancel ارعادان قالتىرىش Peony::FMWindow File Manager ۅجۅت ادمئنىستراتور advanced search ىچكەلەي ، قۇنت قويۇپ ىزدۅۅ clear record جازما دارەك تازالوو Loaing... Press Esc to stop a loading. ئۆچمەنلىك... جۉكتۅۅ توقتوتۇۇ ۉچۉن Esc نى باسىڭ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. اپتور: ولان <lanyue @kylinos. cn> ح مەي <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2019-يىلىدىن 2020-يىلىغىچە، تيانتسزئن KYLIN ۇچۇر تەحنىكا چەكتۉۉ شەركەتى، چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo ارعادان قالتىرىش Redo قايرا جاسوو ،اتقارۇۇ Peony Qt ۅجۅت باشقارعۇۇچۇ Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder جاڭى ۅجۅت قىپچىعىچ Peony::FileBatchRenameOperation File Rename error ۅجۅت اتاعىن ۅزگۅرتۉش قاتالىعى Invalid file name %1%2%3 . ۅجۅت ناامى %1%2%3 ەسەپ ەمەس . File Rename warning ۅجۅت اتىن ۅزگۅرتۉش ەسكەرتىشى Are you sure to hidden these files? سىز سۅزسۉز بۇل ۅجۅتتۅرۉن جاشىرىپ قويوسۇزبۇ؟ Rename file error ۅجۅت اتاعىن ۅزگۅرتۉش قاتالىعى Peony::FileCopy Error in source or destination file path! كەلۉۉ جەر جانى كۅرۉنۉشتۅرۉ نىشان ۅجۅت جولۇندا قاتاالىق كۅرۉلدۉ! Error when copy file: %1, can not copy special files, skip this file and continue? ۅجۅت كۅرۉۉدۅ قاتاالىق كۅرۉلدۉ: %1، ۆزگۆچۆ ۅجۅتلەرنى كۅچۉرۉۉگۅ بولبويت ، بۇل ۅجۅتتىن اتتاپ جالعاشتىراسىزبى؟ Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 نى كۅچۉرۉۉگۅ بولبويت ، ۅجۅت باربولۇۇسۇ ەمەس . ۅجۅتنىڭ اتى ۅزگۅرتۉلدۉبۉ كۅرۉنۉشتۅرۉ جۅتكۅپ ەفىردەبى؟ The dest file "%1" has existed! dest ۅجۅتۉۉ «%1» باربولۇۇسۇ بولدۇ ! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32 ۅجۅت ساامالىعى 4GBنان ارتىق بوشتۇقتۇ ەەلەگەن بىر ەلە ۅجۅتنى قولدوبويت! Error writing to file: Input/output error ۅجۅتكۅ جازۇۇ قاتالىعى: كىرگىزۉۉ/ۅندۉرۉش قاتالىعى Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 قۇرۇۇ جەڭىلۉۉ بولدۇ . انىن جىلدىز تىزىمدىگىندە كۅرۉنۉشتۅرۉ جابدۇۇسۇنۇن gphoto2 كەلىشىمدى تۇۇرا قولدويتۇرغانىن ايقىنداڭ. Failed to create %1. %1 قۇرۇۇ جەڭىلۉۉ بولدۇ . Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! جابدۇۇسۇنۇن الىنىپ سالىندى. تەكشەرىپ باعىڭ! Write file error: There is no available disk space for device! ۅجۅت جازۇۇ قاتالىعى: جابدۇۇسۇنۇن دىسكا بوشتۇعۇ جوق! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure ۅجۅت اچىلىش جەڭىلۉۉ بولدۇ Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel ماشقۇلدانۇۇ بەكەر جاسوو ،اتقارۇۇ Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 ۅجۅت قىپچىعىچ %1 قۇرۇۇ جەڭىلۉۉ بولدۇ : %2 File copy error ۅجۅت گۅچۉرۉش قاتالىعى The file name exceeds the limit ۅجۅت ناامى چەكتەن اشىپ كەتتى Cannot opening file, permission denied! ۅجۅتۉن اچقالى بولبودۇ، ۇرۇقسات قاتار اتقارىلدى ! File:%1 was not found. ۅجۅت:%1 تابىلبادى . open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk سەستىما دىسكاسى File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in %1 نى %2 گە كۅچۉرۉۉگۅ بولبويت : جالاڭ عانا وقۇۇ ابالى، جازعالى بولبودۇ Can not copy %1 to %2: Permission denied %1 نى %2 گە كۅچۉرۉۉگۅ بولبويت : ۇرۇقسات قاتار اتقارىلدى Data ساندۇۇ بايانداما %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا بوشتۇق قالبادى. ۅجۅت گۅچۉرۉش چوڭدۇعۇ : %2GB, بوشتۇقى زارىل : %3GB. Link file error ۅجۅت ۇلوو قاتالىعى Burning does not support replacement كۉيگۉزۉۉ الماشتىرۇۇنۇ قولدوبويت Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error ۅجۅت ۅچۉرۉۉ قاتالىعى Delete file error ۅجۅت ۅچۉرۉۉ قاتالىعى Invalid Operation! Can not delete "%1". ەسەپ ەمەس ماشقۇلدانۇۇ ! «%1» نى ۅچۉرگۅلۉ بولبويت . Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled پارولدۇ دىيالوگ كەرەنەسى بەكەر اتقارىلدى Message recipient disconnected from message bus without replying! ۇچۇر تاپشىرىپ العۇۇچۇ جووپ قايتارباي تۇرۇپ ەلە ۇچۇر اپاراتى توسقوولدۇق. ۉزۉلدۉ! Error قاتاالىق Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data ساندۇۇ بايانداما folder ۅجۅت قىپچىعىچ file ۅجۅت text file تەكىست ۅجۅتۉۉ Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ەسكەرتۉۉ Error قاتاالىق Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتۉن ۅچۉرۅسۉزبۉ؟ Can not open path "%1",permission denied. «%1» جولدۇ اچقالى بولبودۇ،ۇرۇقسات قاتار اتقارىلدى . Can not find path "%1",are you moved or renamed it? «%1» جولدۇ تابالبادى، كۆچۈرۈلدىمۇ كۅرۉنۉشتۅرۉ ئۆزگەرتتىڭىزمۇ؟ Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) بالا ۅجۅت Symbol Link, بەلگە ۇلانماسى، System Disk سەستىما دىسكاسى File Name ۅجۅت ناامى Delete Date چىسلانى ۅچۉرۉۉ Create Date چىسلا قۇرۇۇ Time Modified File Size ۅجۅت چوڭدۇعۇ Original Path العاچى جول Path جول File %1 is existed in space, please not add file repeatly. Operation not supported ماشقۇلدانۇۇ قولدوبودۇ File Type ۅجۅت تۉرۉ Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label ۅجۅت ەنى ، تامعاسى قوشۇۇ Delete All Label باردىق ەندەردى ۅچۉرۉۉ Label Management ... بەلگە باشقارىش ... Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... بەلگە باشقارىش ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 نىڭ اچىلىش ۉلگۉسۉ unknown بەلگىسىز No application is set to open file "%1 %2" «%1 %2» ۅجۅتۉن اچۇۇ ۉچۉن ەچقانداي پراگرامما بەلگىلەنبەگەن Still using the last opened application: داعى ەلە ەڭ سوڭعۇ اچىلعان پراگرامما ىشتەتىپ جاتات: known مەلۇمۇم. Open application is used by default: اچىلعان پراگرامما جىمجىرتتىق ىشتەتىلەت: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. جۇمشاق تەتىك بوربورۇنان بۇل ۅجۅتۉن ئاچالايدىغان پراگراممانى ىزدەپ باقساڭىز كۅرۉنۉشتۅرۉ كومپىيوتەرىڭىزدە باربولۇۇسۇ بولعون پراگراممالاردى تانداساڭىز بولوت . Other application: باشقا قولدونۇشچان: Select application: پراگراممانى تانداڭ: Always open the %1%2 file with this application بۇل پراگرامما ارقىلۇۇ %1%2 ۅجۅتۉن باشتان ارقاسى اچىڭ Choose other application باشقا پراگراممالاردى تانداڭ Go to application center قولدونۇشچان بوربورۇنا جۅتكۅلۉۉ Ok ماقۇل Cancel ارعادان قالتىرىش Desktop files(*.desktop) ئۈستەلئۈستى ۅجۅتۉۉ(*.desktop) Select Open Action ماشقۇلدانۇۇ اچۇۇ تانداش Select تانداش Peony::FileLaunchAction Execute Directly تىكە بارۇۇ ، ۇدۇل بارۇۇ اتقارماق جاسوو ،اتقارۇۇ Execute in Terminal تەرمىنالدا اتقارماق جاسوو ،اتقارۇۇ Detected launching an executable file %1, you want? %1 اتقارماق ۅجۅتۉن قوزعوتۇۇ اچىلدىبى؟ Delete file Warning 删除文件警告 Open Failed اچۇۇ جەڭىلۉۉ بولدۇ Can not open %1, file not exist, is it deleted? %1نى اچقالى بولبودۇ، ۅجۅت باربولۇۇسۇ ەمەس ، ۅچۉرۉلگۅن؟ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ۇرۇقسات بەرىلبەيت File is not readable. Please check if file has read permisson. ۅجۅتۉن وقۇعالى بولبويت . ۅجۅتتۅ ۇرۇقسات البەتتە. تەكشەرىپ باعىڭ. By Default App الدىنالا تىركەمە Launch Options اتقارماق جاسوو ،اتقارۇۇ تاندالمالارى Open Link failed جالعانمانى اچۇۇ جەڭىلۉۉ بولدۇ File not exist, do you want to delete the link file? ۅجۅت باربولۇۇسۇ ەمەس ، جالعانما ۅجۅتۉن ۅچۉرۅسۉزبۉ؟ Can not open %1, Please confirm you have the right authority. %1 نى اچقالى بولبودۇ، ۇقۇعۇڭۇز تۇۇرا باردىعىن ايقىنداڭ. Open App failed تىركەمە اچۇۇ جەڭىلۉۉ بولدۇ The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? جالعانعان تىركەمە ۅزگۅرتۉلگۅن كۅرۉنۉشتۅرۉ ۅچۉرۉپ جىبەرىلگەن، وشوعو نورماال ىشتەي البايت. جالعانما ۅجۅتۉن ۅچۉرۅسۉزبۉ؟ Error قاتاالىق File original path not exist, are you deleted or moved it? ۅجۅتتۉن العاچى جولۇ باربولۇۇسۇ ەمەس ، ۅچۉرۉلگۅن كۅرۉنۉشتۅرۉ جۅتكۅپ قويدىڭىزمۇ؟ Can not get a default application for opening %1, do you want open it with text format? %1 نى اچۇۇ ۉچۉن الدىنالا پراگراممانى العالى بولبودۇ، تەكىست فورماتى مەنەن اچۇۇنى قالايسىزبى؟ Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link سىمۋولىكا جالعانما Link file error ۅجۅت ۇلوو قاتالىعى Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error ۅجۅت جۅتكۅۅ قاتالىعى File System 文件系统 Data ساندۇۇ بايانداما %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا بوشتۇق قالبادى. ۅجۅت گۅچۉرۉش چوڭدۇعۇ : %2GB, بوشتۇقى زارىل : %3GB. File move error ۅجۅت جۅتكۅۅ قاتالىعى Invalid move operation, cannot move a file into its sub directories. ەسەپ ەمەس جۅتكۅۅ ماشعۇلاتى ەسەپ ەمەس، ۅجۅتۉن بۅلۉمچۅ تىزىمدىك ىچىنە جۅتكۅگۅلۉۉ بولبويت . The file name exceeds the limit ۅجۅت ناامى چەكتەن اشىپ كەتتى Create file error ۅجۅت قاتالىعى قۇرۇۇ Can not move %1 to %2: Read-only mode, can not write-in %1 نى %2 گە جۅتكۅگۅلۉۉ بولبودۇ: جالاڭ عانا وقۇۇ ابالى، جازعالى بولبودۇ Can not move %1 to %2: Permission denied %1 نى %2 گە جۅتكۅلۉۉسۉنۅ بولبودۇ: ۇرۇقسات بەرىلبەدى Cannot opening file, permission denied! ۅجۅتۉن اچقالى بولبودۇ، ۇرۇقسات قاتار اتقارىلدى ! File:%1 was not found. ۅجۅت:%1 تابىلبادى . Invalid Operation. ەسەپ ەمەس ماشقۇلدانۇۇ System Disk سەستىما دىسكاسى open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error ۅجۅت ۅچۉرۉۉ قاتالىعى Link file error ۅجۅت ۇلوو قاتالىعى Burning does not support replacement كۉيگۉزۉۉ الماشتىرۇۇنۇ قولدوبويت Burn failed 刻录失败 File delete 文件删除 Invalid Operation ەسەپ ەمەس ماشقۇلدانۇۇ Peony::FileOperationAfterProgressPage &More Details &جۉرۉشتۅر Peony::FileOperationErrorDialog File Operation Error ۅجۅت ماشقۇلدانۇۇ قاتالىعى unkwon null كۅڭدۅي Error message: قاتاالىق ۇچۇرۇ : Source File: كەلۉۉ جەر جانى ۅجۅتۉۉ: Dest File: Dest ۅجۅتۉۉ: Ignore پەرۋا جاساماق Ignore All باردىعىن نازاردان ساق جاسوو ،اتقارۇۇ Overwrite ۉستۉنۅن ساقتوو Overwrite All باردىعىن الماشتىرۇۇ Backup دايار ، دايىن ساقتوو Backup All باردىعىن زاپاستوو &Retry &قايرا سىناپ باعىڭ &Cancel ارعادان قالتىرىش (&C) Peony::FileOperationErrorDialogBase Close جابۇۇ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace الماشتىرۇۇ Ignore پەرۋا جاساماق Do the same وشوندوي قىلىڭ <p>This location already contains the file '%1', Do you want to override it?</p> <p>بۇل ورۇندا '%1' ۅجۅتۉن ۅز ىچىنە العان، انى ئۆچۈرۈۋەتمەكچىمۇ؟</p> Unexpected error from %1 to %2 %1 نان %2 گىچە كۉتۉلبۅگۅن قاتاالىق كۅرۉلدۉ Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup دايار ، دايىن ساقتوو Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel ارعادان قالتىرىش Delete ۅچۉرۉۉ Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected نۇر تاقتاسىنىن تولۇق كۅرۉنۉشتۅرۉ جازىشتان قورعونۇۇ ەمەستىگىن ، ۅجۅتتۉن قورعولوتۇرعان ەمەستىگىن ايقىندوو Peony::FileOperationErrorDialogWarning OK ماقۇل Cancel ارعادان قالتىرىش Skip all باردىعىن اتتاپ ۅتۉپ كەتۉۉ Make sure the disk is not full or write protected and that the file is not protected نۇر تاقتاسىنىن تولۇق كۅرۉنۉشتۅرۉ جازىشتان قورعونۇۇ ەمەستىگىن ، ۅجۅتتۉن قورعولوتۇرعان ەمەستىگىن ايقىندوو Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link سىمۋولىكا جالعانما Copy گۅچۉرۉش Move جۅتكۅۅ Rename اتىن ۅزگۅرتۉش Link جالعانما Delete ۅچۉرۉۉ Delete Permanently تۉبۅلۉك ۅچۉرۉۉ Restore العاچىنا كەلتىرۉۉ New جاڭى - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ەسكەرتۉۉ '%1' is occupied,you cannot operate! %1 نى وققۇپاتسىيالانعان.، سوودا قىلا البايسىز! No, go to settings 否,跳转到设置 OK ماقۇل Cancel ارعادان قالتىرىش Do you want to put selected %1 item(s) into trash? %1 تاندالعان تۉردۉ شىپىرىندى ساندىققا تاشلىماقچىمۇ؟ Do not show again ەمى كۅرسۅتبۅڭ File System 文件系统 System Disk سەستىما دىسكاسى Data ساندۇۇ بايانداما Insufficient storage space ساقتوو بوشتۇعۇ جەتەرلۉۉ ەمەس %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 شايماندا بوشتۇق قالبادى. ۅجۅت گۅچۉرۉش چوڭدۇعۇ : %2GB, بوشتۇقى زارىل : %3GB. Can't delete. ۅچۉرگۅلۉ بولبودۇ . You can't delete a file whenthe file is doing another operation ۅجۅت باشقا ماشقۇلدانۇۇ قىلىپ جاتقاندا ۅجۅتنى ۅچۉرۅ البايسىز File Operation is Busy ۅجۅت ماشعۇلاتى الدىراش There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. الدىدا ، مۇردا ، بىر كۅرۉنۉشتۅرۉ بىر نەچچە ۅجۅت ماشعۇلاتى اتقارماق قىلىنىپ باققان. سىزدىن ماشعۇلاتىڭىز اتقارماق قىلۇۇنۇنۇ ساقتايت كۉچۅ بۉتۉرۉلۅت. ەگەر ەمنەگەدىر. بولبوسۇن ۅجۅت ماشعۇلاتىنى پارالەل اتقارماق قىلماقچى بولسوڭۇز، تانداش تىزىمدەگىندەكى الدىنالا «پارالەل ۇرۇقسات بەرۉۉ» نى ۅزگۅرتسۅڭۉز بولوت . The long name file is saved to %1 ۇزۇن ات ۅجۅتۉۉ %1 گە ساقتالدى Undo %1 %1 نى العاچىنا كەلتىرۉۉ Redo %1 %1 نى قايرا ىشتۅۅ The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ساناق : state: دئاسپورا: Peony::FileOperationProgressPage &More Details &جۉرۉشتۅر From: نان: To: عا: Peony::FileOperationProgressWizard File Manager ۅجۅت ادمئنىستراتور &Cancel ارعادان قالتىرىش (&C) Preparing... داياردىق قىلىۋاتىمىز... Handling... بىر تاراپ جاسوو ،اتقارۇۇ ... Clearing... تازالاپ جاتات... Rollbacking... ارتىنا جاندىرۇۇ... File Operation ۅجۅت ماشقۇلدانۇۇ A file operation is running backend... ۅجۅت ماشعۇلاتى ارقا ۉچ اتقارماق قىلىنىپ جاتات... %1 files, %2 %1 ۅجۅت، %2 %1 done, %2 total, %3 of %4. %1 تۉگۅدۉ، %2 باردىعى، %3 %4. clearing: %1, %2 of %3 تازالوو: %1, %2 %3 copying... گۅچۉرۉش ... Syncing... شاي سئنحروندوشتۇرۇۇ... Peony::FilePreviewPage File Name: 文件名称: File Type: ۅجۅت تۉرۉ: Time Access: ۇباقىت زىيارات جاسوو ،اتقارۇۇ : Time Modified: ۅزگۅرتۉلگۅن ۇباقىت: Children Count: بالدار سانى : Size: چوڭ-كىچىكتىگى : Location: وردۇ: Time Created: قۇرۇلعان ۇباقىت: Image resolution: سۉرۅت انىقتىعى: color model: تۉس نۇسقا ، قالپ: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel ارعادان قالتىرىش OK ماقۇل <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again ەمى سۇراباڭ usershare ىشتەتۉۉچۉ بۅلۉشۉۉ Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1 total, %2 hidden %1 باردىعى، %2 جاشىرىن Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error ۅجۅت اتاعىن ۅزگۅرتۉش قاتالىعى Invalid file name %1%2%3 . ۅجۅت ناامى %1%2%3 ەسەپ ەمەس . Are you sure to hidden this file? سىز سۅزسۉز بۇل ۅجۅتۉن جاشىرىپ قويوسۇزبۇ؟ When change the file suffix, the file may be invalid. Are you sure to change it ? ۅجۅت قوشۇمچاسى ۅزگۅرتكۅندۅ، ۅجۅت ەسەپ ەمەس بولۇۇسۇ مۉمكۉن. سىز سۅزسۉز الماشتىراسىزبى ؟ A file and a directory with the same name cannot replace each other وقشوش ناامداقى ۅجۅت مەنەن تىزىمدىك بىر -بىر ىنىڭ وردۇن الا البايت The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning ۅجۅت اتىن ۅزگۅرتۉش ەسكەرتىشى The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error ۅجۅت اتاعىن ۅزگۅرتۉش قاتالىعى Peony::FileTrashOperation File trash error ۅجۅت شىپىرىندى قاتالىعى Can not trash %1: Read-only file system %1 نى شىپىرىندى جاسووعو بولبويت : جالاڭ عانا وقۇعالى بولوتۇرعان ۅجۅت ساامالىعى trash:/// شىپىرىندى :/// Trash file error شىپىرىندى ساندىعى قاتالىعى Invalid Operation! Can not trash "%1". ەسەپ ەمەس ماشقۇلدانۇۇ ! «%1» نى شىپىرىندى جاسووعو بولبويت . Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. تىزگىندۅۅ جاساعالى بولبويتۇرعان توقۇنۇسۇ باربولۇۇسۇ . جىيناش ساندىعىن تەكشەرىپ باعىڭ. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error ۅجۅت شىپىرىندى قاتالىعىن بەكەر جاسوو ،اتقارۇۇ Can not find trashed file %1, might be restored or removed. %1 شىپىرىندى اتقارىلعان ۅجۅتۉن تاپقالى بولبودۇ، العاچىنا كەلتىرىلگەن كۅرۉنۉشتۅرۉ ۅچۉرۉپ جىبەرىلگەن بولۇۇسۇ مۉمكۉن. Peony::GlobalSettings yyyy/MM/dd جىل/اي/كۉن HH:mm:ss AP hh:mm:ss yyyy-MM-dd جىل-اي-كۉن Peony::HeaderBar Spread بۅلۉنۉش Minimize كىچىرەيتۉۉ Close جابۇۇ Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK ماقۇل Cancel ارعادان قالتىرىش Rename Space Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open اچۇۇ Open With مەنەن اچۇۇ More applications Open The Folder Location Add File قوشۇۇ Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again ەمى سۇراباڭ Copy گۅچۉرۉش Save As ساقتوو file ۅجۅت All File باردىق ۅجۅت This location has no write permission.please change the storage location Label بەلگە Properties قاسىيەتىن Peony::ImageMountManager Invalid device path: %1 ەسەپ ەمەس شايمان جولۇ: %1 Cannot find loop device for path: %1 جولۇنۇن ايلانىم ، كەزەك جابدۇۇسۇن تاپقالى بولبودۇ: %1 Failed to unmount filesystem: %1 ۅجۅت سەستىمانى اچقالى جەڭىلۉۉ بولدۇ : %1 Failed to delete loop device: %1 ايلانىم ، كەزەك اسپاپتى ۅچۉرۉۉ جەڭىلۉۉ بولدۇ : %1 Peony::LabelSettings Name ناامى SideBar يانبالداق Menu تىزىمدىك Create New Label جاڭى بەلگە قۇرۇۇ Delete Label بەلگىنى ۅچۉرۉۉ Display the following items in the identification area: (maximum of 6) ايىرمالاندىرىش رايونۇندا تۅمۅندۅكۉ تۉرلۅردۉ كۅرسۅتۉۉ : (ەڭ كۅپ بولعوندو 6) Rename اتىن ۅزگۅرتۉش Edit Color تۉس تۅپتۅش Delete This Label بۇل بەلگىنى ۅچۉرۉۉ Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" «%2» نان «%1» نى ىزدۅۅ File System ۅجۅت ساامالىعى Search results for all files marked in "%1" in "%2" «%2» داعى «%1» دا بەلگە قويۇلعان باردىق ۅجۅتتۅردۉن ىزدۅۅ ناتىيجاسى &Copy Directory 拷贝路径(&C) Open In New Tab جاڭى ۋقلادقادا اچۇۇ Open In New Window جاڭى كۅزۅنۅكتۅ اچۇۇ Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory تىزىمدىك گۅچۉرۉش Peony::MountOperation Operation Cancelled ماشقۇلدانۇۇ ارعادان قالتىرىلدى. Login failed, unknown username or password error, please re-enter! تىزىمدەتىش جەڭىلۉۉ بولدۇ ، ىشتەتۉۉچۉ ناامى كۅرۉنۉشتۅرۉ پارولدالار قاتاالىق كۅرۉلبۅدۉ، قايرا كىرگىزىڭ! Peony::NavigationToolBar Go Back قايت Go Forward العا ىلگەرلۅۅ History تارىق Clear History تارىحى تازالوو Cd Up Cd نان جوعورۇ Refresh جاڭىلوو Peony::NewFileLaunchDialog Choose new application جاڭى پراگرامما تانداڭ Choose an Application to open this file بۇل ۅجۅتۉن اچۇۇ ۉچۉن پراگرامما تانداڭ apply now ازىر ۅتۉنۉچ جاسوو ،اتقارۇۇ OK ماقۇل Cancel ارعادان قالتىرىش Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? سىز «%1%2» ۅجۅتۉن قانداي اچماقچى؟ Default open with: الدىنالا اچىلىش ۇباقتى: Other: باشقا: Choose other application باشقا پراگراممالاردى تانداڭ Go to application center قولدونۇشچان بوربورۇنا جۅتكۅلۉۉ Peony::PathEdit Go To بار Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 نىشان: %1 Read and Write وقۇۇ جانا جازۇۇ Readonly وقۇعاندىعن كىيىن Group or User توپ كۅرۉنۉشتۅرۉ ىشتەتۉۉچۉ (Current User) (گەزەكتەكى ىشتەتۉۉچۉ) Current User گەزەكتەكى ىشتەتۉۉچۉ Permissions modify tip ۇرۇقسات ۅزگۅرتۉش ەسكەرتمەسى The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? گەزەكتەكى ۅجۅت كۅرۉنۉشتۅرۉ ۅجۅت قىسقچتا ACL ۇقۇعۇ بەلگىلەنگەن. ىشتەتۉۉچۉ توبۇنۇن ۇقۇعۇنى ۅزگۅرتۉش ACL دا بەلگىلەنگەن ۇرۇقساتتار ىشتەتكەلى بولبويتۇرعان بولۇپ قىلۇۇسۇ مۉمكۉن. ىشتەتۉۉچۉلەر توبۇنۇن ۇرۇقسات جالعاشتۇۇ ۅزگۅرتۉش نى قالايسىزبى؟ Permission refinement settings ۇرۇقسات تاقتوو تەڭشەكتەرى The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? گەزەكتەكى كەرەكتۅۅچۉ وزوت بۅلۉشۉۉ بەلگىلەدى. ەگەر داعى ەلە ۇقۇقتۇ ۅزگـۅرتۉۉگـۅ تۇۇرا كەلسە، الدىن بۅلۉشۉۉ باربولۇۇسۇ بولبوستۇعۇ مۉمكۉن. سىز جالعاشتۇۇ تەڭشەشتى قالايسىزبى ؟ Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ۇرۇقسات ۇچۇرۇنا ەە بولعولۇ بولبودۇ. (Me) (我) Others باشقالار Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. سىز بۇل ۅجۅتتۉن زىيارات جاسوو ،اتقارۇۇ وردۇن ۅزگۅرتۅ البايسىز. Me User 用户 Peony::PropertiesSetDialog Confirming property settings قاسىيەت تەڭشەكتەرىن تۇراقتاندىرىپ جاتات Whether to apply to the current selected option or to selected options and subfolders and subfiles. گەزەكتە تاندالعان تاندالمالارعا ناقىل كەلتىرۉۉ كەرەكبى كۅرۉنۉشتۅرۉ تاندالعان تاندالباعاندار جانا بۅلۉمچۅ ۅجۅتتۅرۉنۅ قولدونمو كەرەكبى Apply the current selection گەزەكتەكى تانداشتى قولدونۇش Apply the current selection as well as subfolders and subfiles گەزەكتەكى تانداش جانا بۅلۉمچۅ ۅجۅت قلىپتەر جانا بۅلۉمچۅ ۅجۅتلەرنى قولدونۇش Ok ماقۇل Cancel ارعادان قالتىرىش Peony::PropertiesWindow Trash شىپىرىندى ساندىعى Recent جاقىندا Selected تاندالعان %1 Files %1 ۅجۅت usershare ىشتەتۉۉچۉ بۅلۉشۉۉ Data ساندۇۇ بايانداما System Disk سەستىما دىسكاسى Properties قاسىيەتىن Ok ماقۇل Cancel ارعادان قالتىرىش Restore العاچىنا كەلتىرۉۉ Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. ۅچۉرۉۉ بارىشندا بەكىتۉۉ دىيالوگۇن كۅرسۅتۉۉ . Origin Path: العاچى تۉيۉن جولۇ: Deletion Date: ۅچۉرۉلگەن ۇباقىت: Size: چوڭ كىچىكتىگى : Original Location: العاچى وردۇ: Peony::SearchBar Input the search key of files you would like to find. سىز تاپماقچى بولعون ۅجۅتتۅردۉن ىزدۅۅ كۇنۇپكاسىن كىرگىزىڭ. Input search key... ىزدۅۅ كونۇپكاسى كىرگىزىلدى... advance search الدىن ىزدۅۅ clear record جازما دارەك تازالوو Peony::SearchBarContainer Choose File Type 选择文件类型 Search File ۅجۅت ىزدۅۅ Clear تازالوو all باردىعى file folder ۅجۅت قىپچىعىچ image سۉرۅت video ايىپ text file تەكىست ۅجۅتۉۉ audio دوبۇش others باشقالار wps file WPS ۅجۅتۉۉ Peony::SharedFileLinkOperation Symbolic Link سىمۋولىكا جالعانما The dest file "%1" has existed! dest ۅجۅتۉۉ «%1» باربولۇۇسۇ بولدۇ ! Link file error ۅجۅت ۇلوو قاتالىعى Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Trash شىپىرىندى ساندىعى Recent جاقىندا Quick Access تەز زىيارات جاسوو ،اتقارۇۇ Quick access 快速访问 Favorite 快速访问 KmreData Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data ساندۇۇ بايانداما Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties قاسىيەتىن Delete Symbolic سىمۋولىكا ۅچۉرۉۉ Unmount ئچىپ جىبەرۉۉ Eject ۅندۉرۉش Format فورمات burndata ۅرتتۅلگۅن ساندۇۇ بايانداما &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network تور Peony::SideBarPersonalItem Personal ۅجۅت باشقارعۇۇچۇ ۇقتۇرۇشتۇ Peony::SideBarSeparatorItem (No Sub Directory) (بۅلۉمچۅ تىزىمدىك) Peony::StatusBar ; %1 folders ; %1 ۅجۅت قلىپتەر ; %1 files, %2 total ; %1 ۅجۅت، باردىعى %2 ; %1 folder ; %1 ۅجۅت قىپچىعىچ ; %1 file, %2 ; %1 ۅجۅت، %2 %1 selected %1 تاندالدى Peony::SyncThread notify 温馨提示 温馨提示 Notify ۇقتۇرۇۇ Peony::TagManagement General 通用 Mark بەلگە Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type تۉرگۅ بۆلۉش تۉرۉ File Name ۅجۅت ناامى File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ Modified Date ۅزگۅرتۉلگۅن ۇباقتى Open in New window جاڭى كۅزۅنۅكتۅ اچۇۇ Open in new Tab جاڭى ۋقلادقادا اچۇۇ Ascending جوعورۇلو تارتىبى Descending تۅمۅندۅش Copy گۅچۉرۉش Paste چاپتوو Cut قىيىش Trash شىپىرىندى ساندىعى Clean Trash شىپىرىندى ساندىعىن تازالوو Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore العاچىنا كەلتىرۉۉ Options تاندوو ەلە Forbid Thumbnail كىچىك كۅرۉنۉشۉن چەكتۅۅ Show Hidden جاشىرىن كۅرسۅتۉۉ Resident in Backend Backend دا وتۇرۇقتاشقان Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ەڭ سوڭعۇ كۅزۅنۅكتۉ جااپ بولعوندون كىيىن سەستىما داعى ەلە اتقارماق جاسالات. بۇنداي بولعوندو كىيىنكى ىرەت جارنااما جاسوو ،اتقارۇۇ ۇباقتى قىسقارتىلعان.، وشوندوي ەلە ارقا كۅرۉنۉشتۅگۉ بايلىقتاردى كەرەكتەيت.. &Help جەرلىك بەرۉۉ &About... تۇراسىندا(&A). Peony Qt ۅجۅت باشقارعۇۇچۇ Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. اپتورۇ: ولان <lanyue @kylinos. cn> ح مەي <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2019-جلدىق تيانتسزئن KYLIN ۇچۇر تەحنىكا چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow بەلگىسىز Type: تۉرۉ: Duration: مۅنۅتۉ: Size: چوڭ كىچىكتىگى : Loading... جۉكتۅلۉپ جاتات... Res: Mod Date: ابالى ۇباقتى: Deleted date: Original path: Peony::UserShareInfoManager Warning ەسكەرتۉۉ Peony::VolumeManager Error قاتاالىق ProgressBar starting ... باشتالۇۇ ... canceling ... ارعادان قالدىرىلىپ جاتات ... sync ... شاي قادامدۇۇ ... continue جالعاشتىرىش pause ۇباقتىلۇۇ توقتوش close جابۇۇ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View شارتتۇۇ بەلگىنى كۅرۉۉ Show the folder children as icons. ۅجۅت قىسقىچتاقى بالدار. شارتتۇۇ بەلگى كەبەتەسىندە كۅرسۅتۉۉ . List View تىزىمدىك گۅرۉنۉشۉ Show the folder children as rows in a list. ۅجۅت قىسقىچتاقى بالدار. تىزىمدىكتەگى قۇر كەبەتەسىندە كۅرسۅتۉۉ . Basic Preview Page 基本 Basic نەگىزگى Show the basic file properties, and allow you to modify the access and name. نەگىزگى ۅجۅت ەرەكچەلىگىن كۅرسۅتۉۉ جانا زىيارات جاسوو ،اتقارۇۇ جانا اتىن ۅزگۅرتۉۉڭۉزگۅ ۇرۇقسات قىلىڭ. Permissions Page 权限 Permissions ۇرۇقسات Show and modify file's permission, owner and group. ۅجۅت ۇقۇعۇ، ەەسى جانا توبۇن كۅرسۅتۉۉ جانا ۅزگۅرتۉش . Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? ۅجۅت ۅتۅ چوڭ ەكەن ، جىيناش ساندىققا جۅتكۅگۅ بولبويت . سىز انى تۉبۅلۉك ۅچۉرۅسۉزبۉ؟ These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? بۇلل ۅجۅتتۅر ۅتۅ چوڭ ەكەن ، جىيناش ساندىققا جۅتكۅگۅ بولبويت . سىز بۇلل %1 ۅجۅتتۅرۉن تۉبۅلۉك ئۆچۈرۈۋەتمەكچىمۇ؟ Delete ۅچۉرۉۉ Clean the Trash شىپىرىندى ساندىعىن تازالوو OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. سىز جىيناش ساندىعىن بوش، ۅجۅتتۅرۉن تۉبۅلۉك ۅچۉرۅسۉزبۉ؟ باشتالعاندان كىيىن، الاردى العاچىنا گەلتىرىشكە ايلاسىز قالدى. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties كومپىيۇتەر قاسىيەتتەرى Show the computer properties or items in computer. كومپىيۇتەردەگى كومپىيۇتەر ۅزگۅچۅلۉكتۅر كۅرۉنۉشتۅرۉ مۉچۅلۅرۉن كۅرسۅتۉۉ . Trash and Recent Properties Page 最近/回收 Trash and Recent شىپىرىندى ساندىعى جانا جاقىندا Show the file properties or items in trash or recent. ۅجۅت قاسىيەتىن كۅرۉنۉشتۅرۉ مۉچۅلۅرۉن شىپىرىندى ساندىقتا كۅرۉنۉشتۅرۉ جاقىندا مازمۇن كۅرسۅتۉۉ . eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed فورماتى جەڭىلۉۉ بولدۇ YES وبا Formatting successful! But failed to set the device name. فورماتتاش جەڭىشتۉۉ بولدۇ ! بىروق شايمان اتاعىن بەلگىلۅۅ جەڭىلۉۉ بولدۇ . qmesg_notify ۇقتۇرۇۇ Format فورمات Begin Format باشتالۇۇ فورماتى Close جابۇۇ Format operation has been finished successfully. فورمات ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! كەچىرۉۉ، فورمات ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل كۅلۅمۉ باردىق ساندۇۇ باياندامالاردى فورماتتاش ارقىلۇۇ ۅچۉرۉلەت . فورمات بۇلرۇن ساقتالعان باردىق ساندۇۇ باياندامالاردى زاپاسلاپ قويۇڭ. سىزدىن داۋاملاشتۇرغۇڭىز باربى ؟ format فورمات begin format 开始 close 关闭 File Manager ۅجۅت ادمئنىستراتور Notify ۇقتۇرۇۇ notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed زوردۇق مەنەن اچۇۇ جەڭىلۉۉ بولدۇ Error: %1 قاتاالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندۇۇ بايانداما شاي قادامدۇۇ بۉتۉردۉ دىققات،شايمان جەڭىشتۉۉ اچىق.! Unmount failed تۉشۉرۉدۅن جەڭىلۉۉ بولدۇ Not authorized to perform operation. ماشقۇلدانۇۇ جاسووعو ۇقۇق بەرىلبەگەن. Unable to unmount it, you may need to close some programs, such as: GParted etc. انى ۅچۉرگۅلۉ بولبوعوندۇقتان، گەەبىر پراگراممالاردى تاقووعو تۇۇرا گەلەت ، مىسالى: GParted قاتارلۇۇلار. Error: %1 Do you want to unmount forcely? قاتاالىق : %1 زوردۇق مەنەن چۈشۈرمەكچىمۇ؟ Cancel ارعادان قالتىرىش Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase اسپاپتى قوزعوتۇۇ جەڭىلۉۉ بولدۇ : قاتاا جاشىرۇۇن سۅز The device has been mount successfully! شايمان جەڭىشتۉۉ قاچالاندى! Eject device failed, the reason may be that the device has been removed, etc. ۅندۉرۉش جابدۇۇسۇ كەشەلە كۅرۉلدۉ، سەبەبى جابدۇۇسۇنۇن الىنىپ سالىندى. بولۇۇسۇ مۉمكۉن. Data synchronization is complete and the device can be safely unplugged! ساندۇۇ بايانداما شاي قادامدۇۇ بۉتۉردۉ دىققات، اسپاپتى قووپسۇز ۉزۉپ جىبەرگەلى بولوت ! Password is empty, please re-enter! جاشىرۇۇن نومۇر كۅڭدۅي، قايرا كىرگىزىڭ! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed ۅندۉرۉش جەڭىلۉۉ بولدۇ favorite جاقشى كۅرۅتۇرعان Favorites جاقشى كۉبۅلۅر. File is not existed. ۅجۅت باربولۇۇسۇ ەمەس . Share Data ساندۇۇ ماالىماتتار بۅلۉشۉۉ Trash شىپىرىندى ساندىعى Recent جاقىندا Operation not supported ماشقۇلدانۇۇ قولدوبودۇ The virtual file system does not support folder creation جورۇما ۅجۅت ساامالىعى ۅجۅت قىپچىعىچ قۇرۇشتۇ قولدوبويت Can not create a symbolic file for vfs location vfs وردۇ ۉچۉن بەلگە ۅجۅتۉۉ قۇرۇۇعا بولبودۇ Symbolic Link سىمۋولىكا جالعانما Can not create symbolic file here, %1 بۇل جەردە بەلگە ۅجۅتۉۉ قۇرۇۇعا بولبودۇ، %1 Can not add a file to favorite directory. جاقشى كۅرۅتۇرعان قاتالوع ۅجۅت قوشقولۇ بولبويت . The virtual file system cannot be opened جورۇما ۅجۅت سەستىمانى اچقالى بولبودۇ Virtual file directories do not support move and copy operations جورۇما ۅجۅت مازمۇۇنۇ گۅچۉرۉش جانا گۅچۉرۉش ماشعۇلاتىنى قولدوبويت Default favorite vfs of peony پئون ويۇنداقى ەڭ جاقشى كۅرۅتۇرعان vfs Details جۅن جايى Mark بەلگە mark this file. بۇل ۅجۅتكۅ بەلگە سالىڭ. Open With مەنەن اچۇۇ open with. اچۇۇ مەنەن . It need to synchronize before operating the device,place wait! اسپاپتى ماشقۇلدانۇۇ قاسوودون ،اتقارۇۇدان مۇرۇن شاي قادامدۇۇ بولۇۇسۇ كەرەك، ساقتاپ تۇرۇڭ! Unable to discover the file, it may have been removed or deleted. ۅجۅتۉن بايقىيالمىسىڭىز، ۅچۉرۉپ جىبەرىلگەن كۅرۉنۉشتۅرۉ ۅچۉرۉلگەن بولۇۇسۇ مۉمكۉن. permission denied ۇرۇقسات قاتار اتقارىلدى file not found 没有发现该文件 duplicate قايتالوو Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data ساندۇۇ بايانداما System Disk سەستىما دىسكاسى label بەلگە Computer ەسەپتەگۉچ File System 文件系统 Data ساندۇۇ بايانداما Failed to open file "%1": insufficient permissions. «%1» ۅجۅتۉن اچۇۇ جەڭىلۉۉ بولدۇ : ۇرۇقسات جەتەرلۉۉ ەمەس . File “%1” does not exist. Please check whether the file has been deleted. ۅجۅت "%1" باربولۇۇسۇ ەمەس . ۅجۅتنىڭ ۅچۉرۉلگەن -ۅچۉرۉلبۅگۅندۉگۉن تەكشەرىپ باعىڭ. burn operation has been cancelled كۉيگۉزۉۉ ماشعۇلاتى ارعادان قالتىرىلدى. is busy! ەرەكچە الدىراش! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. سىز ىراس ەلە بۇل ۅجۅتۉن تۉبۅلۉك ۅچۉرمۅكچۉبۉ؟ ۅچۉرۉۉ باشتالعان امان، ۅجۅتۉن العاچىنا كەلتىرگەلى بولبويت . Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. سىز ىراس ەلە بۇلل %1 ۅجۅتتۅرۉن تۉبۅلۉك ۅچۉرمۅكچۉبۉ؟ ۅچۉرۉۉ باشتالعاندان كىيىن، بۇلل ۅجۅتتۅرۉن العاچىنا كەلتىرگەلى بولبويت . Virtual file directories do not support move operations جورۇما ۅجۅت مازمۇۇنۇ جۅتكۅۅ ماشعۇلاتىنى قولدوبويت test simplify vfs plugin VFS پلاگىن جۅنۅكۅيلۅتۉۉ. سىناق جاسوو ،اتقارۇۇ Default custom vfs info of peony پئون الدىنالا ۅزەركى مەنەن vfs ۇچۇرۇ Default local vfs info of peony پئون الدىنالا جەردىك vfs ۇچۇرۇ Show properties plugin window. قاسىيەت قىستىرما كۅزۅنۅگۉن كۅرسۅتۉۉ . Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel ارعادان قالتىرىش Ok ماقۇل Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData Disc Type: دىسكا تۉرۉ: Device Name: شايمان اتى : OK ماقۇل Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ No burn data, please add! كۉيگۉزۉۉ ساندۇۇ بايانداماسى جوق، قوشۇڭ! The disc name cannot be set to empty, please re-enter it! دىسكا اتاعىن بوش ،بەكەر جاساپ قوشۇشقا بولبويت ، قايرا كىرگىزىڭ! AppendBurnData operation has been finished successfully. AppendBurnData ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the appendBurnData operation is failed! كەچىرۉۉ، appendBurnData ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جەڭىلۉۉ بولدۇ Burning. Do not close this window كۉيگۉزۉۉ كەتىپ جاتات. بۇل كۅزۅنۅكتۉ يېپىۋەتمەڭ Burning this disc will append datas on it. Do you want to continue ? بۇل دىسكاسىن كۆيدۈرگەندە اعا ساندۇۇ بايانداما قوشۇپ قويۇلات . سىزدىن داۋاملاشتۇرغۇڭىز باربى ؟ Burn كۉيگۉزۉۉ Begin Burning كۉيگۉزۉۉ باشتوو Close جابۇۇ UdfBurn::UdfFormatDialog Format فورمات Disc Type: دىسكا تۉرۉ: Device Name: شايمان اتى : OK ماقۇل Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ The disc name cannot be set to empty, please re-enter it! دىسكا اتاعىن بوش ،بەكەر جاساپ قوشۇشقا بولبويت ، قايرا كىرگىزىڭ! Format operation has been finished successfully. فورمات ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the format operation is failed! كەچىرۉۉ، فورمات ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جەڭىلۉۉ بولدۇ Formatting. Do not close this window فورمات. بۇل كۅزۅنۅكتۉ يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل دىسكاسىن فورماتتوو انداعى باردىق ساندۇۇ باياندامالار ۅچۉرۉلەت . فورمات بۇلرۇن ساقتالعان باردىق ساندۇۇ باياندامالار نى زاپاسلاپ قويۇڭ. سىزدىن داۋاملاشتۇرغۇڭىز باربى ؟ Begin Format باشتالۇۇ فورماتى Close جابۇۇ UdfFormatDialog Format فورمات Disc Type: دىسكا تۉرۉ: Device Name: شايمان اتى : OK ماقۇل Cancel ارعادان قالتىرىش Unknown بەلگىسىز Warning ەسكەرتۉۉ The disc name cannot be set to empty, please re-enter it! دىسكا اتاعىن بوش ،بەكەر جاساپ قوشۇشقا بولبويت ، قايرا كىرگىزىڭ! Format operation has been finished successfully. فورمات ماشعۇلاتى جەڭىشتۉۉ بۉتۉردۉ دىققات. Sorry, the format operation is failed! كەچىرۉۉ، فورمات ماشعۇلاتى جەڭىلۉۉ بولدۇ ! Failed جەڭىلۉۉ بولدۇ Formatting. Do not close this window فورمات. بۇل كۅزۅنۅكتۉ يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? بۇل دىسكاسىن فورماتتوو انداعى باردىق ساندۇۇ باياندامالار ۅچۉرۉلەت . فورمات بۇلرۇن ساقتالعان باردىق ساندۇۇ باياندامالار نى زاپاسلاپ قويۇڭ. سىزدىن داۋاملاشتۇرغۇڭىز باربى ؟ Begin Format باشتالۇۇ فورماتى Close جابۇۇ progressBarHelper Time is being calculated 正在计算时间 Calculating time ۇباقىت ەسەپتۅۅ %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1 مىنۇت%2سىكونت %1sec %1سىكونت peony/translations/libpeony-qt/libpeony-qt_vi.ts0000664000175000017500000103723715154271106021146 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... Remove "%1" delete "%1" 删除“%1” add "%1" ConnectServerDialog Connect to Sever Kết nối đến máy chủ Domain Miền Password Mật khẩu Save Password Ghi nhớ mật khẩu User Tên người dùng Anonymous Đăng nhập ẩn danh Ok Cancel Tắt DiscControl is busy! Đang bị chiếm dụng! is busy! Bị chiếm dụng! not support udf at present. Hiện tại không hỗ trợ định dạng udf unmount disc failed before udf format. Không thể ngắt kết nối ổ đĩa trước khi định dạng udf. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. Định dạng DVD+RW udf thất bại preparation failed before DVD-RW udf format. Chuẩn bị định dạng DVD-RW udf thất bại. FileLabelModel Red Màu đỏ Orange Màu cam Yellow Màu vàng Green Màu xanh lá cây Blue Màu xanh dương Purple Màu tím Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error Lỗi Label or color is duplicated. Nhãn hoặc màu sắc lặp lại FileOperationHelper Burn failed Ghi đĩa thất bại Format_Dialog Dialog Định dạng rom_size Kích thước dung lượng system vfat/fat32 exfat ntfs vfat VFAT ext4 device_name clean it total Xoá sạch hoàn toàn(Thời gian dài,vui lòng xác nhận!) ok close TextLabel Dung lượng qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format Rom size: Kích thước dung lượng Filesystem: Hệ thống tệp Disk name: Tên thiết bị Completely erase(Time is longer, please confirm!) Xoá sạch hoàn toàn(Thời gian dài,vui lòng xác nhận!) Set password Đặt mật khẩu Set password for volume based on LUKS (only ext4) Thiết lập mật khẩu LUKS cho phân vùng ext4 Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Việc định dạng hệ thống tệp ext4 có thể khiến người dùng khác không thể đọc dữ liệu trên USB Cancel Tắt OK Xóa Data Ổ dữ liệu Error locking device: Failed to deactivate device: Device or resource busy Warning Cảnh báo Device name cannot start with a decimal point, Please re-enter! Tên thiết bị không được bắt đầu bằng dấu chấm,vui lòng nhập lại! Enter Password: Nhập mật khẩu: Password too short, please retype a password more than 6 characters Mật khẩu quá ngắn,vui lòng nhập lại mật khẩu dài hơn 6 ký tự %1/sec, %2 remaining. Mỗi giây%1,thời gian còn lại %2. over one day Hơn một ngày trời getting progress... Đang lấy tiến độ... Error Lỗi Block not existed! Thiết bị không tồn tại! Formatting. Do not close this window Đang định dạng,vui lòng không tắt KyFileDialogRename Renaming "%1" Đang đổi ten lại"%1" Renaming failed, the reason is: %1 Đổi tên thất bại,nguyên nhân: %1 Filename too long Tên tệp quá dài Copying "%1" Đang sao chép "%1" To "%1" Đến "%1" Copying failed, the reason is: %1 Sao chép thất bại,nguyên nhân "%1" Moving "%1" Đang di chuyển "%1" Moving failed, the reason is: %1 Di chuyển thất bại,nguyên nhân: %1 File operation error: Lỗi thao tác tệp: The reason is: %1 Nguyên nhân: %1 Truncation Cắt cụt Save Lưu lại All applications Tất cả các ứng dụng Cancel Tắt Apply Ứng dụng Bytes Front truncation Cắt cụt phía trước Post truncation Cắt cụt phía sau Description: Skip copying files of the current type Lưu ý:Bỏ qua sao chép loại tệp hiện tại truncate interval Khoảng cắt cụt . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Lưu ý:Cắt bỏ phần vượt quá %1 byte của tên tệp,sau đó chọn lại Explanation: When renaming a file name, ensure it is within %1 bytes and Lưu ý:Người dùng đổi tên tệp,đảm bảo không vượt quá %1 byte,và. Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". 说明:将文件保存至“%1/扩展”。 modify the name Sửa tên Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip Bỏ qua Skip All 全部跳过 Rename Đổi tên Please enter a new name 请输入文件名 OK Xóa MainProgressBar File operation 文件操作 starting ... Đang bắt đầu... cancel all file operations Hủy tất cả các thao tác tệp Minimize Cực tiểu hóa Close Tắt Are you sure to cancel all file operations? Bạn có chắc chắn muốn hủy tất cả các thao tác tệp không? Are you sure want to cancel all file operations Bạn có chắc chắn muốn hủy tất cả các thao tác tệp không? OK Xóa File Operation Cancel Tắt Calculating time Đang tính toán thời gian continue pause canceling ... Đang hủy... sync ... Đang đồng bộ... %1Mb/s Est. time left: %2 %1Mb/s Dự tính thời gian còn lại: %2 MessageDialog Peony Trình quản lý tệp Forcibly pulling out the device may cause data loss or device exceptions! Rút thiết bị ép buộc có thể gây mất dữ liệu hoặc hỏng hóc thiết bị! OtherButton Other queue 其它队列 Other Queue Peony::AdvanceSearchBar Key Words Từ khóa input key words... Nhập từ khóa... Search Location Đường dẫn tìm kiếm choose search path... Chọn vị trí cần tìm kiếm... browse File Type Loại tệp Choose File Type Chọn loại tệp Modify Time Sửa đổi thời gian Choose Modify Time Chọn sửa đổi thời gian File Size Choose file size Chọn kích thước tệp show hidden file Hiển thị tệp ẩn go back hidden advance search page Ẩn giao diện tìm kiếm nâng cao file name Tên tệp content search start search Bắt đầu tìm kiếm Select path Chọn đường dẫn Operate Tips Mẹo Have no key words or search location! Không có chữ khóa hoặc đường dẫn! Search file name or content at least choose one! Vui lòng chỉ định ít nhất một tiêu chí tên tệp hoặc nội dung tìm kiếm! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File Tìm kiếm tên tệp Peony::AdvancedPermissionsPage Permission refinement settings Cài đặt chi tiết hóa phân quyền Permission refinement settings tip Thông báo cài đặt chi tiết phân quyền Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? Việc thiết lập ACL sẽ thay đổi quyền của nhóm người dùng cơ bản,bạn có chắc muốn tiếp tục cài đặt ACL? User Tên người dùng Read Có thể đọc được Write Có thể viết được Executable Có thể thực thi được delete Inherit permission Quyền kế thừa Add Thêm Apply Ứng dụng Cancel Tắt Peony::AllFileLaunchDialog Choose new application Chọn một ứng dụng mới Choose an Application to open this file Chọn một ứng dụng để mở tệp này apply now Áp dụng ngay OK Xóa Cancel Tắt Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon Chọn biểu tượng tùy chỉnh Type: Loại: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name Tên người dùng Location Vị trí move 移动 symbolLink Symlink Folder Thư mục Include: Bao hàm: Open with: Phương thức mở: Description: Miêu tả: Select multiple files Chọn nhiều tệp Size: Kích thước tệp: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: Time Create: Time Modified: Sửa đổi thời gian: Time Access: Thời gian truy cập: Readonly Chỉ đọc Hidden Ẩn Readonly (just applied by subfiles) Chỉ đọc (đối với tệp trong thư mục) Property: Thuộc tính: usershare Chia sẻ từ thiết bị này %1 (%2 Bytes) %1 (%2 Byte) Please select a image that is smaller than 1MB. Vui lòng chọn lại ảnh có dung lượng dưới 1MB. Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 Cái tệp, %2 cái thư mục Can't get remote file information Không thể truy xuất thông tin tệp từ xa %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: Bộ xử lý: CPU Core: Nhân CPU: Memory Size: Bộ nhớ: User Name: Tên người dùng: Desktop: Môi trường màn hình nền: You should mount this volume first Bạn cần gắn kết volume này để xem thông tin Name: Tên phân vùng: File System 文件系统 Data Ổ dữ liệu System Disk Ổ hệ thống Total Space: Tổng dung lượng: Used Space: Dung lượng đã dùng: In calculation... Đang tính toán... /root used: Dung lượng chiếm dụng /root: /home used: Dung lượng chiếm dụng /home: /usershare used: Dung lượng chiếm dụng /usershare: /data/* used: Dung lượng chiếm dụng /data/*: Unknow (No permission) Không biết(không có quyền truy cập) Free Space: Không gian còn lại: Type: Loại: Kylin Burner Ghi đĩa Open with: Mở: Unknown Phân vùng không biết Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server Ip Port Type Loại hình Personal Collection server: Máy chủ bộ sưu tập cá nhân Add Thêm Delete Xóa đánh dấu Connect Kết nối Ip input error, please re-enter! Lỗi nhập ip,vui lòng nhập lại! Port input error, please re-enter! Lỗi nhập cổng,vui lòng nhập lại! add 添加 delete 连接 删除 connect 连接 Warning Cảnh báo ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user Danh tính đăng nhập Please enter the %1's user name and password of the server. Vui lòng nhập tên người dùng và mật khẩu của máy chủ %1. User's identity Danh tính kết nối Guest Khách(đăng nhập ẩn danh) Name Tên người dùng Password Mật khẩu domain Cancel Tắt OK Xóa guest 游客(匿名登录) Registered users Đăng ký người dùng name 用户名 password 密码 Remember the password Ghi nhớ mật khẩu cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop Gửi tới lối tắt màn hình Create Link to... Gửi lối tắt tới... Choose a Directory to Create Link Chọn thư mục tạo liên kết Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Gửi tới lối tắt màn hình Peony::CreateTemplateOperation File create error Lỗi tạo tệp Can not create %1: Read-only mode, can not write-in Không thể tạo %1: chế độ chỉ đọc,không thể ghi NewFile Tạo tệp Create file Tạo tệp NewFolder Tạo thư mục Create file error Lỗi tạo tệp Peony::CustomErrorHandler Is Error Handled? Lỗi đã được xử lý chưa? Error not be handled correctly Lỗi không được xử lý đúng cách Peony::DefaultAcitonWidget No default app Chưa thiết lập cách mở mặc định Peony::DefaultOpenWithWidget No default app Chưa thiết lập cách mở mặc định Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview Chọn tệp bạn muốn xem trước Can not preview this file. Không thể xem trước tệp này. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview Thông tin chi tiết This is the Default Preview of peony-qt Hiển thị thông tin chi tiết của tệp Peony::DetailsPropertiesPage Name: Tên: File type: Location: Đường dẫn: yyyy-MM-dd, HH:mm:ss Ngày dd tháng MM năm yyyy, HH:mm:ss Create time: Tạo thời gian: Modify time: Sửa đổi thời gian: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: Kích thước tệp: Width: Độ rộng: Height: Độ cao: Owner Người sở hữu Owner: Người chủ sở hữu: Computer Máy tính Computer: Máy tính: %1 (this computer) %1 (Máy tính này) Unknown Phân vùng không biết Can't get remote file information Không thể truy xuất thông tin tệp từ xa %1 px %1 Điểm ảnh Peony::DirectoryView::IconView Icon View 图标视图 warn Cảnh báo This operation is not supported. Không hỗ trợ thao tác này. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn Cảnh báo This operation is not supported. Không hỗ trợ thao tác này. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark Thêm vào truy cập nhanh &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name Tên người dùng File Type Loại tệp File Size New... 新建... Open in New Window Mở trong cửa sổ mới Open in New Tab Mở trong Tab mới Open Mở Open failed Open directory failed, you have no permission! Mở thư mục thất bại,bạn không có quyền truy cập vào thư mục này! Open with... Phương cách mở More applications... Ứng dụng nhiều hơn Open %1 selected files Mở %1 cái tệp đã chọn New Tạo Empty File Văn bản trống Folder Thư mục View Type Loại chế độ xem Sort By Loại sắp xếp Modified Date Sửa đổi ngày Original Path Đường dẫn gốc Sort Order... 排序顺序... Ascending Order Thứ tự tăng dần Mount MultiSelect Descending Order Thứ tự giảm dần Sort Preferences... 排序偏好... Folder First Ưu tiên thư mục Chinese First Ưu tiên tiếng Trung Show Hidden Hiển thị tệp ẩn Copy Sao chép Cancel Tắt File:"%1" is not exist, did you moved or deleted it? Tệp "%1" không tồn tại,bạn đã xóa hoặc di chuyển nó đi nơi khác? Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut Cắt Delete to trash Xóa vào thùng rác Paste Dán Refresh Làm mới Select All Chọn tất cả Properties Thuộc tính format Restore Khôi phục Delete Xóa đánh dấu Path Đường dẫn Sort Order Thứ tự sắp xếp Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Sắp xếp ưu tiên Error Lỗi File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever Xóa vĩnh viễn Rename Đổi tên Select &All 全选(&A) Reverse Select Chọn ngược lại P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash Xóa sạch thùng rác(&C) Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All Xóa sạch tất cả Open Parent Folder in New Window Mở thư mục chứa tệp trong cửa sổ mới Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager Cài đặt quản lý tiện ích mở rộng Available extensions Tiện ích mở rộng có sẵn Ok Cancel Tắt Peony::FMWindow File Manager Trình quản lý tệp advanced search Tìm kiếm cao cấp clear record Xóa sạch lịch sử Loaing... Press Esc to stop a loading. Đang tải...nhấn Esc để hủy. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Tác giả: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Bản quyền thuộc về(C): 2019-2020,Công ty TNHH Công nghệ Thông tin Kỳ lân Thiên Tân. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo Hủy bỏ Redo Làm lại Peony Qt Trình quản lý tệp Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder Peony::FileBatchRenameOperation File Rename error Lỗi đổi tên tệp Invalid file name %1%2%3 . Tên tệp không hợp lệ %1%2%3 . File Rename warning Cảnh báo đổi tên tệp Are you sure to hidden these files? Bạn có chắc chắn muốn ẩn các tệp này không? Rename file error Lỗi đổi tên tệp Peony::FileCopy Error in source or destination file path! Lỗi đường dẫn nguồn hoặc tệp đích! Error when copy file: %1, can not copy special files, skip this file and continue? Sao chép tệp tin:Lỗi ở %1,không thể sao chép loại tệp đặc biệt,bỏ qua tệp này và tiếp tục? Can not copy %1, file doesn't exist. Has the file been renamed or moved? Không thể sao chép %1,tệp không tồn tại.Có thể đã bị đổi tên hoặc di chuyển? The dest file "%1" has existed! Tệp đích "%1"đã tồn tại! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Hệ thống tệp vfat/fat32 không hỗ trợ tệp đơn lẻ lớn hơn 4G! Error writing to file: Input/output error Lỗi ghi tệp:Lỗi đầu vào/đầu ra Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. Tạo tệp thất bại ở %1,vui lòng xác nhận bạn có đang thao tác ở thư mục gốc,hoặc thiết bị có hỗ trợ chuẩn gphoto2 không. Failed to create %1. Tạo tệp %1 thất bại. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! Vui lòng kiểm tra thiết bị đã được tháo ra chưa! Write file error: There is no available disk space for device! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure Mở tệp thất bại Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel Hủy thao tác Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 Tạo thư mục %1 thất bại: %2 File copy error Lỗi sao chép tệp The file name exceeds the limit Tên tệp vượt quá giới hạn độ dài Cannot opening file, permission denied! Không thể mở tệp,không đủ quyền truy cập! File:%1 was not found. Không tìm thấy được tệp:%1. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk Ổ hệ thống File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in Không thể sao chép từ %1 đến%2:chế độ chỉ đọc,không thể ghi Can not copy %1 to %2: Permission denied Không thể sao chép từ %1 đến%2:không đủ quyền Data Ổ dữ liệu %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Thiết bị%1 không đủ dung lượng.Kích thước tệp cần sao chép: %2 GB, dung lượng cần thiết : %3 GB. Link file error Tạo liên kết tệp thất bại Burning does not support replacement Tính năng ghi đĩa tạm thời không hỗ trợ thay thế Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error Lỗi xóa tệp Delete file error Lỗi xóa Invalid Operation! Can not delete "%1". Thao tác không hợp lệ!không thể xóa"%1". Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled Hộp thoại mật khẩu đã bị hủy Message recipient disconnected from message bus without replying! Bên nhận tin đã ngắt kết nối với message bus mà không có phản hồi! Error Lỗi Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data folder file text file Văn bản Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning Cảnh báo Error Lỗi Open Link failed Mở liên kết thất bại File not exist, do you want to delete the link file? Tệp đích không tồn tại,bạn có muốn xóa liên kết này không? Can not open path "%1",permission denied. Không thể mở đường dẫn "%1",quyền truy cập bị từ chối. Can not find path "%1",are you moved or renamed it? Không tìm thấy được đường dẫn "%1",bạn đã di chuyển hoặc đổi tên chưa? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) Các mục con riêng lẻ Symbol Link, Lối tắt, System Disk Ổ hệ thống File Name Delete Date Xóa ngày Create Date Tạo thời gian File Size Original Path Đường dẫn gốc Path Đường dẫn File Type Loại tệp Modified Date Sửa đổi ngày Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label Thêm nhãn Delete All Label Xóa tất cả nhãn Label Management ... Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 unknown No application is set to open file "%1 %2" Still using the last opened application: known Open application is used by default: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Other application: Select application: Always open the %1%2 file with this application Choose other application Chọn ứng dụng khác Go to application center Đến trung tâm phần mềm Ok Cancel Tắt Desktop files(*.desktop) Tệp Desktop (*.desktop) Select Open Action Select Lựa chọn Peony::FileLaunchAction Execute Directly Chạy trực tiếp Execute in Terminal Chạy trên Terminal Detected launching an executable file %1, you want? Đang mở một tệp thực thi%1,bạn có muốn? Delete file Warning 删除文件警告 Open Failed Không thể mở Can not open %1, file not exist, is it deleted? Không thể mở %1,tệp không tồn tại,vui lòng xác nhận nó đã bị xóa không? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission File is not readable. Please check if file has read permisson. By Default App Dùng ứng dụng mặc định để mở Launch Options Tùy chọn thực thi Open Link failed Mở liên kết thất bại File not exist, do you want to delete the link file? Tệp đích không tồn tại,bạn có muốn xóa liên kết này không? Can not open %1, Please confirm you have the right authority. Không thể mở %1,vui lòng xác nhận bạn có quyền mở hợp lệ. Open App failed Lối tắt gặp sự cố The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Ứng dụng được liên kết đã bị sửa đổi hoặc gỡ cài đặt,do đó lối tắt này không thể hoạt động. Bạn có muốn xóa lối tắt này không? Error Lỗi File original path not exist, are you deleted or moved it? Can not get a default application for opening %1, do you want open it with text format? Không tìm thấy ứng dụng mặc định để mở%1,bạn có muốn mở bằng trình soạn thảo văn bản không? Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link Lối tắt Link file error Tạo liên kết tệp thất bại Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error Lỗi di chuyển tệp File System 文件系统 Data Ổ dữ liệu %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Thiết bị%1 không đủ dung lượng.Kích thước tệp cần sao chép: %2 GB, dung lượng cần thiết : %3 GB. File move error Di chuyển tệp thất bại Invalid move operation, cannot move a file into its sub directories. Thao tác di chuyển không hợp lệ,không thể di chuyển thư mục vào bên trong chính đường dẫn nó. The file name exceeds the limit Tên tệp vượt quá giới hạn độ dài Create file error Lỗi tạo tệp Can not move %1 to %2: Read-only mode, can not write-in Không thể di chuyển từ %1 đến %2:chế độ chỉ đọc,không thể ghi Can not move %1 to %2: Permission denied Không thể di chuyển từ %1 đến%2:không đủ quyền Cannot opening file, permission denied! Không thể mở tệp,không đủ quyền truy cập! File:%1 was not found. Không tìm thấy được tệp:%1. Invalid Operation. Thao tác không hợp lệ. System Disk Ổ hệ thống open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error Lỗi xóa tệp Link file error Tạo liên kết tệp thất bại Burning does not support replacement Tính năng ghi đĩa tạm thời không hỗ trợ thay thế Burn failed 刻录失败 File delete 文件删除 Invalid Operation Thao tác không hợp lệ Peony::FileOperationAfterProgressPage &More Details Thông tin chi tiết(&M) Peony::FileOperationErrorDialog File Operation Error Lỗi thao tác tệp unkwon Nguyên nhân không biết null Trống Error message: Thông tin lỗi: Source File: Dest File: Tệp đích: Ignore Bỏ qua Ignore All Bỏ qua tất cả Overwrite Ghi đè Overwrite All Ghi đè tất cả Backup Sao lưu Backup All Sao lưu tất cả &Retry Thử lại(&R) &Cancel Hủy(&C) Peony::FileOperationErrorDialogBase Close Tắt Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace Thay thế Ignore Bỏ qua Do the same Áp dụng tất cả <p>This location already contains the file '%1', Do you want to override it?</p> <p>Vị trí này đã có sẵn tệp tên '%1',bạn có chắc muốn thay thế nó không?</p> Unexpected error from %1 to %2 Lỗi bất thường khi thực hiện thao tác từ %1 đến%2 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup Sao lưu Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel Tắt Delete Xóa đánh dấu Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected Vui lòng xác nhận ổ đĩa chưa đầy hoặc không bị khóa ghi và tệp không bị sử dụng Peony::FileOperationErrorDialogWarning OK Xóa Cancel Tắt Skip all Make sure the disk is not full or write protected and that the file is not protected Vui lòng xác nhận ổ đĩa chưa đầy hoặc không bị khóa ghi và tệp không bị sử dụng Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link Lối tắt Copy Sao chép Move Di chuyển Rename Đổi tên Link Liên kết Delete Xóa đánh dấu Delete Permanently Restore Khôi phục New Tạo - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn '%1' is occupied,you cannot operate! '%1' Đã bị chiếm dụng,bạn không thể thực hiện thao tác này! No, go to settings 否,跳转到设置 OK Xóa Cancel Tắt Do you want to put selected %1 item(s) into trash? Bạn có xác nhận chuyển %1 mục đã chọn vào thùng rác không? Do not show again Không hiển thị lại File System 文件系统 System Disk Ổ hệ thống Data Ổ dữ liệu Insufficient storage space Không đủ dung lượng lưu trữ %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Thiết bị%1 không đủ dung lượng.Kích thước tệp cần sao chép: %2 GB, dung lượng cần thiết : %3 GB. Can't delete. Không thể xóa You can't delete a file whenthe file is doing another operation Không thể xóa tệp đang được sử dụng bởi tiến trình khác File Operation is Busy Thao tác đang bận There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Trước khi thực thi thao tác này có tác vụ chưa hoàn thành,hệ thống cần đợi tác vụ trước kết thúc mới có thể tiếp tục.Nếu bạn muốn thao tác tệp song song,hãy thay đổi cấu hình 'Cho phép thực thi song song' trong menu tùy chọn. The long name file is saved to %1 Tệp dài đã được lưu vào %1 Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: Tổng cộng: state: Trạng thái: Peony::FileOperationProgressPage &More Details Thông tin chi tiết(&M) From: Từ: To: Đến: Peony::FileOperationProgressWizard File Manager Trình quản lý tệp &Cancel Hủy(&C) Preparing... Đang chuẩn bị... Handling... Đang xử lý... Clearing... Đạng dọn dẹp... Rollbacking... Đang hoàn tác... File Operation A file operation is running backend... Một thao tác tệp đang chạy trong nền... %1 files, %2 %1 Cái tệp,tổng cộng%2 %1 done, %2 total, %3 of %4. Hoàn thành%1,tổng cộng%2,thứ%3 trong %4. clearing: %1, %2 of %3 Đang dọn dẹp: %1, thứ %2 trong %3 copying... Đang sao chép... Syncing... Đang đồng bộ... Peony::FilePreviewPage File Name: 文件名称: File Type: Time Access: Thời gian truy cập: Time Modified: Sửa đổi thời gian: Children Count: Bao gồm tệp: Size: Kích thước tệp: Time Created: Tạo thời gian: Image resolution: Độ phân giải: color model: Chế độ màu sắc: usershare Chia sẻ từ thiết bị này Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1 total, %2 hidden Tổng cộng%1,trong đó có %2 cái tệp ẩn Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error Lỗi đổi tên tệp Invalid file name %1%2%3 . Tên tệp không hợp lệ %1%2%3 . Are you sure to hidden this file? Bạn có chắc chắn muốn ẩn tệp này không? When change the file suffix, the file may be invalid. Are you sure to change it ? Việc thay đổi tên mở rộng tệp,có thể khiến tệp không sử dụng được.Bạn có xác nhận muốn đổi không? A file and a directory with the same name cannot replace each other Tệp cùng tên và thư mục không thể thay thế cho nhau The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning Cảnh báo đổi tên tệp The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error Lỗi đổi tên tệp Peony::FileTrashOperation File trash error Lỗi khi xóa tệp vào thùng rác Can not trash %1: Read-only file system Không thể xóa %1 vào thùng rác:hệ thống chỉ đọc tệp trash:/// Trash file error Lỗi khi xóa tệp vào thùng rác Invalid Operation! Can not trash "%1". Thao tác không hợp lệ!Không thể thu hồi "%1". Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. Tồn tại xung đột không thể xử lý,vui lòng kiểm tra thùng rác. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Lỗi khôi phục tệp từ thùng rác Can not find trashed file %1, might be restored or removed. Không tìm thấy được tệp%1 trong thùng rác,có thể nó đã được khôi phục hoặc bị xóa. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Minimize Cực tiểu hóa Close Tắt Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name Tên người dùng SideBar Menu Create New Label Tạo nhãn Delete Label Display the following items in the identification area: (maximum of 6) Rename Đổi tên Edit Color Chỉnh sửa màu sắc Delete This Label Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" Tìm kiếm "%1"trong "%2" File System Hệ thống tệp Search results for all files marked in "%1" in "%2" &Copy Directory 拷贝路径(&C) Open In New Tab Open In New Window Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory Sao chép đường dẫn Peony::MountOperation Operation Cancelled Login failed, unknown username or password error, please re-enter! Đăng nhập thất bại,tên người dùng hoặc mật khẩu không đúng,vui lòng nhập lại! Peony::NavigationToolBar Go Back Lùi về Go Forward Tiến lên History Lịch sử Clear History Cd Up Lên trên Refresh Làm mới Peony::NewFileLaunchDialog Choose new application Chọn một ứng dụng mới Choose an Application to open this file Chọn một ứng dụng để mở tệp này apply now Áp dụng ngay OK Xóa Cancel Tắt Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? Bạn muốn mở tệp "%1%2" bằng cách nào? Default open with: Cách mở mặc định: Other: Khác: Choose other application Chọn ứng dụng khác Go to application center Đến trung tâm phần mềm Peony::PathEdit Go To Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 Tên đối tượng: %1 Read and Write Có thể đọc và ghi Readonly Chỉ đọc Group or User (Current User) Current User Người dùng hiện tại Permissions modify tip Thông báo thay đổi quyền hạn The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Tệp hoặc thư mục hiện tại đã được thiết lập quyền ACL,việc thay đổi quyền nhóm người dùng có thể khiến các quyền ACL không thể sử dụng được,bạn có muốn tiếp tục thay đổi quyền nhóm người dùng không? Permission refinement settings Cài đặt chi tiết hóa phân quyền The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Người dùng hiện tại đã thiết lập chia sẻ cao cấp,nếu tiếp tục thay đổi quyền,chia sẻ cao cấp có thể ngừng hoạt động,bạn có muốn tiếp tục cài đặt không? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. Không thể lấy thông tin quyền truy cập tệp. (Me) (我) Others Khác Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. Bạn không thể sửa đổi quyền truy cập của tệp này. Me User 用户 Peony::PropertiesSetDialog Confirming property settings Xác nhận thiết lập thuộc tính Whether to apply to the current selected option or to selected options and subfolders and subfiles. Có phải áp dụng cho mục đang chọn hiện tại,hay áp dụng cho mục và thư mục con và tệp bên trong. Apply the current selection Áp dụng cho mục đang chọn hiện tại Apply the current selection as well as subfolders and subfiles Áp dụng cho mục đang chọn hiện tại và thư mục con và tệp bên trong Ok Cancel Tắt Peony::PropertiesWindow Trash Xóa Recent Gần đây Selected Đã chọn %1 Files %1 Cái tệp usershare Chia sẻ từ thiết bị này Data Ổ dữ liệu System Disk Ổ hệ thống Properties Thuộc tính Ok Cancel Tắt Restore Khôi phục Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. Hộp thoại xác nhận khi xóa vào thùng rác. Origin Path: Đường dẫn gốc: Deletion Date: Xóa ngày: Size: Kích thước tệp: Original Location: Đường dẫn gốc: Peony::SearchBar Input the search key of files you would like to find. Nhập từ khóa để tìm kiếm tệp bạn cần. Input search key... Nhập từ khóa... advance search Tìm kiếm cao cấp clear record Xóa sạch lịch sử Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Tìm kiếm tên tệp Clear Xóa sạch all file folder Thư mục image video text file Văn bản audio others wps file Tệp WPS Peony::SharedFileLinkOperation Symbolic Link Lối tắt The dest file "%1" has existed! Tệp đích "%1"đã tồn tại! Link file error Tạo liên kết tệp thất bại Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Trash Xóa Recent Gần đây Quick Access Quick access 快速访问 Favorite 快速访问 KmreData Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data Ổ dữ liệu Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties Thuộc tính Delete Symbolic Xóa Unmount Gỡ cài đặt Eject Tống ra Format burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network Mạng Peony::SideBarPersonalItem Personal Cá nhân Peony::SideBarSeparatorItem (No Sub Directory) (Trống) Peony::StatusBar ; %1 folders ; %1 Cái thư mục ; %1 files, %2 total ; %1 Cái tệp,tổng cộng %2 ; %1 folder ; %1 Cái thư mục ; %1 file, %2 ; %1 Cái tệp, %2 %1 selected Đã chọn mục%1 Peony::SyncThread notify 温馨提示 温馨提示 Notify Peony::TagManagement General 通用 Mark Đánh dấu Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type File Name File Type Loại tệp File Size Modified Date Sửa đổi ngày Open in New window Open in new Tab Ascending Tăng dần Descending Giảm dần Copy Sao chép Paste Dán Cut Cắt Trash Xóa Clean Trash Xóa sạch thùng rác Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore Khôi phục Options Tùy chọn Forbid Thumbnail Cấm dụng hiển thị ảnh thu nhỏ Show Hidden Hiển thị tệp ẩn Resident in Backend Chạy thường trú tronh nền Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Cho phép trình quản lý tệp tiếp tục chạy sau khi tắt cửa sổ,giúp khởi động nhanh hơn,nhưng sẽ chiếm dụng tài nguyên liên tục. &Help Trợ giúp(&H) &About... Về...(&A) Peony Qt Trình quản lý tệp Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Không biết Type: Loại: Duration: Size: Kích thước tệp: Res: Mod Date: Peony::UserShareInfoManager Warning Cảnh báo Peony::VolumeManager Error Lỗi ProgressBar starting ... Đang bắt đầu... canceling ... Đang hủy... sync ... Đang đồng bộ... continue pause close cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View Chế độ xem biểu tượng Show the folder children as icons. Hiển thị thư mục dưới dạng biểu tượng. List View Chế độ xem danh sách Show the folder children as rows in a list. Hiển thị thư mục dưới dạng danh sách. Basic Preview Page 基本 Basic Cơ bản Show the basic file properties, and allow you to modify the access and name. Hiển thị thuộc tính cơ bản của tệp,cho phép sửa đổi tên tệp. Permissions Page 权限 Permissions Quyền truy cập Show and modify file's permission, owner and group. Xem và sửa đổi quyền truy cập tệp này. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? Tệp quá lớn,không thể chuyển vào thùng rác.Bạn có muốn xóa tệp này vĩnh viễn không? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Tệp quá lớn,không thể chuyển vào thùng rác.Bạn có muốn xóa %1 cái tệp này vĩnh viễn không? Delete Xóa đánh dấu Clean the Trash Xóa sạch thùng rác OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. Bạn có chắc chắn muốn xóa sạch tệp trong thùng rác không?Thao tác này không thể hoàn tác. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties Thuộc tính máy tính Show the computer properties or items in computer. Hiển thị thuộc tính máy tính hoặc các mục trong máy tính. Trash and Recent Properties Page 最近/回收 Trash and Recent Thùng rác/gần đây Show the file properties or items in trash or recent. Hiển thị thuộc tính tệp hoặc mục trong 'Thùng rác'hoặc'Gần đây'. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed Định dạng thất bại YES Formatting successful! But failed to set the device name. Định dạng thành công!Thiết lập tên thiết bị thất bại. qmesg_notify Thông báo Format Begin Format Close Tắt Format operation has been finished successfully. Thao tác định dạng đã hoàn thành thành công. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! Rất tiếc,thao tác định dạng đã thất bại,bạn có thể thử lại! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Việc định dạng quyển này sẽ xóa toàn bộ dữ liệu trên đĩa.Vui lòng sao lưu mọi dữ liệu cần giữ lại trước khi định dạng.Bạn có muốn tiếp tục không? format begin format 开始 close 关闭 File Manager Trình quản lý tệp Notify notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed Gỡ cài đặt cưỡng chế thất bại Error: %1 Lỗi: %1 Data synchronization is complete,the device has been unmount successfully! Dữ liệu đã được đồng bộ hoàn tất, thiết bị đã tháo thành công! Unmount failed Gỡ cài đặt thất bại Not authorized to perform operation. Thao tác không được ủy quyền. Unable to unmount it, you may need to close some programs, such as: GParted etc. Không thể gỡ cài đặt, bạn có thể cần tắt một số chương trình trước, chẳng hạn như trình chỉnh sửa phân vùng. Error: %1 Do you want to unmount forcely? Lỗi: %1 Có phải gỡ cài đặt cưỡng chế? Cancel Tắt Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase Không thể kích hoạt thiết bị:Mật khẩu sai The device has been mount successfully! Thiết bị đã được gắn thành công! Eject device failed, the reason may be that the device has been removed, etc. Không thể đẩy thiết bị ra, có thể là do thiết bị đã bị gỡ bỏ, v.v. Data synchronization is complete and the device can be safely unplugged! Đồng bộ dữ liệu hoàn tất,có thể rút thiết bị an toàn! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed Lỗi khi đẩy ra favorite Favorites File is not existed. Tệp không tồn tại. Share Data Chia sẻ cục bộ Trash Xóa Recent Gần đây Operation not supported Thao tác không hỗ trợ The virtual file system does not support folder creation Hệ thống tệp ảo không hỗ trợ tạo thư mục mới Can not create a symbolic file for vfs location Không thể tạo lối tắt cho thư mục ảo Symbolic Link Lối tắt Can not create symbolic file here, %1 Không thể tạo lối tắt tại đây, %1 Can not add a file to favorite directory. Không thể thêm tệp vào danh sách yêu thích. The virtual file system cannot be opened Không thể mở hệ thống tệp ảo Virtual file directories do not support move and copy operations Đường dẫn tệp ảo không hỗ trợ thao tác di chuyển và sao chép Default favorite vfs of peony Hệ thống tệp ảo của trình quản lý tệp mặc định truy cập nhanh Details Thông tin chi tiết Mark Đánh dấu mark this file. Đánh dấu tệp này. Open With Cách mở open with. Cách mở. It need to synchronize before operating the device,place wait! Trước khi vận hành thiết bị, cần đồng bộ dữ liệu, xin vui lòng chờ! Unable to discover the file, it may have been removed or deleted. Không thể tìm thấy tệp này,có thể tệp đã bị di chuyển hoặc xóa. permission denied file not found 没有发现该文件 duplicate Bản sao Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data System Disk Ổ hệ thống label Computer Máy tính File System 文件系统 Data Ổ dữ liệu Failed to open file "%1": insufficient permissions. Mở tệp "%1"thất bại:không đủ quyền. File “%1” does not exist. Please check whether the file has been deleted. Tệp “%1”không tồn tại,vui lòng kiểm tra xem tệp có bị xóa không. burn operation has been cancelled Thao tác ghi đĩa đã bị hủy is busy! Đang bị chiếm dụng! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Bạn có chắc chắn muón xóa vĩnh viễn tệp này không?Một khi đã xóa,tệp sẽ không thể khôi phục. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. Bạn có chắc chắn muón xóa vĩnh viễn%1 cái tệp này không?Một khi đã xóa,tệp sẽ không thể khôi phục. Virtual file directories do not support move operations test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. UdfBurn::UdfAppendBurnDataDialog AppendBurnData Ghi đĩa bổ sung Disc Type: Loại đĩa quang: Device Name: Tên thiết bị: OK Xóa Cancel Tắt Unknown Phân vùng không biết Warning Cảnh báo No burn data, please add! Không có dữ liệu ghi đĩa,vui lòng thêm vào! The disc name cannot be set to empty, please re-enter it! Tên thiết bị không được để trống,vui lòng nhập lại! AppendBurnData operation has been finished successfully. Thao tác ghi đĩa bổ sung thành công. Sorry, the appendBurnData operation is failed! Xin lỗi,thao tác ghi đĩa bổ sung thất bại! Failed Burning. Do not close this window Đang ghi đĩa,vui lòng không tắt cửa sổ này Burning this disc will append datas on it. Do you want to continue ? Việc ghi đĩa này sẽ thêm các dữ liệu vào đĩa quang hiện có,bạn có muốn tiếp tục không ? Burn Ghi đĩa Begin Burning Bắt đầu ghi đĩa Close Tắt UdfBurn::UdfFormatDialog Format Disc Type: Loại đĩa quang: Device Name: Tên thiết bị: OK Xóa Cancel Tắt Unknown Phân vùng không biết Warning Cảnh báo The disc name cannot be set to empty, please re-enter it! Tên thiết bị không được để trống,vui lòng nhập lại! Format operation has been finished successfully. Thao tác định dạng đã hoàn thành thành công. Sorry, the format operation is failed! Rất tiếc,thao tác định dạng đã thất bại,bạn có thể thử lại! Failed Formatting. Do not close this window Đang định dạng,vui lòng không tắt Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Việc định dạng đĩa quang này sẽ xóa toàn bộ dữ liệu trên đĩa.Vui lòng sao lưu mọi dữ liệu cần giữ lại trước khi định dạng.Bạn có muốn tiếp tục không? Begin Format Close Tắt UdfFormatDialog Format Disc Type: Loại đĩa quang: Device Name: Tên thiết bị: OK Xóa Cancel Tắt Unknown Phân vùng không biết Warning Cảnh báo The disc name cannot be set to empty, please re-enter it! Tên thiết bị không được để trống,vui lòng nhập lại! Format operation has been finished successfully. Thao tác định dạng đã hoàn thành thành công. Sorry, the format operation is failed! Rất tiếc,thao tác định dạng đã thất bại,bạn có thể thử lại! Failed Formatting. Do not close this window Đang định dạng,vui lòng không tắt Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Việc định dạng đĩa quang này sẽ xóa toàn bộ dữ liệu trên đĩa.Vui lòng sao lưu mọi dữ liệu cần giữ lại trước khi định dạng.Bạn có muốn tiếp tục không? Begin Format Close Tắt progressBarHelper Time is being calculated 正在计算时间 Calculating time Đang tính toán thời gian %1day%2hrs%3mins%4sec %1 Ngày%2 giờ%3 phút%4 giây %1hrs%2mins%3sec %1 Giờ%2 phút%3 giây %1 mins%2sec %1 Phút%2 giây %1sec %1 Giây peony/translations/libpeony-qt/libpeony-qt_bo_CN.ts0000664000175000017500000126251315154271106021505 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... ངོ་རྟགས་དོ་དམ། Remove "%1" འཕུད་པ། “%1” delete "%1" 删除“%1” add "%1" སྣོན་པ“%1” ConnectServerDialog Connect to Sever ཞབས་ཞུ་ཆས་ལ་མཐུད་པ། Domain ཁྱབ་ཁོངས། Password ཕར་འགྲོ་ཚུར་འོང་བྱེད་མཁན། Save Password གསང་གྲངས། User སྤྱོད་མཁན Anonymous མིང་མ་བཀོད་པའི་ Ok ཐག་ཆོད (_O) Cancel དོར་བ། DiscControl is busy! བཟུང་ཟིན། is busy! བཟུང་ཟིན། not support udf at present. མིག་སྔར་udfརྣམ་གཞག་ཅན་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། unmount disc failed before udf format. udfརྣམ་གཞག་གི་སྔོན་ལ་སྡུད་སྡེར་ཕབ་པ་ལེགས་འགྲུབ་མ་བྱུང་། is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RWudfརྣམ་གཞག་ཅན་ཕམ་པ། preparation failed before DVD-RW udf format. DVD-RWudfཚད་གཞི་སྔོན་གྱི་གྲ་སྒྲིག་ཕམ་སོང་། FileLabelModel Red དམར་པོ། Orange ལི་མདོག་ Yellow སེར་པོ། Green སྔོ་ལྗང་། Blue སྔོན་པོ། Purple ཁ་དོག་སྨུག་པོ། Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error ནོར་འཁྲུལ་བྱུང་བ། Label or color is duplicated. ཡིག་བྱང་ངམ་ཡང་ན་ཁ་དོག་བསྐྱར་ཟློས་བྱེད་པ། FileOperationHelper Burn failed བརྐོས་པར་ཕམ་ཁ་བྱུང་། Format_Dialog Dialog ཁ་བརྡ་བྱེད་པ། rom_size ཤོང་ཚད་ཆེ་ཆུང་། system རྒྱུད་ཁོངས། vfat/fat32 vfat/fat32 exfat exfat ntfs NTFS vfat VFAT ext4 Ext4 device_name སྒྲིག་ཆས་ཀྱི་མིང་། clean it total ཡོངས་སུ་གསུབ་དགོས།(དུས་ཡུན་ཅུང་རིང་བས་ཁས་ལེན་གནང་རོགས།) ok གཏན་འཁེལ་བྱ། close སྒོ་རྒྱག་པ་ TextLabel ཡི་གེ་ལ་པེར་གྱིས་བཤད་རྒྱུར qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format རྣམ་པར་འཇོག་པ། Rom size: ཤོང་ཚད་ཆེ་ཆུང་། Filesystem: ཡིག་ཆའི་རྒྱུད་ཁོངས། Disk name: སྒྲིག་ཆས་ཀྱི་མིང་། Completely erase(Time is longer, please confirm!) ཡོངས་སུ་གསུབ་དགོས།(དུས་ཡུན་ཅུང་རིང་བས་ཁས་ལེན་གནང་རོགས།) Set password གསང་གྲངས་གཏན་འཁེལ་བྱ་དགོས Set password for volume based on LUKS (only ext4) ext4ཁུལ་ལ་LUKSཡི་གསང་གྲངས་སྒྲིག་བཀོད་བྱས་ཡོད། Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive རྣམ་གཞག་ཅན་དེ་ext4ཡིག་ཆའི་མ་ལག་ཏུ་བསྒྱུར་སྐབས་སྤྱོད་མཁན་གཞན་དག་གིས་Uསྡེར་ཀློག་མི་ཐུབ་པར་འགྱུར་སྲིད། Cancel དོར་བ། OK ཁ་འབྱེད་པ། Data གཞི་གྲངས། Error locking device: Failed to deactivate device: Device or resource busy སྒྲིག་ཆས་གཏན་ཁེལ་བྱེད་སྐབས་ནོར་འཁྲུལ་བྱུང་བ། སྒྲིག་ཆས་སྤྱོད་མཚམས་འཇོག་ཐབས་མེད། སྒྲིག་ཆས་སམ་ཐོན་ཁུངས་བྲེལ་བ་ཆེ། Warning ཟོན་བརྡ། Device name cannot start with a decimal point, Please re-enter! སྒྲིག་ཆས་ཀྱི་མིང་དེ་སིལ་གྲངས་ཚེག་ནས་མགོ་བརྩམས་མི་རུང་།ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། Enter Password: གསང་གྲངས། Password too short, please retype a password more than 6 characters གསང་གྲངས་ཐུང་དྲགས་པས་ཡང་བསྐྱར་གསང་གྲངས་དྲུག་ལས་ཆེ་བ་ནང་འཇུག་བྱེད་རོགས། %1/sec, %2 remaining. སྐར་ཆ་རེར་བརྒྱ་ཆའི1.2ལྷག་མའི་དུས་ཚོད། over one day ཉིན་གཅིག་ལས་བརྒལ། getting progress... མྱུར་ཚད་ཁྲོད་དུ། Error ནོར་འཁྲུལ་བྱུང་བ། Block not existed! སྒྲིག་ཆས་མི་འདུག Formatting. Do not close this window རྣམ་གཞག་ཅན་དུ་འགྱུར་བཞིན་པའི་སྒང་ཡིན་པས་སྒོ་མ་བརྒྱག KyFileDialogRename Renaming "%1" བརྒྱ་ཆ1ཞེས་པའི་མིང་བཏགས་ཡོད། Renaming failed, the reason is: %1 བསྐྱར་དུ་མིང་བཏགས་ནས་ཕམ་སོང་།རྒྱུ་རྐྱེན%1 Filename too long ཡིག་ཆའི་མིང་རིང་དྲགས་པ། Copying "%1" "བརྒྱ་ཆ་1"འདྲ་བཟོ་བྱེད་བཞིན་ཡོད། To "%1" "བརྒྱ་ཆ་1"ལ་སླེབས་པར་བྱ་དགོས། Copying failed, the reason is: %1 འདྲ་བཟོ་བྱས་པར་ཕམ་ཉེས་བྱུང་བའི་རྒྱུ་མཚན་ནི། བརྒྱ་ཆ་1ཡིན། Moving "%1" "བརྒྱ་ཆ་1"སྤོ་བཞིན་ཡོད། Moving failed, the reason is: %1 སྤོ་འགུལ་ཕམ་ཉེས་བྱུང་བའི་རྒྱུ་མཚན་གཤམ་གསལ། File operation error: ཡིག་ཆ་བཀོལ་སྤྱོད་ཀྱི་ནོར་འཁྲུལ་ནི། The reason is: %1 རྒྱུ་མཚན་ནི་བརྒྱ་ཆ་1ཡོད་ Truncation བར་མཚམས་གཅོད་པ། Save ཉར་ཚགས་བྱེད་དགོས། All applications སྤྱོད་བྱ་ཚང་མ། Cancel དོར་བ། Apply ཉེར་སྤྱོད། Bytes ཡིག་ཚིགས། Front truncation མདུན་ནས་བར་མཚམས་གཅོད་པ། Post truncation རྗེས་ནས་བར་མཚམས་གཅོད་པ། Description: Skip copying files of the current type གསལ་བཤད།མིག་སྔའི་ཡིག་ཆ་འདྲ་བཟོ་བྱས་པ་ལས་མཆོང་། truncate interval བར་མཚམས་བཅད་པ། . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select གསལ་བཤད། ཡིག་ཆའི་མིང་དུ་ཡིག་ཚིགས %1 ལས་མང་བའི་ཁག་གཏུབ་པ། Explanation: When renaming a file name, ensure it is within %1 bytes and གསལ་བཤད། སྤྱོད་མཁན་གྱིས་ཡིག་ཆའི་མིང་བསྐྱར་དུ་འདོགས་པ། %1ཡིག་ཚིགས་ནང་ཁུལ་ཡིན་པ་ཁག་ཐེག་བྱེད། སོང་། Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". གསལ་བཤད།ཁས་བླངས་པ་དེ“%རྒྱ་བསྐྱེད་པའི”བར་ཉར་ཚགས་བྱས་ཡོད། modify the name མིང་བཟོ་བཅོས་རྒྱག་པ། Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip བྲོས་བྱོལ་དུ་སོང་བ། Skip All 全部跳过 Rename མིང་བསྒྱུར་བ། Please enter a new name 请输入文件名 OK ཁ་འབྱེད་པ། MainProgressBar File operation 文件操作 starting ... ད་ལྟ་མགོ་བརྩམས་བཞིན་ཡོད། cancel all file operations ཡིག་ཆ་བཀོལ་སྤྱོད་ཚང་མ་མེད་པར་བཟོས། Minimize ཉུང་དུ་གཏོང་གང་ཐུབ་བྱ་དགོས། Close ཁ་རྒྱག Are you sure to cancel all file operations? ཁྱོད་ཀྱིས་ཡིག་ཆའི་བཀོལ་སྤྱོད་ཚང་མ་མེད་པར་གཏོང་ཁོ་ཐག་ཡིན་ནམ། Are you sure want to cancel all file operations ཁྱོད་ཀྱིས་ཡིག་ཆའི་བཀོལ་སྤྱོད་ཚང་མ་མེད་པར་གཏོང་ཁོ་ཐག་ཡིན་ནམ། OK ཁ་འབྱེད་པ། File Operation ཡིག་ཆ་བཀོལ་སྤྱོད། Cancel དོར་བ། Calculating time དུས་ཚོས་རྩི་བཞིན་འདུག continue མུ་འཐུད་དུ། pause སྐབས་འཇོག། canceling ... མེད་པར་བཟོ་བཞིན་པའི་སྒང་རེད། sync ... གོམ་མཉམ་བྱེད་བཞིན་ཡོད། %1MB/s Est. time left: %2 %1MB/s དུས་ཚོད་ལྷག་པ།: %2 %1Mb/s Est. time left: %2 %1Mb/s དུས་ཚོད་ལྷག་པ།: %2 MessageDialog Peony མེ་ཏོག་གི་མེ་ཏོག Forcibly pulling out the device may cause data loss or device exceptions! བཙན་ཤེད་ཀྱིས་སྒྲིག་ཆས་བླངས་ན་གཞི་གྲངས་བོར་བའམ་ཡང་ན་སྒྲིག་ཆས་རྒྱུན་ལྡན་མིན་པར་འགྱུར་སྲིད། OtherButton Other queue 其它队列 Other Queue རུ་བསྟར་གཞན། Peony::AdvanceSearchBar Key Words གནད་ཚིག input key words... གནད་ཚིག་ནང་འཇུག་བྱོས། Search Location བཤེར་འཚོལ་འགྲོ་ལམ། choose search path... འཚོལ་བཤེར་བྱེད་པའི་གནས་འདེམས། browse བཤར་གཟིགས། File Type ཡིག་ཆའི་རིགས་གྲས། Choose File Type ཡིག་ཆའི་རིགས་འདེམས་པ། Modify Time བཅོས་པའི་དུས་ཚོད། Choose Modify Time བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད། File Size ཡིག་ཆའི་ཆེ་ཆུང་། Choose file size ཡིག་ཆའི་ཆེ་ཆུང་འདེམས་པ། show hidden file མངོན་མེད་ཡིག་ཆ། go back ཕྱིར་ནུར། hidden advance search page མཐོ་རིམ་འཚོལ་ཞིབ་མཚམས་ངོས་སྦས་སྐུང་བྱེད་པ། file name ཡིག་ཆའི་མིང་། content ནང་དོན search སྤྱིའི་་བཤེར་འཚོལ། start search འཚོལ་ཞིབ་བྱེད་མགོ་བརྩམས། Select path འགྲོ་ལམ་གདམ་གསེས། Operate Tips སྣེ་སྟོན། Have no key words or search location! གནད་འགག་གི་ཡི་གེ་དང་འགྲོ་ལམ་མེད། Search file name or content at least choose one! ཡིག་ཆའི་མིང་དང་ནང་དོན་འཚོལ་ཞིབ་བྱེད་ན་ཆེས་ཉུང་ནའང་གཅིག་གཏན་ཁེལ་བྱེད་དགོས། Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 yesterday last week last month last year year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File ཡིག་ཆ་འཚོལ་ཞིབ། Peony::AdvancedPermissionsPage Permission refinement settings དབང་ཚད་ཞིབ་ཕྲ་བཟོ་བ། Permission refinement settings tip དབང་ཚད་ཞིབ་ཕྲ་བཟོ་བ། Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACLཡི་དབང་ཚད་སྒྲིག་འགོད་བྱས་ན་གཞི་རྩའི་དབང་ཚད་ཀྱི་སྤྱོད་མཁན་ཚོ་སྐོར་གྱི་དབང་ཚད་ལ་འགྱུར་བ་འབྱུང་སྲིད་པས།ACLམུ་མཐུད་དུ་དབང་ཚད་སྒྲིག་འགོད་བྱེད་དགོས་སམ། User སྤྱོད་མཁན Read ཚང་མ་ཀློག་ཟིན། Write འབྲི། Executable ལག་བསྟར། delete སུབ། Inherit permission ཤུལ་འཛིན་གྱི་དབང་ཚད། Input domain/user name Add Other User Add ཁ་སྣོན། Apply ཉེར་སྤྱོད། Cancel དོར་བ། Error ནོར་འཁྲུལ་བྱུང་བ། Please enter a user name User does not exist User already exists in list Peony::AllFileLaunchDialog Choose new application བཀོལ་སྤྱོད་གསར་བ་ཞིག་འདེམས། Choose an Application to open this file ཉེར་སྤྱོད་ཅིག་བདམས་ནས་ཡིག་ཆ་འདིའི་ཁ་ཕྱེས། apply now ལམ་སེང་བེད་སྤྱོད། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon རང་གིས་རང་ལ་མཚན་ཉིད་འཇོག་པའི་རི་མོ། Type: ཡིག་ཆའི་རིགས། Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name མིང་། Location གནས་ས། move 移动 symbolLink མྱུར་བའི་ཐབས་ལམ། Folder ཡིག་སྣོད་ Include: དེའི་ནང་དུ། Move གནས་སྤོ་བྱ་དགོས། Open with: རྒྱག་སྟངས་ནི། Description: གསལ་བཤད། Select multiple files ཡིག་ཆ་མང་པོ་འདེམས་པ། Size: ཡིག་ཆའི་ཆེ་ཆུང་། Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: བར་སྟོང་འཛིན་པ། Time Create: དུས་ཚོད་གསར་བཟོ། Time Modified: བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད། Time Access: འཚམས་འདྲིའི་དུས་ཚོད། Readonly ལྟ་ཀློག་ཁོ་ན། Hidden སྦས་གསང་། Readonly (just applied by subfiles) ཀློག་ཙམ། (ཡིག་ཁུག་འོག་གི་ཡིག་ཆ་ཁོ་ནར་དམིགས་པ) Property: གཏོགས་གཤིས། usershare རང་སའི་རྩིས་འཁོར་གྱི་་མཉམ་སྤྱོད། %1 (%2 Bytes) %(%ཡིག་ཚིགས2) Images (*.png *.jpg *.jpeg *.svg) པར་རིས། (.png་.jpg པ། ) .jpeg.svg། ) Please select a image that is smaller than 1MB. ཁྱོད་ཀྱིས་ཡང་བསྐྱར་1MBལས་ཆུང་པའི་པར་འདེམས་རོགས། Choose a new folder: ཡིག་ཆའི་སྒམ་གསར་བ་ཞིག་འདེམ་དགོས། Error ནོར་འཁྲུལ་བྱུང་བ། cannot move a folder to itself ! དེའི་ནང་དུ་ཡིག་སྣོད་གཅིག་ཀྱང་སྤོ་མི་རུང་། %1 Bytes %1 ཡིག་ཚིགས། %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %ཡིག་ཆ1%ཡིག་ཆ2 Can't get remote file information རྒྱང་བསྟེན་ཡིག་ཆའི་ཆ་འཕྲིན་ཐོབ་མི་ཐུབ། %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: སྒྲིག་གཅོད་ཆས། CPU Core: ལྟེ་བའི་གྲངས། Memory Size: ནང་གསོག User Name: སྤྱོད་མཁན་གྱི་མིང་། Desktop: ཅོག་ངོས་ཁོར་ཡུག You should mount this volume first ཁྱོད་ཀྱིས་རྒྱུགས་ཤོག་འདི་བཞག་ན་ད་གཟོད་ཆ་འཕྲིན་ལ་བལྟ་ཐུབ། Name: ཡན་ལག་ས་ཁུལ་གྱི་མིང་། File System 文件系统 Data གཞི་གྲངས། System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། Total Space: སྤྱིའི་ཤོང་ཚད་ནི། Used Space: བཀོལ་སྤྱོད་བར་སྟོང་། In calculation... རྩི་བའི་སྒང་། /root used: /root འཛིན་སྤྱོད། /home used: /home འཛིན་སྤྱོད། /usershare used: /usershare འཛིན་སྤྱོད། /data/* used: /data/* འཛིན་སྤྱོད། Unknow (No permission) མ་ཤེས་པ།(དབང་ཚད་མེད་པར་ལྟ་བ།) Free Space: ལྷག་མའི་བར་སྟོང་། Type: ཡིག་ཆའི་མ་ལག Kylin Burner རྐོས་མ། Open with: ཁ་འབྱེད་རོགས། Unknown སྔོན་ཤེས་མེད་པ། Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server ཞབས་ཞུ་ཆས་ལ་སྦྲེལ་བ། Ip ཞབས་ཞུ་ཆས། Port ཞབས་ཞུའི་ཕྱོགས་ཀྱི་མཐུད་ཁ། Type རིགས་དབྱིབས། Personal Collection server: མི་སྒེར་གྱི་ཉར་ཚགས་ཞབས་ཞུའི་འཕྲུལ་ཆས། Add ཁ་སྣོན། Delete སུབ་པ། Connect སྦྲེལ་མཐུད་བྱེད་པ། Ip input error, please re-enter! ip,! Port input error, please re-enter! ,! add 添加 delete 连接 删除 connect 连接 Warning ཟོན་བརྡ། ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user ཐོ་འཇུག་ཐོབ་ཐང་། Please enter the %1's user name and password of the server. ཞབས་ཞུ་ཆས་%ཡི་སྤྱོད་མཁན་གྱི་མིང་དང་གསང་གྲངས་ནང་འཇུག་བྱེད་རོགས། User's identity ཐོབ་ཐང་འབྲེལ་མཐུད། Guest མགྲོན་པོ། Name མིང་། Password ཕར་འགྲོ་ཚུར་འོང་བྱེད་མཁན། domain ཁྱབ་ཁོངས། Cancel དོར་བ། OK ཁ་འབྱེད་པ། guest 游客(匿名登录) Registered users ཐོ་འགོད་སྤྱོད་མཁན། name 用户名 password 密码 Remember the password གསང་གྲངས། cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop ཅོག་ངོས་སུ་བསྐུར་ན་མགྱོགས་པའི་ཐབས་ཤེས། Create Link to... བསྐུར་ན་མགྱོགས་པའི་ཐབས་ལ་བརྟེན་ནས་ཐོན། Choose a Directory to Create Link འབྲེལ་མཐུད་བྱེད་པའི་དཀར་ཆག་འདེམས་དགོས། Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop ཅོག་ངོས་སུ་བསྐུར་ན་མགྱོགས་པའི་ཐབས་ཤེས། Peony-Qt Share File menu Extension Tag with Menu. Peony::CreateTemplateOperation File create error ཡིག་ཆ་གསར་བཟོ་ལ་ནོར་འཁྲུལ་བྱུང་བ། Can not create %1: Read-only mode, can not write-in གསར་དུ་བཟོ་ཐབས་མེད། %1:ཀློག་ཙམ་རྣམ་པ། ནང་འབྲི་བྱེད་ཐབས་མེད། NewFile གསར་སྐྲུན་ཡིག་ཆ། Create file ཡིག་ཆ་གསར་གཏོད། NewFolder གསར་དུ་འཕར་བའི་འཕྲུལ་ཆས། Create file error ཡིག་ཆའི་ནོར་འཁྲུལ་འཛུགས་པ། Peony::CustomErrorHandler Is Error Handled? ནོར་འཁྲུལ་ནི་ཐག་གཅོད་བྱས་ཡོད་དམ། Error not be handled correctly ནོར་འཁྲུལ་ཡང་དག་པའི་སྒོ་ནས་ཐག་གཅོད་བྱས་མེད། Peony::DefaultAcitonWidget No default app ཐོག་མའི་ཁས་ལེན་བྱེད་སྟངས་བཀོད་སྒྲིག་བྱས་མེད། Peony::DefaultOpenWithWidget No default app ཐོག་མའི་ཁས་ལེན་བྱེད་སྟངས་བཀོད་སྒྲིག་བྱས་མེད། Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview ཁྱོད་ཀྱིས་སྔོན་ལྟ་བྱ་འདོད་པའི་ཡིག་ཆ་འདོམས་ཤིག Can not preview this file ཡིག་ཆ་འདི་ལ་སྔོན་དཔག་བྱེད་ཐབས་མེད། Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview ཆ་འཕྲིན་ཞིབ་ཕྲ། This is the Default Preview of peony-qt ཡིག་ཆའི་ཞིབ་ཕྲའི་བརྡ་འཕྲིན། Peony::DetailsPropertiesPage Name: མིང་འདི་ལྟ་སྟེ། File type: ཡིག་ཆའི་རིགས་འདི་ལྟ་སྟེ། Location: འགྲོ་ལམ། yyyy-MM-dd, HH:mm:ss yyyyལོ།MMཟླ་ddཉིན།HH:mm:ss Create time: གསར་འཛུགས་དུས་ཚོད། Modify time: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: Width: ཞེང་ཚད་ནི། Height: མཐོ་ཚད་ནི། Owner ཡོད་མཁན། Owner: ཡོད་མཁན། Computer རྩིས་འཁོར། Computer: རྩིས་འཁོར། %1 (this computer) %གློག་ཀླད་འདི། Unknown སྔོན་ཤེས་མེད་པ། Can't get remote file information རྒྱང་བསྟེན་ཡིག་ཆའི་ཆ་འཕྲིན་ཐོབ་མི་ཐུབ། %1 px %བརྙན་རིས། Peony::DirectoryView::IconView Icon View 图标视图 warn ཉེན་བརྡ་བཏང་བ། This operation is not supported. བཀོལ་སྤྱོད་འདི་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ཉེན་བརྡ་བཏང་བ། This operation is not supported. བཀོལ་སྤྱོད་འདི་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark མགྱོགས་མྱུར་འཚམས་འདྲི་བྱེད་པ། &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder གསར་འཛུགས་ཡིག་ཁུག Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name མིང་། File Type ཡིག་ཆའི་རིགས་གྲས། File Size ཡིག་ཆའི་ཆེ་ཆུང་། New... 新建... Open in New Window སྒེའུ་ཁུང་གསར་བའི་ནང་དུ་ཁ་ཕྱེས་པ། Open in New Tab ཤོག་བྱང་གསར་བའི་ངོས་སུ་ཁ་ཕྱེས། Open འབྱེད་པ། Open failed ཁ་འབྱེད་ཐབས་མེད། Open directory failed, you have no permission! ཡིག་ཆའི་ཁ་ཕྱེ་ནས་ཕམ་སོང་།ཁྱེད་ལ་དཀར་ཆག་འདིའི་དབང་ཚད་མེད། Open with... ཁ་འབྱེད་སྟངས། More applications... དེ་ལས་མང་བའི་བེད་སྤྱོད། Open %1 selected files གདམ་ཐོན་བྱུང་བའི་ཡིག་ཆ་1གི་ཁ་ཕྱེས། New གསར་པ། Empty File ཡིག་རྐྱང་། Folder ཡིག་སྣོད་ View Type ལྟ་ཀློག་གི་རིགས་དབྱིབས Sort By གོ་རིམ་རིགས། Modified Date 修改日期 Original Path དང་ཐོག་མའི་ལམ། Sort Order... 排序顺序... Ascending Order རིམ་འཕར། Mount བཀལ་ལེན། MultiSelect མང་འདེམ། Descending Order རིམ་ཕབ། Sort Preferences... 排序偏好... Folder First ཡིག་སྒམ། Chinese First རྒྱ་ཡིག་སྔོན་ལ་འཇོག་པ། Show Hidden སྦས་པའི་ཡིག་ཆ་མངོན་པ། Copy འདྲ་ཕབ། Cancel དོར་བ། File:"%1" is not exist, did you moved or deleted it? ཡིག་ཆ%sམེད་པ་རེད།ཁྱོད་ཀྱིས་བསུབ་པ་དང་ཡང་ན་གནས་གཞན་དུ་སྤོས་པ་ཡིན་ནམ། Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut དྲས་གཏུབ། Delete to trash ཕྱིར་སྡུད་ས་ཚིགས་སུ་སུབ་པ་ཡིན། Paste སྦྱར་བ། Refresh དྭངས་ཤིང་གཙང་བ། Select All ཚང་མ་འདེམས་པ། Properties ངོ་བོ་དང་གཟུགས་ format རྣམ་གཞག་ཅན། Restore སླར་གསོ་བྱེད་པ། Delete སུབ་པ། Time Modified བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད Path འགྲོ་ལམ། Sort Order གོ་རིམ་སྒྲིག་པ། Newest to oldest གསར་ནས་རྙིང་བར། Oldest to newest རྙིང་ནས་གསར་བར། Files from large to small ཆེ་ནས་ཆུང་། Files from small to large ཆུང་ནས་ཆེ། Sort Preferences གོ་རིམ་ཡག་པོ་སྒྲིག་པ། Error ནོར་འཁྲུལ་བྱུང་བ། File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever ཡུན་རིང་བསུབ་རྒྱུ། Rename མིང་བསྒྱུར་བ། Select &All 全选(&A) Reverse Select ལྡོག་འདེམས། P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash བར་སྣང་ཕྱིར་སྡུད་ས་ཚིགས། Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All ཡོད་ཚད་གཙང་དག་བྱས། Open Parent Folder in New Window སྒེའུ་ཁུང་གསར་བའི་ནང་ནས་ཡིག་ཆ་ཡོད་སའི་དཀར་ཆག་ཕྱེ། Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager བསྒར་ལྷུ་དོ་དམ་སྒྲིག་འགོད། Available extensions བཀོལ་སྤྱོད་བྱས་ཆོག་པའི་བསྒར་ཆས། Ok ཐག་ཆོད (_O) Cancel དོར་བ། Peony::FMWindow File Manager ཡིག་ཆའི་དོ་དམ་ཆས། advanced search མཐོ་རིམ་བཤེར་འཚོལ། clear record བར་སྣང་གི་ལོ་རྒྱུས། Loaing... Press Esc to stop a loading. ད་ལྟ་ཁ་སྣོན་བྱེད་བཞིན་ཡོད།Escམནན་ནས་མེད་པར་གཏོང་། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. རྩོམ་པ་པོ།YueLan〈lanyue.kylinos.cn〉MeihongHe〈hemeihong.kylinos.cn〉པར་དབང་ཡོད་ཚད།(C:2019ལོ་ནས་2020ལོའི་བར།ཐེན་ཅིན་ཆི་ལིན་ཆ་འཕྲིན་ལག་རྩལ་ཚད་ཡོད་ཀུང་སི། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo ཁ་ཕྱིར་འཐེན་བྱ་དགོས། Redo བསྐྱར་དུ་བཟོ་པ། Peony Qt ཡིག་ཆའི་དོ་དམ་ཆས། Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder གསར་འཛུགས་ཡིག་ཁུག Peony::FileBatchRenameOperation File Rename error ཡིག་ཆའི་བསྐྱར་དུ་མིང་བཏགས་པའི་ནོར་འཁྲུལ། Invalid file name %1%2%3 . ཁྲིམས་དང་མི་མཐུན་པའི་ཡིག་ཆའི་མིང་བརྒྱ་ཆ12 File Rename warning ཡིག་ཆ་ལ་བསྐྱར་དུ་མིང་བཏགས་ནས་ཉེན་བརྡ་གཏོང་བ། Are you sure to hidden these files? ཡིག་ཆ་འདི་དག་སྦས་དགོས་པ་ཁོ་ཐག་ཡིན་ནམ། Rename file error བསྐྱར་དུ་མིང་བཏགས་པའི་ཡིག་ཆའི་ནོར་འཁྲུལ། Peony::FileCopy Error in source or destination file path! མ་ཁུངས་གནས་སའམ་ཡང་ན་དམིགས་ཚད་ཡིག་ཆའི་ཐབས་ལམ་ནོར་བ། Error when copy file: %1, can not copy special files, skip this file and continue? ཡིག་ཆ་མཁོ་ཕབ་བྱེད་པ་སྟེ།%དུས་ཚོད་1གི་སྟེང་ནོར་འཁྲུལ་བྱུང་བ་དང་།དམིགས་བསལ་གྱི་ཡིག་ཆ་མཁོ་ཕབ་བྱེད་མི་ཐུབ།ཡིག་ཆ་འདི་ལས་བརྒལ་ནས་མུ་མཐུད་དུ་བྱེད་དམ། Can not copy %1, file doesn't exist. Has the file been renamed or moved? བརྒྱ་ཆ་1མཁོ་ཕབ་བྱེད་ཐབས་བྲལ་བ་དང་།ཡིག་ཆ་མེད་པ།མིང་བཏགས་པའམ་སྤོ་བསྒྱུར་བྱས་ཡོད་དམ། The dest file "%1" has existed! དམིགས་འབེན་ཡིག་ཆ1%ཡོད་པ་རེད། Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! vfat/fat32ཡིག་ཆའི་མ་ལག་གིས་ཡིག་ཆ་རྐྱང་པས་བཟུང་བའི་བར་སྟོང་4gལས་ཆེ་བར་རྒྱབ་སྐྱོར་མི་བྱེད། Error writing to file: Input/output error ཡིག་ཆའི་ནང་བྲིས་པར་ནོར་འཁྲུལ་བྱུང་ན།ནང་འཇུག་/ཕྱིར་གཏོང་གི་ནོར་འཁྲུལ་ཡིན། Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. ཡིག་ཆ1%ལ་ཕམ་ཁ་བྱུང་ན།རྩ་བའི་དཀར་ཆག་བཀོལ་སྤྱོད་བྱེད་མིན་དང་།ཡང་ན་སྒྲིག་ཆས་ཡང་དག་པའི་སྒོ་ནས་gphoto2ལ་རྒྱབ་སྐྱོར་བྱེད་མིན་ཐག་གཅོད་བྱེད་རོགས། Failed to create %1. གསར་སྐྲུན་ཡིག་ཆའི་%ལ་ཕམ་ཁ་བྱུང་། Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! སྒྲིག་ཆས་གནས་སྤོས་ཡོད་མེད་གཏན་ཁེལ་བྱེད་རོགས། Write file error: There is no available disk space for device! ཡིག་ཆ་འབྲི་ནོར་བྱུང་བ། སྒྲིག་ཆས་སུ་འདང་ངེས་ཀྱི་བར་སྟོང་མེད་པ། Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure ཡིག་ཆའི་ཁ་ཕྱེ་ནས་ཕམ་སོང་། Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel བཀོལ་སྤྱོད་མེད་པར་བཟོ་བ། Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 གསར་དུ་གཏོད་པའི་དཀར་ཆག%ཕམ་པ།%2 File copy error ཡིག་ཆ་བསྐྱར་པར་བྱས་པ་ནོར་སོང་། The file name exceeds the limit ཡིག་ཆའི་མིང་གི་རིང་ཚད་ཚད་བཀག་ལས་བརྒལ་ཡོད། Cannot opening file, permission denied! ཡིག་ཆ་ཁ་ཕྱེ་མི་ཐུབ།དབང་ཚད་མི་འདང་། File:%1 was not found. ཡིག་ཆ་མ་རྙེད།%1 open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in %1 དེ %2ལ་འདྲ་འབེབས་བྱེད་ཐབས་མེད། ཀློག་ཙམ་རྣམ་པ། ནང་དུ་འབྲི་མི་ཐུབ། Can not copy %1 to %2: Permission denied %1 དེ %2ལ་འདྲ་འབེབས་བྱེད་ཐབས་མེད། དབང་ཚད་མི་འདང་། Data གཞི་གྲངས། %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. བརྒྱ་ཆ1སྒྲིག་ཆས་ལ་བར་སྟོང་མི་འདང་བ།མཁོ་ཕབ་ཡིག་ཆའི་ཆེ་ཆུང་།%GBལ་བར་སྟོང་།%GB། Link file error ཡིག་ཆའི་སྦྲེལ་མཐུད་ལ་ཕམ་ཁ་བྱུང་། Burning does not support replacement གནས་སྐབས་བརྗེ་སྤོར་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error ཡིག་ཆ་བསུབ་ནོར་ཐེབས་པ། Delete file error ནོར་འཁྲུལ་སུབ་པ་ཡིན། Invalid Operation! Can not delete "%1". ཁྲིམས་དང་མི་མཐུན་པའི་བཀོལ་སྤྱོད།བརྒྱ་ཆའི༡བསུབ་མི་ཐུབ། Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled གསང་གྲངས་ཁ་བརྡའི་སྒྲོམ་མེད་པར་བཟོས། Message recipient disconnected from message bus without replying! བརྡ་འཕྲིན་བསྡུ་ལེན་མཁན་གྱིས་ལན་མ་ལོག་གོང་བརྡ་འཕྲིན་གྱི་མ་སྐུད་དང་འབྲེལ་མཐུད་བྱེད་མི་ཐུབ། Error ནོར་འཁྲུལ་བྱུང་བ། Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data གཞི་གྲངས། folder ཡིག་ཁུག file ཡིག་ཆ། text file ཡིག་རྐྱང་། Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ཟོན་བརྡ། Error ནོར་འཁྲུལ་བྱུང་བ། Open Link failed སྦྲེལ་མཐུད་ཁ་ཕྱེ་ན་ཕམ་ཁ་བྱུང་། File not exist, do you want to delete the link file? དམིགས་འབེན་ཡིག་ཆ་མེད་པས།ཁྱོད་ཀྱིས་འབྲེལ་མཐུད་འདི་བསུབ་དགོས་སམ། Can not open path "%1",permission denied. ཐབས་ལམ་གྱི"%"ཕམ་པར་བྱས།དབང་ཚད་དང་ལེན་མ་བྱས། Can not find path "%1",are you moved or renamed it? ཐབས་ལམ་མ་རྙེད་པ་རེད།"%"།ཁྱེད་རང་སྤོ་འགུལ་བྱས་པའམ་ཡང་ན་མིང་བཏགས་པ་ཡིན་ནམ། Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) གཟུགས་ཁག Symbol Link, མྱུར་ཞིང་མྱུར་བའི་ཐབས་ཤེས། System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། File Name ཡིག་ཆའི་མིང་ Delete Date སུབ་པ་ཟླ་ཚེས། Create Date གསར་སྐྲུན་བྱས་པའི་དུས་ཚོད Time Modified བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད File Size ཡིག་ཆའི་ཆེ་ཆུང་། Original Path དང་ཐོག་མའི་ལམ། Path འགྲོ་ལམ། File %1 is existed in space, please not add file repeatly. ཡིག་ཆའི་བརྒྱ་ཆ་1ནང་དུ་ཡོད་པས་ཡིག་ཆ་བསྐྱར་སྣོན་མ་བྱེད། Operation not supported བཀོལ་སྤྱོད་ལ་རྒྱབ་སྐྱོར་མི་བྱེད་པ། File Type ཡིག་ཆའི་རིགས་གྲས། Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label རྟགས་སྣོན་པ། Delete All Label རྟགས་ཚང་མ་བསུབ་རོགས། Label Management ... ངོ་རྟགས་དོ་དམ། add "%1" སྣོན་པ“%1” Remove "%1" འཕུད་པ། “%1” Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... ཤོག་བྱང་དོ་དམ། Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1%2 ཁ་འབྱེད་ཐབས། unknown མ་རྟོགས་པ། No application is set to open file "%1 %2" ཡིག་ཆ“%1%2”འབྱེད་པར་བཀོལ་བའི་ཉེར་སྤྱོད་བྱ་རིམ་སྒྲིག་འཛུགས་བྱས་མེད། Still using the last opened application: ཆེས་མཇུག་ཏུ་ཕྱེ་བའི་ཉེར་སྤྱོད་མུ་མཐུད་དུ་བཀོལ་བ། known ཤེས་ཡོད། Open application is used by default: ཕྱེ་བའི་ཉེར་སྤྱོད་བྱ་རིམ་སོར་འཇོག་ཏུ་བཀོལ་བ། You can search in the Software Center for an application that can open this file, or select an existing application on your computer. ཁྱེད་ཀྱིས་མཉེན་ཆས་ལྟེ་གནས་སུ་ཡིག་ཆ་འདི་འབྱེད་ཐུབ་པའི་ཉེར་སྤྱོད་བྱ་རིམ་འཚོལ་ཆོག་པའམ། ཡང་ན་གློག་ཀླད་སྟེང་གི་ད་ཡོད་ཀྱི་ཉེར་སྤྱོད་བྱ་རིམ་འདེམ་ཆོག Other application: ཉེར་སྤྱོད་བྱ་རིམ་གཞན། Select application: ཉེར་སྤྱོད་བྱ་རིམ་འདེམ་པ། Always open the %1%2 file with this application ནམ་ཡང་ཉེར་སྤྱོད་འདི་བཀོལ་ནས་ཡིག་ཆ%1%2འདེམ་པ། Choose other application གཞན་པའི་བཀོལ་སྤྱོད་འདེམས་དགོས། Go to application center མཉེན་ཆས་ལྟེ་གནས་ལ་འགྲོ། Ok ཐག་ཆོད (_O) Cancel དོར་བ། Desktop files(*.desktop) ཅོག་ངོས་ཡིག་ཆ་(*.desktop) Select Open Action འབྱེད་ཐབས་བདམས་པ། Select གདམ་གསེས། Peony::FileLaunchAction Execute Directly ཐད་ཀར་འཁོར་སྐྱོད། Execute in Terminal མཐའ་སྣེར་འཁོར་སྐྱོད་བྱེད་པ། Detected launching an executable file %1, you want? ལག་བསྟར་བྱེད་ཆོག་པའི་ཡིག་ཆ་ཞིག་གི་ཁ་ཕྱེ་བཞིན་ཡོད།ཁྱོད་ཀྱིས་རེ་བ་བྱེད་དམ། Delete file Warning 删除文件警告 Open Failed ཁ་འབྱེད་ཐབས་མེད། Can not open %1, file not exist, is it deleted? བརྒྱ་ཆའི་༡གི་ཁ་འབྱེད་མི་ཐུབ།ཡིག་ཆ་མེད་པར་གྱུར་སོང་།བསུབ་ཡོད་མེད་གཏན་ཁེལ་བྱེད་རོགས། File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission དབང་ཚད་མེད་པ། File is not readable. Please check if file has read permisson. ཡིག་ཆ་བཀླག་མི་རུང་། མིག་སྔའི་སྤྱོད་མཁན་ལ་ཡིག་ཆ་ཀློག་པའི་དབང་ཚད་ཡོད་པ་ཐག་ཆོད་བྱོས། By Default App ཐོག་མར་ཁས་ལེན་པའི་རྣམ་པ་སྤྱད། Launch Options ལག་བསྟར་གདམ་བྱ། Open Link failed སྦྲེལ་མཐུད་ཁ་ཕྱེ་ན་ཕམ་ཁ་བྱུང་། File not exist, do you want to delete the link file? དམིགས་འབེན་ཡིག་ཆ་མེད་པས།ཁྱོད་ཀྱིས་འབྲེལ་མཐུད་འདི་བསུབ་དགོས་སམ། Can not open %1, Please confirm you have the right authority. བརྒྱ་ཆའི་༡གི་ཁ་འབྱེད་མི་ཐུབ།ཁྱོད་ལ་ཡང་དག་པའི་ཁ་འབྱེད་ཆོག་པའི་དབང་ཆ་ཡོད་པ་གཏན་ཁེལ་བྱེད་རོགས། Open App failed མྱུར་བའི་ཐབས་ལམ་ལ་གནད་དོན་ཡོད། The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? འབྲེལ་མཐུད་འདིས་སྟོན་པའི་བཀོལ་སྤྱོད་བཟོ་བཅོས་སམ་བསུབ་ཟིན།དེའི་རྐྱེན་གྱིས་བདེ་མྱུར་བྱེད་ཐབས་འདི་རྒྱུན་ལྡན་ལྟར་བྱ་བ་སྒྲུབ་མི་ཐུབ།མྱུར་མྱུར་འགྲུབ་བྱེད་ཐབས་འདི་བསུབ་རྒྱུ་ཡིན་ནམ། Error ནོར་འཁྲུལ་བྱུང་བ། File original path not exist, are you deleted or moved it? ,? Can not get a default application for opening %1, do you want open it with text format? ཁས་བླངས་པ་དེས་བརྒྱ་ཆའི་གཅིག་གི་བཀོལ་སྤྱོད་མ་རྙེད།ཡིག་རྐྱང་རྩོམ་སྒྲིག་ཆས་ཀྱིས་ཁ་འབྱེད་པ་ཡིན་ནམ། Operate Tips སྣེ་སྟོན། Sorry, the system currently does not have an application that supports .%1 (%2) files. དགོངས་དག །མ་ལག་ཐོག་ནང་ད་ལྟ་ .%1 (%2) ཡིག་ཆ་ཚུད་པའི་ཐེབས་རིས་མི་འདུག ། Please search the software store for programs that can run %1 applications, or select an existing application on your computer to open it. %1 གློག་རིག་སྒྲུབ་ཐུབ་པའི་ལས་རིམ་ཁག་འཚོལ་ཞིབ་བྱེད་པར་མཁོ་ཆས་ཚོང་ཁང་ནང་འཚོལ་བ། ཡང་ན་ཁྱེད་ཀྱི་གློག་འཕྲུལ་ནང་གནས་ཡོད་ཀྱི་གློག་རིམ་ཞིག་གདམ་ནས་ཁ་ཕྱེ་བ་ཡིན་པར་བྱེད་དགོས། Sorry, the system currently does not have a default application set for opening "xxx.xxx" file format. དགོངས་དག །མ་ལག་ཐོག་ནང་ད་ལྟ་ "xxx.xxx" ཡིག་ཆའི་རྣམ་པར་ཁ་ཕྱེ་བའི་སྒྲིག་འཛུགས་ཀྱི་གློག་རིམ་མི་འདུག ། Please search the software store for applications that can open this file, or select an existing application in the system. མཁོ་ཆས་ཚོང་ཁང་ནང་ཡིག་ཆ་འདི་ཁ་ཕྱེ་ཐུབ་པའི་གློག་རིམ་ཁག་འཚོལ་ཞིབ་བྱེད་པ་དང་། ཡང་ན་མ་ལག་ཁྲོད་ཀྱི་གནས་ཡོད་གློག་རིམ་ཞིག་གདམ་ནས་བེད་སྤྱོད་བྱེད་དགོས། Search Software Store མཁོ་ཆས་ཚོང་ཁང་ནང་འཚོལ་བ། Select Application... གློག་རིམ་གདམ་འདེམས་བྱེད་པ།... Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link མྱུར་བའི་ཐབས་ལམ། Link file error ཡིག་ཆའི་སྦྲེལ་མཐུད་ལ་ཕམ་ཁ་བྱུང་། Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error སྤོ་འགུལ་ཡིག་ཆའི་ནོར་འཁྲུལ། File System 文件系统 Data གཞི་གྲངས། %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. བརྒྱ་ཆ1སྒྲིག་ཆས་ལ་བར་སྟོང་མི་འདང་བ།མཁོ་ཕབ་ཡིག་ཆའི་ཆེ་ཆུང་།%GBལ་བར་སྟོང་།%GB། File move error སྤོ་འགུལ་ཡིག་ཆ་ལེགས་འགྲུབ་མ་བྱུང་། Invalid move operation, cannot move a file into its sub directories. ཁྲིམས་འགལ་གྱི་སྤོ་འགུལ་བཀོལ་སྤྱོད་ནི།ཡིག་ཆ་རང་ངོས་ཀྱི་ཐབས་ལམ་འོག་ཏུ་སྤོ་འགུལ་བྱེད་མི་རུང་། The file name exceeds the limit ཡིག་ཆའི་མིང་གི་རིང་ཚད་ཚད་བཀག་ལས་བརྒལ་ཡོད། Create file error ཡིག་ཆའི་ནོར་འཁྲུལ་འཛུགས་པ། Can not move %1 to %2: Read-only mode, can not write-in %1 ནས%2སྤོ་སྒུལ་མི་ཐུབ། ཀློག་ཙམ་རྣམ་པ། འབྲི་ཐབས་མེད། Can not move %1 to %2: Permission denied %1 ནས%2སྤོ་སྒུལ་མི་ཐུབ། དབང་ཚད་མི་འདང་། Cannot opening file, permission denied! ཡིག་ཆ་ཁ་ཕྱེ་མི་ཐུབ།དབང་ཚད་མི་འདང་། File:%1 was not found. ཡིག་ཆ་མ་རྙེད།%1 Invalid Operation. ཁྲིམས་འགལ་གྱི་བཀོལ་སྤྱོད། System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error ཡིག་ཆ་བསུབ་ནོར་ཐེབས་པ། Link file error ཡིག་ཆའི་སྦྲེལ་མཐུད་ལ་ཕམ་ཁ་བྱུང་། Burning does not support replacement གནས་སྐབས་བརྗེ་སྤོར་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Burn failed 刻录失败 File delete 文件删除 Invalid Operation ཁྲིམས་འགལ་གྱི་བཀོལ་སྤྱོད། Peony::FileOperationAfterProgressPage &More Details ཞིབ་ཕྲའི་བརྡ་འཕྲིན། Peony::FileOperationErrorDialog File Operation Error ཡིག་ཆའི་བཀོལ་སྤྱོད་ནོར་བ། unkwon ཤེས་མེད་པའི་རྒྱུ་རྐྱེན། null མེད། Error message: ཆ་འཕྲིན་ནོར་འཁྲུལ་ཅན། Source File: ཁུངས་ཡིག་ཆ། Dest File: དམིགས་འབེན་ཡིག་ཆ། Ignore སྣང་མེད་ Ignore All ཚང་མ་སྣང་མེད་དུ་བཞག Overwrite ཁེབས་པ། Overwrite All ཁྱོན་ཡོངས་ལ་ཁྱབ་པ། Backup གྲབས་ཉར། Backup All ཚང་མ་གྲབས་ཉར། &Retry བསྐྱར་དུ་ཚོད་ལྟ་བྱས། &Cancel མེད་པར་བཟོས་སོང་། Peony::FileOperationErrorDialogBase Close ཁ་རྒྱག Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace དེའི་ཚབ་བྱེད་པ Ignore སྣང་མེད་ Do the same ཚང་མ་བེད་སྤྱོད། <p>This location already contains the file '%1', Do you want to override it?</p> <p>གོ་གནས་འདིའི་ནང་དུ་མིང་ལ"%"ཟེར་བའི་ཡིག་ཆ་འདུས་ཡོད་པ་དང་།ཁྱེད་ཀྱིས་དེ་བརྗེ་རྒྱུ་ཐག་གཅོད་བྱས་ཡོད་དམ།</p> Unexpected error from %1 to %2 %ནས་%བར་གྱི་བཀོལ་སྤྱོད་བྱེད་སྟངས་ཐད་རྒྱུན་གཏན་མིན་པའི་ནོར་འཁྲུལ་བྱུང་བ། Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup གྲབས་ཉར། Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel དོར་བ། Delete སུབ་པ། Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected སྡུད་སྡེར་སྲུང་སྐྱོབ་བྱས་མེད་པ་དང་ཡིག་ཆ་བཀོལ་སྤྱོད་བྱས་མེད་པ་གཏན་ཁེལ་བྱེད་རོགས། Peony::FileOperationErrorDialogNotice OK ཁ་འབྱེད་པ། Cancel དོར་བ། Make sure the disk is not full or write protected and that the file is not protected སྡུད་སྡེར་སྲུང་སྐྱོབ་བྱས་མེད་པ་དང་ཡིག་ཆ་བཀོལ་སྤྱོད་བྱས་མེད་པ་གཏན་ཁེལ་བྱེད་རོགས། Peony::FileOperationErrorDialogSkip Skip བྲོས་བྱོལ་དུ་སོང་བ། Cancel དོར་བ། Skip all ཚང་མ་བརྒལ་བ། Make sure the disk is not full or write protected and that the file is not protected སྡུད་སྡེར་སྲུང་སྐྱོབ་བྱས་མེད་པ་དང་ཡིག་ཆ་བཀོལ་སྤྱོད་བྱས་མེད་པ་གཏན་ཁེལ་བྱེད་རོགས། Peony::FileOperationErrorDialogWarning OK ཁ་འབྱེད་པ། Cancel དོར་བ། Skip all ཚང་མ་བརྒལ་བ། Make sure the disk is not full or write protected and that the file is not protected སྡུད་སྡེར་སྲུང་སྐྱོབ་བྱས་མེད་པ་དང་ཡིག་ཆ་བཀོལ་སྤྱོད་བྱས་མེད་པ་གཏན་ཁེལ་བྱེད་རོགས། Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link མྱུར་བའི་ཐབས་ལམ། Copy འདྲ་ཕབ། Move གནས་སྤོ་བྱ་དགོས། Rename མིང་བསྒྱུར་བ། Link སྦྲེལ་མཐུད་བྱེད་པ Delete སུབ་པ། Delete Permanently 永久删除 Restore སླར་གསོ་བྱེད་པ། New གསར་པ། - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ཉེན་བརྡ། '%1' is occupied,you cannot operate! བརྒྱ་ཆ1”བཟུང་སྤྱོད་བྱས་ཟིན་པས་ཁྱེད་ཀྱིས་བཀོལ་སྤྱོད་བྱེད་ཐབས་བྲལ། No, go to settings 否,跳转到设置 OK ཁ་འབྱེད་པ། Cancel དོར་བ། Do you want to put selected %1 item(s) into trash? འདེམ་པའི་བརྒྱ་ཆའི་གཅིག་ཕྱིར་སྡུད་ས་ཚིགས་སུ་འཇོག་དགོས་པ་གཏན་ཁེལ་བྱས་ཡོད་དམ། Do not show again མངོན་མི་ཐུབ། File System 文件系统 System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། Data གཞི་གྲངས། Insufficient storage space གསོག་འཇོག་བར་སྟོང་མི་འདང་བ། %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. བརྒྱ་ཆ1སྒྲིག་ཆས་ལ་བར་སྟོང་མི་འདང་བ།མཁོ་ཕབ་ཡིག་ཆའི་ཆེ་ཆུང་།%GBལ་བར་སྟོང་།%GB། Can't delete. བསུབ་མི་ཐུབ། You can't delete a file whenthe file is doing another operation ད་ལྟ་བཀོལ་སྤྱོད་བྱེད་བཞིན་པའི་ཡིག་ཆ་ཞིག་བསུབ་མི་ཐུབ། File Operation is Busy བཀོལ་སྤྱོད་ལ་བྲེལ་བ་ཆེ། There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. བཀོལ་སྤྱོད་འདི་ལག་བསྟར་མ་བྱས་སྔོན་ལ་བཀོལ་སྤྱོད་བྱས་ཚར་མེད་ལ།དེ་ཡིས་བཀོལ་སྤྱོད་སྔོན་མ་ལེགས་འགྲུབ་བྱུང་རྗེས་ད་གཟོད་ལག་བསྟར་བྱེད་དགོས།གལ་ཏེ་ཁྱོད་ཀྱིས་ཡིག་ཆ་བཀོལ་སྤྱོད་གཤིབ་བགྲོད་བྱེད་པར་རེ་བ་བྱེད་ན།ཁྱོད་ཀྱིས་འདེམས་བྱང་ཁྲོད་ཀྱི"བཀོལ་སྤྱོད་གཤིབ་བགྲོད་"ཀྱི་བཀོད་སྒྲིག་བསྒྱུར་ཆོག The long name file is saved to %1 ཡིག་ཆ་རིང་པོ་བརྒྱ་ཆ1བར་ཉར་ཚགས་བྱས་ཡོད། Undo %1 མེད་པར་བཟོ་བ།%1 Redo %1 བསྐྱར་སྒྲུབ། %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: བསྡོམས་རྩིས། state: རྣམ་པ། Peony::FileOperationProgressPage &More Details ཞིབ་ཕྲའི་བརྡ་འཕྲིན། From: ནས། To: སླེབས་བྱུང་། Peony::FileOperationProgressWizard File Manager ཡིག་ཆའི་དོ་དམ་ཆས། &Cancel མེད་པར་བཟོས་སོང་། Preparing... གྲ་སྒྲིག་བྱེད་བཞིན་ཡོད། Handling... ཐག་གཅོད་བྱེད་བཞིན་ཡོད། Clearing... གཙང་བཤེར་བྱེད་བཞིན་ཡོད། Rollbacking... ཕྱིར་སོང་། File Operation ཡིག་ཆ་བཀོལ་སྤྱོད། A file operation is running backend... ཡིག་ཆ་ཞིག་རྒྱབ་སྟེགས་སུ་འཁོར་སྐྱོད་བྱེད་བཞིན་ཡོད། %1 files, %2 བརྒྱ་ཆའི་༡གི་ཡིག་ཆ།བསྡོམས་པས་བརྒྱ་ཆའི་༢རེད། %1 done, %2 total, %3 of %4. བརྒྱ་ཆའི་༡དང་བརྒྱ་ཆའི་༢ཚེག་༤ཁྲོད་ཀྱི་བརྒྱ་ཆའི་༣འགྲུབ་སོང་། clearing: %1, %2 of %3 གཙང་བཤེར་བྱེད་བཞིན་པའི་སྒང་ཡིན།%%༣%ནང་གི་༢% copying... བསྐྱར་པར་བྱེད་བཞིན་པའི་སྒང་ཡིན། Syncing... གོམ་མཉམ་བྱེད་བཞིན་ཡོད། Peony::FilePreviewPage File Name: 文件名称: File Type: ཡིག་ཆའི་རིགས། Time Access: འཚམས་འདྲིའི་དུས་ཚོད། Time Modified: བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད། Children Count: དེའི་ནང་དུ་ཡིག་ཆ་འདུས་ཏེ། Size: ཡིག་ཆའི་ཆེ་ཆུང་། Location: འགྲོ་ལམ། Time Created: གསར་འཛུགས་དུས་ཚོད། Image resolution: དབྱེ་འབྱེད་ཚད། color model: ཚོན་མདོག་གི་རྣམ་པ། <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>ཡིག་ཆ་ཁ་ཕྱེ་བ། X52Xཡིན། <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>ཡིག་ཆའི་དཀར་ཆག་X62Xཡིན་པ་དང་། <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a href='#' style = 'text-decoration:none'>བར་སྟོང་ཁྲོད་ནས་X60Xཡིན། Cancel དོར་བ། OK ཁ་འབྱེད་པ། <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>སུབ་རྗེས། བར་སྟོང་ཁྲོད་ཀྱི་ཡིག་ཆ་གཅིག་བསྡུས་དང་གསར་བསྒྱུར་བྱེད་སྐབས། ཡིག་ཆ་དེ་དག་སླར་ཡང་གསལ་པོར་མངོན་མི་ཐུབ་པ་རེད། X126Xཡིན། <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>སུབ་རྗེས། བར་སྟོང་ཁྲོད་ཀྱི་ཡིག་ཆ་གཅིག་བསྡུས་དང་གསར་སྒྱུར་བྱེད་སྐབས་ཡིག་ཆ་དེ་སླར་ཡང་གསལ་པོར་མངོན་མི་ཐུབ།X125Xཡིན། Do you want to remove this file?<br> ཁྱེད་རང་གིས་ཡིག་ཆ་འདི་གསུབ་རྒྱུ་ཡིན་ནམ། <br> Do not ask again ད་མི་འདྲི། usershare རང་སའི་རྩིས་འཁོར་གྱི་་མཉམ་སྤྱོད། Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden སྡོམ་པས་༡%1དེའི་ནང་གི་༢%2ཡི་གསང་བའི་ཡིག་ཆ། Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error ཡིག་ཆའི་བསྐྱར་དུ་མིང་བཏགས་པའི་ནོར་འཁྲུལ། Invalid file name %1%2%3 . ཁྲིམས་དང་མི་མཐུན་པའི་ཡིག་ཆའི་མིང་བརྒྱ་ཆ12 Are you sure to hidden this file? ཡིག་ཆ་འདི་སྦས་དགོས་པ་ཁོ་ཐག་ཡིན་ནམ། When change the file suffix, the file may be invalid. Are you sure to change it ? གལ་ཏེ་ཡིག་ཆའི་མིང་བསྒྱུར་ན།ཡིག་ཆ་བཀོལ་སྤྱོད་བྱེད་མི་ཐུབ་པར་འགྱུར་སྲིད།དངོས་གནས་བསྒྱུར་དགོས་སམ། A file and a directory with the same name cannot replace each other མིང་གཅིག་པའི་ཡིག་ཆ་དང་དཀར་ཆག་ཕན་ཚུན་བརྗེ་རེས་བྱེད་མི་ཐུབ། The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning ཡིག་ཆ་ལ་བསྐྱར་དུ་མིང་བཏགས་ནས་ཉེན་བརྡ་གཏོང་བ། The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error བསྐྱར་དུ་མིང་བཏགས་པའི་ཡིག་ཆའི་ནོར་འཁྲུལ། Peony::FileTrashOperation File trash error ཡིག་ཆ་བསུབ་ནས་སྙིགས་སྒམ་དུ་གཞག་མ་ཐུབ། Can not trash %1: Read-only file system %1སྙིགས་སྒམ་དུ་བསུབ་མི་ཐུབ། ཀློག་ཙམ་ཡིག་ཆའི་རྒྱུད་ཁོངས། trash:/// trash://///// Trash file error ཡིག་ཆ་བླངས་ནས་ཕྱིར་སྡུད་ས་ཚིགས་སུ་འབྱོར་བའི་ནོར་འཁྲུལ། Invalid Operation! Can not trash "%1". ཁྲིམས་དང་མི་མཐུན་པའི་བཀོལ་སྤྱོད།%་1་ཕྱིར་བསྡུ་མི་ཐུབ། Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. ཐག་གཅོད་བྱེད་ཐབས་བྲལ་བའི་འགལ་བ་ཡོད་པས་ཕྱིར་སྡུད་ས་ཚིགས་ལ་ཞིབ་བཤེར་བྱེད་རོགས། The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error ཕྱིར་སྡུད་ས་ཚིགས་ནས་ཡིག་ཆའི་ནོར་འཁྲུལ་སླར་གསོ་བྱས། Can not find trashed file %1, might be restored or removed. ཕྱིར་བསྡུས་ཀྱི་ཡིག་ཆ%1མི་རྙེད། ཡིག་ཆ་སོར་སློག་གམ་ཡང་ན་བསུབ་ཡོད་ཀྱང་སྲིད། Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread ཆེས་ཆེར་བསྒྱུར། Minimize ཉུང་དུ་གཏོང་གང་ཐུབ་བྱ་དགོས། Close ཁ་རྒྱག Peony::IDMActionsManager Rename Spaces མིང་བཏགས་པའི་བར་སྟོང་། Space Name བར་སྟོང་གི་མིང་། Please input space name བར་སྟོང་གི་མིང་ནང་འཇུག་གནང་རོགས། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Rename Space མིང་བཏགས་པའི་བར་སྟོང་། Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. བར་སྟོང་བརྒྱ་ཆ་1གི་མིང་ལ་མིང་བཏགས་ནས་བརྒྱ་ཆ་2ཡོད་པ་དང་བརྒྱ་ཆ་2ཡོད་མི་ཐུབ། Edit Space Condition བར་སྟོང་གི་ཆ་རྐྱེན་རྩོམ་སྒྲིག་བྱ་དགོས། Close dynamically འགུལ་རྣམ་སྒོ་རྒྱག་པ། Open dynamically གནས་ཚུལ་གྱི་ཁ་ཕྱེ་བ། Delete Spaces བར་སྟོང་བསུབ་དགོས། Are you sure to delete space %1 ? ཁྱེད་རང་གིས་བར་སྟོང་གི་1%གསུབ་རྒྱུ་གཏན་འཁེལ་བྱས་ཡོད་དམ། Open འབྱེད་པ། Open With ཁ་འབྱེད་སྟངས། More applications བེད་སྤྱོད་སྔར་ལས་མང་བ་བྱ་ Open The Folder Location ཡིག་ཆའི་བཙིར་གནས་ཀྱི་ཁ་ཕྱེ་བ། Add File ཡིག་ཆ་ཁ་སྣོན་བྱས་ Choose file to add into space བར་སྟོང་ནང་གི་ཡིག་ཆ་ཁ་སྣོན་རྒྱག་དགོས། File %1 is existed in space, please not add file repeatly. ཡིག་ཆའི་བརྒྱ་ཆ་1ནང་དུ་ཡོད་པས་ཡིག་ཆ་བསྐྱར་སྣོན་མ་བྱེད། Move to space བར་སྣང་དུ་སྤོ་སྐྱོད་བྱེད་པ། Remove From Space བར་སྟོང་ནས་སྤོ་དགོས། <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>སུབ་རྗེས། བར་སྟོང་ཁྲོད་ཀྱི་ཡིག་ཆ་གཅིག་བསྡུས་དང་གསར་བསྒྱུར་བྱེད་སྐབས། ཡིག་ཆ་དེ་དག་སླར་ཡང་གསལ་པོར་མངོན་མི་ཐུབ་པ་རེད། X126Xཡིན། <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>སུབ་རྗེས། བར་སྟོང་ཁྲོད་ཀྱི་ཡིག་ཆ་གཅིག་བསྡུས་དང་གསར་སྒྱུར་བྱེད་སྐབས་ཡིག་ཆ་དེ་སླར་ཡང་གསལ་པོར་མངོན་མི་ཐུབ།X125Xཡིན། Do you want to remove selected %1 item(s)?<br> བདམས་ཟིན་པའི་བརྒྱ་ཆ་1བཏང་ཡོད་དམ། <br> Do you want to remove this file?<br> ཁྱེད་རང་གིས་ཡིག་ཆ་འདི་གསུབ་རྒྱུ་ཡིན་ནམ། <br> Do not ask again ད་མི་འདྲི། Copy འདྲ་ཕབ། Save As གཞན་དུ་ཉར་བ། file ཡིག་ཆ། All File ཡིག་ཆ་ཚང་མ། This location has no write permission.please change the storage location གནས་འདི་ལ་དབང་ཚད་མེད། གསོག་ཉར་གྱི་གནས་སུ་བསྒྱུར་རོགས། Label གདོང་འཛར། Properties ངོ་བོ་དང་གཟུགས་ Peony::ImageMountManager Invalid device path: %1 གོ་མི་ཆོད་པའི་སྒྲིག་ཆས་ཀྱི་ཐབས་ལམ། 1%ཡིན། Cannot find loop device for path: %1 ཐབས་ལམ་གྱི་སྒྲིག་ཆས་བཙལ་ནས་མ་རྙེད་པ། 1%ཡིན། Failed to unmount filesystem: %1 ཡིག་ཆའི་མ་ལག་གི་བརྒྱ་ཆ་1ཆག་ཐབས་མེད། Failed to delete loop device: %1 ཁོར་ཡུག་གི་སྒྲིག་ཆས་མེད་པར་བཟོ་ཐབས་མེད།1%། Peony::LabelSettings Name མིང་། SideBar མཐའ་སྡེ། Menu འདེམས་ཚན་ Create New Label མཚོན་རྟགས། Delete Label ངོ་རྟགས་སུབ་པ། Display the following items in the identification area: (maximum of 6) ངོ་རྟགས་ཁུལ་དུ་གཤམ་གྱི་དོན་ཚན་འཆར་བ།(ཆེས་མང་ན6) Rename མིང་བསྒྱུར་བ། Edit Color ཁ་མདོག་སྒྲིག་བཟོ། Delete This Label ངོ་རྟགས་འདི་སུབ་པ། Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" བརྒྱ་ཆ2ནང་བཤེར་འཚོལ་བྱས་པ། File System ཡིག་ཆའི་མ་ལག Search results for all files marked in "%1" in "%2" “%2”ནང་དུ་“%1”ངོ་རྟགས་ཡིག་ཆ་ཚང་མ་འཚོལ་བའི་འབྲས་བུ། &Copy Directory 拷贝路径(&C) Open In New Tab གདོང་འཛར་སྡེབ་ངོས་གསར་པའི་ནང་ཁ་ཕྱེ། Open In New Window སྒེའུ་ཁུང་གསར་པའི་ནང་ཁ་ཕྱེ། Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory མཁོ་ཕབ་ཐབས་ལམ། Peony::MountOperation Operation Cancelled བཀོལ་སྤྱོད་འདོར་བ། Login failed, unknown username or password error, please re-enter! ཐོ་འགོད་ལེགས་འགྲུབ་མ་བྱུང་ན།སྤྱོད་མཁན་གྱི་མིང་ངམ་གསང་གྲངས་ལ་ནོར་འཁྲུལ་བྱུང་ཡོད་པས་ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། Peony::NavigationToolBar Go Back ཕྱི་ནུར། Go Forward མདུན་སྐྱོད། History ལོ་རྒྱུས་ Clear History ལོ་རྒྱུས་སུབ་པ། Cd Up གོང་མ། Refresh དྭངས་ཤིང་གཙང་བ། Peony::NewFileLaunchDialog Choose new application བཀོལ་སྤྱོད་གསར་བ་ཞིག་འདེམས། Choose an Application to open this file ཉེར་སྤྱོད་ཅིག་བདམས་ནས་ཡིག་ཆ་འདིའི་ཁ་ཕྱེས། apply now ལམ་སེང་བེད་སྤྱོད། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? ཁྱེད་ཀྱི་རེ་བར་ཐབས་ཅི་ཞིག་གིས་རྒྱ་ཆའི་༡%ཡི་ཡིག་ཆའི་ཁ་ཕྱེས་ན་འདོད། Default open with: ཁས་བླངས་པའི་བྱེད་ཐབས་ནི། Other: དེ་ལས་གཞན་པ། Choose other application གཞན་པའི་བཀོལ་སྤྱོད་འདེམས་དགོས། Go to application center མཉེན་ཆས་ལྟེ་གནས་ལ་འགྲོ། Peony::PathEdit Go To མཆོང་སྒྱུར། Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 བྱ་ཡུལ་གྱི་མིང་།% Read and Write ཡི་གེ་ཀློག་པ་དང་འབྲི་བ། Readonly ལྟ་ཀློག་ཁོ་ན། Group or User སྤྱོད་མཁན་ནམ་ཚོགས་པ། (Current User) (མིག་སྔའི་སྤྱོད་མཁན།) The folder containing this file is protected, and only the file owner can modify the file. Current User མིག་སྔའི་སྤྱོད་མཁན། Permissions modify tip དབང་ཚད་བཟོ་བཅོས་གསལ་འདེབས། The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? མིག་སྔར་ཡིག་ཆའམ་ཡང་ན་ཡིག་ཆའི་སྒམ་ལ་ACLདབང་ཚད་བཟོས་ཡོད་པ་དང་།བེད་སྤྱོད་བྱེད་མཁན་གྱི་ཚོགས་ཆུང་གི་དབང་ཚད་བཟོ་བཅོས་བརྒྱབ་ན་ACLཡི་དབང་ཚད་སྤྱོད་ཐབས་བྲལ་བས་མུ་མཐུད་བེད་སྤྱོད་བྱེད་མཁན་གྱི་ཚོགས་ཆུང་གི་དབང་ཚད་ལ་བཟོ་བཅོས་རྒྱག་དགོས་སམ། Permission refinement settings དབང་ཚད་ཞིབ་ཕྲ་བཟོ་བ། The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? མིག་སྔར་སྤྱོད་མཁན་གྱིས་མཐོ་རིམ་མཉམ་སྤྱོད་བྱས་ཟིན་པས།གལ་ཏེ་ད་དུང་དབང་ཚད་བཟོ་བཅོས་རྒྱག་དགོས་ན་མཐོ་རིམ་མཉམ་སྤྱོད་བྱེད་མི་ཐུབ་པ་འབྱུང་སྲིད་པས།མུ་མཐུད་དུ་བཀོད་སྒྲིག་བྱེད་དགོས་སམ། Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ཡིག་ཆའི་དབང་ཚད་ཀྱི་འབྲེལ་ཡོད་ཆ་འཕྲིན་བསྡུ་ལེན་བྱེད་ཐབས་བྲལ། (Me) (我) Others གཞན་དག Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. ཁྱོད་ཀྱིས་ཡིག་ཆ་འདིའི་དབང་ཚད་བསྒྱུར་མི་ཐུབ། Me User 用户 Peony::PropertiesSetDialog Confirming property settings གཏོགས་གཤིས་ཀྱི་སྒྲིག་འགོད་ངོས་འཛིན། Whether to apply to the current selected option or to selected options and subfolders and subfiles. མིག་སྔར་བདམས་པའི་དོན་ཚན་ལ་བཀོལ་ལམ། ཡང་ན་བུའི་ཡིག་ཁུག་གམ་བུའི་ཡིག་ཆར་སྤྱོད་པ། Apply the current selection མིག་སྔའི་བདམས་ཚན་ལ་སྤྱོད་པ། Apply the current selection as well as subfolders and subfiles མིག་སྔའི་བདམས་ཚན་དང་བུའི་ཡིག་ཁུག་གམ་བུའི་ཡིག་ཆར་སྤྱོད་པ། Ok ཐག་ཆོད (_O) Cancel དོར་བ། Peony::PropertiesWindow Trash ཕྱིར་སྡུད་ས་ཚིགས། Recent ཉེ་ལམ། Selected འདེམས་པ། %1 Files %ཡིག་ཆ1 usershare རང་སའི་རྩིས་འཁོར་གྱི་་མཉམ་སྤྱོད། Data གཞི་གྲངས། System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། Properties ངོ་བོ་དང་གཟུགས་ Ok ཐག་ཆོད (_O) Cancel དོར་བ། Restore སླར་གསོ་བྱེད་པ། Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. ཕྱིར་སྡུད་ས་ཚིགས་སུ་བསུབ་སྐབས་ངོས་འཛིན་སྒྲོམ་ཕྱིར་བཏོན། Origin Path: སྔར་གྱི་ཐབས་ལམ། Deletion Date: བསུབ་བྱའི་དུས་ཚོད། Size: ཡིག་ཆའི་ཆེ་ཆུང་། Original Location: སྔར་གྱི་ཐབས་ལམ། Peony::SearchBar Input the search key of files you would like to find. གནད་ཚིག་ནང་འཇུག་བྱས་ནས་ཁྱོད་ཀྱིས་འཚོལ་འདོད་པའི་ཡིག་ཆ་འཚོལ་རོགས། Input search key... གནད་ཚིག་ནང་འཇུག་བྱོས། advance search མཐོ་རིམ་བཤེར་འཚོལ། clear record བར་སྣང་གི་ལོ་རྒྱུས། Peony::SearchBarContainer Choose File Type 选择文件类型 Search File ཡིག་ཆ་འཚོལ་ཞིབ། Clear སེལ་བ all ཆ་ཚང་ file folder ཡིག་སྒམ། image བརྙན་རིས video བརྙན་ཕབ། text file ཡིག་རྐྱང་། audio སྒྲ། others གཞན་དག wps file WPS Peony::SharedFileLinkOperation Symbolic Link མྱུར་བའི་ཐབས་ལམ། The dest file "%1" has existed! དམིགས་འབེན་ཡིག་ཆ1%ཡོད་པ་རེད། Link file error ཡིག་ཆའི་སྦྲེལ་མཐུད་ལ་ཕམ་ཁ་བྱུང་། Peony::SideBarCloudItem CloudStorage སྤྲོན་གསོག CloudFile སྤྲིན་ཡིག་ཆ། Peony::SideBarFavoriteItem Trash ཕྱིར་སྡུད་ས་ཚིགས། Recent ཉེ་ལམ། Quick Access མྱུར་དུ་ལྟ་སྤྱོད། Quick access 快速访问 Favorite 快速访问 KmreData སྤོ་སྒུལ་སྤྱོད་པ། Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data གཞི་གྲངས། Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties ངོ་བོ་དང་གཟུགས་ Delete Symbolic སུབ་པ་ཡིན། Remove from bookmark དྲ་ཕྲུག་འཛུལ་སྤྱོད་ནས་བཅོས་མི་རུང་བར་གཏོང་བ། Unmount སུབ་པ། Eject ཕྱིར་འབུད་བྱེད་པ། Format རྣམ་པར་འཇོག་པ། burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network དྲ་རྒྱ། Peony::SideBarPersonalItem Personal མི་སྒེར། Peony::SideBarSeparatorItem (No Sub Directory) སྟོང་། Peony::StatusBar ; %1 folders %ཡིག་སྒམ1 ; %1 files, %2 total བརྒྱ་ཆའི་༡གི་ཡིག་ཆ།བསྡོམས་པས་བརྒྱ་ཆའི་༢རེད། ; %1 folder %ཡིག་སྒམ1 ; %1 file, %2 %ཡིག་ཆ་1%%%2% %1 selected གདམ་བྱའི་རྣམ་གྲངས1 Peony::SyncThread notify 温馨提示 温馨提示 Notify སྣེ་སྟོན་དྲོན་པོ། Peony::TagManagement General 通用 Mark རྟགས། Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type རིམ་སྒྲིག་གི་རིགས། File Name ཡིག་ཆའི་མིང་ File Type ཡིག་ཆའི་རིགས་གྲས། File Size ཡིག་ཆའི་ཆེ་ཆུང་། Modified Date དུས་འགྱུར་བ། Open in New window སྒེའུ་ཁུང་གསར་བའི་ནང་དུ་ཁ་ཕྱེ་བ། Open in new Tab ཤོག་བྱང་གསར་བའི་ངོས་སུ་ཁ་ཕྱེས། Ascending རིམ་པ་ཇེ་མང་དུ་འགྲོ་བཞིན Descending མར་འབབ་པ། Copy འདྲ་ཕབ། Paste སྦྱར་བ། Cut དྲས་གཏུབ། Trash ཕྱིར་སྡུད་ས་ཚིགས། Clean Trash བར་སྣང་ཕྱིར་སྡུད་ས་ཚིགས། Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore སླར་གསོ་བྱེད་པ། Options འདེམས་ཚན Forbid Thumbnail བཀག་སྡོམ་བསྡུས་རིས། Show Hidden སྦས་པའི་ཡིག་ཆ་མངོན་པ། Resident in Backend རྒྱུན་སྡོད་རྒྱབ་རྟེན། Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ཡིག་ཆ་དོ་དམ་ཆས་སྒེའུ་ཁུང་ཡོད་ཚད་ཀྱི་སྒོ་རྒྱབ་རྗེས་སྔར་བཞིན་འཁོར་སྐྱོད་བྱེད་དུ་འཇུག་དགོས།འདིས་ཐེངས་རྗེས་མའི་ལག་བསྟར་བྱེད་པར་མཁོ་བའི་དུས་ཚོད་ཇེ་ཐུང་དུ་བཏང་།འོན་ཀྱང་རྒྱུན་པར་ཐོན་ཁུངས་བཀོལ་སྤྱོད་བྱེད་སྲིད། &Help རོགས་རམ།(&H) &About... འབྲེལ་ཡོད་ཀྱི།(&A) Peony Qt ཡིག་ཆའི་དོ་དམ་ཆས། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. རྩོམ་པ་པོ།YueLan〈lanyue.kylinos.cn〉MeihongHe〈hemeihongkylinos.cn〉པར་དབང་ཡོད་ཚད།(C)2019ལོ།ཐེན་ཅིན་ཆི་ལིན་ཆ་འཕྲིན་ལག་རྩལ་ཚད་ཡོད་ཀུང་སི། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow མི་ཤེས། Type: ཡིག་ཆའི་མ་ལག Duration: དུས་ཡུན Size: ཡིག་ཆའི་ཆེ་ཆུང་། Loading... སྣོན་པའི་སྒང་། Res: འབྱེད་ཚད། Mod Date: བཟོ་བཅོས་དུས་ཚོད། Deleted date: བསུབས་པའི་ཚེས་གྲངས་ནི། Original path: དེ་སྔའི་ཐབས་ལམ་ནི། Peony::UserShareInfoManager Warning ཟོན་བརྡ། Peony::VolumeManager Error ནོར་འཁྲུལ་བྱུང་བ། ProgressBar starting ... ད་ལྟ་མགོ་བརྩམས་བཞིན་ཡོད། canceling ... མེད་པར་བཟོ་བཞིན་པའི་སྒང་རེད། sync ... གོམ་མཉམ་བྱེད་བཞིན་ཡོད། continue མུ་འཐུད་དུ། pause སྐབས་འཇོག། close སྒོ་རྒྱག་པ་ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View མཚོན་རྟགས་ལྟ་ཚུལ། Show the folder children as icons. རི་མོའི་རྣམ་པའི་ཐོག་ནས་དཀར་ཆག་མངོན་པ། List View རེའུ་མིག་མཐོང་རིས། Show the folder children as rows in a list. རེའུ་མིག་གི་རྣམ་པའི་ཐོག་ནས་དཀར་ཆག་མངོན་པ། Basic Preview Page 基本 Basic གཞི་རྩ། Show the basic file properties, and allow you to modify the access and name. ཡིག་ཆའི་གཞི་རྩའི་ཁྱད་ཆོས་མངོན་པར་བྱས་ཏེ་ཡིག་ཆའི་མིང་བཟོ་བཅོས་བརྒྱབ་ཆོག Permissions Page 权限 Permissions ཆོག་འཐུས་ལག་ཁྱེར། Show and modify file's permission, owner and group. ཡིག་ཆའི་དབང་ཚད་ལ་ལྟ་ཞིབ་དང་བཟོ་བཅོས་རྒྱག་པ། Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? ཡིག་ཆ་ཆེ་དྲགས་པས་ཕྱིར་སྡུད་ས་ཚིགས་སུ་སྤོར་མི་རུང་།ཡིག་ཆ་འདི་གཏན་དུ་བསུབ་དགོས་སམ། These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? ཡིག་ཆ་ཆེ་དྲགས་པས་ཕྱིར་སྡུད་ས་ཚིགས་སུ་སྤོར་མི་རུང་།%ཡི་ཡིག་ཆ་འདི་གཏན་དུ་བསུབ་རྒྱུ་ཡིན་ནམ། Delete སུབ་པ། Clean the Trash སྙིགས་སྒམ་གཙང་སེལ། OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. ཕྱིར་སྡུད་ས་ཚིགས་ནང་གི་ཡིག་ཆ་གཙང་བཤེར་བྱེད་པ་གཏན་ཁེལ་ཡིན་ནམ།བཀོལ་སྤྱོད་འདི་ཕྱིར་འཐེན་བྱེད་ཐབས་མེད། Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties རྩིས་འཁོར་གྱི་ཁྱད་ཆོས། Show the computer properties or items in computer. རྩིས་འཁོར་གྱི་ངོ་བོ་དང་རྩིས་འཁོར་ནང་གི་ཚན་པ་མངོན་ཡོད། Trash and Recent Properties Page 最近/回收 Trash and Recent ཕྱིར་སྡུད་ས་ཚིགས།ཉེ་ཆར། Show the file properties or items in trash or recent. ཕྱིར་སྡུད་ས་ཚིགས་སམ་ཆེས་ཉེ་བའི་ཡིག་ཆའི་ངོ་བོ་དང་རྣམ་གྲངས་མངོན་ཡོད། eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed རྣམ་གཞག་ཅན་ལ་ཕམ་ཉེས་བྱུང་བ། YES རེད། Formatting successful! But failed to set the device name. རྣམ་གཞག་ཅན་ལེགས་འགྲུབ་བྱུང་བ།སྒྲིག་ཆས་ཀྱི་མིང་སྒྲིག་པ་ལེགས་འགྲུབ་མ་བྱུང་བ། qmesg_notify བརྡ་ཐོ། Format རྣམ་པར་འཇོག་པ། Begin Format མགོ་རྩོམ། Close ཁ་རྒྱག Format operation has been finished successfully. རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ལེགས་འགྲུབ་བྱུང་བ་རེད། Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! ཡིད་ཕངས་པ་ཞིག་ལ།རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ཕམ་སོང་།ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱས་ཆོག Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? རྣམ་གཞག་ཅན་གྱི་བམ་པོ་འདིའི་སྟེང་གི་གཞི་གྲངས་ཡོད་ཚད་མེད་པར་གཏོང་རྒྱུ་རེད།ཁྱོད་ཀྱིས་རྣམ་གཞག་ཅན་གྱི་སྔོན་ལ་སོར་བཞག་བྱས་པའི་གཞི་གྲངས་ཡོད་ཚད་གྲ་སྒྲིག་བྱེད་རོགས།ཁྱོད་ཀྱིས་མུ་མཐུད་དུ་བྱེད་འདོད་དམ། format རྣམ་གཞག་ཅན། begin format 开始 close 关闭 File Manager ཡིག་ཆའི་དོ་དམ་ཆས། Notify སྣེ་སྟོན་དྲོན་པོ། notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed བཙན་ཤེད་ཀྱིས་བསུབ་པ་ལེགས་འགྲུབ་མ་བྱུང་། Error: %1 ནོར་འཁྲུལ།%,n Data synchronization is complete,the device has been unmount successfully! གཞི་གྲངས་གོམ་མཉམ་བྱུང་བ་དང་སྒྲིག་ཆས་བདེ་ལེགས་ངང་བསུབ་ཐུབ་སོང། Unmount failed བསུབ་མ་ཐུབ། Not authorized to perform operation. བཀོལ་སྤྱོད་ལ་དབང་སྤྲོད་མ་ཐོབ། Unable to unmount it, you may need to close some programs, such as: GParted etc. བསུབ་ཐུབ་མ་སོང། ཁྱེད་རང་གིས་དེའི་སྔོན་ལ་བྱང་རིམ་ཁ་ཤས་སྒོ་རྒྱག་དགོས་འདུག། དཔེར་ན་ཁུལ་དབྱེ་རྩོམ་སྒྲིག་ཆས་སོགས། Error: %1 Do you want to unmount forcely? ནོར་འཁྲུལ།%1བཙན་ཤེད་ཀྱིས་སུབ་པ་ཡིན་ནམ། Cancel དོར་བ། Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase སྐུལ་སློང་བྱེད་མི་ཐུབ་པའི་སྒྲིག་ཆས།ནོར་འཁྲུལ་གྱི་བཀའ་བརྡ། The device has been mount successfully! སྒྲིག་ཆས་འགེལ་འཇོག་ལེགས་གྲུབ་བྱུང་སོང་། Eject device failed, the reason may be that the device has been removed, etc. སྒྲིག་ཆས་མདོན་མི་ཐུབ་པ་དེ་སྒྲིག་ཆས་མེད་པར་བཟོས་པ་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན་སྲིད། Data synchronization is complete and the device can be safely unplugged! གཞི་གྲངས་དུས་མཉམ་དུ་འགྲུབ་ན་སྒྲིག་ཆས་བདེ་འཇགས་ངང་ལེན་ཐུབ། Password is empty, please re-enter! གསང་ཨང་སྟོང་བ་རེད། བསྐྱར་དུ་ཆུགས་ཤིག Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed ཐོན་ཐུབ་མ་སོང། favorite སྡུད་ཉེར Favorites ཆེས་མོས་པ། File is not existed. ཡིག་ཆ་མེད་པ། Share Data འཕྲུལ་ཆས་འདི་མཉམ་སྤྱོད། Trash ཕྱིར་སྡུད་ས་ཚིགས། Recent ཉེ་ལམ། Operation not supported བཀོལ་སྤྱོད་ལ་རྒྱབ་སྐྱོར་མི་བྱེད་པ། The virtual file system does not support folder creation རྟོག་བཟོའི་ཡིག་ཆའི་མ་ལག་འོག་ཡིག་སྣོད་གསར་བ་འཛུགས་པར་རྒྱབ་སྐྱོར་མི་བྱེད། Can not create a symbolic file for vfs location རྟོག་བཟོའི་དཀར་ཆག་ལ་མྱུར་བཟོའི་ཐབས་ལམ་གསར་གཏོད་བྱེད་ཐབས་བྲལ། Symbolic Link མྱུར་བའི་ཐབས་ལམ། Can not create symbolic file here, %1 འདི་ནས་མགྱོགས་མྱུར་གྱི་ཐབས་ལམ་ཞིག་འཛུགས་མི་ཐུབ།% Can not add a file to favorite directory. ཡིག་ཆ་སྡུད་གསོག་ཆས་སུ་འཇོག་མི་རུང་། The virtual file system cannot be opened རྟོག་བཟོའི་ཡིག་ཚགས་མ་ལག་གི་ཁ་ཕྱེ་མི་ཐུབ། Virtual file directories do not support move and copy operations རྟོག་བཟོའི་ཡིག་ཆའི་དཀར་ཆག་གིས་འགུལ་སྐྱོད་དང་འདྲ་བཟོའི་བྱ་སྤྱོད་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Default favorite vfs of peony ཡིག་ཆ་དོ་དམ་ཆས་ཀྱི་རྟོག་བཟོའི་ཡིག་ཆའི་མ་ལག་གིས་མགྱོགས་མྱུར་ངང་བཅར་འདྲི་བྱེད་པར་ཁས་ལེན་བྱས། Details གནས་ཚུལ་ཞིབ་ཕྲ། Mark རྟགས། mark this file. ཡིག་ཆ་འདི་ལ་རྟགས་རྒྱོབ། Open With ཁ་འབྱེད་སྟངས། open with. སྒོ་འབྱེད་པའི་ཐབས་ཤེས། It need to synchronize before operating the device,place wait! སྒྲིག་ཆས་བཀོལ་སྤྱོད་བྱེད་པའི་སྔོན་ལ་དེ་མཚུངས་ཀྱི་གཞི་གྲངས་དགོས། ཅུང་ཙམ་སྒུག་རོགས། Unable to discover the file, it may have been removed or deleted. ཡིག་ཆ་དེ་རྙེད་ཐབས་མེད་པས་ཡིག་ཆ་གནས་སྤོ་འམ་ཡང་ན་བསུབ་སྲིད། permission denied དབང་ཚད་མེད། file not found 没有发现该文件 duplicate བུ་ཡིག Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data གཞི་གྲངས། System Disk རྒྱུད་ཁོངས་ཀྱི་སྡེར། label ཤོག་བྱང Computer རྩིས་འཁོར། File System 文件系统 Data གཞི་གྲངས། Failed to open file "%1": insufficient permissions. ཡིག་ཆའི་ཁ་ཕྱེ་ནས"%1"ཕམ་པ།དབང་ཚད་མི་འདང་བ། File “%1” does not exist. Please check whether the file has been deleted. ཡིག་ཆ"%1"མེད་པ་རེད།ཡིག་ཆ་བསུབ་ཡོད་མེད་ལ་ཞིབ་བཤེར་བྱེད་རོགས། burn operation has been cancelled བརྐོས་པའི་བཀོལ་སྤྱོད་མེད་པར་བཟོས་ཟིན། is busy! བཟུང་ཟིན། Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. ཡིག་ཆ་འདི་ནམ་ཡང་བསུབ་རྒྱུ་ཁོ་ཐག་ཡིན་ནམ།གལ་ཏེ་བསུབ་ན་ཡིག་ཆ་སླར་གསོ་བྱེད་མི་ཐུབ། Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. ཡིག་ཆ་འདི་གཏན་དུ་བསུབ་རྒྱུ་ཡིན་ནམ།གལ་ཏེ་བསུབ་ན།ཡིག་ཆ་སླར་གསོ་བྱེད་མི་ཐུབ། Virtual file directories do not support move operations རྟོག་བཟོའི་ཡིག་ཆའི་འགྲོ་ལམ་གྱིས་སྤོ་སྒུལ་དང་འདྲ་འབེབས་ལ་རྒྱབ་སྐྱོར་མི་བྱ། test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space རིག་ནུས་བར་སྟོང་། New Intelligent Space གསར་བྱུང་བློ་འཕྲིན་ཁང་། File %1 is existed in space, please not add file repeatly. ཡིག་ཆའི་བརྒྱ་ཆ་1ནང་དུ་ཡོད་པས་ཡིག་ཆ་བསྐྱར་སྣོན་མ་བྱེད། SpaceSaveDialog Save as space བར་སྟོང་དུ་གྲོན་ཆུང་བྱ་དགོས། Space Name བར་སྟོང་གི་མིང་། Please input space name བར་སྟོང་གི་མིང་ནང་འཇུག་གནང་རོགས། Dynamically Update Space Files འགུལ་རྣམ་གསར་སྒྱུར་གྱི་བར་སྟོང་ཡིག་ཆ། Cancel དོར་བ། Ok ཐག་ཆོད (_O) Failed to create space %1,%1 is existed བར་སྟོང་བརྒྱ་ཆ་1དང་བརྒྱ་ཆ་1གསར་སྐྲུན་བྱེད་ཐབས་མེད། UdfBurn::UdfAppendBurnDataDialog AppendBurnData གསབ་སྣོན་ཟིན་ཐོ། Disc Type: འོད་སྡེར་གྱི་རིགས། Device Name: སྒྲིག་ཆས་ཀྱི་མིང་གཤམ་གསལ། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Unknown སྔོན་ཤེས་མེད་པ། Warning ཟོན་བརྡ། No burn data, please add! གཞི་གྲངས་བརྐོས་མེད་ན་ཁ་སྣོན་གྱིས། The disc name cannot be set to empty, please re-enter it! སྒྲིག་ཆས་ཀྱི་མིང་བར་སྟོང་དུ་འཇོག་མི་རུང་།ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། AppendBurnData operation has been finished successfully. རྐོས་མའི་བཀོལ་སྤྱོད་ལེགས་འགྲུབ་བྱུང་བ། Sorry, the appendBurnData operation is failed! ཐུགས་རྒྱལ་མ་བཞེངས།བསྐྱར་ཕབ་བཀོལ་སྤྱོད་ལེགས་འགྲུབ་མ་བྱུང་། Failed གསར་སྒྱུར་མ་ཐུབ། Burning. Do not close this window རྐོས་མའི་ནང་དུ་སྒེའུ་ཁུང་འདི་མ་རྒྱག Burning this disc will append datas on it. Do you want to continue ? འོད་སྡེར་འདི་བརྐོས་ནས་འོད་སྡེར་འདིའི་སྟེང་དུ་འཇོག་རྒྱུ་ཡིན་ནམ།མུ་མཐུད་དུ་བྱེད་དམ། Burn རྐོས་མ། Begin Burning ཕབ་ལེན་བྱེད་འགོ་ཚུགས། Close ཁ་རྒྱག UdfBurn::UdfFormatDialog Format རྣམ་པར་འཇོག་པ། Disc Type: འོད་སྡེར་གྱི་རིགས། Device Name: སྒྲིག་ཆས་ཀྱི་མིང་གཤམ་གསལ། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Unknown སྔོན་ཤེས་མེད་པ། Warning ཟོན་བརྡ། The disc name cannot be set to empty, please re-enter it! སྒྲིག་ཆས་ཀྱི་མིང་བར་སྟོང་དུ་འཇོག་མི་རུང་།ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། Format operation has been finished successfully. རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ལེགས་འགྲུབ་བྱུང་བ་རེད། Sorry, the format operation is failed! ཡིད་ཕངས་པ་ཞིག་ལ།རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ཕམ་སོང་།ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱས་ཆོག Failed གསར་སྒྱུར་མ་ཐུབ། Formatting. Do not close this window རྣམ་གཞག་ཅན་དུ་འགྱུར་བཞིན་པའི་སྒང་ཡིན་པས་སྒོ་མ་བརྒྱག Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? རྣམ་གཞག་ཅན་གྱི་འོད་སྡེར་འདིའི་སྟེང་གི་གཞི་གྲངས་ཡོད་ཚད་བསུབ་རྒྱུ་རེད།ཁྱོད་ཀྱིས་རྣམ་གཞག་ཅན་གྱི་སྔོན་ལ་སོར་བཞག་བྱས་པའི་གཞི་གྲངས་ཡོད་ཚད་གྲ་སྒྲིག་བྱེད་རོགས།ཁྱོད་ཀྱིས་མུ་མཐུད་དུ་བྱེད་འདོད་དམ། Begin Format མགོ་རྩོམ། Close ཁ་རྒྱག UdfFormatDialog Format རྣམ་པར་འཇོག་པ། Disc Type: འོད་སྡེར་གྱི་རིགས། Device Name: སྒྲིག་ཆས་ཀྱི་མིང་གཤམ་གསལ། OK ཁ་འབྱེད་པ། Cancel དོར་བ། Unknown སྔོན་ཤེས་མེད་པ། Warning ཟོན་བརྡ། The disc name cannot be set to empty, please re-enter it! སྒྲིག་ཆས་ཀྱི་མིང་བར་སྟོང་དུ་འཇོག་མི་རུང་།ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། Format operation has been finished successfully. རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ལེགས་འགྲུབ་བྱུང་བ་རེད། Sorry, the format operation is failed! ཡིད་ཕངས་པ་ཞིག་ལ།རྣམ་གཞག་ཅན་གྱི་བཀོལ་སྤྱོད་ཕམ་སོང་།ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱས་ཆོག Failed གསར་སྒྱུར་མ་ཐུབ། Formatting. Do not close this window རྣམ་གཞག་ཅན་དུ་འགྱུར་བཞིན་པའི་སྒང་ཡིན་པས་སྒོ་མ་བརྒྱག Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? རྣམ་གཞག་ཅན་གྱི་འོད་སྡེར་འདིའི་སྟེང་གི་གཞི་གྲངས་ཡོད་ཚད་བསུབ་རྒྱུ་རེད།ཁྱོད་ཀྱིས་རྣམ་གཞག་ཅན་གྱི་སྔོན་ལ་སོར་བཞག་བྱས་པའི་གཞི་གྲངས་ཡོད་ཚད་གྲ་སྒྲིག་བྱེད་རོགས།ཁྱོད་ཀྱིས་མུ་མཐུད་དུ་བྱེད་འདོད་དམ། Begin Format མགོ་རྩོམ། Close ཁ་རྒྱག progressBarHelper Time is being calculated 正在计算时间 Calculating time དུས་ཚོས་རྩི་བཞིན་འདུག %1day%2hrs%3mins%4sec ཉིན%1ཆུ་ཚོད%2སྐར་མ%3སྐར་ཆ%4 %1hrs%2mins%3sec ཆུ་ཚོད%1སྐར་མ%2སྐར་ཆ%3 %1 mins%2sec སྐར་མ་1དང་སྐར་ཆ་2ཟིན་གྱི་ཡོད། %1sec སྐར་ཆ%1 peony/translations/libpeony-qt/libpeony-qt_zh_Hant.ts0000664000175000017500000106165115154271106022120 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... 識別管理 ... Remove "%1" 拿掉%1 delete "%1" 删除“%1” add "%1" 添加%1 ConnectServerDialog Connect to Sever 連接到伺服器 Domain 功能變數名稱 Password 密碼 Save Password 記住密碼 User 使用者名 Anonymous 匿名登錄 Ok 確定 Cancel 取消 DiscControl is busy! 被佔用! is busy! 被佔用! not support udf at present. 目前不支援udf格式化 unmount disc failed before udf format. 在 udf 格式之前卸載磁碟失敗。 is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf格式化失敗 preparation failed before DVD-RW udf format. DVD-RW udf 格式之前的準備失敗。 FileLabelModel Red 紅色 Orange 橙色 Yellow 黃色 Green 綠色 Blue 藍色 Purple 紫色 Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error 錯誤 Label or color is duplicated. 標籤或者顏色重複 FileOperationHelper Burn failed 燒錄失敗 Format_Dialog Dialog 格式化 rom_size 容量大小 system 檔案系統 vfat/fat32 vfat/fat32 exfat exfat ntfs NTFS vfat VFAT ext4 Ext4 device_name 設備名稱 clean it total 完全擦除(時間較長,請確認!) ok 確定 close 關閉 TextLabel 容量 qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format 格式化 Rom size: 容量大小 Filesystem: 檔案系統 Disk name: 設備名稱 Completely erase(Time is longer, please confirm!) 完全擦除(時間較長,請確認!) Set password 設置密碼 Set password for volume based on LUKS (only ext4) 為ext4分區設置基於LUKS的密碼 Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive 格式化為ext4文件系統時可能會導致其他用戶無法讀寫U盤 Cancel 關閉 OK 確定 Data 數據盤 Error locking device: Failed to deactivate device: Device or resource busy 鎖定設備失敗:設備或者資源忙,無法停止。 Warning 警告 Device name cannot start with a decimal point, Please re-enter! 設備名稱不能以小數點開始,請重新輸入! Enter Password: 輸入密碼: Password too short, please retype a password more than 6 characters 密碼過短, 請重新輸入大於6位的密碼 %1/sec, %2 remaining. % 1/秒, 剩餘% 2. over one day 超過一天 getting progress... 取得進度... Error 錯誤 Block not existed! 設備不存在! Formatting. Do not close this window 正在格式化, 請勿關閉 KyFileDialogRename Renaming "%1" 正在重新命名%1 Renaming failed, the reason is: %1 重新命名失敗, 原因: %1 Filename too long 檔名過長 Copying "%1" 複製%1 To "%1" 到%1” Copying failed, the reason is: %1 複製失敗, 原因: %1 Moving "%1" 正在移動%1 Moving failed, the reason is: %1 移動失敗, 原因: %1 File operation error: 檔案操作錯誤: The reason is: %1 原因: %1 Truncation 截斷 Save 保存 All applications 全部應用 Cancel 取消 Apply 應用 Bytes 位元組 Front truncation 前截斷 Post truncation 後截斷 Description: Skip copying files of the current type 說明:跳過當前類型檔的複製 truncate interval 截斷區間 . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select 說明:截斷檔名超過 %1 位元組的部分,去選擇 Explanation: When renaming a file name, ensure it is within %1 bytes and 說明:使用者重命名檔名,保證在 %1 位元組內,去 Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". 說明:預設保存至“%1/擴展”。 modify the name 修改命名 Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip 跳過 Skip All 全部跳过 Rename 重新命名 Please enter a new name 请输入文件名 OK 確定 MainProgressBar File operation 文件操作 starting ... 開始 ... cancel all file operations 取消所有檔操作 Minimize 最小化 Close 關閉 Are you sure to cancel all file operations? 確定取消所有檔操作? Are you sure want to cancel all file operations 確定要取消所有檔案操作? OK 確定 File Operation 檔操作 Cancel 取消 Calculating time 正在計算時間 continue 繼續 pause 暫停 canceling ... 取消中 ... sync ... 同步... %1Mb/s Est. time left: %2 %1Mb/s 預計剩餘時間: %2 MessageDialog Peony 檔管理員 Forcibly pulling out the device may cause data loss or device exceptions! 強制拔出設備可能會導致數據丟失 或數據異常! OtherButton Other queue 其它队列 Other Queue 其它佇列 Peony::AdvanceSearchBar Key Words 關鍵詞 input key words... 輸入關鍵字... Search Location 搜索路徑 choose search path... 選擇要搜尋的位置... browse 流覽 File Type 檔案類型 Choose File Type 選擇檔案類型 Modify Time 修改時間 Choose Modify Time 選擇修改時間 File Size 檔大小 Choose file size 選擇檔案大小 show hidden file 顯示隱藏檔案 go back 後退 hidden advance search page 隱藏高級搜索介面 file name 檔名 content 內容 search 搜索 start search 開始搜索 Select path 選擇路徑 Operate Tips 提示 Have no key words or search location! 沒有關鍵字或路徑! Search file name or content at least choose one! 搜索檔名或者內容請至少指定一個! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File 搜索檔 Peony::AdvancedPermissionsPage Permission refinement settings 許可權細化設置 Permission refinement settings tip 許可權細化設置提示 Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? 設置檔的ACL許可權將改變用檔基本許可權中使用者組的許可權,是否繼續設置檔的ACL許可權? User 使用者 Read 可讀 Write 可寫 Executable 可執行 delete 刪除 Inherit permission 繼承許可權 Add 添加 Apply 應用 Cancel 取消 Peony::AllFileLaunchDialog Choose new application 選擇一個新的應用 Choose an Application to open this file 選擇一個應用打開這個檔 apply now 立即應用 OK 確定 Cancel 取消 Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon 選擇自訂圖示 Type: 類型: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name 名稱 Location 位置 move 移动 symbolLink 快捷方式 Folder 資料夾 Include: 包含: Move 移動 Open with: 開啟方式: Description: 描述: Select multiple files 選取多個檔案 Size: 檔案大小: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: 佔用空間: Time Create: 建立時間: Time Modified: 變更時間: Time Access: 存取時間: Readonly 唯讀 Hidden 隱藏 Readonly (just applied by subfiles) 唯讀(只對資料夾下檔案 ) Property: 屬性: usershare 本機共用 %1 (%2 Bytes) % 1 (% 2 位元組 ) Images (*.png *.jpg *.jpeg *.svg) 圖片(*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. 請選擇小於1MB的圖片。 Choose a new folder: 選擇新的資料夾: Error 錯誤 cannot move a folder to itself ! 不能移動一個資料夾到它內部! %1 Bytes %1 位元組 %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 個檔案, %2 個資料夾 Can't get remote file information 未能獲取遠端文件資訊 %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: 處理器: CPU Core: 核心數: Memory Size: 記憶體: User Name: 使用者名稱: Desktop: 桌面環境: You should mount this volume first 你需要掛載該卷才能查看資訊 Name: 分區名稱: File System 文件系统 Data 數據盤 System Disk 系統盤 Total Space: 總容量: Used Space: 使用空間: In calculation... 計算中... /root used: /root 佔用: /home used: /home 佔用: /usershare used: /usershare 佔用: /data/* used: /data/* 佔用: Unknow (No permission) 未知(無權限檢視) Free Space: 剩餘空間: Type: 檔案系統: Kylin Burner 燒錄 Open with: 開啟: Unknown 未知的分區 Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server 連接伺服器 Ip 伺服器 Port Type 類型 Personal Collection server: 個人收藏伺服器 Add 添加 Delete 刪除 Connect 連接 Ip input error, please re-enter! IP 輸入錯誤, 請重新輸入! Port input error, please re-enter! 連接埠號輸入錯誤, 請重新輸入! add 添加 delete 连接 删除 connect 连接 Warning 警告 ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user 登錄身份 Please enter the %1's user name and password of the server. 請輸入伺服器 %1 的使用者名稱和密碼。 User's identity 連接身份 Guest 遊客(匿名登錄) Name 名稱 Password 密碼 domain Cancel 取消 OK 確定 guest 游客(匿名登录) Registered users 註冊使用者 name 用户名 password 密码 Remember the password 記住密碼 cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop 發送到桌面快捷方式 Create Link to... 傳送快捷方式到... Choose a Directory to Create Link 選擇創建連結的目錄 Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop 發送到桌面快捷方式 Peony::CreateTemplateOperation File create error 創建檔案錯誤 Can not create %1: Read-only mode, can not write-in 無法建立 %1:唯讀模式,無法寫入 NewFile 新建檔 Create file 檔案創建 NewFolder 新建資料夾 Create file error 創建檔案錯誤 Peony::CustomErrorHandler Is Error Handled? 錯誤是否已處理? Error not be handled correctly 錯誤未被正確處理 Peony::DefaultAcitonWidget No default app 沒有設置預設打開方式 Peony::DefaultOpenWithWidget No default app 沒有設置預設打開方式 Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview 選擇你想要預覽的檔 Can not preview this file 不能預覽該檔 Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview 詳細資訊 This is the Default Preview of peony-qt 顯示文件的詳細資訊 Peony::DetailsPropertiesPage Name: 名稱: File type: 檔案類型: Location: 路徑: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss Create time: 建立時間: Modify time: 變更時間: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: 檔案大小: Width: 寬度: Height: 高度: Owner 擁有者 Owner: 擁有者: Computer 計算機 Computer: 電腦: %1 (this computer) %1 (這台電腦) Unknown 未知的分區 Can't get remote file information 不能獲取遠端文件資訊 %1 px %1 像素 Peony::DirectoryView::IconView Icon View 图标视图 warn 警告 This operation is not supported. 不支援此操作。 Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn 警告 This operation is not supported. 不支援此操作。 Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark 添加到快速訪問 &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建資料夾 Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name 檔名稱 File Type 檔案類型 File Size 檔大小 New... 新建... Open in New Window 在新視窗中打開 Open in New Tab 在新標籤頁中打開 Open 打開 Open failed 無法打開 Open directory failed, you have no permission! 無法打開資料夾,沒有許可權! Open with... 打開方式 More applications... 更多應用 Open %1 selected files 打開%1個選取檔案 New 新建 Empty File 空文本 Folder 資料夾 View Type 視圖類型 Sort By 排序類型 Modified Date 修改日期 Original Path 原始路徑 Sort Order... 排序顺序... Ascending Order 升序 Mount 掛載 MultiSelect 多選 Descending Order 降序 Sort Preferences... 排序偏好... Folder First 資料夾優先 Chinese First 中文優先 Show Hidden 顯示隱藏檔案 Copy 複製 Cancel 取消 File:"%1" is not exist, did you moved or deleted it? 檔 %s 不存在,你是否已經刪除或移動到別處? Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut 剪切 Delete to trash 刪除到回收站 Paste 粘貼 Refresh 刷新 Select All 全選 Properties 屬性 format 格式化 Restore 還原 Delete 刪除 Time Modified 修改時間 Path 路徑 Sort Order 排序順序 Newest to oldest 從新到舊 Oldest to newest 從舊到新 Files from large to small 從大到小 Files from small to large 從小到大 Sort Preferences 排序偏好 Error 錯誤 File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever 永久刪除 Rename 重新命名 Select &All 全选(&A) Reverse Select 反選 P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash 清空回收站(&C) Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All 清空全部 Open Parent Folder in New Window 在新視窗中打開檔所在目錄 Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager 外掛程式管理設置 Available extensions 可使用的外掛程式 Ok 確定 Cancel 取消 Peony::FMWindow File Manager 檔管理員 advanced search 高級搜索 clear record 清空歷史 Loaing... Press Esc to stop a loading. 載入... 按下Esc鍵取消. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2019-2020,天津麒麟資訊技術有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo 撤銷 Redo 重做 Peony Qt 檔管理員 Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder 新建資料夾 Peony::FileBatchRenameOperation File Rename error 檔案重新命名錯誤 Invalid file name %1%2%3 . 非法的檔案名%1% 2% 3. File Rename warning 檔重新命名警告 Are you sure to hidden these files? 確定隱藏這些檔? Rename file error 重新命名檔案錯誤 Peony::FileCopy Error in source or destination file path! 源位址或者目標檔路徑出錯! Error when copy file: %1, can not copy special files, skip this file and continue? 拷貝檔: %1 時出錯,不能拷貝特殊類型檔,是否跳過此檔並繼續? Can not copy %1, file doesn't exist. Has the file been renamed or moved? 無法拷貝 %1, 檔案不存在. 是否被重命名或移動? The dest file "%1" has existed! 目標檔案 %1 已經存在! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! vfat/fat32文件系統不支援單檔所佔空間大於4g Error writing to file: Input/output error 寫如檔出錯:輸入輸出錯誤 Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. 創建檔案 %1 失敗,請確認是否是在根目錄創建,或者設備是否正確支援個gphoto2協定。 Failed to create %1. 創建檔案 %1 失敗。 Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! 請確認設備是否被移除! Write file error: There is no available disk space for device! 寫入檔案錯誤: 裝置上沒有足夠可用空間! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure 打開文件失敗 Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel 操作取消 Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 建立目錄%1失敗: %2 File copy error 檔案複製錯誤 The file name exceeds the limit 檔名長度超出限制 Cannot opening file, permission denied! 無法打開檔,許可權不夠! File:%1 was not found. 找不到檔案:% 1. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk 系統盤 File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in 無法複製 %1 到 %2:唯讀模式,無法寫入 Can not copy %1 to %2: Permission denied 無法複製 %1 到 %2:權限不夠 Data 數據盤 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 Link file error 創建檔案連結失敗 Burning does not support replacement 燒錄操作不支援替換檔 Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error 檔刪除錯誤 Delete file error 刪除錯誤 Invalid Operation! Can not delete "%1". 非法的操作! 無法刪除%1. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled 密碼對話框被取消 Message recipient disconnected from message bus without replying! 消息接收者在沒有回復的情況下與消息總線斷開連接! Error 錯誤 Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data 數據盤 folder 資料夾 file text file 文字檔 Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning 警告 Error 錯誤 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 目標資料夾不存在,是否刪除該無效快捷方式? Can not open path "%1",permission denied. 打開路徑 %1 失敗,許可權被拒絕。 Can not find path "%1",are you moved or renamed it? 找不到路徑:「%1」,您是否已經移動或者重新命名? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) 個子項 Symbol Link, 快捷方式, System Disk 系統盤 File Name 檔名稱 Delete Date 刪除日期 Create Date 創建時間 Time Modified 修改時間 File Size 檔大小 Original Path 原始路徑 Path 路徑 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 Operation not supported 操作不支援 File Type 檔案類型 Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label 添加標記 Delete All Label 刪除所有標記 Label Management ... 識別管理 ... Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... 識別管理 ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1%2 開啟方式 unknown 未知 No application is set to open file "%1 %2" 未設定用來打開檔案「%1%2」 的應用程式。 Still using the last opened application: 仍使用最後開啟的應用: known 已知 Open application is used by default: 預設使用開啟的應用程式: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. 您可以在軟體中心搜索能夠打開此檔案的應用程式,或者選取電腦上的現有應用程式。 Other application: 其他應用程式: Select application: 選取應用程式: Always open the %1%2 file with this application 始終用該應用打開%1%2檔 Choose other application 選擇其他應用 Go to application center 去軟體中心安裝應用 Ok 確定 Cancel 取消 Desktop files(*.desktop) 桌面檔(*.desktop) Select Open Action 選擇打開方式 Select 選擇 Peony::FileLaunchAction Execute Directly 直接運行 Execute in Terminal 在終端運行 Detected launching an executable file %1, you want? 正在打開一個可執行檔案%1, 你希望? Delete file Warning 删除文件警告 Open Failed 無法打開 Can not open %1, file not exist, is it deleted? 無法開啟%1,檔案不存在,請確認是否已被刪除? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission 沒有許可權 File is not readable. Please check if file has read permisson. 檔案不可讀,請確認當前使用者擁有檔的讀許可權。 By Default App 使用默認打開方式 Launch Options 執行選項 Open Link failed 打開連結失敗 File not exist, do you want to delete the link file? 目標檔不存在,您需要刪除該連結嗎? Can not open %1, Please confirm you have the right authority. 無法開啟%1,請確認您有正確的打開許可權。 Open App failed 快捷方式存在問題 The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? 該連結指向的應用已經被修改或者卸載,因此該快捷方式無法正常工作。 是否刪除該快捷方式? Error 錯誤 File original path not exist, are you deleted or moved it? 檔案原始路徑未找到,您是否已經移動或刪除了它? Can not get a default application for opening %1, do you want open it with text format? 沒有找到預設開啟% 1 的應用程式, 是否用文字編輯器開啟? Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link 快捷方式 Link file error 創建檔案連結失敗 Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error 移動檔案錯誤 File System 文件系统 Data 數據盤 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 File move error 檔案移動錯誤 Invalid move operation, cannot move a file into its sub directories. 非法的移動操作,不能移動資料夾到自身路徑下。 The file name exceeds the limit 檔名長度超出限制 Create file error 創建檔案錯誤 Can not move %1 to %2: Read-only mode, can not write-in 無法移動 %1 到 %2:唯讀模式,無法寫入 Can not move %1 to %2: Permission denied 無法移動 %1 到 %2:權限不夠 Cannot opening file, permission denied! 無法打開檔,許可權不夠! File:%1 was not found. 找不到檔案:% 1. Invalid Operation. 非法的操作. System Disk 系統盤 open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error 檔刪除錯誤 Link file error 創建檔案連結失敗 Burning does not support replacement 燒錄操作不支援替換檔 Burn failed 刻录失败 File delete 文件删除 Invalid Operation 非法的操作 Peony::FileOperationAfterProgressPage &More Details 詳細資訊(&M) Peony::FileOperationErrorDialog File Operation Error 檔操作錯誤 unkwon 未知原因 null Error message: 錯誤資訊: Source File: 來源檔: Dest File: 目標檔案: Ignore 忽略 Ignore All 全部忽略 Overwrite 覆蓋 Overwrite All 全部覆蓋 Backup 備份 Backup All 全部備份 &Retry 重試(&R) &Cancel 取消(&C) Peony::FileOperationErrorDialogBase Close 關閉 Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace 替換 Ignore 忽略 Do the same 全部應用 <p>This location already contains the file '%1', Do you want to override it?</p> <p>此位置已包含名稱為「%1」 的檔案,您確定要取代它嗎? </p> Unexpected error from %1 to %2 從 %1 至 %2 操作發生異常錯誤 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup 備份 Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel 取消 Delete 刪除 Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Peony::FileOperationErrorDialogWarning OK 確定 Cancel 取消 Skip all 全部跳過 Make sure the disk is not full or write protected and that the file is not protected 請確認磁碟未滿或未被寫保護而且檔未被使用 Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link 快捷方式 Copy 複製 Move 移動 Rename 重新命名 Link 連結 Delete 刪除 Delete Permanently 永久刪除 Restore 還原 New 新建 - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn 警告 '%1' is occupied,you cannot operate! “%1”已被佔用,您無法進行操作! No, go to settings 否,跳转到设置 OK 刪除 Cancel 取消 Do you want to put selected %1 item(s) into trash? 確認要將選取的 %1 項放入回收站嗎? Do not show again 不再顯示 File System 文件系统 System Disk 系統盤 Data 數據盤 Insufficient storage space 存儲空間不足 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 設備可用空間不足,拷貝檔案大小:%2 GB,需要空間:%3 GB。 Can't delete. 不能刪除 You can't delete a file whenthe file is doing another operation 不能刪除一個正在進行其它操作的檔 File Operation is Busy 操作正忙 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. 在執行該操作之前有操作未完成,它需要等待上一個操作完成後再執行。 如果你希望檔操作並行,你可以更改選項功能表中的「允許操作並行」配置。 The long name file is saved to %1 長檔被保存到%1 Undo %1 撤銷 %1 Redo %1 重做 %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: 總計: state: 狀態: Peony::FileOperationProgressPage &More Details 詳細資訊(&M) From: 從: To: 到: Peony::FileOperationProgressWizard File Manager 檔管理員 &Cancel 取消(&C) Preparing... 準備中... Handling... 處理... Clearing... 正在清理... Rollbacking... 回滾中... File Operation 檔操作 A file operation is running backend... 檔案操作正在後台執行中... %1 files, %2 %1個檔,共%2 %1 done, %2 total, %3 of %4. 完成%1,共%2,%4中的第%3個。 clearing: %1, %2 of %3 正在清理:%1,%3中的第%2個 copying... 複製中... Syncing... 同步... Peony::FilePreviewPage File Name: 文件名称: File Type: 類型 Time Access: 上次打開時間 Time Modified: 修改時間 Children Count: 包含檔案 Size: 大小 Location: 所在位置: Time Created: 創建時間 Image resolution: 解析度 color model: 色彩模式 <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>打開檔</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>打開檔位置</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a href='#' style = 'text-decoration:none'>從該空間移除</a> Cancel 取消 OK 確定 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> Do you want to remove this file?<br> 確定要移除該檔嗎? Do not ask again 不再提醒 usershare 本機共用 Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden 共%1項,其中%2個隱藏檔 Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error 檔案重新命名錯誤 Invalid file name %1%2%3 . 非法的檔案名%1% 2% 3. Are you sure to hidden this file? 確定隱藏該檔? When change the file suffix, the file may be invalid. Are you sure to change it ? 改變擴展名可能導致檔不可用,確認更改嗎? A file and a directory with the same name cannot replace each other 同名的文件和資料夾,無法相互替換。 The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning 檔重新命名警告 The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error 重新命名檔案錯誤 Peony::FileTrashOperation File trash error 刪除檔到回收站錯誤 Can not trash %1: Read-only file system 無法刪除 %1 到回收站:唯讀檔案系統 trash:/// trash:/// Trash file error 刪除檔到回收站錯誤 Invalid Operation! Can not trash "%1". 非法的操作! 不能回收 %1. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. 存在無法處理的衝突,請檢查回收站。 The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error 從回收站恢復文件錯誤 Can not find trashed file %1, might be restored or removed. 無法找到回收的檔案 %1,檔案可能被還原或者刪除。 Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread 最大化 Minimize 最小化 Close 關閉 Peony::IDMActionsManager Rename Spaces 重新命名空間 Space Name 空間名稱 Please input space name 請輸入空間名稱 OK 確定 Cancel 取消 Rename Space 重新命名空間 Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. 無法重新命名空間%1為%2,空間%2已存在。 Edit Space Condition 編輯空間條件 Close dynamically 關閉動態更新 Open dynamically 打開動態更新 Delete Spaces 刪除空間 Are you sure to delete space %1 ? 確定要刪除空間%1? Open 打開 Open With 打開方式 More applications 更多應用 Open The Folder Location 打開檔所在位置 Add File 添加檔 Choose file to add into space 選擇要添加到空間的檔 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 Move to space 移動至空間 Remove From Space 從該空間內移除 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空間檔聚合更新時,這些檔不再顯示</font> Do you want to remove selected %1 item(s)?<br> 確定要移除這 %1項檔案嗎? <br> Do you want to remove this file?<br> 確定要移除該檔嗎? Do not ask again 不再提醒 Copy 複製 Save As 另存為 file All File 所有檔 This location has no write permission.please change the storage location 該位置無儲存許可權,建議更換位置 Label 標記 Properties 屬性 Peony::ImageMountManager Invalid device path: %1 設備路徑不可用:%1 Cannot find loop device for path: %1 無法找到虛擬塊設備路徑:%1 Failed to unmount filesystem: %1 卸載檔系統失敗:%1 Failed to delete loop device: %1 刪除虛擬塊設備失敗:%1 Peony::LabelSettings Name 標記名 SideBar 邊欄 Menu 右鍵功能表 Create New Label 新建標識 Delete Label 刪除標識 Display the following items in the identification area: (maximum of 6) 在識別區顯示如下項:(最多6個) Rename 重新命名 Edit Color 修改標識顏色 Delete This Label 刪除此標識 Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" 在“%2”中搜索“%1” File System 檔案系統 Search results for all files marked in "%1" in "%2" 在「%2」 中搜索所有「%1」標識文件的結果 &Copy Directory 拷贝路径(&C) Open In New Tab 在新標籤頁中打開 Open In New Window 在新視窗中打開 Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory 拷貝路徑 Peony::MountOperation Operation Cancelled 操作被取消 Login failed, unknown username or password error, please re-enter! 驗證失敗,未知的使用者名或者密碼錯誤,請重新輸入! Peony::NavigationToolBar Go Back 後退 Go Forward 前進 History 歷史 Clear History 清空歷史 Cd Up 向上 Refresh 刷新 Peony::NewFileLaunchDialog Choose new application 選擇一個新的應用 Choose an Application to open this file 選擇一個應用打開這個檔 apply now 立即應用 OK 確定 Cancel 取消 Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? 您希望以什麼方式打開「%1%2」檔? Default open with: 預設開啟方式: Other: 其他: Choose other application 選擇其他應用 Go to application center 去軟體中心 Peony::PathEdit Go To 跳轉 Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 物件名稱: %1 Read and Write 讀寫 Readonly 唯讀 Group or User 使用者或組 (Current User) (當前使用者) Current User 當前使用者 Permissions modify tip 許可權修改提示 The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? 當前檔或目錄已經設置了ACL許可權,修改使用者組許可權可能導致ACL許可權不可用,是否繼續修改使用者組許可權? Permission refinement settings 許可權細化設置 The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? 當前使用者已經設置了高級共用,如果修改許可權,高級共用可能不可用,是否希望繼續設置? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. 無法獲取檔案許可權相關信息。 (Me) (我) Others 其他 Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. 你無法修改該文件的許可權。 Me User 用户 Peony::PropertiesSetDialog Confirming property settings 確認屬性設置 Whether to apply to the current selected option or to selected options and subfolders and subfiles. 是否應用於當前所選項,還是應用於所選項以及子資料夾和子檔。 Apply the current selection 應用於當前所選項 Apply the current selection as well as subfolders and subfiles 應用於目前所選項以及子資料夾和子檔 Ok 確定 Cancel 取消 Peony::PropertiesWindow Trash 回收站 Recent 最近 Selected 選中 %1 Files %1 個檔案 usershare 本機共用 Data 數據盤 System Disk 系統盤 Properties 屬性 Ok 確定 Cancel 取消 Restore 還原 Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. 刪除到回收站時彈出確認框。 Origin Path: 原路徑: Deletion Date: 刪除日期: Size: 檔案大小: Original Location: 原路徑: Peony::SearchBar Input the search key of files you would like to find. 輸入關鍵字以搜尋你想搜尋的檔案. Input search key... 輸入關鍵字... advance search 高級搜索 clear record 清空歷史 Peony::SearchBarContainer Choose File Type 选择文件类型 Search File 搜索檔 Clear 清空 all 全部 file folder 資料夾 image 圖片 video 視頻 text file 文本 audio 音訊 others 其它 wps file WPS檔 Peony::SharedFileLinkOperation Symbolic Link 快捷方式 The dest file "%1" has existed! 目標檔案 %1 已經存在! Link file error 創建檔案連結失敗 Peony::SideBarCloudItem CloudStorage 雲存儲 CloudFile 雲檔 Peony::SideBarFavoriteItem Trash 回收站 Recent 最近 Quick Access 快速訪問 Quick access 快速访问 Favorite 快速访问 KmreData 移動應用 Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data 數據盤 Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties 屬性 Delete Symbolic 刪除 Unmount 卸載 Eject 彈出 Format 格式化 burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network 網路 Peony::SideBarPersonalItem Personal 個人 Peony::SideBarSeparatorItem (No Sub Directory) (空) Peony::StatusBar ; %1 folders ; %1個資料夾 ; %1 files, %2 total ; %1個檔案,總共%2 ; %1 folder ; %1個資料夾 ; %1 file, %2 ; %1 個檔案,%2 %1 selected 選中%1項 Peony::SyncThread notify 温馨提示 温馨提示 Notify 溫馨提示 Peony::TagManagement General 通用 Mark 標記 Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type 排序類型 File Name 檔名稱 File Type 檔案類型 File Size 檔大小 Modified Date 修改日期 Open in New window 在新視窗中打開 Open in new Tab 在新標籤頁中打開 Ascending 升序 Descending 降序 Copy 複製 Paste 粘貼 Cut 剪切 Trash 刪除 Clean Trash 清空回收站 Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore 還原 Options 選項 Forbid Thumbnail 禁用縮圖 Show Hidden 顯示隱藏檔案 Resident in Backend 常駐後台 Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. 讓檔管理員在關閉所有視窗后仍然運行,這將縮短下次啟動所需要的時間,但是也會一直佔用資源。 &Help 說明(&H) &About... 關於... (&A) Peony Qt 檔管理員 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2019,天津麒麟資訊技術有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow 未知 Type: 類型: Duration: 時長: Size: 大小: Loading... 載入中... Res: 解析度: Mod Date: 變更日期: Deleted date: 刪除日期: Original path: 原路徑: Peony::UserShareInfoManager Warning 警告 Peony::VolumeManager Error 錯誤 ProgressBar starting ... 開始 ... canceling ... 取消中 ... sync ... 同步... continue 繼續 pause 暫停 close 關閉 cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View 圖示檢視 Show the folder children as icons. 以圖示形式顯示目錄. List View 清單檢視 Show the folder children as rows in a list. 以清單形式顯示目錄. Basic Preview Page 基本 Basic 基本 Show the basic file properties, and allow you to modify the access and name. 顯示檔案的基本屬性,允許修改檔名稱。 Permissions Page 权限 Permissions 權限 Show and modify file's permission, owner and group. 查看和修改文件的許可權。 Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? 檔過大,不可移入回收站。 是否永久刪除該檔? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? 檔過大,不可移入回收站。 是否永久刪除這 %1 項檔? Delete 刪除 Clean the Trash 清空回收站 OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. 確認要清空回收站內的檔嗎? 此操作無法撤銷。 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties 計算機屬性 Show the computer properties or items in computer. 顯示電腦屬性或計算機中的項。 Trash and Recent Properties Page 最近/回收 Trash and Recent 回收站/最近 Show the file properties or items in trash or recent. 顯示「回收站」或「最近」中的文件屬性或專案。 eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed 格式化失敗 YES 確認 Formatting successful! But failed to set the device name. 格式化成功! 設備名設置失敗。 qmesg_notify 通知 Format 格式化 Begin Format 開始 Close 關閉 Format operation has been finished successfully. 格式化操作已成功完成。 Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷將清除其上的所有數據。 請在格式化之前備份所有保留的數據。 您想繼續嗎? format 格式化 begin format 开始 close 关闭 File Manager 檔管理員 Notify 溫馨提示 notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed 強制卸載失敗 Error: %1 錯誤: %1 Data synchronization is complete,the device has been unmount successfully! 數據同步完成,設備已經成功卸載! Unmount failed 卸載失敗 Not authorized to perform operation. 操作未獲得授權。 Unable to unmount it, you may need to close some programs, such as: GParted etc. 無法卸載,您可能需要先關閉一些程式,如分區編輯器等。 Error: %1 Do you want to unmount forcely? 錯誤: %1 是否強制卸載? Cancel 取消 Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase 無法啟動裝置: 錯誤的口令 The device has been mount successfully! 設備掛載成功! Eject device failed, the reason may be that the device has been removed, etc. 彈出設備失敗,可能是設備已經被移除等原因。 Data synchronization is complete and the device can be safely unplugged! 數據同步完成,設備可以安全拔出! Password is empty, please re-enter! 密碼為空,請重新輸入! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed 彈出失敗 favorite 快速訪問 Favorites 快速訪問 File is not existed. 檔案不存在. Share Data 本機共用 Trash 回收站 Recent 最近 Operation not supported 操作不支援 The virtual file system does not support folder creation 虛擬檔案系統下不支援創建新資料夾 Can not create a symbolic file for vfs location 無法為虛擬目錄創建快捷方式 Symbolic Link 快捷方式 Can not create symbolic file here, %1 無法在此建立快捷方式, %1 Can not add a file to favorite directory. 檔案不能被添加到我的最愛. The virtual file system cannot be opened 虛擬檔案系統無法打開 Virtual file directories do not support move and copy operations 虛擬檔案路徑不支援移動和複製操作 Default favorite vfs of peony 檔管理員虛擬檔案系統預設快速訪問 Details 詳細資訊 Mark 標記 mark this file. 標記這個檔。 Open With 打開方式 open with. 打開方式。 It need to synchronize before operating the device,place wait! 操作設備前需要同步數據,請稍等! Unable to discover the file, it may have been removed or deleted. 未找到檔,可能被移動或刪除。 permission denied 沒有許可權 file not found 没有发现该文件 duplicate 副本 Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data 數據盤 System Disk 系統盤 label 標記 Computer 計算機 File System 文件系统 Data 數據盤 Failed to open file "%1": insufficient permissions. 打開檔案%1 失敗:許可權不足。 File “%1” does not exist. Please check whether the file has been deleted. 檔%1 不存在,請檢查檔是否被刪除。 burn operation has been cancelled 燒錄操作已取消 is busy! 被佔用! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. 確定永久刪除該檔嗎? 一旦開始刪除,檔將不可恢復。 Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. 確定永久刪除這 %2 項檔案嗎? 一旦開始刪除,檔將不可恢復。 Virtual file directories do not support move operations 虛擬檔案路徑不支援移動和複製操作 test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space 智能空間 File %1 is existed in space, please not add file repeatly. 空間已存在檔案 %1,不可重複添加。 SpaceSaveDialog Save as space 存為智能空間 Space Name 空間名稱 Please input space name 請輸入空間名稱 Dynamically Update Space Files 動態更新空間檔 Cancel 取消 Ok 確定 Failed to create space %1,%1 is existed 創建空間%1失敗,%1已存在。 UdfBurn::UdfAppendBurnDataDialog AppendBurnData 追加刻錄 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 No burn data, please add! 沒有燒錄資料, 請新增! The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! AppendBurnData operation has been finished successfully. 追加刻錄操作已完成。 Sorry, the appendBurnData operation is failed! 抱歉, 追加刻錄操作出錯! Failed 失敗 Burning. Do not close this window 燒錄中, 請勿關閉此視窗 Burning this disc will append datas on it. Do you want to continue ? 燒錄此光碟將在其後追加數據, 是否繼續? Burn 燒錄 Begin Burning 開始燒錄 Close 關閉 UdfBurn::UdfFormatDialog Format 格式化 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Failed 失敗 Formatting. Do not close this window 正在格式化, 請勿關閉 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光碟將擦除其上的所有數據。 請在格式化前備份所有保留的數據。 要繼續嗎 ? Begin Format 開始 Close 關閉 UdfFormatDialog Format 格式化 Disc Type: 光碟類型: Device Name: 裝置名稱: OK 確定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 設備名稱不能設置為空,請重新輸入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遺憾,格式化操作失敗了,您可以重新試下! Failed 失敗 Formatting. Do not close this window 正在格式化, 請勿關閉 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光碟將擦除其上的所有數據。 請在格式化前備份所有保留的數據。 要繼續嗎 ? Begin Format 開始 Close 關閉 progressBarHelper Time is being calculated 正在计算时间 Calculating time 正在計算時間 %1day%2hrs%3mins%4sec %1天%2小時%3分鐘%4秒 %1hrs%2mins%3sec %1小時%2分鐘%3秒 %1 mins%2sec %1 分鐘%2秒 %1sec %1秒 peony/translations/libpeony-qt/libpeony-qt_fa.ts0000664000175000017500000046210515154271070021111 0ustar fengfeng ConnectServerDialog Connect to Sever اتصال به سرور Domain دامنه Password گذرواژه Save Password ذخیرۀ گذرواژه User کاربر Anonymous ناشناس Ok تأیید Cancel لغو FileLabelModel Red قرمز Orange نارنجی Yellow زرد Green سبز Blue آبی Purple بنفش Gray خاکستری Transparent شفاف Delete file Warning Dosya Silme Uyarısı Error خطا Label or color is duplicated. برچسب یا رنگ، تکراری است. Format_Dialog Dialog rom_size system سیستم vfat/fat32 exfat ntfs NTFS vfat VFAT ext4 Ext4 device_name clean it total ok تأیید close لغو TextLabel Format operation has been finished successfully. عملیات فرمت‌کردن با موفقیت به پایان رسید. Sorry, the format operation is failed! متأسفانه عملیات فرمت‌کردن انجام نشد! format فرمت begin format آغاز فرمت‌کردن format_success Biçimlentirme başarılı format_err Biçimlendirme hatalı Format Rom size: Filesystem: Disk name: Completely erase(Time is longer, please confirm!) Cancel لغو OK Formatting. Do not close this window MainProgressBar File operation starting ... cancel all file operations Are you sure want to cancel all file operations canceling ... sync ... OK Cancel لغو OtherButton Other queue Peony::AdvanceSearchBar Key Words کلمات کلیدی input key words... کلمات کلیدی را وارد کنید... Search Location محل جستجو choose search path... محل جستجو را انتخاب کنید... browse File Type Choose File Type Modify Time Choose Modify Time File Size Choose file size show hidden file go back hidden advance search page file name content search start search Select path Operate Tips Have no key words or search location! Search file name or content at least choose one! Search content or file name at least choose one! İçeriği veya dosya adını en az birini seçin! all file folder image video text file audio others wps file today this week this month this year year ago tiny(0-16K) small(16k-1M) medium(1M-100M) big(100M-1G) large(>1G) Peony::AdvancedLocationBar Search Content... Peony::AllFileLaunchDialog Choose new application Choose an Application to open this file apply now OK Cancel لغو Peony::BasicPropertiesPage Type: Time Modified: Change Name Location move symbolLink Folder Include: Open with: Description: Select multiple files Size: Space Useage: Time Access: Readonly Hidden Property: usershare %1 (%2 Bytes) Choose a new folder: Error خطا cannot move a folder to itself ! Choose a custom icon %1 Bytes %1 files, %2 folders Can't get remote file information Peony::ComputerPropertiesPage CPU Name: CPU Core: Memory Size: User Name: Desktop: You should mount this volume first Name: File System Data Total Space: Used Space: Free Space: Type: Kylin Burner Open with: Unknown Peony::ConnectServerDialog connect to server ip port type Personal Collection server: add delete connect Peony::ConnectServerLogin The login user Please enter the %1's user name and password of the server. User's identity guest Registered users name password Remember the password cancel ok تأیید Peony::CreateLinkInternalPlugin Create Link to Desktop Create Link to... Choose a Directory to Create Link Peony-Qt Create Link Extension Create Link Menu Extension. Peony::CreateTemplateOperation NewFile Create file Dosya oluştur NewFolder Create file error Peony::CustomErrorHandler Is Error Handled? Error not be handled correctly Peony::DefaultOpenWithWidget No default app Peony::DefaultPreviewPage Select the file you want to preview... Can not preview this file. Can not preivew this file. Bu dosya önizlemesi görüntülenemiyor. Peony::DefaultPreviewPageFactory Default Preview This is the Default Preview of peony-qt Peony::DetailsPropertiesPage Name: File type: Location: Create time: Modify time: yyyy-MM-dd, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP File size: Width: Height: Owner Owner: Computer Computer: %1 (this computer) Unknown Can't get remote file information %1 px Peony::DirectoryView::IconView Icon View Simge Görünümü Peony::DirectoryView::IconView2 Icon View Simge Görünümü Peony::DirectoryView::ListView List View Liste Görünümü Peony::DirectoryView::ListView2 List View Liste Görünümü Peony::DirectoryViewFactoryManager Icon View Simge Görünümü Peony::DirectoryViewMenu Add to bookmark &New... &Yeni New Folder Icon View Simge Görünümü List View Liste Görünümü View Type... Sort By... Name File Type File Size New... Open in New Window Open in New Tab Open Open with... More applications... Open %1 selected files Empty File Folder Modified Date Sort Order... Ascending Order Descending Order Sort Preferences... Folder First Chinese First Show Hidden Copy File:"%1" is not exist, did you moved or deleted it? Peony-Qt filesafe menu Extension Cut Delete to trash Paste Delete Refresh Select All Properties format فرمت Restore Error خطا Cu&t &Kes Delete forever Kalıcı Olarak Sil Rename Reverse Select P&roperties &Özellikler &Rename &Yeniden Adlandır &Properties Özellikler &Clean the Trash Delete file Warning Dosyayı Sil Uyarısı Delete Permanently حذف همیشگی Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Clean All Open Parent Folder in New Window Peony::DirectoryViewWidget Directory View Dizin Görünümü Peony::FMWindow File Manager advanced search clear record Loaing... Press Esc to stop a loading. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Ctrl+H Show|Hidden Ctrl+H Undo Redo Peony Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. New Folder Peony::FileCopy Error in source or destination file path! The dest file "%1" has existed! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Error opening source or destination file! Please check whether the device has been removed! File opening failure operation cancel Peony::FileCopyOperation File copy Dosya kopyalama File copy error Cannot opening file, permission denied! Peony::FileDeleteOperation File delete Dosya silme File delete error Delete file error Invalid Operation! Can not delete "%1". Peony::FileEnumerator Delete file Warning Dosyayı Sil Uyarısı Error خطا Peony::FileInfo data Peony::FileInfoJob Trash Computer Network Recent Peony::FileItem Delete file Warning Dosyayı Sil Uyarısı Error خطا Open Link failed File not exist, do you want to delete the link file? Can not open path "%1",permission denied. Can not find path "%1",are you moved or renamed it? Peony::FileItemModel child(ren) Symbol Link, File Name Delete Date File Size File Type Modified Date Peony::FileLabelInternalMenuPlugin Add File Label... Delete All Label Peony File Labels Menu Extension Tag a File with Menu. Peony::FileLauchDialog Applications Choose an Application to open this file Set as Default OK Cancel لغو Peony::FileLaunchAction Execute Directly Execute in Terminal Detected launching an executable file %1, you want? Delete file Warning Dosyayı Sil Uyarısı Open Failed Can not open %1, file not exist, is it deleted? File not exist, is it deleted or moved to other path? Dosya mevcut değil, silinmiş veya başka bir yere taşınmış olabilir Can not open %1 %1 açılamadı By Default App Launch Options Open Link failed File not exist, do you want to delete the link file? Can not open %1, Please confirm you have the right authority. Open App failed The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Error خطا Can not get a default application for opening %1, do you want open it with text format? Peony::FileLinkOperation Symbolic Link Link file error Link file Dosyayı bağla Peony::FileMoveOperation Invalid move operation, cannot move a file itself. Geçersiz taşıma işlemi, bir dosyanın kendisini taşıyamaz. Move file Dosyayı taşı Create file Dosya oluştur Move file error Create file error Invalid Operation. File delete error File delete Dosya silme Invalid Operation Peony::FileOperationAfterProgressPage &More Details Peony::FileOperationErrorDialog File Operation Error unkwon null Error message: Source File: Dest File: Ignore Ignore All Overwrite Overwrite All Backup Backup All &Retry &Cancel Peony::FileOperationErrorDialogConflict Replace Ignore Do the same <p>This location already contains the file '%1', Do you want to override it?</p> Backup Peony::FileOperationErrorDialogNotSupported Yes Cancel لغو Do the same Make sure the disk is not full or write protected and that the file is not protected Peony::FileOperationErrorDialogWarning OK Cancel لغو Make sure the disk is not full or write protected and that the file is not protected Please make sure the disk is not full or not is write protected, or file is not being used. Lütfen diskin dolu olmadığından veya yazmaya karşı korumalı olmadığından veya dosyanın kullanılmadığından emin olun. Peony::FileOperationInfo Symbolic Link - Symbolic Link - Symbolik Link Peony::FileOperationManager Delete file Warning Dosyayı Sil Uyarısı No, go to settings Do you want to put selected %1 item(s) into trash? Can't delete. You can't delete a file whenthe file is doing another operation File Operation is Busy There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. Daha önce bir veya daha fazla dosya işlemi yürütüldü. Operasyonunuz tamamlanana kadar yürütmeyi bekleyecektir. Peony::FileOperationPreparePage counting: state: Peony::FileOperationProgressPage &More Details From: To: Peony::FileOperationProgressWizard File Manager &Cancel Preparing... Handling... Clearing... Rollbacking... File Operation A file operation is running backend... %1 files, %2 %1 done, %2 total, %3 of %4. clearing: %1, %2 of %3 copying... Syncing... Peony::FilePreviewPage File Name: File Type: Time Access: Time Modified: Children Count: Size: Image resolution: color model: usershare %1x%2 %1 total, %2 hidden Peony::FileRenameOperation Rename file Dosyayı yeniden isimlendir File Rename error Invalid file name %1%2%3 . File Rename warning The file %1%2%3 will be hidden when you refresh or change directory! Rename file error Peony::FileTrashOperation trash:/// Trash file error Invalid Operation! Can not trash "%1". Can not trash Can not trash files more than 10GB, would you like to delete it permanently? Can not trash this file, would you like to delete it permanently? Trash file Çöp dosyası Peony::FileUntrashOperation Untrash file Dosyayı geri al Untrash file error Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::LocationBar Search "%1" in "%2" File System Open In New Tab Open In New Window Copy Directory ">Dizini Kopyala Peony::MountOperation Operation Cancelled Peony::NavigationToolBar Go Back Go Forward History Clear History Cd Up Refresh Peony::NewFileLaunchDialog Choose new application Choose an Application to open this file apply now OK Cancel لغو Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? Default open with: Other: Choose other application Go to application center Peony::PathEdit Go To Peony::PermissionsPropertiesPage User or Group Type Target: %1 Read Write Executable Can not get the permission info. (Me) Others Owner Group Other You can not change the access of this file. Me User کاربر Peony::PropertiesWindow Trash Recent Selected %1 Files usershare Properties Ok تأیید Cancel لغو Close Kapat Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing. Origin Path: Deletion Date: Size: Original Location: Peony::SearchBar Input the search key of files you would like to find. Input search key... advance search clear record Peony::SearchBarContainer Clear all file folder image video text file audio others wps file Peony::SideBarFavoriteItem Favorite Peony::SideBarFileSystemItem Data Peony::SideBarMenu &Properties Özellikler P&roperties Özellikler Properties Delete Symbolic Unmount Eject format فرمت Peony::SideBarModel Network Peony::SideBarPersonalItem Personal Peony::SideBarSeparatorItem (No Sub Directory) Peony::StatusBar ; %1 folders ; %1 files, %2 total ; %1 folder ; %1 file, %2 %1 selected Peony::SyncThread notify Peony::ToolBar Open in new &Window Yeni Pencerede Aç Sort Type File Name File Type File Size Modified Date Open in New window Open in new Tab Ascending Descending Copy Paste Cut Trash Clean Trash Delete file Warning Dosyayı Sil Uyarısı Delete Permanently حذف همیشگی Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Restore Options Forbid Thumbnail Show Hidden Resident in Backend Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. &Help &About... Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Peony::VolumeManager Error خطا ProgressBar starting ... canceling ... sync ... Cancel لغو QObject Icon View Simge Görünümü Show the folder children as icons. List View Liste Görünümü Show the folder children as rows in a list. Basic Show the basic file properties, and allow you to modify the access and name. Permissions Show and modify file's permission, owner and group. Can not trash Can not trash these files. You can delete them permanently. Are you sure doing that? Can not trash files more than 10GB, would you like to delete it permanently? Delete Permanently حذف همیشگی Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Computer Properties Show the computer properties or items in computer. Trash and Recent Show the file properties or items in trash or recent. eject device failed Aygıtı çıkarma başarısız oldu Please check whether the device is occupied and then eject the device again Lütfen cihazın dolu olup olmadığını kontrol edin ve ardından cihazı tekrar çıkarın Format failed YES Formatting successful! But failed to set the device name. qmesg_notify Format operation has been finished successfully. عملیات فرمت‌کردن با موفقیت به پایان رسید. Sorry, the format operation is failed! متأسفانه عملیات فرمت‌کردن انجام نشد! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? format فرمت begin format آغاز فرمت‌کردن close لغو File Manager Default search vfs of peony Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Not authorized to perform operation. Unable to unmount it, you may need to close some programs, such as: GParted etc. Eject failed Cancel لغو The device has been mount successfully! Data synchronization is complete and the device can be safely unplugged! Error: %1 Do you want to unmount forcely? Details Mark mark this file. Open With open with. permission denied file not found It need to synchronize before operating the device,place wait! favorite Share Data Operation not supported Virtual file directories do not support move and copy operations The virtual file system does not support folder creation Can not create a symbolic file for vfs location Symbolic Link Can not create symbolic file here, %1 The virtual file system cannot be opened Default favorite vfs of peony duplicate data Failed to open file "%1": insufficient permissions. File “%1” does not exist. Please check whether the file has been deleted. Computer File System peony/translations/libpeony-qt/libpeony-qt_kk.ts0000664000175000017500000113221315154271106021123 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... بەلگى باسقارۋ ... Remove "%1" «%1» نى شىعارىپ وتۋ delete "%1" 删除“%1” add "%1" «%1» نى قوسۋ ConnectServerDialog Connect to Sever Sever عا اۋلاۋ Domain تور مى Password قۇپيا كىلت Save Password پارولدى ساقتاۋ User پايدالانۋشٸ Anonymous اتسىز Ok ماقۇل Cancel كۇشىنەن قالدىرۋ DiscControl is busy! وتە قاربالاس! is busy! قاربالاس not support udf at present. قازىرشا udf نى قولدامايدى. unmount disc failed before udf format. UDF پىشىننەن بۇرٸن دەسكانى دومالاتۋ جەڭىلىپ قالدى. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf حۇجاتى ٴپىشىنى. preparation failed before DVD-RW udf format. DVD-RW udf پىشىننەن بۇرٸن دايٸنداۋ جەڭىلىپ قالدى. FileLabelModel Red قىزىل Orange قىزعىش سارى رەڭ Yellow سارى رەڭ Green جاسىل Blue كوك Purple كۇلگىن رەڭ Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error قاتەلىك Label or color is duplicated. بەلگى ياكي رەڭ كوبەيتىلگەن. FileOperationHelper Burn failed كۇيگىرتكىشىن جەڭىلىپ قالدى Format_Dialog Dialog ديالوگ rom_size rom_رىزمەر system سەستيما vfat/fat32 exfat ntfs vfat VFAT ext4 device_name clean it total بۇتٸندەپ تازالاۋ ok ماقۇل close تاقاۋ TextLabel تەكىسىت بەلگىسى qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format ٴپىشىم Rom size: rom ۇلكەن-كشىلگى: Filesystem: حۇجات سەستيماسى: Disk name: ديسكا ديسكا مى: Completely erase(Time is longer, please confirm!) ۇزىلدى - كەسىلدى ٴوشىرۋ (ۋاقىت ۇزىن، كەسٸم جاساۋ!) Set password پارولدى بەلگٸلەۋ Set password for volume based on LUKS (only ext4) LUKS عا نەگىزىنەن كولەمى ٷشٸن پارولدى بەلگٸلەۋ (تەك ext4) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive ext4 حۇجات سەستاماسىعا فورماتتاۋ باسقا قاريدارلاردىڭ USB دەسكادا وقۋ ياكي يازالماسلىقىنى كەتىرىپ شٸعۋٸ مۇمكان Cancel كۇشىنەن قالدىرۋ OK تۇراقتاندىرۋ Data ساندىق مالىمەت Error locking device: Failed to deactivate device: Device or resource busy اسبابٸن قۇلۇپلاشتا قاتەلىك كورىلدى: اسبابٸن توقتاتۋ جەڭىلىس قالدى: اسباب ياكي بايلىق قاربالاس Warning ەسكەرتۋ Device name cannot start with a decimal point, Please re-enter! اسباب مى وندٸق نۇكتە مەنەن باستاعالى بولمايدى، قاتە كىرگىزىڭىز! Enter Password: پارولدى كىرگىزىڭىز: Password too short, please retype a password more than 6 characters پارول وتە قىسقا، 6 ٴارىپتەن ارتىق پارولدى قاتە كىرگىزىڭىز %1/sec, %2 remaining. %1/سەكونت، %2 قالدى. over one day بٸر كۇننەن ارتىق getting progress... ٸلگەرلەۋ ... Error قاتەلىك Block not existed! بولٸك ساقتالعان ەمەس! Formatting. Do not close this window ٴپىشىم. نۇ تەرەزەسى يېپىۋەتمەڭ KyFileDialogRename Renaming "%1" «%1» اتاعىن وزگەرتۋ Renaming failed, the reason is: %1 ات وزگەرتۋ جەڭىلىپ قالدى، وبالى: %1 Filename too long حۇجات مى وتە ۇزىن ەكەن Copying "%1" «%1» نى كوشىرىپ جاتىر To "%1" «%1» عا Copying failed, the reason is: %1 كوشىرۋ جەڭىلىپ قالدى، وبالى %1 Moving "%1" «%1» نى جوتكەپ جاتىر Moving failed, the reason is: %1 جوتكەۋ جەڭىلىپ قالدى، وبالى: %1 File operation error: حۇجات جوبالاۋ قاتەلىگى: The reason is: %1 وبالى: %1 Truncation قىسقارتۋ Save ساقتاۋ All applications بارلٸق قولدانعىش پٸروگٸراممالار Cancel كۇشىنەن قالدىرۋ Apply قولدانۋ Bytes بايت Front truncation الدى قىسقارتۋ Post truncation كەسۋ جازباسى Description: Skip copying files of the current type تۇسٸندٸرۋشٸ: كەزەكتەگى حۇجاتتاردى كوشرۋدەن اتالىپ ٴوتۋ truncate interval قىسقارتۋ ارالققا . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select تۇسىندىرۋ: %1 بايت ٸشٸپ كەتكەن حۇجات اتاعىن قىسقارتىپ تالدا Explanation: When renaming a file name, ensure it is within %1 bytes and تۇسىندىرۋ: حۇجات اتاعىن وزگەرتكەندە، ونىڭ %1 بايت ساباعىندا بولۋٸنا كەپىلدىك ىستەڭ Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". تۇسىندىرۋ:كوڭىلدەگى احۋالدا، %1/دەيىن ساقتاۋ كەرەك. modify the name ەسىمىن وزگەرتۋ Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip اتتاۋ Skip All 全部跳过 Rename قاتە ات فاميليا ەتۋ Please enter a new name 请输入文件名 OK تۇراقتاندىرۋ MainProgressBar File operation 文件操作 starting ... باستالۋ ... cancel all file operations بارلٸق حۇجات باسقارۋداردى بوس ەتۋ Minimize تومەنگە تۇسىرۋ Close تىعنداۋ Are you sure to cancel all file operations? ٴسىز ٴسوزسٸز بارلٸق حۇجات جوبالاۋدى كۇشىنەن قالدۇرامٴسىز؟ Are you sure want to cancel all file operations بارلٸق حۇجات جوبالاۋدى شىنىندا كۇشىنەن قالدىراسىزبا OK تۇراقتاندىرۋ File Operation حۇجات جوبالاۋ Cancel كۇشىنەن قالدىرۋ Calculating time ۋاقىت ەسەپتەۋگە continue جالعاستىرۋ pause قەرەللىك توقتاۋ canceling ... كۇشىنەن قالدىرىلىپ جاتىر ... sync ... بۇرشاق قادامدىق ... %1Mb/s Est. time left: %2 %1Mb/s نەگٸزٸنەن قالعان ۋاقىت: %2 MessageDialog Peony پيون Forcibly pulling out the device may cause data loss or device exceptions! اسبابٸن ماجبۇر تارتىپ جاريالاۋ ساندىق مالىمەت جوعالىپ كەتۋى ياكي اسبابٸنڭ سىرتىنا بولۋدى كەتىرىپ جاريالاۋى مۇمكان! OtherButton Other queue 其它队列 Other Queue باسقا قاتار Peony::AdvanceSearchBar Key Words شەشۋشٸ سوزدەر input key words... شەشۋشٸ سوزدەردى كىرگىزۋ... Search Location ورىن ٸزدەۋ choose search path... ٸزدەۋ جولىن تالدا... browse كورۋ File Type حۇجات تيپى Choose File Type حۇجات تيبىن تالدا Modify Time ۋاقىتتى وزگەرتۋ Choose Modify Time ۋاقىتتى وزگەرتۋدى تالداۋ File Size حۇجات ۇلكەندىگى Choose file size حۇجات ۇلكەندىگىن تالدا show hidden file جاسىرىن حۇجاتتى كورسەتۋ go back قايت hidden advance search page جاسىرىن الدىن ٸزدەۋ كۇيى file name حۇجات مى content مازمۇن search ٸزدەۋ start search ىزدەۋدى باستاۋ Select path جول تالداۋ Operate Tips جوبالاۋ ەسكەرتپەسٸ Have no key words or search location! شەشۋشٸ سوز ياكي ٸزدەۋ ورنى جوق! Search file name or content at least choose one! حۇجات مى ياكي مازمۇندى ٸزدە، ەش بولماعاندا بٸرٸن تالدا! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File حۇجات ٸزدەۋ Peony::AdvancedPermissionsPage Permission refinement settings ماقۇلداۋ قۇنتتاستىرۋ تەڭشەۋلەرى Permission refinement settings tip ماقۇلداۋ قۇنتتاستىرۋ تەڭشەۋلەرى ەسكەرتپەسٸ Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? ACL ۇقىقتى تەڭشەۋ پايدالانۋشٸ گرۋپپاسىنىڭ نەگٸزگٸ ئىجازەتنامىسىدە وزگەرس بولادٸ. ACL ۇقىقتى جالعاستى تەڭشەۋ كەرەكپە؟ User پايدالانۋشٸ Read وقۋ Write جازىۋ Executable اتقار قىلعالى بولادٸ delete ٴوشىرۋ Inherit permission كەپىلدىككە مىيراسقور ەتۋ Add قوس Apply قولدانۋ Cancel كۇشىنەن قالدىرۋ Peony::AllFileLaunchDialog Choose new application جاڭا پٸروگٸرامما تالدا Choose an Application to open this file نۇ حۇجاتتى ٸشٸۋ ٷشٸن پٸروگٸرامما تالدا apply now قازىر جابلماس ەتۋ OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon ەرٸكتٸ گرافيىكتى تالدا Type: تيپى Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name ات-فاميليا Location ورنى move 移动 symbolLink بەلگى جالعاۋٸ Folder باس مازمۇن Include: ٶز ىشىنە الادٸ: Move جوتكەلۋ Open with: ٸشٸۋ : Description: تۇسىندىرۋ: Select multiple files قايتا حۇجات تالداۋ Size: ۇلكەن - كشىلگى: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: بوستٸق ٸستەتۋ ٴتاسٸلٸ: Time Create: ۋاقىت جاراتۋ: Time Modified: وزگەرتىلگەن ۋاقىت: Time Access: ۋاقىت ۇسىنس ەتۋ: Readonly وقىعاننان كەيىن Hidden جاسىرىن Readonly (just applied by subfiles) تەك وقىلۋ (تەك تارماق حۇجاتتار قولدانىلعان) Property: قاسيەت: usershare پايدالانۋشٸ ھەمبەھىرلەش %1 (%2 Bytes) %1 (%2 بايت) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. ۇلكەندىگى 1MBدان كشكەنە راسىمىن تالدا. Choose a new folder: Error قاتەلىك cannot move a folder to itself ! %1 Bytes %1 بايت %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 حۇجات، %2 حۇجات قىسقىش Can't get remote file information جىراقتاعى حۇجات حابارعا يە بولعالٸ بولمادى %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: CPU مى: CPU Core: CPU يادىروسى: Memory Size: ٸشكٸ ساقتاعىش ۇلكەندىگى: User Name: پايدالانۋشٸ اتٸ: Desktop: ۇستەل بەتى: You should mount this volume first ٴسىز الدى مەنەن نۇ ئىمتىھاننى تۇسىرۋ كەرەك Name: مى: File System 文件系统 Data ساندىق مالىمەت System Disk سەستما ديسكاسى Total Space: جالپى بوستٸق: Used Space: ٸستەتكەن بوستٸق: In calculation... ەسەپتەۋگە بارىسىندا... /root used: /root ٸستەتكەن: /home used: /home ٸستەتكەن: /usershare used: /پايدالانۋشٸ ٸستەتكەن: /data/* used: /data/* ٸستەتكەن: Unknow (No permission) بىلمەگەن (رۇحسات بەرٸلمەگەن) Free Space: ٸستەتكەلٸ بولاتٸن بوستٸق: Type: تيپى: Kylin Burner Open with: ٸشٸۋ ٴتاسٸلٸ: Unknown كۋالىك Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server قىزىمەت وتەۋ اسبابىنا اۋلاۋ Ip IP ٵدىرىسى Port اۋٸزٸ Type تۇرى Personal Collection server: جەكە توپتام قىزىمەت وتەۋ تۇرلەرى: Add قوس Delete حابار Connect جالعانۋ Ip input error, please re-enter! IP يمپورتتاۋشى قاتەلىك كورىلدى، قاتە كىرگىزىڭىز! Port input error, please re-enter! اۋٸز كىرگىزۋدە قاتەلىك كورىلدى، قاتە كىرگىزىڭىز! add 添加 delete 连接 删除 connect 连接 Warning ەسكەرتۋ ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user تٸزٸمدەۇ پايدالانۋشٸ Please enter the %1's user name and password of the server. %1 نىڭ پايدالانۋشٸ مى ۋا قىزىمەت وتەۋىنىڭ پارولدى كىرگىزىڭىز. User's identity ٸستەتۋشٸنٸڭ سالاۋاتى Guest ەركىن ساپارلاۋشى Name ات-فاميليا Password قۇپيا كىلت domain تور مى Cancel كۇشىنەن قالدىرۋ OK تۇراقتاندىرۋ guest 游客(匿名登录) Registered users تٸزٸمدەتكەن پايدالانۋشٸلار name 用户名 password 密码 Remember the password پارولدى ەسىڭىزدى ۇستاۋ cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop كەستەدە قولدانبا قۇرۋ Create Link to... قولدانبا قۇرۋ... Choose a Directory to Create Link قولدانبا قۇرۋ ٷشٸن باس مازمۇن تالدا Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop كەستەدە قولدانبا قۇرۋ Peony::CreateTemplateOperation File create error حۇجات قۇرۋ قاتەلىگى Can not create %1: Read-only mode, can not write-in %1 نى ورناتقالى بولمادى: تەك وقۋ كۇيى جازىلىمدى، جازعالى بولمادى NewFile جاڭا حۇجات Create file حۇجات قۇرۋ NewFolder جاڭا حۇجات قىسقىش Create file error حۇجات قاتەلىگى قۇرۋ Peony::CustomErrorHandler Is Error Handled? قاتەلىك بٸر جاق قىلىندىمۇ؟ Error not be handled correctly قاتەلىك دۇرٸس بٸر جاق ورىندالىمدى Peony::DefaultAcitonWidget No default app ادەتتى جيۋ جوق Peony::DefaultOpenWithWidget No default app ادەتتى جيۋ جوق Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview الدىن كورمەكشى بولعان حۇجاتتى تالدا Can not preview this file Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview ادەتتى الدىن كورۋ This is the Default Preview of peony-qt نۇ پيون-qt نىڭ ادەتتى الدىن كورۋ پٸروگٸرامماسٸ Peony::DetailsPropertiesPage Name: مى: File type: حۇجات تيپى: Location: ورنى: yyyy-MM-dd, HH:mm:ss yyyyجىلMMايddكۇن, ساعات:مينۋت:سەكنوت Create time: ۋاقىت جازۋ: Modify time: ۋاقىتتى وزگەرتۋ: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: حۇجات ۇلكەندىگى: Width: كەڭدىڭ: Height: بوي بيٸكتٸگٸ: Owner يەسى Owner: يەسى: Computer كومپيۋتەر Computer: كومپيۋتەر: %1 (this computer) %1 (نۇ كومپيۋتەر) Unknown كۋالىك Can't get remote file information جىراقتاعى حۇجات حابارعا يە بولعالٸ بولمادى %1 px Peony::DirectoryView::IconView Icon View 图标视图 warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋ قولدامايدى. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋ قولدامايدى. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark جاپسىرماعا قوسۋ &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder جاڭا حۇجات قىسقىش Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name ات-فاميليا File Type حۇجات تيپى File Size حۇجات ۇلكەندىگى New... 新建... Open in New Window جاڭا تەرەزەدە ٸشٸۋ Open in New Tab جاڭا قويىندىدا ٸشٸۋ Open ٸشٸۋ Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باس مازمۇن ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ماقۇلداۋ جوق! Open with... ٸشٸۋ مەنەن... More applications... الٸدە كوپ باعدارلامالار.... Open %1 selected files %1 لىك راسىمىن ٸشٸۋ New جاڭا Empty File حۇجات قۇرعاق Folder باس مازمۇن View Type كورۋ تۇرى Sort By بويىنشا تۇرگە ايىرۋ Modified Date 修改日期 Original Path وڭ جول Sort Order... 排序顺序... Ascending Order ورلەۋ جاعٸ Mount بايلاۋ MultiSelect Descending Order تومەندەۋ جاعٸ Sort Preferences... 排序偏好... Folder First حۇجات قىسقىش Chinese First حانزۋ ٴتٸلٸ بٸرٸنشٸ Show Hidden جاسىرىن كورسەتۋ Copy كوشىرۋ Cancel كۇشىنەن قالدىرۋ File:"%1" is not exist, did you moved or deleted it? حۇجات:"%1" ساقتالعان ەمەس، جوتكەپ قويدىڭىزمۇ ياكي ئۆچۈرۈۋەتتىڭىزمۇ؟ Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut كەسۋ Delete to trash قوقسىق بوشكە تاستالۋ Paste شاپتاۋ Refresh جاڭالاۋ Select All جالپىسىن تالداۋ Properties قاسيەتى format ٴپىشىم Restore قالپىنا قايتارۋ Delete حابار Time Modified Path جول Sort Order تۇرگە ايىرۋ جاعٸ Newest to oldest ەڭ جاڭا ۋا ەڭ قادامى Oldest to newest ەڭ كونە ەڭ جاڭا Files from large to small ۇلكەنىرەك كىچىكگىچە حۇجاتتار Files from small to large كىچىكدىن چوڭغىچە حۇجات Sort Preferences پرەقەرەنتسييالار رەتتەۋ Error قاتەلىك File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever ماڭگىلىك ٴوشىرۋ Rename قاتە ات فاميليا ەتۋ Select &All 全选(&A) Reverse Select كەرٸ تالداۋ P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash & قوقسىق ساندىقتى تازالاۋ Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All ٴبارىن تازالاۋ Open Parent Folder in New Window جاڭا تەرەزەدە انا حۇجات قىسقىشىنى ٸشٸۋ Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager كەڭەيتىمدەر اكىمشى Available extensions ٸستەتكەلٸ بولاتٸن كەڭەيتىمدەر Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Peony::FMWindow File Manager حۇجات اكىمشى advanced search ناقتىلاپ ٸزدەۋ clear record ەستەلىك تازالاۋ Loaing... Press Esc to stop a loading. وشپەندىلك... جۇكتەۋ توقتاتۋ ٷشٸن Esc نى باس. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. اۆتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2019-يىلىدىن 2020-يىلىغىچە، تيەنجىن KYLIN حابار تەحىنيكا شەكتى سەرىكتى، شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo قايتىپ الۋ Redo قاتە ٸستەۋ Peony Qt حۇجات باسقارۋشٸسٸ Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder جاڭا حۇجات قىسقىش Peony::FileBatchRenameOperation File Rename error حۇجات اتاعىن وزگەرتۋ قاتەلىگى Invalid file name %1%2%3 . حۇجات مى %1%2%3 كۇشكە يە ەمەس . File Rename warning حۇجات ەسىمىن وزگەرتۋ ەسكەرتۋٸ Are you sure to hidden these files? ٴسىز ٴسوزسٸز نۇ حۇجاتتاردى جاسىرىپ قويامٴسىز؟ Rename file error حۇجات اتاعىن وزگەرتۋ قاتەلىگى Peony::FileCopy Error in source or destination file path! قاينار ياكي حۇجاتتاعى نىسانا حۇجات جولدا قاتەلىك كورىلدى! Error when copy file: %1, can not copy special files, skip this file and continue? حۇجات كوشىرگىىششەڭ قاتەلىك كورىلدى: %1، ەرەكشە حۇجاتلەرنى كوشىرۋگە بولمايدى، نۇ حۇجاتتىن اتالىپ جالعاستىراسىز با؟ Can not copy %1, file doesn't exist. Has the file been renamed or moved? %1 نى كوشىرۋگە بولمايدى، حۇجات ساقتالعان ەمەس. حۇجاتنىڭ اتٸ ٶزگەرتىلدىمە ياكي جوتكەپ قويۇلدىمۇ؟ The dest file "%1" has existed! dest حۇجاتى «%1» ساقتالعان قالدى! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Vfat/FAT32 حۇجات سەستيماسى 4GBدان ارتىق بوستقتٸ يەلەگەن بٸرەۋ حۇجاتنى قولدامايدى! Error writing to file: Input/output error قاجەتكە جازۋ قاتەلىگى: كىرگىزۋ/جاريالاۋ قاتەلىگى Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. %1 قۇرۋ جەڭىلىس قالدى. ونىڭ جۇلدىز باس مازمۇنىندا ياكي اسبابٸتٸڭ gphoto2 كەلىسىمىن دۇرٸس قولدايتىنىن انىقتاڭىز. Failed to create %1. %1 قۇرۋ جەڭىلىس قالدى. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! اسبابٸتٸڭ ئېلىۋېتىلگەنلىكىنى تەكسەرٸپ كور! Write file error: There is no available disk space for device! حۇجات جازۋ قاتەلىگى: اسبابٸتٸڭ ديسكا ديسكا بوستٸعٸ جوق! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure حۇجات اشىلۋ جەڭىلىپ قالدى Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel جوبالاۋ بوس ەتۋ Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 حۇجات قىسقىش %1 قۇرۋ جەڭىلىپ قالدى: %2 File copy error حۇجات كوشىرۋ قاتەلىگى The file name exceeds the limit حۇجات مى شەكتەن ٸشٸپ كەتتى Cannot opening file, permission denied! حۇجاتتى اشۋئاجرىتىششىن بولمادى، ماقۇلداۋ رەت قىلىندى! File:%1 was not found. حۇجات:%1 تابىلمادى. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk سەستما ديسكاسى File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in %1 نى %2 گە كوشىرۋگە بولمايدى: تەك وقۋ كۇيى، جازعالى بولمادى Can not copy %1 to %2: Permission denied %1 نى %2 گە كوشىرۋگە بولمايدى: ماقۇلداۋ رەت قىلىندى Data ساندىق مالىمەت %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا بوستٸق قالمادى. حۇجات كوشىرۋ ۇلكەندىگى: %2GB, بوستٸقى ٴسوزسىز: %3GB. Link file error حۇجات اۋلاۋ قاتەلىگى Burning does not support replacement كۇيگىرتكىشىن الماستٸرۋدٸ قولدامايدى Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error حۇجات ٴوشىرۋ قاتەلىگى Delete file error حۇجات ٴوشىرۋ قاتەلىگى Invalid Operation! Can not delete "%1". كۇشكە يە ەمەس جوبالاۋ! «%1» نى ٶشٸرگەلٸ بولمايدى. Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled پارولدى ديالوگ رامكاسى بوس قىلىندى Message recipient disconnected from message bus without replying! حابار تاپسٸرٸپ الۋشٸ جاۋاپ قايتارماي ٴوز بەتىمەن حابار اپپارتتى كەدەرگى ٷزٸلدٸ! Error قاتەلىك Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data ساندىق مالىمەت folder حۇجات قىسقىش file حۇجات text file تەكىسىت حۇجاتى Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning ەسكەرتۋ Error قاتەلىك Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتىن ٶشٸرەسٸزبە؟ Can not open path "%1",permission denied. «%1» جولىن اشۋئاجرىتىششىن بولمادى،ماقۇلداۋ رەت قىلىندى. Can not find path "%1",are you moved or renamed it? «%1» جولىن تاباالمادٸ، كۆچۈرۈلدىمۇ ياكي ئۆزگەرتتىڭىزمۇ؟ Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) بالا حۇجات Symbol Link, بەلگى جالعاۋٸ، System Disk سەستما ديسكاسى File Name قولحات مى Delete Date چيسىلانى ٴوشىرۋ Create Date چيسىلا قۇرۋ Time Modified File Size حۇجات ۇلكەندىگى Original Path وڭ جول Path جول File %1 is existed in space, please not add file repeatly. Operation not supported جوبالاۋ قولدايما File Type حۇجات تيپى Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label حۇجات بەلگىسى قوسۋ Delete All Label بارلٸق بەلگىلەردى ٴوشىرۋ Label Management ... بەلگى باسقارۋ ... Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... بەلگى باسقارۋ ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1 %2 نىڭ اشىلۋ فورماسى unknown كۋالىك No application is set to open file "%1 %2" «%1 %2» حۇجاتتى ٸشٸۋ ٷشٸن ەشقانداي پٸروگٸرامما بەلگٸلەنبەگەن Still using the last opened application: ٵلٸگەدەيٸن ەڭ سوڭعٸ اشىلعان پٸروگٸرامما ٸستەتٸپ جاتٸر: known مالۋم. Open application is used by default: اشىلعان پٸروگٸرامما تىنىشتىق ٸستەتەدٸ: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. جۇمساق دەتال ورتالىقتان نۇ حۇجاتتى ئاچالايدىغان پٸروگٸراممانٸ ٸزدەپ ۇيتسەڭىز ياكي كومپيۋتەرىڭىزدە ساقتالعان بولعان پٸروگٸراممالاردٸ تالداساڭٸز بولادٸ. Other application: باسقا قولدانعىش: Select application: پٸروگٸراممانٸ تالدا: Always open the %1%2 file with this application نۇ پٸروگٸرامما ارقىلى %1%2 حۇجاتىن باستان اقىرٸ ٴٸشڭٸز Choose other application باسقا پٸروگٸراممالاردٸ تالدا Go to application center قولدانعىش ورتالىعىنا جوتكەلۋ Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Desktop files(*.desktop) ئۈستەلئۈستى حۇجاتى(*.desktop) Select Open Action جوبالاۋ ٸشٸۋ تالداۋ Select تالدا Peony::FileLaunchAction Execute Directly تٸكە اتقار ەتۋ Execute in Terminal ورتاسندا اتقار ەتۋ Detected launching an executable file %1, you want? %1 اتقار حۇجاتىن قوزعالتۋ بايقالدىمۇ؟ Delete file Warning 删除文件警告 Open Failed ٸشٸۋ جەڭىلىپ قالدى Can not open %1, file not exist, is it deleted? %1نى اشۋئاجرىتىششىن بولمادى، حۇجات ساقتالعان ەمەس، وشىرىلگەن؟ File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission ماقۇلداۋ بەرلمەيدٸ File is not readable. Please check if file has read permisson. حۇجاتتى وقٸعالٸ بولمايدى. دا حۇجاتتا ماقۇلداۋ بېرىلگەنلىكىنى تەكسەرٸپ كور. By Default App ادەتتى جيۋ Launch Options اتقار ەتۋ تالدانبالارٸ Open Link failed جالعانبانى ٸشٸۋ جەڭىلىپ قالدى File not exist, do you want to delete the link file? حۇجات ساقتالعان ەمەس، قولدانبا حۇجاتىن ٶشٸرەسٸزبە؟ Can not open %1, Please confirm you have the right authority. %1 نى اشۋئاجرىتىششىن بولمادى، ۇقىعىڭىز دۇرٸس بارلٸعٸن انىقتاڭىز. Open App failed باعدارلاما ٸشٸۋ جەڭىلىپ قالدى The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? جالعانعان جيۋ وزگەرتىلگەن ياكي ٶشٸرٸلگەن، سوندىقتان نورمال ٸستەي المايدٸ. قولدانبا حۇجاتىن ٶشٸرەسٸزبە؟ Error قاتەلىك File original path not exist, are you deleted or moved it? حۇجاتتىڭ وڭ جولى ساقتالعان ەمەس، وشىرىلگەن ياكي جوتكەپ قويدىڭىزمۇ؟ Can not get a default application for opening %1, do you want open it with text format? %1 نى ٸشٸۋ ٷشٸن ادەتتى پٸروگٸراممانٸ العالٸ بولمادى، تەكىسىت ٴپىشىنى مەنەن ٸشٸۋنى قابىل الاسىز با؟ Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link سيمۆلدىق قولدانبا Link file error حۇجات اۋلاۋ قاتەلىگى Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error حۇجات جوتكەۋ قاتەلىگى File System 文件系统 Data ساندىق مالىمەت %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا بوستٸق قالمادى. حۇجات كوشىرۋ ۇلكەندىگى: %2GB, بوستٸقى ٴسوزسىز: %3GB. File move error حۇجات جوتكەۋ قاتەلىگى Invalid move operation, cannot move a file into its sub directories. كۇشكە يە ەمەس جوتكەۋ جوبالاۋى كۇشكە يە ەمەس، حۇجاتتى تارماق باس مازمۇن ىشىنە جوتكەلۋى بولمايدى. The file name exceeds the limit حۇجات مى شەكتەن ٸشٸپ كەتتى Create file error حۇجات قاتەلىگى قۇرۋ Can not move %1 to %2: Read-only mode, can not write-in %1 نى %2 گە جوتكەلۋى بولمادى: تەك وقۋ كۇيى، جازعالى بولمادى Can not move %1 to %2: Permission denied %1 نى %2 گە جىلجۋعا بولمادى: ماقۇلداۋ بەرىلمەدى Cannot opening file, permission denied! حۇجاتتى اشۋئاجرىتىششىن بولمادى، ماقۇلداۋ رەت قىلىندى! File:%1 was not found. حۇجات:%1 تابىلمادى. Invalid Operation. كۇشكە يە ەمەس جوبالاۋ System Disk سەستما ديسكاسى open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error حۇجات ٴوشىرۋ قاتەلىگى Link file error حۇجات اۋلاۋ قاتەلىگى Burning does not support replacement كۇيگىرتكىشىن الماستٸرۋدٸ قولدامايدى Burn failed 刻录失败 File delete 文件删除 Invalid Operation كۇشكە يە ەمەس جوبالاۋ Peony::FileOperationAfterProgressPage &More Details &جٸڭٸشكەلٸكپەن Peony::FileOperationErrorDialog File Operation Error حۇجات جوبالاۋ قاتەلىگى unkwon null قۇرعاق Error message: قاتەلىك حابارى: Source File: قاينار حۇجاتى: Dest File: Dest حۇجاتى: Ignore نازاردان ساقتانۋ ەتۋ Ignore All ٴبارىن نازاردان ساقتانۋ ەتۋ Overwrite ٷستٸنەن جازۋ Overwrite All ٴبارىن سايكەستىرۋ Backup زاپاس ساقتاۋ Backup All ٴبارىن زاپاستاۋ &Retry &قاتە سىناپ كور &Cancel بولدىرماۋ Peony::FileOperationErrorDialogBase Close تىعنداۋ Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace سايكەستىرۋ Ignore نازاردان ساقتانۋ ەتۋ Do the same سونداي ىستەڭ <p>This location already contains the file '%1', Do you want to override it?</p> <p>نۇ ورٸندا '%1' حۇجاتىن ٶز ىشىنە العان، ونى ئۆچۈرۈۋەتمەكچىمۇ؟</p> Unexpected error from %1 to %2 %1 دان %2 دەيىن كۇتپەگەن قاتەلىك كورىلدى Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup زاپاس ساقتاۋ Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel كۇشىنەن قالدىرۋ Delete حابار Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected دەسكانىڭ تولٸق ياكي جازۋدان الدىن الۋ ەمەستىگىن، حۇجاتتىڭ قورعالاتىن ەمەستىگىن انىقتاۋ Peony::FileOperationErrorDialogWarning OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Skip all ٴبارىن اتالىپ وتٸپ كەتۋ Make sure the disk is not full or write protected and that the file is not protected دەسكانىڭ تولٸق ياكي جازۋدان الدىن الۋ ەمەستىگىن، حۇجاتتىڭ قورعالاتىن ەمەستىگىن انىقتاۋ Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link سيمۆلدىق قولدانبا Copy كوشىرۋ Move جوتكەلۋ Rename قاتە ات فاميليا ەتۋ Link اۋلاۋ Delete حابار Delete Permanently ماڭگىلىك ٴوشىرۋ Restore قالپىنا قايتارۋ New جاڭا - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn ەسكەرتۋ '%1' is occupied,you cannot operate! %1 نى ئىگىلىۋالدى، ساۋدا ۇيتەالمايسىز! No, go to settings 否,跳转到设置 OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Do you want to put selected %1 item(s) into trash? %1 تالدانعان توردى قوقسىق ساندىعىنا تاشلىماقچىمۇ؟ Do not show again قاتە كورسەتپەڭىز File System 文件系统 System Disk سەستما ديسكاسى Data ساندىق مالىمەت Insufficient storage space ساقتاۋ بوستٸعٸ جەتەرلىك ەمەس %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 اسبابدا بوستٸق قالمادى. حۇجات كوشىرۋ ۇلكەندىگى: %2GB, بوستٸقى ٴسوزسىز: %3GB. Can't delete. ٶشٸرگەلٸ بولمادى . You can't delete a file whenthe file is doing another operation حۇجات باسقا جوبالاۋ ورىنداپ جاتقاندا حۇجاتنى وشٸرەالمايدٸ File Operation is Busy حۇجات جوبالاۋى قاربالاس There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. بۇرىن بٸر ياكي بٸرنەچچە حۇجات جوبالاۋى اتقار ورىندالىپ باققان. سىزدىڭ جوبالاۋىڭىز اتقار ورىندالۋىن ساقتايدى تٸپتٸ تامامدالادٸ. قيسٸق قانداقلا بولماسىن حۇجات جوبالاۋىنى پاراللەل اتقار ورىنداماقشى بولساڭٸز، تالداۋ تىزىمدكتەگى ادەتتى «پاراللەل ماقۇلداۋ بەرۋ» نى وزگەرتەسٸز بولادٸ. The long name file is saved to %1 ۇزىن ات حۇجاتى %1 گە ساقتالدى Undo %1 %1 نى قالپىنا كەلتىرىلگەن Redo %1 %1 نى قاتە ٸستەۋ The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: ساناق: state: شتات: Peony::FileOperationProgressPage &More Details &جٸڭٸشكەلٸكپەن From: قاينارى: To: ٷشٸن: Peony::FileOperationProgressWizard File Manager حۇجات اكىمشى &Cancel بولدىرماۋ Preparing... دايٸندٸق قىلىۋاتىمىز... Handling... بٸر جاق ەتۋ... Clearing... تازالاپ جاتىز... Rollbacking... ارتىنا قۇسۋ... File Operation حۇجات جوبالاۋ A file operation is running backend... حۇجات جوبالاۋى ارتى ٴۇش اتقار ورىندالىپ جاتىر... %1 files, %2 %1 حۇجات، %2 %1 done, %2 total, %3 of %4. %1 توگەدى، %2 جالپٸ، %3 %4. clearing: %1, %2 of %3 تازالاۋ: %1, %2 %3 copying... كوشىرۋ... Syncing... بۇرشاق سينحرونداۋ... Peony::FilePreviewPage File Name: 文件名称: File Type: حۇجات تيپى: Time Access: ۋاقىت ۇسىنس ەتۋ: Time Modified: وزگەرتىلگەن ۋاقىت: Children Count: بالالاردىڭ سانى: Size: ۇلكەن - كشىلگى: Location: ورنى: Time Created: ورناتىلعان ۋاقىت: Image resolution: سۋرەت انٸقتٸعٸ: color model: رەڭ مودەلى: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel كۇشىنەن قالدىرۋ OK تۇراقتاندىرۋ <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again ەندٸ سۇراماڭىز usershare پايدالانۋشٸ ھەمبەھىرلەش Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1 total, %2 hidden %1 جالپٸ، %2 جاسىرىن Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error حۇجات اتاعىن وزگەرتۋ قاتەلىگى Invalid file name %1%2%3 . حۇجات مى %1%2%3 كۇشكە يە ەمەس . Are you sure to hidden this file? ٴسىز ٴسوزسٸز نۇ حۇجاتتى جاسىرىپ قويامٴسىز؟ When change the file suffix, the file may be invalid. Are you sure to change it ? حۇجات قوسىمشاسى وزگەرتكەندە، حۇجات كۇشكە يە ەمەس بولۋٸ مۇمكان. ٴسىز ٴسوزسٸز ئالماشتۇرامٴسىز ؟ A file and a directory with the same name cannot replace each other ۇقساس داڭقىنداعى حۇجات مەنەن باس مازمۇن بٸر-بٸرىنىڭ ورٸنٸ الا المايدى The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning حۇجات ەسىمىن وزگەرتۋ ەسكەرتۋٸ The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error حۇجات اتاعىن وزگەرتۋ قاتەلىگى Peony::FileTrashOperation File trash error حۇجات قوقسىق قاتەلىگى Can not trash %1: Read-only file system %1 نى قوقسىق ىستەۋگە بولمايدى: تەك وقٸعالٸ بولاتٸن حۇجات سەستيماسى trash:/// قوقسىق:/// Trash file error قوقسىق ساندىعى قاتەلىگى Invalid Operation! Can not trash "%1". كۇشكە يە ەمەس جوبالاۋ! «%1» نى قوقسىق ىستەۋگە بولمايدى. Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. مەڭگەرۋ قىلعالى بولمايتٸن سوقتٸعٸۋ ساقتالعان. جيىپ الۋ ساندىقتى تەكسەرٸپ كور. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error حۇجات قوقسىق قاتەلىكتى بوس ەتۋ Can not find trashed file %1, might be restored or removed. %1 قوقسىق ورىندالعان حۇجاتتى تاپقالٸ بولمادى، قالپىنا كەلتىرلگەن ياكي ٶشٸرٸلگەن بولۋٸ مۇمكان. Peony::GlobalSettings yyyy/MM/dd جىل/اي/كۇن HH:mm:ss AP hh:mm:ss yyyy-MM-dd جىل-اي-كۇن Peony::HeaderBar Spread تارالۋ Minimize تومەنگە تۇسىرۋ Close تىعنداۋ Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Rename Space Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open ٸشٸۋ Open With ٸشٸۋ ٴتاسٸلٸ More applications Open The Folder Location Add File قوسۋ Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again ەندٸ سۇراماڭىز Copy كوشىرۋ Save As ورىنداپ ساقتاۋ file حۇجات All File بارلٸق حۇجات This location has no write permission.please change the storage location Label بەلگى Properties قاسيەتى Peony::ImageMountManager Invalid device path: %1 كۇشكە يە ەمەس اسباب جولى: %1 Cannot find loop device for path: %1 جولىنىڭ داۋىرلىك اسبابٸن تاپقالٸ بولمادى: %1 Failed to unmount filesystem: %1 حۇجات سەستاماسىن اشۋئاجرىتىششىن جەڭىلىس قالدى: %1 Failed to delete loop device: %1 داۋىرلىك اسبابٸن ٴوشىرۋ جەڭىلىس قالدى: %1 Peony::LabelSettings Name ات-فاميليا SideBar يانبالداق Menu تٸزٸمدٸك Create New Label جاڭا بەلگى قۇرۋ Delete Label بەلگٸنٸ ٴوشىرۋ Display the following items in the identification area: (maximum of 6) پارىقتاندىرۋ رايوندا تومەندەگٸ تۇرلەردى كورسەتۋ: (ەڭ كوپ بولعاندا 6) Rename قاتە ات فاميليا ەتۋ Edit Color رەڭ تالداۋجاساۋ Delete This Label نۇ بەلگٸنٸ ٴوشىرۋ Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" «%2» دان «%1» نى ٸزدەۋ File System حۇجات سەستيماسى Search results for all files marked in "%1" in "%2" «%2» دەگى «%1» دا بەلگى قويىلعان بارلٸق حۇجاتتاردىڭ ٸزدەۋ ناتيجەسى &Copy Directory 拷贝路径(&C) Open In New Tab جاڭا قويىندىدا ٸشٸۋ Open In New Window جاڭا تەرەزەدە ٸشٸۋ Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory باس مازمۇن كوشىرۋ Peony::MountOperation Operation Cancelled جوبالاۋ كۇشىنەن قالدىرىلدى. Login failed, unknown username or password error, please re-enter! تٸزٸمدەۇ جەڭىلىپ قالدى، پايدالانۋشٸ مى ياكي پارولدا قاتەلىك كورىلمدى، قاتە كىرگىزىڭىز! Peony::NavigationToolBar Go Back قايت Go Forward العا ىلگەرلەۋ History تاريح Clear History تاريحنى تازالاۋ Cd Up Cd دان جوعارعى Refresh جاڭالاۋ Peony::NewFileLaunchDialog Choose new application جاڭا پٸروگٸرامما تالدا Choose an Application to open this file نۇ حۇجاتتى ٸشٸۋ ٷشٸن پٸروگٸرامما تالدا apply now قازىر جابلماس ەتۋ OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? ٴسىز «%1%2» حۇجاتىن قانداق اشپاقشى؟ Default open with: ادەتتى اشىلۋ ۋاقىتى: Other: باسقالارى: Choose other application باسقا پٸروگٸراممالاردٸ تالدا Go to application center قولدانعىش ورتالىعىنا جوتكەلۋ Peony::PathEdit Go To بار Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 حۇجاتتاعى نىسانا: %1 Read and Write وقۋ ۋا جازۋ Readonly وقىعاننان كەيىن Group or User گرۋپپا ياكي پايدالانۋشٸ (Current User) (كەزەكتەگى پايدالانۋشٸ) Current User كەزەكتەگى پايدالانۋشٸ Permissions modify tip ماقۇلداۋ وزگەرتۋ ەسكەرتپەسٸ The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? كەزەكتەگى حۇجات ياكي حۇجات قىسۋاسپابىندا ACL ۇقىعى بەلگٸلەنگەن. پايدالانۋشٸ گرۋپپاسىنىڭ ۇقىعىنى وزگەرتۋ ACL دا بەلگٸلەنگەن رۇقساتتار ٸستەتكەلٸ بولمايتٸن بولىپ قىلۋى مۇمكان. پايدالانۋشٸلەر گرۋپپاسىنىڭ جادەمدى جالعاستى وزگەرتۋنى قابىل الاسىز با؟ Permission refinement settings ماقۇلداۋ قۇنتتاستىرۋ تەڭشەۋلەرى The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? كەزەكتەگى الارمان ىلعارى ھەمبەھىرلەشنى بەلگىلەدى. قيسٸق جانەدە ۇقىقتى وزگەرتۋگە دۇرٸس كەلسە، الدىن ھەمبەھىرلەش ساقتالعان بولماستٸعٸ مۇمكان. ٴسىز جالعاستى تەڭشەۋدٸ خالامٴسىز ؟ Read 可读 Write 可写 Executable 可执行 Can not get the permission info. ماقۇلداۋ حابارعا يە بولعالٸ بولمادى. (Me) (我) Others باسقالار Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. ٴسىز نۇ حۇجاتتىڭ ۇسىنس ەتۋ ورٸنٸ ئۆزگەرتەلمەيٴسىز. Me User 用户 Peony::PropertiesSetDialog Confirming property settings قاسيەت تەڭشەۋلەردٸ تۇراقتاستىرىپ جاتىر Whether to apply to the current selected option or to selected options and subfolders and subfiles. كەزەكتە تالدانعان تالداۋلارعا ماقۇلداۋ كەرەكپە ياكي تالدانعان تالدانبالار ۋا تارماق قۇجاتتارعا قولدانبا كەرەكپە Apply the current selection كەزەكتەگى تاڭداۋدى قولدانۋ Apply the current selection as well as subfolders and subfiles كەزەكتەگى تالداۋ ۋا تارماق حۇجات كليپتەر ۋا تارماق حۇجاتلەرنى قولدانۋ Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Peony::PropertiesWindow Trash قوقسق ساندىعى Recent جاقىنعى Selected تالدانعان %1 Files %1 حۇجات usershare پايدالانۋشٸ ھەمبەھىرلەش Data ساندىق مالىمەت System Disk سەستما ديسكاسى Properties قاسيەتى Ok ماقۇل Cancel كۇشىنەن قالدىرۋ Restore قالپىنا قايتارۋ Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. ٴوشىرۋ بارىسىندا كەسٸم جاساۋ ديالوگىن كورسەتۋ. Origin Path: وڭ نۇكتە جولى: Deletion Date: ٶشٸرٸلگەن ۋاقىت: Size: ۇلكەن كشىلگى: Original Location: وڭ ورنى: Peony::SearchBar Input the search key of files you would like to find. ٴسىز تاۋماقشى بولعان حۇجاتتاردىڭ ٸزدەۋ كىنوپكاسىن كىرگىزىڭىز. Input search key... ٸزدەۋ كىنوپكاسى كىرگىزىلدى... advance search الدىن ٸزدەۋ clear record ەستەلىك تازالاۋ Peony::SearchBarContainer Choose File Type 选择文件类型 Search File حۇجات ٸزدەۋ Clear تازالاۋ all جالپىسى file folder حۇجات قىسقىش image راسىم video سىن text file تەكىسىت حۇجاتى audio ۇن others باسقالار wps file WPS حۇجاتى Peony::SharedFileLinkOperation Symbolic Link سيمۆلدىق قولدانبا The dest file "%1" has existed! dest حۇجاتى «%1» ساقتالعان قالدى! Link file error حۇجات اۋلاۋ قاتەلىگى Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Trash قوقسق ساندىعى Recent جاقىنعى Quick Access تەز ۇسىنس ەتۋ Quick access 快速访问 Favorite 快速访问 KmreData Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data ساندىق مالىمەت Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties قاسيەتى Delete Symbolic سيمۆلدىق ٴوشىرۋ Unmount ٴوشىرۋ Eject جاريالاۋ Format ٴپىشىم burndata ورتەنگەن ساندىق مالىمەت &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network تور Peony::SideBarPersonalItem Personal حۇجات باسقارۋشٸسٸ ۇقتىرۋى Peony::SideBarSeparatorItem (No Sub Directory) (تارماق باس مازمۇن) Peony::StatusBar ; %1 folders ; %1 حۇجات كليپتەر ; %1 files, %2 total ; %1 حۇجات، جالپٸ %2 ; %1 folder ; %1 حۇجات قىسقىش ; %1 file, %2 ; %1 حۇجات، %2 %1 selected %1 تالداندٸ Peony::SyncThread notify 温馨提示 温馨提示 Notify ۇقتٸرۋ Peony::TagManagement General 通用 Mark بەلگى Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type سۇرىپتاۋ تيپى File Name قولحات مى File Type حۇجات تيپى File Size حۇجات ۇلكەندىگى Modified Date وزگەرتىلگەن ۋاقىتى Open in New window جاڭا تەرەزەدە ٸشٸۋ Open in new Tab جاڭا قويىندىدا ٸشٸۋ Ascending كىشىدەن ۇلكەنگە قاراتىپ تىزۋ Descending چوڭدىن كىشى قاراتىپ تىزۋ Copy كوشىرۋ Paste شاپتاۋ Cut كەسۋ Trash قوقسق ساندىعى Clean Trash قوقسىق ساندىقتى تازالاۋ Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore قالپىنا قايتارۋ Options تالداۋ Forbid Thumbnail كشكەنە كورىنسىن شەكتەۋ Show Hidden جاسىرىن كورسەتۋ Resident in Backend Backend دا سەتتلەر Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. ەڭ سوڭعٸ تەرەزەسى جابىپ بولعاننان كەيىن سەستما جانەدە اتقار قىلىندى. بۇنداي بولعاندا كەيىنكى رەت جارناما ەتۋ ۋاقىتى قىسقارتىلىدىكەن، سۇيتىپ ارتى كورىنىستەگى بايلىقتاردى خورىتىدۇ. &Help & جاردەم &About... جايىندا... Peony Qt حۇجات باسقارۋشٸسٸ Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. اۆتورى: ولان <lanyue @kylinos. cn> خې مەيگ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2019-جىلدىق تيانتسزين KYLIN حابار تەحىنيكا شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow كۋالىك Type: تيپى: Duration: مەزگىلى: Size: ۇلكەن كشىلگى: Loading... جوتكەلىپ جاتىر... Res: Mod Date: بەينە ۋاقىتى: Deleted date: Original path: Peony::UserShareInfoManager Warning ەسكەرتۋ Peony::VolumeManager Error قاتەلىك ProgressBar starting ... باستالۋ ... canceling ... كۇشىنەن قالدىرىلىپ جاتىر ... sync ... بۇرشاق قادامدىق ... continue جالعاستىرۋ pause قەرەللىك توقتاۋ close تاقاۋ cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View اي كۇن كورىنۋى Show the folder children as icons. حۇجات قىسقشتاعى بالالارىن اي كۇن فورمادا كورسەتۋ. List View تٸزٸمدٸك كورىنۋى Show the folder children as rows in a list. حۇجات قىسقشتاعى بالالارىن تٸزٸمدەكتەگٸ قۇر فورمادا كورسەتۋ. Basic Preview Page 基本 Basic نەگٸزگٸ Show the basic file properties, and allow you to modify the access and name. نەگٸزگٸ حۇجات ەرەكشەلگىن كورسەتۋ ۋا ۇسىنس ەتۋ ۋا ەسىمىن وزگەرتۋىڭىزگە رۇحسات ىستەڭ. Permissions Page 权限 Permissions ماقۇلداۋ Show and modify file's permission, owner and group. حۇجات ۇقىعى، يەسى ۋا گرۋپپاسىن كورسەتۋ ۋا وزگەرتۋ. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? حۇجات وتە ۇلكەن ەكەن، جيىپ الۋ ساندىعىنا جىلجىتۋعا بولمايدى. ٴسىز ونى ماڭگىلىك ئۆچۈرەمٴسىز؟ These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? نۇ حۇجاتتار وتە ۇلكەن ەكەن، جيىپ الۋ ساندىعىنا جىلجىتۋعا بولمايدى. ٴسىز نۇ %1 حۇجاتتاردى ماڭگىلىك ئۆچۈرۈۋەتمەكچىمۇ؟ Delete حابار Clean the Trash قوقسىق ساندىقتى تازالاۋ OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. ٴسىز جيىپ الۋ ساندىقتى بوس، حۇجاتتاردى ماڭگىلىك ئۆچۈرەمٴسىز؟ باستالعاننان كەيىن، ولاردى قالپىنا كەلتىرۋگە ئامالٴسىز قالدى. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties كومپيۋتەر قاسيەتتەرى Show the computer properties or items in computer. كومپيوتوردكى كومپيۋتەر سيپاتتارى ياكي مۇشەلەرىن كورسەتۋ. Trash and Recent Properties Page 最近/回收 Trash and Recent قوقسىق ساندىعى ۋا جاقىندا Show the file properties or items in trash or recent. حۇجات قاسيەتى ياكي مۇشەلەرىن قوقسىق ساندىقتا ياكي جاقىنعى مازمۇنىندا كورسەتۋ. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed ٴپىشىنى جەڭىلىپ قالدى YES يا Formatting successful! But failed to set the device name. فورماتتاۋ ناتيجەلى قالدى! بىراق اسباب اتاعىن بەلگٸلەۋ جەڭىلىس قالدى. qmesg_notify ۇقتٸرۋ Format ٴپىشىم Begin Format باستالۋ ٴپىشىنى Close تىعنداۋ Format operation has been finished successfully. ٴپىشىم جوبالاۋى ٴساتتٸ تامامدالدٸ. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! كەشىرىڭ، ٴپىشىم جوبالاۋى جەڭىلىپ قالدى! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ كولەمدەگى بارلٸق ساندىق مالىمەتتەردى فورماتتاۋ ارقىلى ٶشٸرٸلەدٸ. پىشىم نۇرۇن ساقتالعان بارلٸق ساندىق مالىمەتتەردى زاپاستاپ قويىڭىز. سىزدىڭ داۋاملاشتۇرغۇڭىز بارما ؟ format ٴپىشىم begin format 开始 close 关闭 File Manager حۇجات اكىمشى Notify ۇقتٸرۋ notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed ماجبۇر ٸشٸۋ جەڭىلىپ قالدى Error: %1 قاتەلىك بايقالدٸ: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندىق مالىمەت بۇرشاق قادامدىق تامامدالدٸ،اسباب ٴساتتٸ اشىق! Unmount failed تۇسٸرۋدەن جەڭىلىپ قالدى Not authorized to perform operation. جوبالاۋ ىستەۋگە ۇقىق بەرٸلمەگەن. Unable to unmount it, you may need to close some programs, such as: GParted etc. ونى ٶشٸرگەلٸ بولماعانشا، بارٸ پٸروگٸراممالاردٸ جابۋعا دۇرٸس كەلەدى، ماسەلەن: GParted قاتارلىلار. Error: %1 Do you want to unmount forcely? قاتەلىك: %1 زورلىق مەنەن چۈشۈرمەكچىمۇ؟ Cancel كۇشىنەن قالدىرۋ Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase اسبابٸن قوزعالتۋ جەڭىلىس قالدى: قاتە قۇپيا سوز The device has been mount successfully! اسباب ناتيجەلى تۇسىرىلدى! Eject device failed, the reason may be that the device has been removed, etc. جاريالاۋ اسپابٸ كەدەرگى كورىلدى، وبالى اسبابٸتٸڭ ئېلىۋېتىلگەنلىكى بولۋٸ مۇمكان. Data synchronization is complete and the device can be safely unplugged! ساندىق مالىمەت بۇرشاق قادامدىق تامامدالدٸ، اسبابٸن حاۋٸپسٸز ۇزىپ ەتكەلى بولادٸ! Password is empty, please re-enter! قۇپيا نومەر قۇرعاق، قاتە كىرگىزىڭىز! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed جاريالاۋ جەڭىلىپ قالدى favorite جاقسى كورەتىن Favorites جاقسى كۆرگۈچىلەر File is not existed. حۇجات ساقتالعان ەمەس. Share Data ساندىق دەرەكتەر ھەمبەھرلەش Trash قوقسق ساندىعى Recent جاقىنعى Operation not supported جوبالاۋ قولدايما The virtual file system does not support folder creation جاساندى حۇجات سەستيماسى حۇجات قىسقىش قۇرۋدى قولدامايدى Can not create a symbolic file for vfs location vfs ورنى ٷشٸن بەلگى حۇجاتى ورناتقالى بولمادى Symbolic Link سيمۆلدىق قولدانبا Can not create symbolic file here, %1 نۇ جەردە بەلگى حۇجاتى ورناتقالى بولمادى، %1 Can not add a file to favorite directory. جاقسى كورەتىن كاتالوگ حۇجات قوسقالى بولمايدى. The virtual file system cannot be opened جاساندى حۇجات سەستاماسىن اشۋئاجرىتىششىن بولمادى Virtual file directories do not support move and copy operations جاساندى حۇجات باسمازمۇن كوشىرۋ ۋا كوشىرۋ جوبالاۋدى قولدامايدى Default favorite vfs of peony پيون كوڭىلدەگى ەڭ جاقسى كورەتىن vfs Details ناقتىلاپ ماتەريال Mark بەلگى mark this file. نۇ قاجەتكە بەلگى سالىڭىز. Open With ٸشٸۋ ٴتاسٸلٸ open with. ٸشٸۋ مەنەن . It need to synchronize before operating the device,place wait! اسبابٸن جوبالاۋ قىلۋدان بۇرٸن بۇرشاق قادامدىق بولۋٸ كەرەك، ساقتاپ تۇر! Unable to discover the file, it may have been removed or deleted. حۇجاتتى بايقىيالمىسىڭىز، ٶشٸرٸلگەن ياكي ٶشٸرٸلگەن بولۋٸ مۇمكان. permission denied ماقۇلداۋ رەت قىلىندى file not found 没有发现该文件 duplicate قايتالاۋ Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data ساندىق مالىمەت System Disk سەستما ديسكاسى label بەلگى Computer كومپيۋتەر File System 文件系统 Data ساندىق مالىمەت Failed to open file "%1": insufficient permissions. «%1» حۇجاتىن ٸشٸۋ جەڭىلىس قالدى: ماقۇلداۋ جەتەرلىك ەمەس. File “%1” does not exist. Please check whether the file has been deleted. حۇجات "%1" ساقتالعان ەمەس. حۇجاتنىڭ ٶشٸرٸلگەن-وشىرلمەگەندكتى تەكسەرٸپ كور. burn operation has been cancelled كۇيگىرتكىشىن جوبالاۋى كۇشىنەن قالدىرىلدى. is busy! وتە قاربالاس! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. ٴسىز شىنىندا نۇ حۇجاتتى ماڭگىلىك ٶشٸرمەكشٸ؟ ٴوشىرۋ باستالعان اقىرىندا، حۇجاتتى قالپىنا كەلتىرگەلى بولمايدى. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. ٴسىز شىنىندا نۇ %1 حۇجاتتاردى ماڭگىلىك ٶشٸرمەكشٸ؟ ٴوشىرۋ باستالعاننان كەيىن، نۇ حۇجاتتاردى قالپىنا كەلتىرگەلى بولمايدى. Virtual file directories do not support move operations جاساندى حۇجات باسمازمۇن جوتكەۋ جوبالاۋدى قولدامايدى test simplify vfs plugin VFS قىستىرمانى جەڭىلدەتۋ سىناق ەتۋ Default custom vfs info of peony پيون ادەتتى ەرٸكتٸ vfs حابارى Default local vfs info of peony پيون ادەتتى جەرلىك vfs حابارى Show properties plugin window. قاسيەت قىستىرما تەرەزەنى كورسەتۋ. Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel كۇشىنەن قالدىرۋ Ok ماقۇل Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData Disc Type: ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ No burn data, please add! كۇيگىرتكىشىن ساندىق مالىمەتى جوق، قوس! The disc name cannot be set to empty, please re-enter it! ديسكا ديسكا اتاعىن بوس ورىنداپ تەڭشەۋگە بولمايدى، قاتە كىرگىزىڭىز! AppendBurnData operation has been finished successfully. AppendBurnData جوبالاۋى ٴساتتٸ تامامدالدٸ. Sorry, the appendBurnData operation is failed! كەشىرىڭ، appendBurnData جوبالاۋى جەڭىلىپ قالدى! Failed جەڭىلىپ قالدى Burning. Do not close this window كۇيىك كەتىپ بارا جاتىر. نۇ تەرەزەسى يېپىۋەتمەڭ Burning this disc will append datas on it. Do you want to continue ? نۇ دەسكانى كۆيدۈرگەندە وعان ساندىق مالىمەت قوسىپ قويىلادى . سىزدىڭ داۋاملاشتۇرغۇڭىز بارما ؟ Burn كۇيىك Begin Burning كۇيىك باستاۋ Close تىعنداۋ UdfBurn::UdfFormatDialog Format ٴپىشىم Disc Type: ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ The disc name cannot be set to empty, please re-enter it! ديسكا ديسكا اتاعىن بوس ورىنداپ تەڭشەۋگە بولمايدى، قاتە كىرگىزىڭىز! Format operation has been finished successfully. ٴپىشىم جوبالاۋى ٴساتتٸ تامامدالدٸ. Sorry, the format operation is failed! كەشىرىڭ، ٴپىشىم جوبالاۋى جەڭىلىپ قالدى! Failed جەڭىلىپ قالدى Formatting. Do not close this window ٴپىشىم. نۇ تەرەزەسى يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ دەسكانى فورماتتالعاندا ونٸڭداعٸ بارلٸق ساندىق مالىمەتتە ٶشٸرٸلەدٸ. پىشىم نۇرۇن ساقتالعان بارلٸق ساندىق مالىمەتتەنى زاپاستاپ قويىڭىز. سىزدىڭ داۋاملاشتۇرغۇڭىز بارما ؟ Begin Format باستالۋ ٴپىشىنى Close تىعنداۋ UdfFormatDialog Format ٴپىشىم Disc Type: ديسكا ديسكا تيپى: Device Name: اسباب اتٸ: OK تۇراقتاندىرۋ Cancel كۇشىنەن قالدىرۋ Unknown كۋالىك Warning ەسكەرتۋ The disc name cannot be set to empty, please re-enter it! ديسكا ديسكا اتاعىن بوس ورىنداپ تەڭشەۋگە بولمايدى، قاتە كىرگىزىڭىز! Format operation has been finished successfully. ٴپىشىم جوبالاۋى ٴساتتٸ تامامدالدٸ. Sorry, the format operation is failed! كەشىرىڭ، ٴپىشىم جوبالاۋى جەڭىلىپ قالدى! Failed جەڭىلىپ قالدى Formatting. Do not close this window ٴپىشىم. نۇ تەرەزەسى يېپىۋەتمەڭ Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? نۇ دەسكانى فورماتتالعاندا ونٸڭداعٸ بارلٸق ساندىق مالىمەتتە ٶشٸرٸلەدٸ. پىشىم نۇرۇن ساقتالعان بارلٸق ساندىق مالىمەتتەنى زاپاستاپ قويىڭىز. سىزدىڭ داۋاملاشتۇرغۇڭىز بارما ؟ Begin Format باستالۋ ٴپىشىنى Close تىعنداۋ progressBarHelper Time is being calculated 正在计算时间 Calculating time ۋاقىت ەسەپتەۋگە %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1 مينۋت%2سەكونت %1sec %1سەكونت peony/translations/libpeony-qt/libpeony-qt_zh_CN.ts0000664000175000017500000110712415154271106021522 0ustar fengfeng ColorPushButton label management ... 标识管理 ... Label Management ... 标识管理 ... Remove "%1" 移除“%1” delete "%1" 删除“%1” add "%1" 添加“%1” ConnectServerDialog Connect to Sever 连接到服务器 Domain 域名 Password 密码 Save Password 记住密码 User 用户名 Anonymous 匿名登录 Ok 确定 Cancel 取消 DiscControl is busy! 被占用! is busy! 被占用! not support udf at present. 目前不支持udf格式化 unmount disc failed before udf format. 在 udf 格式之前卸载磁盘失败。 is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. DVD+RW udf格式化失败 preparation failed before DVD-RW udf format. DVD-RW udf 格式之前的准备失败。 FileLabelModel Red 红色 Orange 橙色 Yellow 黄色 Green 绿色 Blue 蓝色 Purple 紫色 Gray 灰色 Transparent 无颜色 Delete file Warning 删除文件警告 Error 错误 Label or color is duplicated. 标签或者颜色重复 FileOperationHelper Burn failed 刻录失败 Format_Dialog Dialog 格式化 rom_size 容量大小 system 文件系统 vfat/fat32 vfat/fat32 exfat exfat ntfs NTFS vfat VFAT ext4 Ext4 device_name 设备名称 clean it total 完全擦除(时间较长,请确认!) ok 确定 close 关闭 TextLabel 容量 qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format 格式化 Rom size: 容量大小 Filesystem: 文件系统 Disk name: 设备名称 Completely erase(Time is longer, please confirm!) 完全擦除(时间较长,请确认!) Set password 设置密码 Set password for volume based on LUKS (only ext4) 为ext4分区设置基于LUKS的密码 Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive 格式化为ext4文件系统时可能会导致其他用户无法读写U盘 Cancel 关闭 OK 确定 Data 数据盘 Error locking device: Failed to deactivate device: Device or resource busy 锁定设备失败:设备或者资源忙,无法停止。 Warning 警告 Device name cannot start with a decimal point, Please re-enter! 设备名称不能以小数点开始,请重新输入! Enter Password: 输入密码: Password too short, please retype a password more than 6 characters 密码过短, 请重新输入大于6位的密码 %1/sec, %2 remaining. %1/秒, 剩余%2. over one day 超过一天 getting progress... 正在获取进度... Error 错误 Block not existed! 设备不存在! Formatting. Do not close this window 正在格式化, 请勿关闭 KyFileDialogRename Renaming "%1" 正在重命名 "%1" Renaming failed, the reason is: %1 重命名失败, 原因: %1 Filename too long 文件名过长 Copying "%1" 正在复制 "%1" To "%1" 到 "%1" Copying failed, the reason is: %1 复制失败, 原因: %1 Moving "%1" 正在移动 "%1" Moving failed, the reason is: %1 移动失败, 原因: %1 File operation error: 文件操作错误: The reason is: %1 原因: %1 Truncation 截断 Save 保存 All applications 全部应用 Cancel 取消 Apply 应用 Bytes 字节 Front truncation 前截断 Post truncation 后截断 Description: Skip copying files of the current type 说明:跳过当前类型文件的复制 truncate interval 截断区间 . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select 说明:截断文件名超过 %1 字节的部分,去选择 Explanation: When renaming a file name, ensure it is within %1 bytes and 说明:用户重命名文件名,保证在 %1 字节内,去 Explanation: Truncate the portion of the file name that exceeds 225 bytes and select 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/扩展". 说明:默认保存至"%1/扩展"。 modify the name 修改命名 Explanation: When renaming a file name, ensure it is within 255 bytes and 说明:用户重命名文件名,保证在225字节以内,去 {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and 说明:用户重命名文件名,保证在225字节以内,去 Skip 跳过 Skip All 全部跳过 Rename 重命名 Please enter a new name 请输入文件名 OK 确定 MainProgressBar File operation 文件操作 starting ... 正在开始 ... cancel all file operations 取消所有文件操作 Minimize 最小化 Close 关闭 Are you sure to cancel all file operations? 确定取消所有文件操作? Are you sure want to cancel all file operations 确定要取消所有文件操作? OK 确定 File Operation 文件操作 Cancel 取消 Calculating time 正在计算时间 continue 继续 pause 暂停 canceling ... 取消中 ... sync ... 正在同步... %1MB/s Est. time left: %2 %1MB/s 预计剩余时间: %2 %1Mb/s Est. time left: %2 %1Mb/s 预计剩余时间: %2 MessageDialog Peony 文件管理器 Forcibly pulling out the device may cause data loss or device exceptions! 强制拔出设备可能会导致数据丢失 或数据异常! OtherButton Other queue 其它队列 Other Queue 其它队列 Peony::AdvanceSearchBar Key Words 关键词 input key words... 输入关键词... Search Location 搜索路径 choose search path... 选择要搜索的位置... browse 浏览 File Type 文件类型 Choose File Type 选择文件类型 Modify Time 修改时间 Choose Modify Time 选择修改时间 File Size 文件大小 Choose file size 选择文件大小 show hidden file 显示隐藏文件 go back 后退 hidden advance search page 隐藏高级搜索界面 file name 文件名 content 内容 search 搜索 start search 开始搜索 Select path 选择路径 Operate Tips 提示 Have no key words or search location! 没有关键字或路径! Search file name or content at least choose one! 搜索文件名或者内容请至少指定一个! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 yesterday last week last month last year year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... 搜索内容 Search File 搜索文件 Peony::AdvancedPermissionsPage Permission refinement settings 权限细化设置 Permission refinement settings tip 权限细化设置提示 Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? 设置文件的ACL权限将改变用文件基本权限中用户组的权限,是否继续设置文件的ACL权限? User 用户 Read 可读 Write 可写 Executable 可执行 delete 删除 Inherit permission 继承权限 Input domain/user name Add Other User Add 添加 Apply 应用 Cancel 取消 Error 错误 Please enter a user name User does not exist User already exists in list Peony::AllFileLaunchDialog Choose new application 选择一个新的应用 Choose an Application to open this file 选择一个应用打开这个文件 apply now 立即应用 OK 确定 Cancel 取消 Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon 选择自定义图标 Type: 类型: Display Name: 名称: Location: 路径: Overview: 概览: Change 更改 Name 名称 Location 位置 move 移动 symbolLink 快捷方式 Folder 文件夹 Include: 包含: Move 移动 Open with: 打开方式: Description: 描述: Select multiple files 选中多个文件 Size: 文件大小: Total size: 实际大小: Space Useage: 占用空间: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: 创建时间: Space Usage: 占用空间: Time Create: 创建时间: Time Modified: 修改时间: Time Access: 访问时间: Readonly 只读 Hidden 隐藏 Readonly (just applied by subfiles) 只读(仅对文件夹下文件) Property: 属性: usershare 本机共享 %1 (%2 Bytes) %1 (%2 字节) Images (*.png *.jpg *.jpeg *.svg) 图片(*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. 请选择小于1MB的图片。 Choose a new folder: 选择一个新的文件夹: Error 错误 cannot move a folder to itself ! 不能移动一个文件夹到它内部! %1 Bytes %1 字节 %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 个文件, %2 个文件夹 Can't get remote file information 未能获取远程文件信息 %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: 处理器: CPU Core: 核心数: Memory Size: 内存: User Name: 用户名: Desktop: 桌面环境: You should mount this volume first 你需要挂载该卷才能查看信息 Name: 分区名: File System 文件系统 Data 数据盘 System Disk 系统盘 Total Space: 总容量: Used Space: 使用空间: In calculation... 计算中... /root used: /root 占用: /home used: /home 占用: /usershare used: /usershare 占用: /data/* used: /data/* 占用: Unknow (No permission) 未知(无权限查看) Free Space: 剩余空间: Type: 文件系统: Kylin Burner 刻录 Open with: 打开: Unknown 未知的分区 Peony::ConnectServerDialog connect to server 连接服务器 ip 服务器 port 端口 type 类型 Connect to server 连接服务器 Ip 服务器 Port 端口 Type 类型 Personal Collection server: 个人收藏服务器 Add 添加 Delete 删除 Connect 连接 Ip input error, please re-enter! IP输入错误, 请重新输入! Port input error, please re-enter! 端口号输入错误, 请重新输入! add 添加 delete 连接 删除 connect 连接 Warning 警告 ip input error, please re-enter! IP输入错误, 请重新输入! port input error, please re-enter! 端口号输入错误, 请重新输入! Peony::ConnectServerLogin The login user 登录身份 Please enter the %1's user name and password of the server. 请输入服务器 %1 的用户名和密码。 User's identity 连接身份 Guest 游客(匿名登录) Name 名称 Password 密码 domain Cancel 取消 OK 确定 guest 游客(匿名登录) Registered users 注册用户 name 用户名 password 密码 Remember the password 记住密码 cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop 发送到桌面快捷方式 Create Link to... 发送快捷方式到... Choose a Directory to Create Link 选择创建链接的目录 Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop 发送到桌面快捷方式 Peony-Qt Share File menu Extension Tag with Menu. Peony::CreateTemplateOperation File create error 创建文件错误 Can not create %1: Read-only mode, can not write-in 无法创建 %1:只读模式,无法写入 NewFile 新建文件 Create file 文件创建 NewFolder 新建文件夹 Create file error 创建文件错误 Peony::CustomErrorHandler Is Error Handled? 错误是否已处理? Error not be handled correctly 错误未被正确处理 Peony::DefaultAcitonWidget No default app 没有设置默认打开方式 Peony::DefaultOpenWithWidget No default app 没有设置默认打开方式 Peony::DefaultPreviewPage Select the file you want to preview... 选择你想要预览的文件... Select the file you want to preview 选择你想要预览的文件 Can not preview this file 不能预览该文件 Can not preview this file. 不能预览该文件. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview 详细信息 This is the Default Preview of peony-qt 显示文件的详细信息 Peony::DetailsPropertiesPage Name: 名称: File type: 文件类型: Location: 路径: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss Create time: 创建时间: Modify time: 修改时间: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: 文件大小: Width: 宽度: Height: 高度: Owner 拥有者 Owner: 拥有者: Computer 计算机 Computer: 计算机: %1 (this computer) %1 (这台电脑) Unknown 未知的分区 Can't get remote file information 不能获取远程文件信息 %1 px %1 像素 Peony::DirectoryView::IconView Icon View 图标视图 warn 警告 This operation is not supported. 不支持此操作。 Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn 警告 This operation is not supported. 不支持此操作。 Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark 添加到快速访问 &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder 新建文件夹 Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name 文件名称 File Type 文件类型 File Size 文件大小 New... 新建... Open in New Window 在新窗口中打开 Open in New Tab 在新标签页中打开 Open 打开 Open failed 无法打开 Open directory failed, you have no permission! 无法打开文件夹,没有权限! Open with... 打开方式 More applications... 更多应用 Open %1 selected files 打开%1个选中文件 New 新建 Empty File 空文本 Folder 文件夹 View Type 视图类型 Sort By 排序类型 Modified Date 修改日期 Original Path 原始路径 Sort Order... 排序顺序... Ascending Order 升序 Mount 挂载 MultiSelect 多选 Descending Order 降序 Sort Preferences... 排序偏好... Folder First 文件夹优先 Chinese First 中文优先 Show Hidden 显示隐藏文件 Copy 复制 Cancel 取消 File:"%1" is not exist, did you moved or deleted it? 文件 ”%s“ 不存在,你是否已经删除或移动到别处? Peony-Qt filesafe menu Extension 文件保护箱扩展 Peony File Labels Menu Extension 文件标记 &Copy 复制(&C) Cut 剪切 Delete to trash 删除到回收站 Paste 粘贴 Refresh 刷新 Select All 全选 Properties 属性 format 格式化 Restore 还原 Delete 删除 Time Modified 修改时间 Path 路径 Sort Order 排序顺序 Newest to oldest 从新到旧 Oldest to newest 从旧到新 Files from large to small 从大到小 Files from small to large 从小到大 Sort Preferences 排序偏好 Error 错误 File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever 永久删除 Rename 重命名 Select &All 全选(&A) Reverse Select 反选 P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash 清空回收站(&C) Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All 清空全部 Open Parent Folder in New Window 在新窗口中打开文件所在目录 Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager 插件管理设置 Available extensions 可使用的插件 Ok 确定 Cancel 取消 Peony::FMWindow File Manager 文件管理器 advanced search 高级搜索 clear record 清空历史 Loaing... Press Esc to stop a loading. 正在加载...按下Esc键取消. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo 撤销 Redo 重做 Peony Qt 文件管理器 Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder 新建文件夹 Peony::FileBatchRenameOperation File Rename error 文件重命名错误 Invalid file name %1%2%3 . 非法的文件名%1%2%3. File Rename warning 文件重命名警告 Are you sure to hidden these files? 确定隐藏这些文件? Rename file error 重命名文件错误 Peony::FileCopy Error in source or destination file path! 源地址或者目标文件路径出错! Error when copy file: %1, can not copy special files, skip this file and continue? 拷贝文件: %1 时出错,不能拷贝特殊类型文件,是否跳过此文件并继续? Can not copy %1, file doesn't exist. Has the file been renamed or moved? 无法拷贝 %1, 文件不存在. 是否被重命名或移动? The dest file "%1" has existed! 目标文件 %1 已经存在! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! vfat/fat32文件系统不支持单文件所占空间大于4g Error writing to file: Input/output error 写入文件出错:输入输出错误 Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. 创建文件 %1 失败,请确认是否是在根目录创建,或者设备是否正确支持个gphoto2协议。 Failed to create %1. 创建文件 %1 失败。 Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! 请确认设备是否被移除! Write file error: There is no available disk space for device! 写入文件错误: 设备上没有足够可用空间! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure 打开文件失败 Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel 操作取消 Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 创建目录%1失败: %2 File copy error 文件复制错误 The file name exceeds the limit 文件名长度超出限制 Cannot opening file, permission denied! 无法打开文件,权限不够! File:%1 was not found. 未找到文件:%1. open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 System Disk 系统盘 File System 文件系统 Can not copy %1 to %2: Read-only mode, can not write-in 无法复制 %1 到 %2:只读模式,无法写入 Can not copy %1 to %2: Permission denied 无法复制 %1 到 %2:权限不够 Data 数据盘 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 设备可用空间不足,拷贝文件大小:%2 GB,需要空间:%3 GB。 Link file error 创建文件链接失败 Burning does not support replacement 刻录操作不支持替换文件 Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error 文件删除错误 Delete file error 删除错误 Invalid Operation! Can not delete "%1". 非法的操作! 不能删除 "%1". Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled 密码对话框被取消 Message recipient disconnected from message bus without replying! 消息接收者在没有回复的情况下与消息总线断开连接! Error 错误 Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data 数据盘 folder 文件夹 file 文件 text file 文本文件 Peony::FileInfoJob Trash 回收站 Computer 计算机 Network 网络 Recent 最近 Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Computer 计算机 Network 网络 Recent 最近 Peony::FileItem Delete file Warning 删除文件警告 Warning 警告 Error 错误 Open Link failed 打开链接失败 File not exist, do you want to delete the link file? 目标文件夹不存在,是否删除该无效快捷方式? Can not open path "%1",permission denied. 打开路径 "%1" 失败,权限被拒绝。 Can not find path "%1",are you moved or renamed it? 未找到路径:"%1",您是否已经移动或者重命名? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) 个子项 Symbol Link, 快捷方式, System Disk 系统盘 File Name 文件名称 Delete Date 删除日期 Create Date 创建时间 Time Modified 修改时间 File Size 文件大小 Original Path 原始路径 Path 路径 File %1 is existed in space, please not add file repeatly. 空间已存在文件 %1,不可重复添加。 Operation not supported 操作不支持 File Type 文件类型 Modified Date 修改日期 Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label 添加标记 Delete All Label 删除所有标记 Label Management ... 标识管理 ... add "%1" 添加“%1” Remove "%1" 移除“%1” Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. label management ... 标识管理 ... Peony::FileLabelWidget label management ... 标识管理 ... Label Management ... 标识管理 ... Peony::FileLauchDialog Applications 应用程序 Choose an Application to open this file 选择一个应用打开这个文件 Set as Default 设为默认 OK 确定 No application is set to open file %1 未设定用来打开文件“%1”的应用程序。 The opening mode of the %1 %2 %1%2 打开方式 unknown 未知 No application is set to open file "%1 %2" 未设定用来打开文件“%1%2”的应用程序。 Still using the last opened application: 仍使用最后打开的应用: known 已知 Open application is used by default: 默认使用打开的应用程序: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. 您可以在软件中心搜索能够打开此文件的应用程序,或者选取电脑上的现有应用程序。 Other application: 其他应用程序: Select application: 选取应用程序: Always open the %1%2 file with this application 始终用该应用打开%1%2文件 Choose other application 选择其他应用 Go to application center 去软件中心安装应用 Ok 确定 Cancel 取消 Desktop files(*.desktop) 桌面文件(*.desktop) Select Open Action 选择打开方式 Select 选择 Peony::FileLaunchAction Execute Directly 直接运行 Execute in Terminal 在终端运行 Detected launching an executable file %1, you want? 正在打开一个可执行文件%1, 你希望? Delete file Warning 删除文件警告 Open Failed 无法打开 Can not open %1, file not exist, is it deleted? 无法打开%1,文件不存在,请确认是否已被删除? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission 没有权限 File is not readable. Please check if file has read permisson. 文件不可读,请确认当前用户拥有文件的读权限。 By Default App 使用默认打开方式 Launch Options 执行选项 Open Link failed 打开链接失败 File not exist, do you want to delete the link file? 目标文件不存在,您需要删除该链接吗? Can not open %1, Please confirm you have the right authority. 无法打开%1,请确认您有正确的打开权限。 Open App failed 快捷方式存在问题 The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? 该链接指向的应用已经被修改或者卸载,因此该快捷方式无法正常工作。 是否删除该快捷方式? Error 错误 File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Can not get a default application for opening %1, do you want open it with text format? 没有找到默认打开%1的应用, 是否用文本编辑器打开? Operate Tips 提示 Sorry, the system currently does not have an application that supports .%1 (%2) files. 抱歉,当前系统暂无支持 .%1 (%2) 的应用程序。 Please search the software store for programs that can run %1 applications, or select an existing application on your computer to open it. 请在软件商店搜索能运行 %1 应用的程序,或选取电脑上现有的应用程序打开。 Sorry, the system currently does not have a default application set for opening "xxx.xxx" file format. 抱歉,当前系统暂未设定打开“xxx.xxx”文件格式的应用程序。 Please search the software store for applications that can open this file, or select an existing application in the system. 请在软件商店搜索可以打开此文件的应用程序,或选取系统中现有的应用程序。 Search Software Store 搜索软件商店 Select Application... 选取应用程序... Warning 警告 Can not open the file, application is disabled 无法打开文件,应用被禁用。 Peony::FileLinkOperation Symbolic Link 快捷方式 Link file error 创建文件链接失败 Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error 移动文件错误 File System 文件系统 Data 数据盘 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 设备可用空间不足,拷贝文件大小:%2 GB,需要空间:%3 GB。 File move error 文件移动错误 Invalid move operation, cannot move a file into its sub directories. 非法的移动操作,不能移动文件夹到自身路径下。 The file name exceeds the limit 文件名长度超出限制 Create file error 创建文件错误 Can not move %1 to %2: Read-only mode, can not write-in 无法移动 %1 到 %2:只读模式,无法写入 Can not move %1 to %2: Permission denied 无法移动 %1 到 %2:权限不够 Cannot opening file, permission denied! 无法打开文件,权限不够! File:%1 was not found. 未找到文件:%1. Invalid Operation. 非法的操作. System Disk 系统盘 open file %1 error: Read-only file system 打开文件 %1 出错:只读文件系统 File delete error 文件删除错误 Link file error 创建文件链接失败 Burning does not support replacement 刻录操作不支持替换文件 Burn failed 刻录失败 File delete 文件删除 Invalid Operation 非法的操作 Peony::FileOperationAfterProgressPage &More Details 详细信息(&M) Peony::FileOperationErrorDialog File Operation Error 文件操作错误 unkwon 未知原因 null Error message: 错误信息: Source File: 源文件: Dest File: 目标文件: Ignore 忽略 Ignore All 全部忽略 Overwrite 覆盖 Overwrite All 全部覆盖 Backup 备份 Backup All 全部备份 &Retry 重试(&R) &Cancel 取消(&C) Peony::FileOperationErrorDialogBase Close 关闭 Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace 替换 Ignore 忽略 Do the same 全部应用 <p>This location already contains the file '%1', Do you want to override it?</p> <p>此位置已包含名称为“%1”的文件,您确定要替换它吗?</p> Unexpected error from %1 to %2 从 %1 至 %2 操作发生异常错误 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup 备份 Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No Cancel 取消 Delete 删除 Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected 请确认磁盘未满或未被写保护而且文件未被使用 Peony::FileOperationErrorDialogNotice OK 确定 Cancel 取消 Make sure the disk is not full or write protected and that the file is not protected 请确认磁盘未满或未被写保护而且文件未被使用 Peony::FileOperationErrorDialogSkip Skip 跳过 Cancel 取消 Skip all 全部跳过 Make sure the disk is not full or write protected and that the file is not protected 请确认磁盘未满或未被写保护而且文件未被使用 Peony::FileOperationErrorDialogWarning OK 确定 Cancel 取消 Skip all 全部跳过 Make sure the disk is not full or write protected and that the file is not protected 请确认磁盘未满或未被写保护而且文件未被使用 Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link 快捷方式 Copy 复制 Move 移动 Rename 重命名 Link 链接 Delete 删除 Delete Permanently 永久删除 Restore 还原 New 新建 - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn 警告 '%1' is occupied,you cannot operate! “%1”已被占用,您无法进行操作! No, go to settings 否,跳转到设置 OK 删除 Cancel 取消 Do you want to put selected %1 item(s) into trash? 确认要将选中的 %1 项放入回收站吗? Do not show again 不再显示 File System 文件系统 System Disk 系统盘 Data 数据盘 Insufficient storage space 存储空间不足 %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 设备可用空间不足,拷贝文件大小:%2 GB,需要空间:%3 GB。 Can't delete. 不能删除 You can't delete a file whenthe file is doing another operation 不能删除一个正在进行其它操作的文件 File Operation is Busy 操作正忙 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。如果你希望文件操作并行,你可以更改选项菜单中的“允许操作并行”配置。 The long name file is saved to %1 长文件被保存到%1 Undo %1 撤销 %1 Redo %1 重做 %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: 总计: state: 状态: Peony::FileOperationProgressPage &More Details 详细信息(&M) From: 从: To: 到: Peony::FileOperationProgressWizard File Manager 文件管理器 &Cancel 取消(&C) Preparing... 准备中... Handling... 正在处理... Clearing... 正在清理... Rollbacking... 回滚中... File Operation 文件操作 A file operation is running backend... 一个文件操作正在后台运行中... %1 files, %2 %1个文件,共%2 %1 done, %2 total, %3 of %4. 完成%1,共%2,%4中的第%3个。 clearing: %1, %2 of %3 正在清理:%1,%3中的第%2个 copying... 复制中... Syncing... 正在同步... Peony::FilePreviewPage File Name: 文件名称: File Type: 类型 Time Access: 上次打开时间 Time Modified: 修改时间 Children Count: 包含文件 Size: 大小 Location: 所在位置: Time Created: 创建时间 Image resolution: 分辨率 color model: 色彩模式 <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>打开文件</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>打开文件位置</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> <a href='#' style = 'text-decoration:none'>从该空间移除</a> Cancel 取消 OK 确定 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空间文件聚合更新时,这些文件不再显示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空间文件聚合更新时,这些文件不再显示</font> Do you want to remove this file?<br> 确定要移除该文件吗? Do not ask again 不再提醒 usershare 本机共享 Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden 共%1项,其中%2个隐藏文件 Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error 文件重命名错误 Invalid file name %1%2%3 . 非法的文件名%1%2%3. Are you sure to hidden this file? 确定隐藏该文件? When change the file suffix, the file may be invalid. Are you sure to change it ? 改变扩展名可能导致文件不可用,确认更改吗? A file and a directory with the same name cannot replace each other 同名的文件和文件夹,无法相互替换。 The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning 文件重命名警告 The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error 重命名文件错误 Peony::FileTrashOperation File trash error 刪除文件到回收站错误 Can not trash %1: Read-only file system 无法删除 %1 到回收站:只读文件系统 trash:/// trash:/// Trash file error 刪除文件到回收站错误 Invalid Operation! Can not trash "%1". 非法的操作! 不能回收 "%1". Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. 存在无法处理的冲突,请检查回收站。 The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error 从回收站恢复文件错误 Can not find trashed file %1, might be restored or removed. 无法找到回收的文件 %1,文件可能被还原或者删除。 Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread 最大化 Minimize 最小化 Close 关闭 Peony::IDMActionsManager Rename Spaces 重命名空间 Space Name 空间名称 Please input space name 请输入空间名称 OK 确定 Cancel 取消 Rename Space 重命名空间 Space rename failed 空间重命名失败 Failed to rename space 无法重命名空间 Failed to rename space %1 to %2, %2 is existed. 无法重命名空间%1为%2,空间%2已存在。 Edit Space Condition 编辑空间条件 Close dynamically 关闭动态更新 Open dynamically 打开动态更新 Delete Spaces 删除空间 Are you sure to delete space %1 ? 确定要删除空间%1? Open 打开 Open With 打开方式 More applications 更多应用 Open The Folder Location 打开文件所在位置 Add File 添加文件 Choose file to add into space 选择要添加到空间的文件 File %1 is existed in space, please not add file repeatly. 空间已存在文件 %1,不可重复添加。 Move to space 移动至空间 Remove From Space 从该空间内移除 <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>移除后,空间文件聚合更新时,这些文件不再显示</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> <font color='gray'>移除后,空间文件聚合更新时,这些文件不再显示</font> Do you want to remove selected %1 item(s)?<br> 确定要移除这 %1项文件吗?<br> Do you want to remove this file?<br> 确定要移除该文件吗? Do not ask again 不再提醒 Copy 复制 Save As 另存为 file 文件 All File 所有文件 This location has no write permission.please change the storage location 该位置无储存权限,建议更换位置 Label 标记 Properties 属性 Peony::ImageMountManager Invalid device path: %1 设备路径不可用:%1 Cannot find loop device for path: %1 无法找到虚拟块设备路径:%1 Failed to unmount filesystem: %1 卸载文件系统失败:%1 Failed to delete loop device: %1 删除虚拟块设备失败:%1 Peony::LabelSettings Name 标记名 SideBar 边栏 Menu 右键菜单 Create New Label 新建标识 Delete Label 删除标识 Display the following items in the identification area: (maximum of 6) 在标识区显示如下项:(最多6个) Rename 重命名 Edit Color 修改标识颜色 Delete This Label 删除此标识 Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" 在“%2”中搜索“%1” File System 文件系统 Search results for all files marked in "%1" in "%2" 在“%2”中搜索所有“%1”标识文件的结果 &Copy Directory 拷贝路径(&C) Open In New Tab 在新标签页中打开 Open In New Window 在新窗口中打开 Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory 拷贝路径 Peony::MountOperation Operation Cancelled 操作被取消 Login failed, unknown username or password error, please re-enter! 验证失败,未知的用户名或者密码错误,请重新输入! Peony::NavigationToolBar Go Back 后退 Go Forward 前进 History 历史 Clear History 清空历史 Cd Up 向上 Refresh 刷新 Peony::NewFileLaunchDialog Choose new application 选择一个新的应用 Choose an Application to open this file 选择一个应用打开这个文件 apply now 立即应用 OK 确定 Cancel 取消 Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? 您希望以什么方式打开“%1%2”文件? Default open with: 默认打开方式: Other: 其他: Choose other application 选择其他应用 Go to application center 去软件中心 Peony::PathEdit Go To 跳转 Peony::PermissionsPropertiesPage User or Group 用户或组 Type 类型 Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 对象名称: %1 Read and Write 读写 Readonly 只读 Group or User 用户或组 (Current User) (当前用户) The folder containing this file is protected, and only the file owner can modify the file. 此文件所在的文件夹设置了安全保护,只有文件所有者可以修改文件。 Current User 当前用户 Permissions modify tip 权限修改提示 The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? 当前文件或目录已经设置了ACL权限,修改用户组权限可能导致ACL权限不可用,是否继续修改用户组权限? Permission refinement settings 权限细化设置 The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? 当前用户已经设置了高级共享,如果修改权限,高级共享可能不可用,是否希望继续设置? Read 可读 Write 可写 Executable 可执行 Can not get the permission info. 无法获取文件权限相关信息。 (Me) (我) Others 其他 Owner 拥有者 Group 用户组 Other 其他 Other Users 其它用户 You can not change the access of this file. 你无法修改该文件的权限。 Me User 用户 Peony::PropertiesSetDialog Confirming property settings 确认属性设置 Whether to apply to the current selected option or to selected options and subfolders and subfiles. 是否应用于当前所选项,还是应用于所选项以及子文件夹和子文件。 Apply the current selection 应用于当前所选项 Apply the current selection as well as subfolders and subfiles 应用于当前所选项以及子文件夹和子文件 Ok 确定 Cancel 取消 Peony::PropertiesWindow Trash 回收站 Recent 最近 Selected 选中 %1 Files %1 个文件 usershare 本机共享 Data 数据盘 System Disk 系统盘 Properties 属性 Ok 确定 Cancel 取消 Restore 还原 Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. 删除到回收站时弹出确认框。 Origin Path: 原路径: Deletion Date: 删除日期: Size: 文件大小: Original Location: 原路径: Peony::SearchBar Input the search key of files you would like to find. 输入关键词以搜索你想搜索的文件. Input search key... 输入关键词... advance search 高级搜索 clear record 清空历史 Peony::SearchBarContainer Choose File Type 选择文件类型 Search File 搜索文件 Clear 清空 all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 Peony::SharedFileLinkOperation Symbolic Link 快捷方式 The dest file "%1" has existed! 目标文件 %1 已经存在! Link file error 创建文件链接失败 Peony::SideBarCloudItem CloudStorage 云存储 CloudFile 云文件 Peony::SideBarFavoriteItem Trash 回收站 Recent 最近 Quick Access 快速访问 Quick access 快速访问 Favorite 快速访问 KmreData 移动应用 Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data 数据盘 Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties 属性 Delete Symbolic 删除 Remove from bookmark 从“快速访问”取消固定 Unmount 卸载 Eject 弹出 Format 格式化 burndata &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network 网络 Peony::SideBarPersonalItem Personal 个人 Peony::SideBarSeparatorItem (No Sub Directory) (空) Peony::StatusBar ; %1 folders ;%1个文件夹 ; %1 files, %2 total ;%1个文件,总共%2 ; %1 folder ;%1个文件夹 ; %1 file, %2 ;%1个文件,%2 %1 selected 选中%1项 Peony::SyncThread notify 温馨提示 温馨提示 Notify 温馨提示 Peony::TagManagement General 通用 Mark 标记 Sidebar 边栏 Advanced 高级 Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type 排序类型 File Name 文件名称 File Type 文件类型 File Size 文件大小 Modified Date 修改日期 Open in New window 在新窗口中打开 Open in new Tab 在新标签页中打开 Ascending 升序 Descending 降序 Copy 复制 Paste 粘贴 Cut 剪切 Trash 删除 Clean Trash 清空回收站 Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore 还原 Options 选项 Forbid Thumbnail 禁用缩略图 Show Hidden 显示隐藏文件 Resident in Backend 常驻后台 Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. 让文件管理器在关闭所有窗口后仍然运行,这将缩短下次启动所需要的时间,但是也会一直占用资源。 &Help 帮助(&H) &About... 关于...(&A) Peony Qt 文件管理器 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow 未知 Type: 类型: Duration: 时长: Size: 大小: Loading... 加载中... Res: 分辨率: Mod Date: 修改日期: Deleted date: 删除日期: Original path: 原路径: Peony::UserShareInfoManager Warning 警告 Peony::VolumeManager Error 错误 ProgressBar starting ... 正在开始 ... canceling ... 取消中 ... sync ... 正在同步... continue 继续 pause 暂停 close 关闭 cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View 图标视图 Show the folder children as icons. 以图标形式显示目录. List View 列表视图 Show the folder children as rows in a list. 以列表形式显示目录. Basic Preview Page 基本 Basic 基本 Show the basic file properties, and allow you to modify the access and name. 显示文件的基本属性,允许修改文件名称。 Permissions Page 权限 Permissions 权限 Show and modify file's permission, owner and group. 查看和修改文件的权限。 Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? 文件过大,不可移入回收站。是否永久删除该文件? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? 文件过大,不可移入回收站。是否永久删除这 %1 项文件? Delete 删除 Clean the Trash 清空回收站 OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. 确认要清空回收站内的文件吗?此操作无法撤销。 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties 计算机属性 Show the computer properties or items in computer. 显示计算机属性或计算机中的项。 Trash and Recent Properties Page 最近/回收 Trash and Recent 回收站/最近 Show the file properties or items in trash or recent. 显示“回收站”或“最近”中的文件属性或项目。 eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed 格式化失败 YES 确认 Formatting successful! But failed to set the device name. 格式化成功!设备名设置失败。 qmesg_notify 通知 Format 格式化 Begin Format 开始 Close 关闭 Format operation has been finished successfully. 格式化操作已成功完成。 Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 close 关闭 File Manager 文件管理器 Notify 温馨提示 notify 温馨提示 Default search vfs of peony 默认文件搜索 Force unmount failed 强制卸载失败 Error: %1 错误: %1 Data synchronization is complete,the device has been unmount successfully! 数据同步完成,设备已经成功卸载! Unmount failed 卸载失败 Not authorized to perform operation. 操作未获得授权。 Unable to unmount it, you may need to close some programs, such as: GParted etc. 无法卸载,您可能需要先关闭一些程序,如分区编辑器等。 Error: %1 Do you want to unmount forcely? 错误: %1 是否强制卸载? Cancel 取消 Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase 无法激活设备: 错误的口令 The device has been mount successfully! 设备挂载成功! Eject device failed, the reason may be that the device has been removed, etc. 弹出设备失败,可能是设备已经被移除等原因。 Data synchronization is complete and the device can be safely unplugged! 数据同步完成,设备可以安全拔出! Password is empty, please re-enter! 密码为空,请重新输入! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed 弹出失败 favorite 快速访问 Favorites 快速访问 File is not existed. 文件不存在. Share Data 本机共享 Trash 回收站 Recent 最近 Operation not supported 操作不支持 The virtual file system does not support folder creation 虚拟文件系统下不支持创建新文件夹 Can not create a symbolic file for vfs location 无法为虚拟目录创建快捷方式 Symbolic Link 快捷方式 Can not create symbolic file here, %1 无法在此创建快捷方式, %1 Can not add a file to favorite directory. 文件不能被添加到收藏夹. The virtual file system cannot be opened 虚拟文件系统无法打开 Virtual file directories do not support move and copy operations 虚拟文件路径不支持移动和复制操作 Default favorite vfs of peony 文件管理器虚拟文件系统默认快速访问 Details 详细信息 Mark 标记 mark this file. 标记这个文件。 Open With 打开方式 open with. 打开方式。 It need to synchronize before operating the device,place wait! 操作设备前需要同步数据,请稍等! Unable to discover the file, it may have been removed or deleted. 未找到文件,可能被移动或删除。 permission denied 没有权限 file not found 没有发现该文件 duplicate 副本 Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data 数据盘 System Disk 系统盘 label 标记 Computer 计算机 File System 文件系统 Data 数据盘 Failed to open file "%1": insufficient permissions. 打开文件"%1"失败:权限不足。 File “%1” does not exist. Please check whether the file has been deleted. 文件“%1”不存在,请检查文件是否被删除。 burn operation has been cancelled 刻录操作已取消 is busy! 被占用! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. 确定永久删除该文件吗?一旦开始删除,文件将不可恢复。 Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. 确定永久删除这 %2 项文件吗?一旦开始删除,文件将不可恢复。 Virtual file directories do not support move operations 虚拟文件路径不支持移动和复制操作 test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Show properties plugin window. Intelligent Space 智能空间 New Intelligent Space 新建智能空间 File %1 is existed in space, please not add file repeatly. 空间已存在文件 %1,不可重复添加。 SpaceSaveDialog Save as space 存为智能空间 Space Name 空间名称 Please input space name 请输入空间名称 Dynamically Update Space Files 动态更新空间文件 Cancel 取消 Ok 确定 Failed to create space %1,%1 is existed 创建空间%1失败,%1已存在。 UdfBurn::UdfAppendBurnDataDialog AppendBurnData 追加刻录 Disc Type: 光盘类型: Device Name: 设备名称: OK 确定 Cancel 取消 Unknown 未知 Warning 警告 No burn data, please add! 没有刻录数据, 请添加! The disc name cannot be set to empty, please re-enter it! 设备名称不能设置为空,请重新输入! AppendBurnData operation has been finished successfully. 追加刻录操作已完成。 Sorry, the appendBurnData operation is failed! 抱歉, 追加刻录操作出错! Failed 失败 Burning. Do not close this window 刻录中, 请勿关闭此窗口 Burning this disc will append datas on it. Do you want to continue ? 刻录此光盘将在其后追加数据, 是否继续? Burn 刻录 Begin Burning 开始刻录 Close 关闭 UdfBurn::UdfFormatDialog Format 格式化 Disc Type: 光盘类型: Device Name: 设备名称: OK 确定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 设备名称不能设置为空,请重新输入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Failed 失败 Formatting. Do not close this window 正在格式化, 请勿关闭 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光盘将擦除其上的所有数据。 请在格式化前备份所有保留的数据。 你想继续吗 ? Begin Format 开始 Close 关闭 UdfFormatDialog Format 格式化 Disc Type: 光盘类型: Device Name: 设备名称: OK 确定 Cancel 取消 Unknown 未知 Warning 警告 The disc name cannot be set to empty, please re-enter it! 设备名称不能设置为空,请重新输入! Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Failed 失败 Formatting. Do not close this window 正在格式化, 请勿关闭 Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此光盘将擦除其上的所有数据。 请在格式化前备份所有保留的数据。 你想继续吗 ? Begin Format 开始 Close 关闭 progressBarHelper Time is being calculated 正在计算时间 Calculating time 正在计算时间 %1day%2hrs%3mins%4sec %1天%2小时%3分钟%4秒 %1hrs%2mins%3sec %1小时%2分钟%3秒 %1 mins%2sec %1 分钟%2秒 %1sec %1秒 peony/translations/libpeony-qt/libpeony-qt_tr.ts0000664000175000017500000103476515154271106021160 0ustar fengfeng ColorPushButton Label Management ... Remove "%1" add "%1" ConnectServerDialog Connect to Sever Sunucuya Bağlan Domain Alan Adı Password Parola Save Password Parolayı Kaydet User Kullanıcı Anonymous Misafir Ok Tamam Cancel İptal DiscControl is busy! is busy! not support udf at present. unmount disc failed before udf format. DVD+RW udf format fail. preparation failed before DVD-RW udf format. FileLabelModel Red Kırmızı Orange Turuncu Yellow Sarı Green Yeşil Blue Mavi Purple Mor Gray Gri Transparent Şeffaf Delete file Warning Dosya Silme Uyarısı Error Hata Label or color is duplicated. Etiket veya renk yinelendi. FileOperationHelper Burn failed Format_Dialog Dialog Diyalog rom_size Rom boyutu system Sistem vfat/fat32 exfat ntfs Ntfs vfat Vfat ext4 Ext4 device_name Aygıt Adı clean it total Toplamı Temizle ok Tamam close Kapat TextLabel qmesg_notify Qmesg bildir Format operation has been finished successfully. Biçimlendirme işlemi başarıyla tamamlandı. Sorry, the format operation is failed! Üzgünüz, formatlama işlemi başarısız oldu! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Bu birimi biçimlendirmek, içindeki tüm verileri silecektir. Biçimlendirmeden önce lütfen saklanan tüm verileri yedekleyin. Devam etmek istiyor musun? format Biçim begin format biçimlendirmeye başla format_success Biçimlentirme başarılı format_err Biçimlendirme hatalı Format Rom size: Filesystem: Disk name: Completely erase(Time is longer, please confirm!) Set password Set password for volume based on LUKS (only ext4) Warning Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive Cancel İptal OK Tamam Data Device name cannot start with a decimal point, Please re-enter! Enter Password: Password too short, please retype a password more than 6 characters %1/sec, %2 remaining. over one day getting progress... Error Hata Block not existed! Formatting. Do not close this window Error locking device: Failed to deactivate device: Device or resource busy KyFileDialogRename Renaming "%1" Renaming failed, the reason is: %1 Filename too long Copying "%1" To "%1" Copying failed, the reason is: %1 Moving "%1" Moving failed, the reason is: %1 File operation error: The reason is: %1 Skip Truncation Save Rename Yeniden Adlandır All applications Cancel İptal Apply Bytes Front truncation Post truncation OK Tamam Description: Skip copying files of the current type truncate interval . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Description: By default, save to "%1/扩展". modify the name Explanation: When renaming a file name, ensure it is within %1 bytes and MainProgressBar File operation Dosya işlemi starting ... Başlatılıyor... Calculating time cancel all file operations Tüm dosya işlemlerini iptal et Are you sure want to cancel all file operations Tüm dosya işlemlerini iptal etmek istediğinizden emin misiniz continue pause canceling ... İptal ediliyor... sync ... %1Mb/s Est. time left: %2 OK Tamam File Operation Dosya İşlemi Minimize Close Kapat Are you sure to cancel all file operations? Cancel İptal MessageDialog Peony Forcibly pulling out the device may cause data loss or device exceptions! OtherButton Other queue Diğer sıra Other Queue Peony::AdvanceSearchBar Key Words Anahtar Kelimeleri input key words... Anahtar kelimeler gir... Search Location Arama Konumu choose search path... Arama yolu seç... browse Araştır File Type Dosya Türü Choose File Type Dosya Türü Seç Modify Time Değiştirme Zamanı Choose Modify Time Değiştirme Zamanı Seç File Size Dosya Boyutu Choose file size Dosya boyutu seç show hidden file Gizli dosyaları göster go back Geri git hidden advance search page Gizli gelişmiş arama sayfası file name Dosya adı content İçerik search Ara start search Aramayı başlat Select path Yol seçin Operate Tips İşlem İpuçları Have no key words or search location! Anahtar kelimeler veya arama konumu yok! Search file name or content at least choose one! Dosya adını veya içeriğini arayın en azından birini seçin! Search content or file name at least choose one! İçeriği veya dosya adını en az birini seçin! all Tümü file folder Dosya klasör image Resim video Video text file Metin dosyası audio Ses others Diğerleri wps file Wps Dosyası today Bugün this week Bu hafta this month Bu ay this year Bu yıl year ago Önceki yıl tiny(0-16K) Çok küçük(0-16K) small(16k-1M) Küçük(16k-1M) medium(1M-100M) Orta(1M-100M) big(100M-1G) Büyük(100M-1G) large(>1G) Çok büyük(>1G) Peony::AdvancedLocationBar Search Content... İçerik Ara... Search File Peony::AdvancedPermissionsPage Permission refinement settings Permission refinement settings tip Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? User Kullanıcı Read Write Executable delete sil Inherit permission Add Apply Cancel İptal Peony::AllFileLaunchDialog Choose new application Yeni uygulama seçin Choose an Application to open this file Bu dosyayı açmak için bir Uygulama seçin apply now Şimdi uygula OK Tamam Cancel İptal Peony::AudioPlayManager Operation file Warning İşlem dosyası Uyarısı Peony::BasicPropertiesPage Choose a custom icon Özel bir simge seçin Type: Tür: Display Name: Ekran Adı: Location: Konum: Overview: Genel Bakış: Change Değiştir Name İsim Location Konum move taşı symbolLink Include: Dahil et: Open with: İle aç: Description: Açıklama: Select multiple files Birden çok dosya seçin Size: Boyut: Total size: Toplam boyut: Time Created: Oluşturma Zamanı: Time Modified: Değiştirme Zamanı: Folder Time Access: Erişim Zamanı: Move Space Usage: Time Create: Readonly Salt okunur Hidden Gizli Readonly (just applied by subfiles) Property: Özellik: usershare %1 (%2 Bytes) Images (*.png *.jpg *.jpeg *.svg) Please select a image that is smaller than 1MB. Choose a new folder: Yeni bir klasör seçin: Error Hata cannot move a folder to itself ! Bir klasör kendisine taşınamaz! %1 Bytes %1 files, %2 folders %1 dosya, %2 klasör Can't get remote file information Uzak dosya bilgisi alınamıyor %1 files (include root files), %2 hidden %1 dosya (kök dosyaları dahil),%2 gizli %1 total Toplam %1 Peony::ComputerPropertiesPage CPU Name: CPU Adı: CPU Core: CPU Çekirdeği: Memory Size: Hafıza Boyutu: User Name: Kullanıcı Adı: Desktop: Masaüstü: You should mount this volume first Önce bu birimi bağlamalısınız Name: İsim: File System Dosya Sistemi Data System Disk Total Space: Toplam Alan: Used Space: Kullanılan Alan: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Boş Alan: Type: Tür: Kylin Burner Open with: Unknown Bilinmeyen Peony::ConnectServerDialog connect to server sunucuya bağlan Connect to server Ip Port Type Tür Personal Collection server: Kişisel Koleksiyon sunucusu: Add Delete Connect Warning Ip input error, please re-enter! Port input error, please re-enter! add ekle delete sil connect bağlan Peony::ConnectServerLogin The login user Oturum açan kullanıcı Please enter the %1's user name and password of the server. Lütfen %1'in sunucunun kullanıcı adını ve şifresini girin. User's identity Kullanıcının kimliği Guest Name İsim Password Parola domain Cancel İptal OK Tamam guest misafir Registered users Kayıtlı kullanıcılar name isim password parola Remember the password Parolayı hatırla cancel İptal ok Tamam Peony::CreateLinkInternalPlugin Create Link to Desktop Masaüstünde Link Oluştur Create Link to... Linki Oluştur... Choose a Directory to Create Link Bağlantı Oluşturmak İçin Bir Dizin Seçin Peony-Qt Create Link Extension Dosya Yöneticisi Bağlantı Uzantısı Oluştur Create Link Menu Extension. Bağlantı Menüsü Uzantısı Oluştur. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Masaüstünde Link Oluştur Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile Yeni Dosya Create file Dosya oluştur NewFolder Yeni Klasör Create file error Dosya oluşturma hatası Peony::CustomErrorHandler Is Error Handled? Error not be handled correctly Peony::DefaultAcitonWidget No default app Peony::DefaultOpenWithWidget No default app Peony::DefaultPreviewPage Select the file you want to preview... Önizlemek istediğiniz dosyayı seçin ... Can not preview this file. Bu dosya önizlemesi görüntülenemiyor. Can not preivew this file. Bu dosya önizlemesi görüntülenemiyor. Select the file you want to preview Can not preview this file Peony::DefaultPreviewPageFactory Default Preview Varsayılan Önizleme This is the Default Preview of peony-qt Bu peony-qt Varsayılan Önizlemesi Peony::DetailsPropertiesPage Name: İsim: File type: Dosya türü: Location: Konum: yyyy-MM-dd, HH:mm:ss Create time: Oluşturma zamanı: Modify time: Değiştirme zamanı: File size: Dosya boyutu: Width: Genişlik: Height: Yükseklik: Owner Sahibi Owner: Sahibi: Computer Bilgisayar Computer: Bilgisayar: %1 (this computer) %1 (bu bilgisayar) Unknown Bilinmeyen Can't get remote file information Uzak dosya bilgisi alınamıyor %1 px Peony::DirectoryView::IconView Icon View Simge Görünümü warn This operation is not supported. Peony::DirectoryView::IconView2 Icon View Simge Görünümü Peony::DirectoryView::ListView List View Liste Görünümü warn This operation is not supported. Peony::DirectoryView::ListView2 List View Liste Görünümü Peony::DirectoryViewFactoryManager Icon View Simge Görünümü Peony::DirectoryViewMenu Open in &New Window Yeni Pen&cerede Aç Open in New &Tab &Yeni Sekmede Aç Add to bookmark Yer işaretlerine ekle &Open "%1" “%1” Aç Open "%1" in &New Window “%1” Yeni Pencerede Aç Open "%1" in New &Tab “%1” Yeni Sekmede Aç Open "%1" with... “%1” ile aç... &More applications... &Daha Fazla Uygulama... &Open &Aç Open &with... &İle aç... &Open %1 selected files %1 dosy&a seçildi &New... &Yeni Empty &File &Boş Dosya &Folder &Klasör New Folder Yeni Klasör Icon View Simge Görünümü List View Liste Görünümü View Type... Görünüm Türü... Sort By... Sırala... Name İsim File Type Dosya Türü File Size Dosya Boyutu New... Yeni... Open in New Window Open in New Tab Open Open failed Open directory failed, you have no permission! Open with... More applications... Open %1 selected files New Empty File Folder Modified Date Değiştirme Saati Sort Order... Sıralama Düzeni... Ascending Order Artan Düzen Descending Order Azalan Düzen Sort Preferences... Tercihleri Sırala... Folder First Önce Klasör Chinese First Önce Çince Show Hidden Gizlileri Göster Copy Kopyala File:"%1" is not exist, did you moved or deleted it? &Copy &Kopyala Cut Kes Delete to trash Paste Yapıştır Refresh Yenile Select All Properties Özellikler format Biçim Restore Onar Delete View Type Sort By Time Modified Original Path Path Sort Order Newest to oldest Oldest to newest Files from large to small Files from small to large Sort Preferences Cancel İptal Error Hata Mount MultiSelect File:"%1 is not exist, did you moved or deleted it? Dosya: "%1 mevcut değil, onu taşıdınız yada sildiniz mi? Cu&t &Kes &Delete to trash Çöp Kutus&una Gönder Delete forever Kalıcı Olarak Sil Rename Yeniden Adlandır Select &All &Tümünü Seç Reverse Select Seçimi Ters Çevir P&roperties &Özellikler &Delete &Sil &Rename &Yeniden Adlandır &Paste &Yapıştır &Refresh Yeni&le &Properties Özellikler &Clean the Trash Çö&pü Temizle Delete file Warning Dosyayı Sil Uyarısı Delete Permanently Kalıcı Olarak Sil Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. &Restore O&nar Clean All Tümünü Temizle Open Parent Folder in New Window Üst Klasörü Yeni Pencerede Aç Peony::DirectoryViewWidget Directory View Dizin Görünümü Peony::ExtensionsManagerWidget Extensions Manager Available extensions Ok Tamam Cancel İptal Peony::FMWindow File Manager Dosya Yöneticisi advanced search Gelişmiş arama clear record Kaydı temizle Loaing... Press Esc to stop a loading. Yükleniyor ... Yüklemeyi durdurmak için Esc tuşuna basın. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Ctrl+H Show|Hidden Ctrl+H Undo Geri Redo İleri Peony Qt Dosya Yöneticisi Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. New Folder Yeni Klasör Peony::FileBatchRenameOperation File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden these files? Rename file error Dosya yeniden adlandırma hatası Peony::FileCopy Error in source or destination file path! Error when copy file: %1, can not copy special files, skip this file and continue? Can not copy %1, file doesn't exist. Has the file been renamed or moved? The dest file "%1" has existed! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Error writing to file: Input/output error Write file error: There is no available disk space for device! Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. Failed to create %1. Please check whether the device has been removed! File opening failure operation cancel Peony::FileCopyOperation File copy Dosya kopyalama Create folder %1 failed: %2 File copy error Dosya kopyalama hatası Cannot opening file, permission denied! The file name exceeds the limit File:%1 was not found. Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Link file error Link dosya hatası Burning does not support replacement Peony::FileDeleteOperation File delete Dosya silme File delete error Dosya silme hatası Delete file error Invalid Operation! Can not delete "%1". Peony::FileEnumerator Delete file Warning Dosyayı Sil Uyarısı The password dialog box is canceled Message recipient disconnected from message bus without replying! Error Hata Did not find target path, do you move or deleted it? Hedef yolu bulunamadı, taşıdınız yada sildiniz mi? Peony::FileInfo data folder file text file Metin dosyası Peony::FileInfoJob Trash Çöp Computer Bilgisayar Recent En son Peony::FileInformationLabel File location: Dosya konumu: File size: Dosya boyutu: Modify time: Değiştirme zamanı: Peony::FileItem Delete file Warning Dosyayı Sil Uyarısı Warning Error Hata Open Link failed Açık Bağlantı başarısız File not exist, do you want to delete the link file? Dosya mevcut değil, bağlantı dosyasını silmek istiyor musunuz? Can not open path "%1",permission denied. %1 yolu açılamıyor izni reddedildi. Can not find path "%1",are you moved or renamed it? %1 yolu bulunamıyor taşındınız mı yoksa yeniden adlandırdınız mı? Peony::FileItemModel child(ren) Çocuklar Symbol Link, Sembolik Bağlantı, System Disk File Name Dosya Adı Delete Date Create Date Time Modified File Size Dosya Boyutu Original Path Path File %1 is existed in space, please not add file repeatly. Operation not supported İşlem desteklenmedi File Type Dosya Türü Modified Date Değiştirme Tarihi Peony::FileLabelInternalMenuPlugin Add File Label... Dosya Etiketi Ekle... Add File Label Delete All Label Tüm Etiketleri Sil Label Management ... add "%1" Remove "%1" Peony File Labels Menu Extension Peony Dosya Etiketleri Menü Uzantısı Tag a File with Menu. Dosyayı Menü ile etiketleyin. Peony::FileLabelWidget Label Management ... Peony::FileLauchDialog Applications Uygulamalar Choose an Application to open this file Bu dosyayı açmak için bir Uygulama seçin Set as Default Varsayılan Olarak Ayarla OK Tamam The opening mode of the %1 %2 unknown No application is set to open file "%1 %2" Still using the last opened application: known Open application is used by default: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Other application: Select application: Always open the %1%2 file with this application Choose other application Başka bir uygulama seçin Go to application center Uygulama merkezine git Ok Tamam Cancel İptal Desktop files(*.desktop) Select Open Action Select Peony::FileLaunchAction Execute Directly Doğrudan Çalıştır Execute in Terminal Terminalde Çalıştır Detected launching an executable file %1, you want? %1 çalıştırılabilir bir dosyayı başlatmayı mı istediniz? Delete file Warning Dosyayı Sil Uyarısı Open Failed Açma Hatası Can not open %1, file not exist, is it deleted? %1 açılamıyor, dosya mevcut değil, silinmiş olabilir mi? File not exist, is it deleted or moved to other path? Dosya mevcut değil, silinmiş veya başka bir yere taşınmış olabilir Can not open %1 %1 açılamadı No Permission File is not readable. Please check if file has read permisson. By Default App Varsayılan Uygulamaya Göre Launch Options Başlatma Ayarları Open Link failed Açık Bağlantı başarısız File not exist, do you want to delete the link file? Dosya mevcut değil, bağlantı dosyasını silmek istiyor musunuz? Can not open %1, Please confirm you have the right authority. %1 açılamıyor, lütfen yetkilerinizi kontrol edin. Open App failed Uygulama Açılamadı The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? Bağlı uygulama değiştirilir veya kaldırılır, bu nedenle düzgün çalışamaz. Bağlantı dosyasını silmek istiyor musunuz? Error Hata File original path not exist, are you deleted or moved it? Can not get a default application for opening %1, do you want open it with text format? %1 dosyasını açmak için varsayılan bir uygulama alınamıyor, metin biçiminde açmak istiyor musunuz? Peony::FileLinkOperation Symbolic Link Sembolik Bağ Link file error Link dosya hatası Link file Dosyayı bağla Peony::FileMoveOperation Invalid move operation, cannot move a file itself. Geçersiz taşıma işlemi, bir dosyanın kendisini taşıyamaz. Move file Dosyayı taşı Create file Dosya oluştur Move file error Dosya oynatma hatası System Disk Data %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. File move error Invalid move operation, cannot move a file into its sub directories. Cannot opening file, permission denied! The file name exceeds the limit Create file error Dosya oluşturma hatası Link file error Link dosya hatası Burning does not support replacement Invalid Operation. Geçersiz İşlem. File:%1 was not found. Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error Dosya silme hatası File delete Dosya silme Invalid Operation Geçersiz İşlem Peony::FileOperationAfterProgressPage &More Details &Daha Fazla Ayrıntı Peony::FileOperationErrorDialog File Operation Error Dosya İşlem Hatası unkwon Bilinmeyen null Boş Error message: Hata Mesajı: Source File: Kaynak Dosya: Dest File: Hedef Dosya: Ignore Görmezden Gel Ignore All Tümünü Görmezden Gel Overwrite Üzerine Yaz Overwrite All Tümünün Üzerine Yaz Backup Yedekle Backup All Tümünü Yedekle &Retry &Yeniden Dene &Cancel &İptal Peony::FileOperationErrorDialogBase Close Kapat Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. Bu konum zaten aynı ada sahip bir dosya içeriyor. Please select the file to keep Lütfen saklanacak dosyayı seçin This location already contains the file, Bu konum zaten dosyayı içeriyor, Do you want to override it? Geçersiz kılmak istiyor musunuz? Replace Değiştir Ignore Görmezden Gel Do the same Aynısını yap <p>This location already contains the file '%1', Do you want to override it?</p> <p>Bu konum zaten '%1' dosyasını içeriyor, onu geçersiz kılmak ister misiniz?</p> Unexpected error from %1 to %2 Then do the same thing in a similar situation Sonra benzer bir durumda aynı şeyi yapın Backup Yedekle Cancel İptal OK Tamam Peony::FileOperationErrorDialogNotSupported Yes Evet Cancel İptal Delete Do the same Aynısını yap Make sure the disk is not full or write protected and that the file is not protected Diskin dolu olmadığından veya yazma korumalı olmadığından ve dosyanın korumalı olmadığından emin olun Peony::FileOperationErrorDialogWarning OK Tamam Cancel İptal Skip all Make sure the disk is not full or write protected and that the file is not protected Diskin dolu olmadığından veya yazma korumalı olmadığından ve dosyanın korumalı olmadığından emin olun Please make sure the disk is not full or not is write protected, or file is not being used. Lütfen diskin dolu olmadığından veya yazmaya karşı korumalı olmadığından veya dosyanın kullanılmadığından emin olun. Peony::FileOperationInfo Symbolic Link Sembolik Bağ Copy Kopyala Move Rename Yeniden Adlandır Link Delete Delete Permanently Kalıcı Olarak Sil Restore Onar New - Symbolic Link - Symbolik Link Peony::FileOperationManager Delete file Warning Dosyayı Sil Uyarısı Warn '%1' is occupied,you cannot operate! OK Tamam Cancel İptal Do you want to put selected %1 item(s) into trash? Do not show again System Disk Data Insufficient storage space %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. Can't delete. Silinmedi. You can't delete a file whenthe file is doing another operation Dosya başka bir işlem yaparken dosyayı silemezsiniz File Operation is Busy Dosya İşlemi Meşgul There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Daha önce bir veya daha fazla dosya işlemi yürütülüyor. İşleminiz gerçekleşene kadar yürütülmesini bekleyecektir. Gerçekten de dosya işlemlerini paralel olarak yürütmek istiyorsanız, seçenek menüsünde varsayılan "Paralele İzin Ver" seçeneğini değiştirebilirsiniz. The long name file is saved to %1 Undo %1 Redo %1 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. Daha önce bir veya daha fazla dosya işlemi yürütüldü. Operasyonunuz tamamlanana kadar yürütmeyi bekleyecektir. Peony::FileOperationPreparePage counting: Hesaplama: state: Durum: Peony::FileOperationProgressPage &More Details &Daha Fazla Detay From: den: To: -e: Peony::FileOperationProgressWizard File Manager Dosya Yöneticisi &Cancel &İptal Preparing... Hazırlanıyor... Handling... Taşınıyor... Clearing... Temizleniyor... Rollbacking... Geri sarılıyor... File Operation Dosya İşlemi A file operation is running backend... Bir dosya işlemi arka uçta çalışıyor... %1 files, %2 %1 dosya, %2 %1 done, %2 total, %3 of %4. %1 bitti,toplam %2, %4 de %3. clearing: %1, %2 of %3 Temizlenen:%1, %3 de %2 copying... Kopyalanıyor... Syncing... Senkronize ediliyor... Peony::FilePreviewPage File Name: Dosya Adı: File Type: Dosya Türü: Time Access: Erişim Zamanı: Time Modified: Değiştirme Zamanı: Children Count: Çocuk Sayısı: Size: Boyut: Location: Konum: Time Created: Oluşturma Zamanı: Image resolution: color model: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel İptal OK Tamam <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare Image size: Resim Boyutu: Image format: Resim Formatı: %1x%2 %1x%2 %1 total, %2 hidden toplam %1, %2 gizli Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) İsimler otomatik olarak seri Numaralar ekler (ör. 1,2,3 ...) Cancel İptal New file name Yeni dosya adı Please enter the file name Lütfen dosya adını girin OK Tamam Peony::FileRenameOperation Rename file Dosyayı yeniden isimlendir File Rename error Invalid file name %1%2%3 . File Rename warning Are you sure to hidden this file? When change the file suffix, the file may be invalid. Are you sure to change it ? A file and a directory with the same name cannot replace each other Rename file error Dosya yeniden adlandırma hatası Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// Çöp:/// Trash file error Çöp dosyası hatası Invalid Operation! Can not trash "%1". An unmanageable conflict exists. Please check the recycle bin. Can not trash Çöp Silinemez The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. Kullanıcının '%1' dosyası için okuma ve yazma hakları yok ve onu Geri Dönüşüm Kutusu'na silemiyor. Can not trash %1, would you like to delete this file permanently? %1 çöp kutusuna atılamıyor, bu dosyayı kalıcı olarak silmek ister misiniz? . Are you sure you want to permanently delete the file . Dosyayı kalıcı olarak silmek istediğinizden emin misiniz Trash file Çöp dosyası Peony::FileUntrashOperation Untrash file Dosyayı geri al Untrash file error Dosya geri alma hatası Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd Peony::HeaderBar Spread Minimize Close Kapat Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Tamam Cancel İptal Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Open With İle aç More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Kopyala Save As file All File This location has no write permission.please change the storage location Label Properties Özellikler Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name İsim SideBar Menu Create New Label Delete Label Display the following items in the identification area: (maximum of 6) Rename Yeniden Adlandır Edit Color Delete This Label Peony::LocationBar click the blank area for edit Düzenlemek için boş alanı tıklayın Computer Bilgisayar Search "%1" in "%2" %2 de %1 ara File System Dosya Sistemi Search results for all files marked in "%1" in "%2" &Copy Directory &Dizini Kopyala Open In New Tab Open In New Window Open In New &Tab Yeni &Sekmede Aç Open In &New Window Yeni Penc&erede Aç Copy Directory Dizini Kopyala Peony::MountOperation Operation Cancelled İşlem İptal Edildi Login failed, unknown username or password error, please re-enter! Peony::NavigationToolBar Go Back Geri Git Go Forward İleri Git History Geçmiş Clear History Geçmişi Temizle Cd Up Yukarı Refresh Yenile Peony::NewFileLaunchDialog Choose new application Yeni uygulama seçin Choose an Application to open this file Bu dosyayı açmak için bir Uygulama seçin apply now Şimdi uygula OK Tamam Cancel İptal Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? %1%2 dosyalarını nasıl açmak istersiniz? How do you want to open "%1%2" files ? Default open with: Varsayılan şununla aç: Other: Diğer: Choose other application Başka bir uygulama seçin Go to application center Uygulama merkezine git Peony::PathEdit Go To Git Peony::PermissionsPropertiesPage User or Group Kullanıcı veya Grup Type Tür Readable Okunabilir Writeable Yazılabilir Excuteable Çalıştırılabilir File: %1 Dosya:%1 Target: %1 Read and Write Okuma ve Yazma Readonly Salt Okunur Group or User (Current User) The folder containing this file is protected, and only the file owner can modify the file. Current User Permissions modify tip The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? Permission refinement settings The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? Can not get the permission info. İzin bilgileri alınamıyor. (Me) (Ben) Others Diğerleri Owner Sahibi Group Grup Other Diğer Other Users Diğer Kullanıcılar You can not change the access of this file. Bu dosyanın erişimini değiştiremezsiniz. Me Ben User Kullanıcı Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok Tamam Cancel İptal Peony::PropertiesWindow Trash Çöp Recent En son Selected Seçilen %1 Files %1 Dosyalar usershare Data System Disk Properties Özellikler Ok Tamam Cancel İptal Restore Onar Close Kapat Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing. Origin Path: Kaynak Yolu: Deletion Date: Size: Boyut: Original Location: Orjinal Konum: Peony::SearchBar Input the search key of files you would like to find. Bulmak istediğiniz dosyaların arama anahtarını girin. Input search key... Arama anahtarını girin... advance search Gelişmiş arama clear record Kaydı temizle Peony::SearchBarContainer Choose File Type Dosya Türü Seç Search File Clear Temizle all Tümü file folder Dosya klasörü image Resim video Video text file Metin dosyası audio Ses others Diğerleri wps file Wps Dosyası Peony::SharedFileLinkOperation Symbolic Link Sembolik Bağ The dest file "%1" has existed! Link file error Link dosya hatası Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Favorite Sık Kullanılan Trash Çöp Recent En son Quick Access KmreData Peony::SideBarFileSystemItem Computer Bilgisayar File System Dosya Sistemi Data Peony::SideBarMenu &Properties Özellikler P&roperties Özellikler Properties Özellikler Delete Symbolic Unmount Eject Format burndata &Delete Symbolic Sembolik B&ağı Sil &Unmount Ba&ğı Kaldır &Eject &Çıkar format Biçim Peony::SideBarModel Network Peony::SideBarPersonalItem Personal Kişisel Peony::SideBarSeparatorItem (No Sub Directory) (Alt Dizin Yok) Peony::StatusBar ; %1 folders ; %1 klasör ; %1 files, %2 total ; %1 dosya, toplam %2 ; %1 folder ; %1 klasör ; %1 file, %2 ; %1 dosya, %2 %1 selected %1 seçildi Peony::SyncThread Notify Peony::TagManagement Mark İşaretle Peony::ToolBar Open in new &Window Yeni Pencerede Aç Open in &New window Yeni Pen&cerede Aç Open in new &Tab Yeni S&ekmede Aç Sort Type Sıralama Türü File Name Dosya Adı File Type Dosya Türü File Size Dosya Boyutu Modified Date Değiştirme Tarihi Open in New window Open in new Tab Ascending Artıyor Descending Azalıyor Copy Kopyala Paste Yapıştır Cut Kes Trash Çöp Clean Trash Çöpü Temizle Delete file Warning Dosyayı Sil Uyarısı Delete Permanently Kalıcı Olarak Sil Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Restore Onar Options Seçenekler Forbid Thumbnail Küçük Resmi Yasakla Show Hidden Gizli Dosyaları Göster Resident in Backend Arka Uçta Yerleşik Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Son pencereyi kapattıktan sonra programın çalışmaya devam etmesine izin verin. Bu, bir sonraki lansman süresini azaltır, ancak arka uçtaki kaynakları da tüketir. &Help &Yardım &About... &Hakkında... Peony Qt Dosya Yönetici Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Peony::TooltipsManager Unknow Type: Tür: Duration: Size: Boyut: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Peony::VolumeManager Error Hata ProgressBar starting ... Başlatılıyor... canceling ... İptal ediliyor... sync ... continue pause close Kapat cancel file operation Dosya işlemini iptal et Are you sure want to cancel the current selected file operation Mevcut seçili dosya işlemini iptal etmek istediğinizden emin misiniz OK Tamam Cancel İptal QObject Icon View Simge Görünümü Show the folder children as icons. Klasörleri simgeler olarak göster. List View Liste Görünümü Show the folder children as rows in a list. Alt klasörü bir listede satır olarak göster. Basic Preview Page Temel Önizleme Sayfası Basic Temel Show the basic file properties, and allow you to modify the access and name. Temel dosya özelliklerini gösterin ve erişimi ve adı değiştirmenize izin verin. Permissions Page İzinler Sayfası Permissions İzinler Show and modify file's permission, owner and group. Dosya iznini, sahibini ve grubunu göster ve değiştir. Can not trash Çöp Silinemez Can not trash these files. You can delete them permanently. Are you sure doing that? Bu dosyalar çöp kutusuna gönderilemiyor. Bunları kalıcı olarak silebilirsiniz. Bunu yaptığınızdan emin misiniz? Delete Permanently Kalıcı Olarak Sil Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Are you sure that you want to delete %1? Once you start a deletion, the files deleting will never be restored again. %1'i silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Are you sure that you want to delete these %1 files? Once you start a deletion, the files deleting will never be restored again. Bu %1 dosyayı silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Computer Properties Page Bilgisayar Özellikleri Sayfası Computer Properties Bilgisayar özellikleri Show the computer properties or items in computer. Bilgisayar özelliklerini veya bilgisayardaki öğeleri gösterir. Trash and Recent Properties Page Çöp Kutusu ve Son Özellikler Sayfası Trash and Recent Çöp Kutusu ve En Son Show the file properties or items in trash or recent. Dosya özelliklerini veya öğelerini çöp kutusunda veya son zamanlarda gösterin. eject device failed Aygıtı çıkarma başarısız oldu Please check whether the device is occupied and then eject the device again Lütfen cihazın dolu olup olmadığını kontrol edin ve ardından cihazı tekrar çıkarın Format failed Biçim hatalı YES EVET Formatting successful! But failed to set the device name. qmesg_notify Qmesg bildir Format Begin Format Close Kapat Format operation has been finished successfully. Biçimlendirme işlemi başarıyla tamamlandı. Sorry, the format operation is failed! Üzgünüz, formatlama işlemi başarısız oldu! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Bu birimi biçimlendirmek, içindeki tüm verileri silecektir. Biçimlendirmeden önce lütfen saklanan tüm verileri yedekleyin. Devam etmek istiyor musun? format Biçim begin format biçimlendirmeye başla close Kapat File Manager Dosya Yöneticisi Notify Default search vfs of peony Peony için varsayılan arama vfs'si Force unmount failed Zorla ayrılma başarısız oldu Error: %1 Hata: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Ayrılma Hatası Not authorized to perform operation. Unable to unmount it, you may need to close some programs, such as: GParted etc. Bağlantısını kesemiyorsanız, bazı programları kapatmanız gerekebilir, örneğin: GParted vb. Error: %1 Do you want to unmount forcely? Hata: %1 Zorla ayrılmak ister misin? Eject failed Çıkarma hatalı The file is too large to be moved to the recycle bin. Do you want to permanently delete it? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Delete Cancel İptal Clean the Trash Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. Eject Anyway Yine de Çıkar Failed to activate device: Incorrect passphrase The device has been mount successfully! Eject device failed, the reason may be that the device has been removed, etc. Data synchronization is complete and the device can be safely unplugged! Password is empty, please re-enter! Unable to eject %1 %1 çıkarılamıyor favorite favori Favorites File is not existed. Share Data Operation not supported İşlem desteklenmedi Trash Çöp Recent En son The virtual file system does not support folder creation Sanal dosya sistemi klasör oluşturmayı desteklemiyor Can not create a symbolic file for vfs location Symbolic Link Sembolik Bağ Can not create symbolic file here, %1 Can not add a file to favorite directory. The virtual file system cannot be opened Sanal dosya sistemi açılamaz Virtual file directories do not support move and copy operations Sanal dosya dizinleri taşıma ve kopyalama işlemlerini desteklemez Default favorite vfs of peony Peony varsayılan favori vfs Mark İşaretle mark this file. bu dosyayı işaretle. Open With İle aç open with. ile aç. Details Detaylar It need to synchronize before operating the device,place wait! Unable to discover the file, it may have been removed or deleted. permission denied duplicate data System Disk Computer Bilgisayar File System Dosya Sistemi Data Failed to open file "%1": insufficient permissions. File “%1” does not exist. Please check whether the file has been deleted. Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. burn operation has been cancelled is busy! test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Intelligent Space File %1 is existed in space, please not add file repeatly. Virtual file directories do not support move operations label Show properties plugin window. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel İptal Ok Tamam Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData Disc Type: Device Name: OK Tamam Cancel İptal Unknown Bilinmeyen Warning No burn data, please add! The disc name cannot be set to empty, please re-enter it! AppendBurnData operation has been finished successfully. Sorry, the appendBurnData operation is failed! Failed Burning. Do not close this window Burning this disc will append datas on it. Do you want to continue ? Burn Begin Burning Close Kapat UdfBurn::UdfFormatDialog Format Disc Type: Device Name: OK Tamam Cancel İptal Unknown Bilinmeyen Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. Biçimlendirme işlemi başarıyla tamamlandı. Sorry, the format operation is failed! Üzgünüz, formatlama işlemi başarısız oldu! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat UdfFormatDialog Format Disc Type: Device Name: OK Tamam Cancel İptal Unknown Bilinmeyen Warning The disc name cannot be set to empty, please re-enter it! Format operation has been finished successfully. Biçimlendirme işlemi başarıyla tamamlandı. Sorry, the format operation is failed! Üzgünüz, formatlama işlemi başarısız oldu! Failed Formatting. Do not close this window Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Begin Format Close Kapat progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/libpeony-qt/libpeony-qt_es.ts0000664000175000017500000107344015154271106021133 0ustar fengfeng ColorPushButton Label Management ... Remove "%1" add "%1" ConnectServerDialog Connect to Sever Conectar a Sever Domain Dominio Password Contraseña Save Password Guardar contraseña User Usuario Anonymous Anónimo Ok De acuerdo Cancel Cancelar DiscControl is busy! ¡Está ocupado! is busy! ¡Está ocupado! not support udf at present. No es compatible con UDF en la actualidad. unmount disc failed before udf format. Error al desmontar el disco antes del formato UDF. is not properly formatted. 格式不正确。 Can not found newfs_udf tool. 未找到newfs_udf工具。 DVD+RW udf format fail. Error en el formato udf DVD+RW. preparation failed before DVD-RW udf format. error de preparación antes del formato udf DVD-RW. FileLabelModel Red Rojo Orange Naranja Yellow Amarillo Green Verde Blue Azul Purple Morado Gray Gris Transparent 无颜色 Delete file Warning 删除文件警告 Error Error Label or color is duplicated. La etiqueta o el color están duplicados. FileOperationHelper Burn failed Error en la grabación Format_Dialog Dialog Diálogo rom_size rom_size system sistema vfat/fat32 VFAT/FAT32 exfat exfat ntfs NTFS vfat VFAT ext4 ext4 device_name device_name clean it total Límpialo por completo ok De acuerdo close cerrar TextLabel Etiqueta de texto qmesg_notify 通知 Format operation has been finished successfully. 格式化操作已成功完成。 Sorry, the format operation is failed! 很遗憾,格式化操作失败了,您可以重新试下! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? 格式化此卷将清除其上的所有数据。请在格式化之前备份所有保留的数据。您想继续吗? format 格式化 begin format 开始 format_success 格式化成功! format_err 格式化失败! Format Formato Rom size: Tamaño de la rom: Filesystem: Sistema de archivos: Disk name: Nombre del disco: Completely erase(Time is longer, please confirm!) Borrar completamente (¡el tiempo es más largo, confirme!) Set password Establecer contraseña Set password for volume based on LUKS (only ext4) Establecer contraseña para el volumen basado en LUKS (solo ext4) Formatting to the ext4 file system may cause other users to be unable to read or write to the USB drive El formateo en el sistema de archivos ext4 puede hacer que otros usuarios no puedan leer o escribir en la unidad USB Cancel Cancelar OK De acuerdo Data Datos Error locking device: Failed to deactivate device: Device or resource busy Warning Advertencia Device name cannot start with a decimal point, Please re-enter! El nombre del dispositivo no puede comenzar con un punto decimal, ¡vuelva a ingresar! Enter Password: Introduzca la contraseña: Password too short, please retype a password more than 6 characters Contraseña demasiado corta, vuelva a escribir una contraseña de más de 6 caracteres over one day más de un día %1/sec, %2 remaining. %1/seg, %2 restante. getting progress... Progresando... Error Error Block not existed! ¡El bloque no existía! Formatting. Do not close this window Formateo. No cierre esta ventana KyFileDialogRename Renaming "%1" Cambiar el nombre de "%1" Renaming failed, the reason is: %1 Error en el cambio de nombre, la razón es: %1 Filename too long El nombre del archivo es demasiado largo Copying "%1" Copiar "%1" To "%1" A "%1" Copying failed, the reason is: %1 Error de copia, el motivo es: %1 Moving "%1" Mover "%1" Moving failed, the reason is: %1 Error en el movimiento, la razón es: %1 File operation error: Error de operación del archivo: The reason is: %1 La razón es: %1 Truncation Truncamiento All applications Todas las aplicaciones Cancel Cancelar Apply Aplicar . Explanation: Truncate the portion of the file name that exceeds %1 bytes and select Explanation: When renaming a file name, ensure it is within %1 bytes and Explanation: Truncate the portion of the file name that exceeds 225 bytes and select Explicación: Trunca la parte del nombre de archivo que supera los 225 bytes y selecciona Description: By default, save to "%1/扩展". Descripción: De forma predeterminada, guárdelo en "%1/扩展". Explanation: When renaming a file name, ensure it is within 255 bytes and Explicación: Al cambiar el nombre de un archivo, asegúrese de que esté dentro de los 225 bytes y {255 ?} Explanation: When renaming a file name, ensure it is within 225 bytes and Explicación: Al cambiar el nombre de un archivo, asegúrese de que esté dentro de los 225 bytes y Explanation: Truncate the portion of the file name that exceeds 225 bytes and 说明:用户重命名文件名,保证在225字节以内, Save Salvar Bytes Bytes Front truncation Truncamiento frontal Post truncation Después del truncamiento Description: Skip copying files of the current type Descripción: Omitir la copia de archivos del tipo actual truncate interval Intervalo truncado Explanation: Truncate the portion of the file name that exceeds 225 bytes 说明:截断文件名的超过225字节的部分,去选择 Description: By default, save to "%1/extension". 说明:默认保存至“%1/拓展”。 modify the name Modificar el nombre Explanation: When renaming a file name, ensure it is within 225 bytes 说明:用户重命名文件名,保证在225字节以内,去 Skip Saltarse Skip All 全部跳过 Rename Rebautizar Please enter a new name 请输入文件名 OK De acuerdo MainProgressBar File operation Operación de archivos starting ... incipiente... cancel all file operations Cancelar todas las operaciones de archivo Minimize Minimizar Close Cerrar Are you sure to cancel all file operations? ¿Está seguro de cancelar todas las operaciones de archivo? Are you sure want to cancel all file operations ¿Está seguro de que desea cancelar todas las operaciones de archivo? OK De acuerdo File Operation Operación de archivos Cancel Cancelar Calculating time continue continuar pause pausa canceling ... Cancelar... sync ... Sincronizar... %1Mb/s Est. time left: %2 MessageDialog Peony Peonía Forcibly pulling out the device may cause data loss or device exceptions! Tirar el dispositivo a la fuerza puede causar datos ¡Pérdida o excepciones de dispositivos! OtherButton Other queue Otra cola Other Queue Peony::AdvanceSearchBar Key Words Palabras clave input key words... Introduzca las palabras clave... Search Location Ubicación de búsqueda choose search path... Elija la ruta de búsqueda... browse hojear File Type Tipo de archivo Choose File Type Elija el tipo de archivo Modify Time Modificar hora Choose Modify Time Elija Modificar hora File Size Tamaño del archivo Choose file size Elegir el tamaño del archivo show hidden file Mostrar archivo oculto go back Volver hidden advance search page Página de búsqueda avanzada oculta file name nombre de archivo content contenido search buscar start search Iniciar búsqueda Select path Seleccionar ruta Operate Tips Consejos de operación Have no key words or search location! ¡No tenga palabras clave ni ubicación de búsqueda! Search file name or content at least choose one! Busque el nombre del archivo o el contenido, ¡al menos elija uno! Search content or file name at least choose one! 搜索文件名或者内容请至少指定一个! all 全部 file folder 文件夹 image 图片 video 视频 text file 文本 audio 音频 others 其它 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 year ago 去年 tiny(0-16K) 极小(0-16K) small(16k-1M) 较小(16k-1M) medium(1M-100M) 中等(1M-100M) big(100M-1G) 较大(100M-1G) large(>1G) 极大(>1G) Peony::AdvancedLocationBar Search Content... Buscar contenido... Search File Peony::AdvancedPermissionsPage Permission refinement settings Configuración de refinamiento de permisos Permission refinement settings tip Sugerencia sobre la configuración de refinamiento de permisos Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions? La configuración de los permisos de ACL dará como resultado un cambio en los permisos del grupo de usuarios para los permisos básicos. ¿Necesita seguir configurando los permisos de ACL? User Usuario Read Leer Write Escribir Executable Ejecutable delete borrar Inherit permission Heredar el permiso Add Agregar Apply Aplicar Cancel Cancelar Peony::AllFileLaunchDialog Choose new application Elegir nueva aplicación Choose an Application to open this file Elija una aplicación para abrir este archivo apply now Aplicar ahora OK De acuerdo Cancel Cancelar Peony::AudioPlayManager Operation file Warning 文件操作警告 Peony::BasicPropertiesPage Choose a custom icon Elegir un icono personalizado Type: Tipo: Display Name: 名称: Location: 路径: Overview: 概览: Change Cambio Name Nombre Location Ubicación move mover symbolLink symbolLink Folder Carpeta Include: Incluír: Move Open with: Abrir con: Description: Descripción: Select multiple files Seleccionar varios archivos Size: Tamaño: Total size: 实际大小: Space Useage: Uso del espacio: yyyy-MM-dd, HH:mm:ss yyyy年MM月dd日, HH:mm:ss yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP Time Created: Hora de creación: Space Usage: Time Create: Time Modified: Hora de modificación: Time Access: Acceso al tiempo: Readonly Solo lectura Hidden Escondido Readonly (just applied by subfiles) Property: Propiedad: usershare Compartir usuario %1 (%2 Bytes) %1 (%2 bytes) Images (*.png *.jpg *.jpeg *.svg) Choose a new folder: Elige una nueva carpeta: Error Error cannot move a folder to itself ! no se puede mover una carpeta a sí misma. Please select a image that is smaller than 1MB. Seleccione una imagen que tenga un tamaño inferior a 1 MB. %1 Bytes %1 Bytes %1 KB (%2 Bytes) %1 KB (%2 字节) %1 MB (%2 Bytes) %1 MB (%2 字节) %1 GB (%2 Bytes) %1 GB (%2 字节) %1 files, %2 folders %1 archivos, %2 carpetas Can't get remote file information No se puede obtener información de archivos remotos %1 files (include root files), %2 hidden 共%1个文件(包括顶层目录),有%2个隐藏文件 %1 total 共%1 Peony::ComputerPropertiesPage CPU Name: Nombre de la CPU: CPU Core: Núcleo de CPU: Memory Size: Tamaño de la memoria: User Name: Nombre de usuario: Desktop: Escritorio: You should mount this volume first Primero debe montar este volumen Name: Nombre: File System Sistema de archivos Data Datos System Disk Total Space: Espacio total: Used Space: Espacio utilizado: In calculation... /root used: /home used: /usershare used: /data/* used: Unknow (No permission) Free Space: Espacio libre: Type: Tipo: Kylin Burner Quemador Kylin Open with: Abrir con: Unknown Desconocido Peony::ConnectServerDialog connect to server 连接服务器 Connect to server Conéctese al servidor Ip IP Port Puerto Type Tipo Add Agregar Delete Borrar Connect Conectar Ip input error, please re-enter! Error de entrada de IP, ¡vuelva a ingresar! Port input error, please re-enter! Error de entrada de puerto, ¡vuelva a ingresar! ip 服务器 port 端口 type 类型 Personal Collection server: Servidor de colección personal: add 添加 delete 连接 删除 connect 连接 Warning Advertencia ip input error, please re-enter! ip输入错误,请重新输入! port input error, please re-enter! 端口输入错误,请重新输入! Peony::ConnectServerLogin The login user El usuario de inicio de sesión Please enter the %1's user name and password of the server. Introduzca el nombre de usuario y la contraseña del servidor %1. User's identity Identidad del usuario Guest Huésped Name Nombre Password Contraseña domain Cancel Cancelar OK De acuerdo guest 游客(匿名登录) Registered users Usuarios registrados name 用户名 password 密码 Remember the password Recuerde la contraseña cancel 取消 ok 连接 Peony::CreateLinkInternalPlugin Create Link to Desktop Crear enlace al escritorio Create Link to... Crear enlace a... Choose a Directory to Create Link Elegir un directorio para crear un enlace Peony-Qt Create Link Extension 创建链接 Create Link Menu Extension. 创建链接. Peony::CreateSharedFileLinkMenuPlugin Create Link to Desktop Crear enlace al escritorio Peony::CreateTemplateOperation File create error Can not create %1: Read-only mode, can not write-in NewFile NuevoArchivo Create file Crear archivo NewFolder NewFolder Create file error Error de creación de archivo Peony::CustomErrorHandler Is Error Handled? ¿Se maneja el error? Error not be handled correctly El error no se maneja correctamente Peony::DefaultAcitonWidget No default app No hay una aplicación predeterminada Peony::DefaultOpenWithWidget No default app No hay una aplicación predeterminada Peony::DefaultPreviewPage Select the file you want to preview... Seleccione el archivo que desea previsualizar... Select the file you want to preview Can not preview this file Can not preview this file. No se puede obtener una vista previa de este archivo. Can not preivew this file. 不能预览该文件 Peony::DefaultPreviewPageFactory Default Preview Vista previa predeterminada This is the Default Preview of peony-qt Esta es la vista previa predeterminada de peony-qt Peony::DetailsPropertiesPage Name: Nombre: File type: Tipo de archivo: Location: Ubicación: yyyy-MM-dd, HH:mm:ss aaaa-MM-dd, HH:mm:ss Create time: Tiempo de creación: Modify time: Modificar hora: yyyy-MM-dd, hh:mm:ss AP yyyy年MM月dd日, hh:mm:ss AP File size: Tamaño del archivo: Width: Ancho: Height: Altura: Owner Dueño Owner: Dueño: Computer Ordenador Computer: Ordenador: %1 (this computer) %1 (este equipo) Unknown Desconocido Can't get remote file information No se puede obtener información de archivos remotos %1 px %1 px Peony::DirectoryView::IconView Icon View 图标视图 warn advertir This operation is not supported. Esta operación no es compatible. Peony::DirectoryView::IconView2 Icon View 图标视图 Peony::DirectoryView::ListView List View 列表视图 warn advertir This operation is not supported. Esta operación no es compatible. Peony::DirectoryView::ListView2 List View 列表视图 Peony::DirectoryViewFactoryManager Icon View 图标视图 Peony::DirectoryViewMenu Open in &New Window 在新窗口中打开(&N) Open in New &Tab 在新标签页中打开(&T) Add to bookmark Añadir al marcador &Open "%1" 打开“%1”(&O) Open "%1" in &New Window 在新窗口中打开“%1”(&N) Open "%1" in New &Tab 在新标签页中打开“%1”(&T) Open "%1" with... 选用其它应用打开“%1”... &More applications... 更多应用...(&M) &Open 打开(&O) Open &with... 打开方式(&W)... &Open %1 selected files 打开%1个选中文件(&O) &New... 新建...(&N) Empty &File 空文件(&E) &Folder 文件夹(&F) New Folder Nueva carpeta Icon View 图标视图 List View 列表视图 View Type... 视图类型... Sort By... 排序类型... Name Nombre File Type Tipo de archivo File Size Tamaño del archivo New... 新建... Open in New Window Abrir en ventana nueva Open in New Tab Abrir en una nueva pestaña Open Abrir Open failed Open directory failed, you have no permission! Open with... Abrir con... More applications... Más aplicaciones... Open %1 selected files Abrir %1 archivos seleccionados New Nuevo Empty File Archivo vacío Folder Carpeta View Type Tipo de vista Sort By Ordenar por Modified Date Fecha de modificación Path Newest to oldest Oldest to newest Files from large to small Files from small to large Cancel Mount MultiSelect Orignal Path Ruta Originaria Sort Order... 排序顺序... Ascending Order Orden ascendente Descending Order Orden descendente Sort Preferences... 排序偏好... Folder First Carpeta primero Chinese First Chino Primero Show Hidden Mostrar oculto Copy Copiar File:"%1" is not exist, did you moved or deleted it? File:"%1" no existe, ¿lo movió o lo eliminó? Peony-Qt filesafe menu Extension Extensión del menú de seguridad de archivos Peony-Qt Peony File Labels Menu Extension Extensión de menú de etiquetas de archivo de peonía &Copy 复制(&C) Cut Cortar Delete to trash Eliminar a la papelera Paste Pegar Refresh Actualizar Select All Seleccionar todo Properties Propiedades format formato Restore Restaurar Delete Borrar Time Modified Original Path Ruta original Sort Order Criterio de clasificación Sort Preferences Preferencias de ordenación Error Error File:"%1 is not exist, did you moved or deleted it? 文件:"%1" 不存在,您是否已经移动或者删除了它? File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Cu&t 剪切(&T) &Delete to trash 删除到回收站(&D) Delete forever Eliminar para siempre Rename Rebautizar Select &All 全选(&A) Reverse Select Selección inversa P&roperties 属性(&R) &Delete 删除(&D) &Rename 重命名(&R) &Paste 粘贴(&P) &Refresh 刷新(&R) &Properties 属性(&P) &Clean the Trash y limpiar la basura Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 &Restore 还原(&R) Clean All Limpiar todo Open Parent Folder in New Window Abra la carpeta principal en una ventana nueva Peony::DirectoryViewWidget Directory View 文件视图 Peony::ExtensionsManagerWidget Extensions Manager Administrador de extensiones Available extensions Extensiones disponibles Ok De acuerdo Cancel Cancelar Peony::FMWindow File Manager Administrador de archivos advanced search Búsqueda avanzada clear record Historial claro Loaing... Press Esc to stop a loading. Odiando... Presione Esc para detener una carga. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Autor: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Derechos de autor (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Ctrl+H Show|Hidden Ctrl+H Undo Deshacer Redo Rehacer Peony Qt Peonía Qt Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. New Folder Nueva carpeta Peony::FileBatchRenameOperation File Rename error Error de cambio de nombre de archivo Invalid file name %1%2%3 . Nombre de archivo no válido %1%2%3 . File Rename warning Advertencia de cambio de nombre de archivo Are you sure to hidden these files? ¿Estás seguro de ocultar estos archivos? The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! Rename file error Error de cambio de nombre del archivo Peony::FileCopy Error in source or destination file path! ¡Error en la ruta del archivo de origen o destino! Error when copy file: %1, can not copy special files, skip this file and continue? Error al copiar el archivo: %1, no se pueden copiar archivos especiales, omitir este archivo y continuar? Can not copy %1, file doesn't exist. Has the file been renamed or moved? No se puede copiar %1, el archivo no existe. ¿Se ha cambiado el nombre del archivo o se ha movido? The dest file "%1" has existed! ¡El archivo de dest "%1" ha existido! Vfat/FAT32 file systems do not support a single file that occupies more than 4 GB space! Los sistemas de archivos Vfat/FAT32 no admiten un solo archivo que ocupe más de 4 GB de espacio. Error writing to file: Input/output error Error al escribir en el archivo: Error de entrada/salida Write file error: There is no available disk space for device! Failed to create %1. Please ensure if it is in root directory, or if the device supports gphoto2 protocol correctly. No se pudo crear %1. Asegúrese de que esté en el directorio raíz o si el dispositivo es compatible con el protocolo gphoto2 correctamente. Failed to create %1. No se pudo crear %1. Error opening source or destination file! 打开源文件或者目标文件出错! Please check whether the device has been removed! ¡Compruebe si se ha retirado el dispositivo! Write file error: There is no avaliable disk space for device! Error de escritura de archivo: ¡No hay espacio disponible en disco para el dispositivo! Please confirm that the device controls are insufficient! 请确认设备空间是否足够! File opening failure Error de apertura de archivos Reading and Writing files are inconsistent! 读和写文件不一致! operation cancel Cancelación de operación Peony::FileCopyOperation File copy 文件复制 Create folder %1 failed: %2 Error al crear la carpeta %1: %2 File copy error Error de copia de archivo The file name exceeds the limit El nombre del archivo supera el límite Cannot opening file, permission denied! No se puede abrir el archivo, ¡permiso denegado! File:%1 was not found. Archivo:%1 no fue encontrado. File System Sistema de archivos Can not copy %1 to %2: Read-only mode, can not write-in Can not copy %1 to %2: Permission denied System Disk Data Datos %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 No queda espacio en el dispositivo. Tamaño del archivo de copia: %2 GB, espacio necesario: %3 GB. Link file error Error de archivo de enlace Burning does not support replacement La quema no admite el reemplazo Burn failed 刻录失败 Peony::FileDeleteOperation File delete 文件删除 File delete error Error de eliminación de archivos Delete file error Error de eliminación de archivo Invalid Operation! Can not delete "%1". ¡Operación no válida! No se puede eliminar "%1". Peony::FileEnumerator Delete file Warning 删除文件警告 The password dialog box is canceled Se cancela el cuadro de diálogo de contraseña Message recipient disconnected from message bus without replying! ¡El destinatario del mensaje se desconectó del bus de mensajes sin responder! Error Error Did not find target path, do you move or deleted it? 未找到目标路径,您是否已经移动或删除了它? Peony::FileInfo data datos folder file text file Peony::FileInfoJob Trash Basura Computer Ordenador Network Red Recent Reciente Peony::FileInformationLabel File location: 文件位置: File size: 文件大小: Modify time: 修改时间: Peony::FileInfosJob Trash Basura Computer Ordenador Network Red Recent Reciente Peony::FileItem Delete file Warning 删除文件警告 Warning Advertencia Error Error Open Link failed Error en el enlace abierto File not exist, do you want to delete the link file? El archivo no existe, ¿desea eliminar el archivo de enlace? Can not open path "%1",permission denied. No se puede abrir la ruta "%1", permiso denegado. Can not find path "%1",are you moved or renamed it? No puede encontrar la ruta "%1", ¿se ha movido o se le ha cambiado el nombre? Can not find path "%1" . 找不到路径: "%1" 。 Peony::FileItemModel child(ren) niño(s) Symbol Link, Enlace de símbolo, System Disk File Name Nombre de archivo Delete Date Fecha de eliminación Create Date Fecha de creación Time Modified File Size Tamaño del archivo Original Path Ruta original Path File %1 is existed in space, please not add file repeatly. Operation not supported Operación no admitida File Type Tipo de archivo Modified Date Fecha de modificación Peony::FileLabelInternalMenuPlugin Add File Label... 添加标记... Add File Label Agregar etiqueta de archivo Delete All Label Eliminar todas las etiquetas Label Management ... add "%1" Remove "%1" Peony File Labels Menu Extension 文件标记 Tag a File with Menu. 菜单中增加标记功能. Peony::FileLabelWidget Label Management ... Peony::FileLauchDialog Applications Aplicaciones Choose an Application to open this file Elija una aplicación para abrir este archivo Set as Default Establecer como predeterminado OK De acuerdo The opening mode of the %1 %2 unknown No application is set to open file "%1 %2" Still using the last opened application: known Open application is used by default: You can search in the Software Center for an application that can open this file, or select an existing application on your computer. Other application: Select application: Always open the %1%2 file with this application Choose other application Elegir otra aplicación Go to application center Ir al centro de aplicaciones Ok De acuerdo Cancel Cancelar Desktop files(*.desktop) Select Open Action Select Peony::FileLaunchAction Execute Directly Ejecutar directamente Execute in Terminal Ejecutar en Terminal Detected launching an executable file %1, you want? Detectado lanzando un archivo ejecutable %1, ¿quieres? Delete file Warning 删除文件警告 Open Failed Error de apertura Can not open %1, file not exist, is it deleted? ¿No se puede abrir %1, el archivo no existe, se elimina? File not exist, is it deleted or moved to other path? 文件不存在,您是否已将其删除或挪动位置? Can not open %1 不能打开%1 No Permission File is not readable. Please check if file has read permisson. By Default App Aplicación predeterminada Launch Options Opciones de lanzamiento Open Link failed Error en el enlace abierto File not exist, do you want to delete the link file? El archivo no existe, ¿desea eliminar el archivo de enlace? Can not open %1, Please confirm you have the right authority. No se puede abrir %1, confirme que tiene la autoridad adecuada. Open App failed Error al abrir la aplicación The linked app is changed or uninstalled, so it can not work correctly. Do you want to delete the link file? La aplicación vinculada se cambia o se desinstala, por lo que no puede funcionar correctamente. ¿Desea eliminar el archivo de enlace? Error Error File original path not exist, are you deleted or moved it? 文件原始路径未找到,您是否已经移动或删除了它? Can not get a default application for opening %1, do you want open it with text format? No se puede obtener una aplicación predeterminada para abrir %1, ¿desea abrirla con formato de texto? Peony::FileLinkOperation Symbolic Link Vínculo simbólico Link file error Error de archivo de enlace Link file 创建文件链接 Peony::FileMoveOperation Invalid move operation, cannot move a file itself. 非法的移动操作,不能自移动到自身。 Move file 文件移动 Create file 文件创建 Move file error Error de mover archivo File System Sistema de archivos Data Datos %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 No queda espacio en el dispositivo. Tamaño del archivo de copia: %2 GB, espacio necesario: %3 GB. File move error Error de movimiento de archivos Invalid move operation, cannot move a file into its sub directories. Operación de movimiento no válida, no se puede mover un archivo a sus subdirectorios. The file name exceeds the limit El nombre del archivo supera el límite Create file error Error de creación de archivo Cannot opening file, permission denied! No se puede abrir el archivo, ¡permiso denegado! File:%1 was not found. Archivo:%1 no fue encontrado. Invalid Operation. Operación no válida. System Disk Can not move %1 to %2: Read-only mode, can not write-in Can not move %1 to %2: Permission denied File delete error Error de eliminación de archivos Link file error Error de archivo de enlace Burning does not support replacement La quema no admite el reemplazo Burn failed 刻录失败 File delete 文件删除 Invalid Operation Operación no válida Peony::FileOperationAfterProgressPage &More Details &Más detalles Peony::FileOperationErrorDialog File Operation Error Error de operación de archivo unkwon Unkwon null nulo Error message: Mensaje de error: Source File: Archivo fuente: Dest File: Archivo de dest: Ignore Ignorar Ignore All Ignorar todo Overwrite Sobrescribir Overwrite All Sobrescribir todo Backup Copia de seguridad Backup All Copia de seguridad de todo &Retry &Volver a intentarlo &Cancel &Cancelar Peony::FileOperationErrorDialogBase Close Cerrar Peony::FileOperationErrorDialogConflict This location already contains a file with the same name. 目标文件夹里已经包含有同名文件 Please select the file to keep 请选择要保留的文件 This location already contains the file, 这里已包含此文件 Do you want to override it? 你确定要覆盖它吗 Replace Reemplazar Ignore Ignorar Do the same Haz lo mismo <p>This location already contains the file '%1', Do you want to override it?</p> <p> Esta ubicación ya contiene el archivo '%1', ¿desea anularlo? </p> Unexpected error from %1 to %2 Error inesperado de %1 a %2 Then do the same thing in a similar situation 之后类似情况执行相同操作 Backup Copia de seguridad Cancel 取消 OK 确定 Peony::FileOperationErrorDialogNotSupported Yes No No Cancel 取消 Delete Borrar Do the same 全部应用 Make sure the disk is not full or write protected and that the file is not protected Asegúrese de que el disco no esté lleno o protegido contra escritura y que el archivo no esté protegido Peony::FileOperationErrorDialogWarning OK De acuerdo Cancel Cancelar Skip all Make sure the disk is not full or write protected and that the file is not protected Asegúrese de que el disco no esté lleno o protegido contra escritura y que el archivo no esté protegido Please make sure the disk is not full or not is write protected, or file is not being used. 请确保磁盘未满或未被写保护或未被使用。 Peony::FileOperationInfo Symbolic Link Vínculo simbólico Copy Copiar Move Rename Rebautizar Link Delete Borrar Delete Permanently 永久删除 Restore Restaurar New Nuevo - Symbolic Link -快捷方式 Peony::FileOperationManager Delete file Warning 删除文件警告 Warn Advertir '%1' is occupied,you cannot operate! '%1' está ocupado, ¡no puede operar! No, go to settings 否,跳转到设置 OK De acuerdo Cancel Cancelar Do you want to put selected %1 item(s) into trash? ¿Desea tirar a la papelera los elementos %1 seleccionados? Do not show again No volver a mostrar File System Sistema de archivos System Disk Data Datos Insufficient storage space Espacio de almacenamiento insuficiente %1 no space left on device. Copy file size: %2 GB, Space needed: %3 GB. %1 No queda espacio en el dispositivo. Tamaño del archivo de copia: %2 GB, espacio necesario: %3 GB. Can't delete. No se puede eliminar. You can't delete a file whenthe file is doing another operation No se puede eliminar un archivo cuando el archivo está realizando otra operación File Operation is Busy La operación del archivo está ocupada There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option "Allow Parallel" in option menu. Ha habido una o más operaciones de archivo ejecutándose antes. Su operación esperará a ejecutarse hasta que esté lista. Si realmente desea ejecutar operaciones de archivos en paralelo de todos modos, puede cambiar la opción predeterminada "Permitir paralelo" en el menú de opciones. The long name file is saved to %1 El archivo de nombre largo se guarda en %1 Undo %1 Redo %1 The system cannot hibernate or sleep 无法进入休眠或睡眠模式 The file operation is in progress. Ensure that the file operation is complete or canceled before hibernating or sleeping 文件操作进行中,\ 进入休眠或者睡眠之前,请先确保文件操作已完成或者取消 There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. 在执行该操作之前有操作未完成,它需要等待上一个操作完成后再执行。 Peony::FileOperationPreparePage counting: contaje: state: estado: Peony::FileOperationProgressPage &More Details &Más detalles From: De: To: Para: Peony::FileOperationProgressWizard File Manager Administrador de archivos &Cancel &Cancelar Preparing... Preparando... Handling... Manipulación... Clearing... Claro... Rollbacking... Reversión... File Operation Operación de archivos A file operation is running backend... Una operación de archivo se está ejecutando en el backend... %1 files, %2 %1 archivos, %2 %1 done, %2 total, %3 of %4. %1 hecho, %2 total, %3 de %4. clearing: %1, %2 of %3 Compensación: %1, %2 de %3 copying... copiador... Syncing... Sincronización... Peony::FilePreviewPage File Name: Nombre de archivo: File Type: Tipo de archivo: Time Access: Acceso al tiempo: Time Modified: Hora de modificación: Children Count: Los niños cuentan: Size: Tamaño: Location: Time Created: Hora de creación: Image resolution: Resolución de la imagen: color model: Modelo de color: <a href='#' style = 'text-decoration:none'>Open File</a> <a href='#' style = 'text-decoration:none'>Open File Directory</a> <a href='#' style = 'text-decoration:none'>Remove From Space</a> Cancel OK <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove this file?<br> Do not ask again usershare Compartir usuario Image size: 图片尺寸: Image format: 图片格式: %1x%2 %1x%2 %1 total, %2 hidden %1 total, %2 oculto Peony::FileRenameDialog Names automatically add serial Numbers (e.g., 1,2,3...) 名称后自动添加序号(如:1,2,3...) Cancel 取消 New file name 文件名 Please enter the file name 请输入文件名 OK 确定 Peony::FileRenameOperation Rename file 文件重命名 File Rename error Error de cambio de nombre de archivo Invalid file name %1%2%3 . Nombre de archivo no válido %1%2%3 . Are you sure to hidden this file? ¿Estás seguro de ocultar este archivo? A file and a directory with the same name cannot replace each other The file %1%2%3 will be hidden when you refresh or change directory! 文件 %1%2%3 在刷新或者切换路径后将会被隐藏! When change the file suffix, the file may be invalid. Are you sure to change it ? Al cambiar el sufijo del archivo, es posible que el archivo no sea válido. ¿Estás seguro de cambiarlo? The file %1%2%3 will be hidden when you refresh or rsort! 文件 %1%2%3 在刷新或者排序后将会被隐藏! The file %1%2%3 will be hidden! 文件%1%2%3将被隐藏! Invalid file name "%1" 文件名 "%1" 不合法 File Rename warning Advertencia de cambio de nombre de archivo The file "%1" will be hidden! 文件 "%1" 将会被隐藏! Rename file error Error de cambio de nombre del archivo Peony::FileTrashOperation File trash error Can not trash %1: Read-only file system trash:/// basura:/// Trash file error Error de archivo de papelera Invalid Operation! Can not trash "%1". ¡Operación no válida! No se puede tirar a la papelera "%1". Can not trash 不能回收 Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? An unmanageable conflict exists. Please check the recycle bin. Existe un conflicto inmanejable. Por favor, compruebe la papelera de reciclaje. The user does not have read and write rights to the file '%1' and cannot delete it to the Recycle Bin. 用户对当前文件 %1 没有读写权限,无法删除到回收站。 Can not trash this file, would you like to delete it permanently? 不能回收该文件, 是否要永久删除? Can not trash %1, would you like to delete this file permanently? 不能回收%1, 是否永久删除? . Are you sure you want to permanently delete the file ,你确定要永久删除文件吗? The user does not have read and write rights to the file '%s' and cannot delete it to the Recycle Bin. 用户对当前文件 %s 没有读写权限,无法删除到回收站。 Trash file 删除文件到回收站 Peony::FileUntrashOperation Untrash file 撤销删除的文件 Untrash file error Error de archivo Untrash Can not find trashed file %1, might be restored or removed. Peony::GlobalSettings yyyy/MM/dd aaaa/MM/dd HH:mm:ss AP hh:mm:ss yyyy-MM-dd aaaa-MM-dd Peony::HeaderBar Spread Minimize Minimizar Close Peony::IDMActionsManager Rename Spaces Space Name Please input space name OK Cancel Rename Space Failed to rename space %1 to %2, %2 is existed. Edit Space Condition Close dynamically Open dynamically Delete Spaces Are you sure to delete space %1 ? Open Abrir Open With Abrir con More applications Open The Folder Location Add File Choose file to add into space File %1 is existed in space, please not add file repeatly. Move to space Remove From Space <font color='gray'>After removal,when files in the space are aggregated and updated,these files will be no longer be displayed</font> <font color='gray'>After removal,when files in the space are aggregated and updated,this files will be no longer be displayed</font> Do you want to remove selected %1 item(s)?<br> Do you want to remove this file?<br> Do not ask again Copy Copiar Save As file All File This location has no write permission.please change the storage location Label Properties Propiedades Peony::ImageMountManager Invalid device path: %1 Cannot find loop device for path: %1 Failed to unmount filesystem: %1 Failed to delete loop device: %1 Peony::LabelSettings Name Nombre SideBar Menu Create New Label Delete Label Display the following items in the identification area: (maximum of 6) Rename Rebautizar Edit Color Delete This Label Peony::LocationBar click the blank area for edit 点击空白区域编辑路径 Computer 计算机 Search "%1" in "%2" Busque "%1" en "%2" File System 文件系统 Search results for all files marked in "%1" in "%2" &Copy Directory 拷贝路径(&C) Open In New Tab Abrir en una nueva pestaña Open In New Window Abrir en ventana nueva Open In New &Tab 在新标签页中打开(&T) Open In &New Window 在新窗口中打开(&N) Copy Directory Copiar directorio Peony::MountOperation Operation Cancelled Operación cancelada Login failed, unknown username or password error, please re-enter! Error de inicio de sesión, nombre de usuario o contraseña desconocidos, ¡vuelva a ingresar! Peony::NavigationToolBar Go Back Volver Go Forward Adelantarse History Historia Clear History Borrar historial Cd Up Cd Arriba Refresh Actualizar Peony::NewFileLaunchDialog Choose new application Elegir nueva aplicación Choose an Application to open this file Elija una aplicación para abrir este archivo apply now Aplicar ahora OK De acuerdo Cancel Cancelar Peony::OpenWithPropertiesPage How do you want to open %1%2 files ? 您希望以什么方式打开 %1%2 文件? How do you want to open "%1%2" files ? ¿Cómo desea abrir los archivos "%1%2"? Default open with: Abierto por defecto con: Other: Otro: Choose other application Elegir otra aplicación Go to application center Ir al centro de aplicaciones Peony::PathEdit Go To Vete a Peony::PermissionsPropertiesPage User or Group Usuario o grupo Type Tipo Readable 可读 Writeable 可写 Excuteable 可执行 File: %1 文件:%1 Target: %1 Objetivo: %1 Read and Write 读写 Readonly 只读 Read Leer Write Escribir Executable Ejecutable Can not get the permission info. No se puede obtener la información del permiso. (Me) (Yo) Others Otros Owner Dueño Group Grupo Other Otro Group or User (Current User) The folder containing this file is protected, and only the file owner can modify the file. Current User Permissions modify tip Sugerencia de modificación de permisos The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions? El archivo o carpeta actual ya ha establecido permisos de ACL. La modificación de los permisos del grupo de usuarios puede hacer que los permisos establecidos en ACL no se puedan utilizar. ¿Desea seguir modificando los permisos de los grupos de usuarios? Permission refinement settings Configuración de refinamiento de permisos The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting? El usuario actual ha configurado el uso compartido avanzado. Si aún necesita modificar los permisos, es posible que el uso compartido avanzado no esté disponible. ¿Quieres seguir ambientando? Other Users 其它用户 You can not change the access of this file. No se puede cambiar el acceso a este archivo. Me Me User Usuario Peony::PropertiesSetDialog Confirming property settings Whether to apply to the current selected option or to selected options and subfolders and subfiles. Apply the current selection Apply the current selection as well as subfolders and subfiles Ok De acuerdo Cancel Peony::PropertiesWindow Trash Basura Recent Reciente Selected Seleccionado %1 Files %1 Archivos usershare Compartir usuario Data Datos System Disk Properties Propiedades Ok De acuerdo Cancel Cancelar Restore Restaurar Close 关闭 Peony::RecentAndTrashPropertiesPage Show confirm dialog while trashing: 删除到回收站时弹出确认框: Show confirm dialog while trashing. Mostrar el cuadro de diálogo de confirmación mientras se tira a la papelera. Origin Path: Ruta de origen: Deletion Date: Fecha de eliminación: Size: Tamaño: Original Location: Ubicación original: Peony::SearchBar Input the search key of files you would like to find. Ingrese la clave de búsqueda de los archivos que desea encontrar. Input search key... Tecla de búsqueda de entrada... advance search Búsqueda avanzada clear record Historial claro Peony::SearchBarContainer Choose File Type 选择文件类型 Search File Clear Claro all todo file folder Carpeta de archivos image imagen video vídeo text file Archivo de texto audio audio others otros wps file Archivo WPS Peony::SharedFileLinkOperation Symbolic Link Vínculo simbólico The dest file "%1" has existed! ¡El archivo de dest "%1" ha existido! Link file error Error de archivo de enlace Peony::SideBarCloudItem CloudStorage CloudFile Peony::SideBarFavoriteItem Trash Basura Recent Reciente Quick Access KmreData Favorite Favorito Peony::SideBarFileSystemItem Computer 计算机 File System 文件系统 data 数据盘 Data Datos Peony::SideBarMenu &Properties 属性(&P) P&roperties 属性(&R) Properties Propiedades Delete Symbolic Eliminar simbólico Unmount Desmontar Eject Expulsar Format Formato burndata Quemar datos &Delete Symbolic 删除(&D) &Unmount 卸载(&U) &Eject 弹出(&E) format 格式化 Peony::SideBarModel Shared Data 共享数据 Network Red Peony::SideBarPersonalItem Personal Personal Peony::SideBarSeparatorItem (No Sub Directory) (Sin subdirectorio) Peony::StatusBar ; %1 folders ; %1 carpetas ; %1 files, %2 total ; %1 archivos, %2 total ; %1 folder ; Carpeta %1 ; %1 file, %2 ; %1 archivo, %2 %1 selected %1 seleccionado Peony::SyncThread notify 温馨提示 notificar Notify Peony::TagManagement Mark Marcar Peony::ToolBar Open in new &Window 在新窗口中打开(&W) Open in &New window 在新窗口中打开(&N) Open in new &Tab 在新标签页中打开(&T) Sort Type Tipo de ordenación File Name Nombre de archivo File Type Tipo de archivo File Size Tamaño del archivo Modified Date Fecha de modificación Open in New window Abrir en ventana nueva Open in new Tab Abrir en una nueva pestaña Ascending Ascendente Descending Descendente Copy Copiar Paste Pegar Cut Cortar Trash Basura Clean Trash Limpiar la basura Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Restore Restaurar Options Opciones Forbid Thumbnail Prohibir miniatura Show Hidden Mostrar oculto Resident in Backend Residente en Backend Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend. Deje que el programa siga ejecutándose después de cerrar la última ventana. Esto reducirá el tiempo para el próximo lanzamiento, pero también consumirá recursos en el backend. &Help &Ayuda &About... &Acerca de... Peony Qt Peonía Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Autor: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Derechos de autor (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019,天津麒麟信息技术有限公司. Peony::TooltipsManager Unknow Unknow Type: Tipo: Duration: Size: Tamaño: Loading... Res: Mod Date: Deleted date: Original path: Peony::UserShareInfoManager Warning Advertencia Peony::VolumeManager Error Error ProgressBar starting ... incipiente... canceling ... Cancelar... sync ... Sincronizar... continue continuar pause pausa close cancel file operation 取消文件操作 Are you sure want to cancel the current selected file operation 你确定要取消当前选中的文件操作 OK 确定 Cancel 取消 QObject Icon View Vista de iconos Show the folder children as icons. Muestre los elementos secundarios de la carpeta como iconos. List View Vista de lista Show the folder children as rows in a list. Muestre los elementos secundarios de la carpeta como filas en una lista. Basic Preview Page 基本 Basic Básico Show the basic file properties, and allow you to modify the access and name. Muestra las propiedades básicas del archivo y le permite modificar el acceso y el nombre. Permissions Page 权限 Permissions Permisos Show and modify file's permission, owner and group. Mostrar y modificar el permiso, el propietario y el grupo del archivo. Can not trash 不能回收 Can not trash these files. You can delete them permanently. Are you sure doing that? 这些文件不能完全放入回收站,可以选择永久删除这些文件,确定这样做吗? Can not trash files more than 10GB, would you like to delete it permanently? 无法回收大于10G的文件,是否需要永久删除? The file is too large to be moved to the recycle bin. Do you want to permanently delete it? El archivo es demasiado grande para moverlo a la papelera de reciclaje. ¿Quieres eliminarlo permanentemente? These files are too large to be moved to the recycle bin. Do you want to permanently delete these %1 files? Estos archivos son demasiado grandes para moverlos a la papelera de reciclaje. ¿Desea eliminar permanentemente estos archivos %1? Delete Borrar Clean the Trash Limpiar la basura OK 清空回收站 Do you want to empty the recycle bin and delete the files permanently? Once it has begun there is no way to restore them. ¿Quieres vaciar la papelera de reciclaje y eliminar los archivos de forma permanente? Una vez que ha comenzado, no hay forma de restaurarlos. Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Computer Properties Page 计算机 Computer Properties Propiedades de la computadora Show the computer properties or items in computer. Mostrar las propiedades o elementos del equipo en el equipo. Trash and Recent Properties Page 最近/回收 Trash and Recent Basura y Reciente Show the file properties or items in trash or recent. Mostrar las propiedades o elementos del archivo en la papelera o recientes. eject device failed 弹出设备失败 Please check whether the device is occupied and then eject the device again 请检查设备是否正在使用,确认没有使用后再次弹出 Format failed Error de formato YES Formatting successful! But failed to set the device name. ¡Formateo exitoso! Pero no se pudo establecer el nombre del dispositivo. qmesg_notify qmesg_notify Format Formato Begin Format Formato de inicio Close Cerrar Format operation has been finished successfully. La operación de formateo ha finalizado correctamente. Formatting successful! Description Failed to set the device name. 格式化成功!设备名设置失败。 Sorry, the format operation is failed! Lo sentimos, ¡se ha producido un error en la operación de formato! Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Al formatear este volumen, se borrarán todos los datos que contenga. Haga una copia de seguridad de todos los datos retenidos antes de formatear. ¿Quieres continuar? format formato begin format 开始 close 关闭 File Manager Administrador de archivos Notify Default search vfs of peony 默认文件搜索 Force unmount failed Error al forzar el desmontaje Error: %1 Error: %1 Data synchronization is complete,the device has been unmount successfully! ¡La sincronización de datos se ha completado, el dispositivo se ha desmontado correctamente! Unmount failed Error al desmontar Not authorized to perform operation. No autorizado para realizar operaciones. Unable to unmount it, you may need to close some programs, such as: GParted etc. Al no poder desmontarlo, es posible que deba cerrar algunos programas, como: GParted, etc. Error: %1 Do you want to unmount forcely? Error: %1 ¿Quieres desmontar a la fuerza? Cancel Cancelar Eject Anyway 无论如何弹出 Failed to activate device: Incorrect passphrase Error al activar el dispositivo: frase de contraseña incorrecta The device has been mount successfully! ¡El dispositivo se ha montado con éxito! Eject device failed, the reason may be that the device has been removed, etc. Error en el dispositivo de expulsión, la razón puede ser que el dispositivo se haya eliminado, etc. Data synchronization is complete and the device can be safely unplugged! ¡La sincronización de datos se ha completado y el dispositivo se puede desconectar de forma segura! Password is empty, please re-enter! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 Eject failed Error de expulsión favorite favorito Favorites File is not existed. El archivo no existe. Share Data Compartir datos Trash Basura Recent Reciente Operation not supported Operación no admitida The virtual file system does not support folder creation El sistema de archivos virtual no admite la creación de carpetas Can not create a symbolic file for vfs location No se puede crear un archivo simbólico para la ubicación de vfs Symbolic Link Vínculo simbólico Can not create symbolic file here, %1 No se puede crear un archivo simbólico aquí, %1 Can not add a file to favorite directory. No se puede agregar un archivo al directorio favorito. The virtual file system cannot be opened No se puede abrir el sistema de archivos virtual Virtual file directories do not support move and copy operations Los directorios de archivos virtuales no admiten operaciones de movimiento y copia Default favorite vfs of peony Vfs favoritos predeterminados de peonía Details Detalles Mark Marcar mark this file. Marque este archivo. Open With Abrir con open with. Abrir con. It need to synchronize before operating the device,place wait! Es necesario sincronizarse antes de operar el dispositivo, ¡espere! Unable to discover the file, it may have been removed or deleted. permission denied Permiso denegado file not found Archivo no encontrado duplicate duplicado Error when getting information for file : No target file found 获取文件信息时出现错误:没有目标文件。 data datos System Disk label Computer Ordenador File System Sistema de archivos Data Datos Failed to open file "%1": insufficient permissions. No se pudo abrir el archivo "%1": permisos insuficientes. File “%1” does not exist. Please check whether the file has been deleted. El archivo "%1" no existe. Compruebe si el archivo se ha eliminado. burn operation has been cancelled La operación de quema ha sido cancelada is busy! ¡Está ocupado! Are you sure you want to permanently delete this file? Once deletion begins, the file will not be recoverable. ¿Está seguro de que desea eliminar este archivo de forma permanente? Una vez que comience la eliminación, el archivo no será recuperable. Are you sure you want to permanently delete these %1 files? Once deletion begins, these file will not be recoverable. ¿Está seguro de que desea eliminar permanentemente estos archivos %1? Una vez que comience la eliminación, estos archivos no serán recuperables. test simplify vfs plugin Default custom vfs info of peony Default local vfs info of peony Virtual file directories do not support move operations Show properties plugin window. Intelligent Space File %1 is existed in space, please not add file repeatly. SpaceSaveDialog Save as space Space Name Please input space name Dynamically Update Space Files Cancel Ok De acuerdo Failed to create space %1,%1 is existed UdfBurn::UdfAppendBurnDataDialog AppendBurnData AppendBurnData Disc Type: Tipo de disco: Device Name: Nombre del dispositivo: OK De acuerdo Cancel Cancelar Unknow Unknow Unknown Desconocido Warning Advertencia No burn data, please add! ¡No hay datos de grabación, por favor agregue! The disc name cannot be set to empty, please re-enter it! El nombre del disco no se puede configurar como vacío, ¡vuelva a ingresarlo! AppendBurnData operation has been finished successfully. La operación AppendBurnData ha finalizado correctamente. Sorry, the appendBurnData operation is failed! Lo sentimos, se ha producido un error en la operación appendBurnData. Failed Fracasado Burning. Do not close this window Arde. No cierre esta ventana Burning this disc will append datas on it. Do you want to continue ? Al grabar este disco, se agregarán datos en él. ¿Quieres continuar? Burn Arder Begin Burning Comienza a quemar Close Cerrar UdfBurn::UdfFormatDialog Format Formato Disc Type: Tipo de disco: Device Name: Nombre del dispositivo: OK De acuerdo Cancel Cancelar Unknow Unknow Unknown Desconocido Warning Advertencia The disc name cannot be set to empty, please re-enter it! El nombre del disco no se puede configurar como vacío, ¡vuelva a ingresarlo! Format operation has been finished successfully. La operación de formateo ha finalizado correctamente. Sorry, the format operation is failed! Lo sentimos, ¡se ha producido un error en la operación de formato! Failed Fracasado Formatting. Do not close this window Formateo. No cierre esta ventana Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Al formatear este disco, se borrarán todos los datos que contenga. Haga una copia de seguridad de todos los datos retenidos antes de formatear. ¿Quieres continuar? Begin Format Formato de inicio Close Cerrar UdfFormatDialog Format Formato Disc Type: Tipo de disco: Device Name: Nombre del dispositivo: OK De acuerdo Cancel Cancelar Unknow Unknow Unknown Desconocido Warning Advertencia The disc name cannot be set to empty, please re-enter it! El nombre del disco no se puede configurar como vacío, ¡vuelva a ingresarlo! Format operation has been finished successfully. La operación de formateo ha finalizado correctamente. Sorry, the format operation is failed! Lo sentimos, ¡se ha producido un error en la operación de formato! Failed Fracasado Formatting. Do not close this window Formateo. No cierre esta ventana Formatting this disc will erase all data on it. Please backup all retained data before formatting. Do you want to continue ? Al formatear este disco, se borrarán todos los datos que contenga. Haga una copia de seguridad de todos los datos retenidos antes de formatear. ¿Quieres continuar? Begin Format Formato de inicio Close Cerrar progressBarHelper Calculating time %1day%2hrs%3mins%4sec %1hrs%2mins%3sec %1 mins%2sec %1sec peony/translations/peony-qt/0000775000175000017500000000000015154271106015131 5ustar fengfengpeony/translations/peony-qt/peony-qt_bo_CN.ts0000664000175000017500000023031015154271106020314 0ustar fengfeng AboutDialog Dialog གླེང་མོལ། <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <DOCTYPEHTMLPUBLIC་/W3C/DTDHTML་4.0/EN"htp:/wW.w.w.30.org/TRav-html40/strict.dtml><head><metanam=qurichtrichtexter'cncnnn=1styy''''''''''styy''''''''''''''''''xtmain/pachrit/sachrit-ain-nafrafafa-st-st-st-hrin-Sain-st-Sain-st-hrnnnno TextLabel ཡི་གེ་ལ་པེར་གྱིས་བཤད་རྒྱུར Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: ཞབས་ཞུ་ & རྒྱབ་སྐྱོར་: Peony ཡིག་ཆའི་དོ་དམ་ཆས། peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. ཡིག་ཆ་དོ་དམ་ཡོ་བྱད་ནི་སྤྱོད་མཁན་དོ་དམ་མ་ལག་གི་ཡིག་ཆའི་དཔེ་རིས་ཅན་གྱི་མཉེན་ཆས་ཤིག་ཡིན་ཞིང་།སྤྱོད་མཁན་ལ་རྒྱུན་བཀོལ་གྱི་ཡིག་ཆའི་བཀོལ་སྤྱོད་བྱེད་ནུས་འདོན་སྤྲོད་བྱེད་པ་དཔེར་ན།ཡིག་ཆར་ལྟ་ཞིབ་བྱེད་པ་དང་།ཡིག་ཆ་འདྲ་བཟོ་དང་།སྦྱར་སྦྱར།གཏུབ་པ།བསུབ་པ།མིང་བཏགས་པ།ཡིག་ཆའི་ཁ་ཕྱེ་སྟངས་འདེམ་པ།ཡིག་ཆ་འཚོལ་བཤེར།ཡིག་ཆའི་གོ་རིམ་སྒྲིག་པ།ཡིག་ཆའི་སྔོན་ལྟ་སོགས་བྱས་ཏེ།སྤྱོད་མཁན་གྱིས་ཐད་ཀར་དོ་དམ་མ་ལག་གི་ཡིག་ཆར་སྟབས་བདེ་བསྐྲུན་དགོས། Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 པར་གཞིའི་ཨང་རྟགས།: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window སྒེའུ་ཁུང་གསར་པའི་ནང་ཁ་ཕྱེ། Open In New Tab རྣམ་གྲངས་གསར་བའི་ནང་དུ་ཁ་ཕྱེ་བ། Rename མིང་བསྒྱུར་བ། Edit Color ཁ་མདོག་སྒྲིག་བཟོ། Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back ཕྱིར་ལོག་པ། Go Forward མདུན་དུ་སྐྱོད། Search 搜索 View Type མཐོང་རིས་རིགས། Sort Type རིམ་སྒྲིག་རིགས། Option བདམ་ཚན། Operate Tips བཀོལ་སྤྱོད་སྣེ་སྟོན། Go Up གོང་དུ་སྤེལ་དགོས། Details 详情 &Copy 复制(&C) Copy འདྲ་བཟོ་བྱས་པ། &Cut གཏུབ་པ། Cut གཏུབ་པ &Select All ཡོངས་འདེམས། Select All ཡོངས་འདེམས་ Deselect All ཚང་མ་ཕྱིར་འབུད་བྱ་དགོས། &Delete to trash 删除到回收站(&D) Delete to trash སྙིགས་སྣོད་དུ་སུབ་པ། Don't find any terminal, please install at least one terminal! མཐའ་སྣེའི་བར་འཇུག་ཅི་ཡང་མ་རྙེད་པ་རེད།ཁྱེད་ཀྱིས་མ་མཐར་ཡང་གཅིག་སྒྲིག་སྦྱོར་བྱས་ཡོད་པ་གཏན་ཁེལ་བྱེད་རོགས། Select All Item ཀུན་འདེམས། Select བདམས་ཐོན་བྱུང་བ། Restore སླར་གསོ་བྱེད་པ། Maximize ཆེས་ཆེ་ཤོས། Select Done ལེགས་གྲུབ། MoveTo གནས་སུ་སྤོ། Icon View 图标视图 མཚོན་རྟགས་ལྟ་ཚུལ། List View མིང་ཐོའི་ལྟ་ཚུལ། CopyTo འདྲ་འབེབས། Delete སུབ་དགོས། Select path འགྲོ་ལམ་གདམ་གསེས། Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize ཉུང་དུ་གཏོང་གང་ཐུབ་བྱ་དགོས། Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close སྒོ་རྒྱག་པ། Intel::NavigationSideBar Open In &New Window སྒེའུ་ཁུང་གསར་པ་ཕྱེ་བ། Open In New &Tab གསར་དུ་བསྐྲུན་པ་དང་རྣམ་གྲངས་བདམས་པའི་བྱང་བུའི་ནང་ཁ་ཕྱེ་བ། Intel::TitleLabel Files ཡིག་ཆ། MainWindow File Manager ཡིག་ཆའི་དོ་དམ་ཆས། Undo ཕྱིར་འཐེན་བྱེད་པ། idm:///新建智能空间 Redo ཡང་བསྐྱར་ཐེངས་གཅིག་ལ་བསྐྱར warn ཉེན་བརྡ་བཏང་བ། This operation is not supported. བཀོལ་སྤྱོད་འདི་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Search འཚོལ་ཞིབ་བྱེད་པ། Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder ཡིག་ཁུག་གསར་བཟོ། NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ཉེན་བརྡ་བཏང་བ། This operation is not supported. བཀོལ་སྤྱོད་འདི་ལ་རྒྱབ་སྐྱོར་མི་བྱེད། Tips སྣེ་སྟོན། The device is in busy state, please perform this operation later. སྒྲིག་ཆས་བྲེལ་འཚུབ་ཀྱི་རྣམ་པར་གནས་པས་ཅུང་ཙམ་འགོར་རྗེས་བཀོལ་སྤྱོད་འདི་ལག་བསྟར་བྱེད་རོགས། This is an abnormal Udisk, please fix it or format it འདི་ནི་ཧ་ཅང་རྒྱུན་ལྡན་མིན་པའི་Uསྡེར་ཞིག་རེད།དེ་ཉམས་གསོ་དང་རྣམ་གཞག་ཅན་དུ་གཏོང་རོགས། This is an empty drive, please insert a Disc. འདི་ནི་འོད་སྡེར་སྟོང་བ་ཞིག་རེད།འོད་སྡེར་ནང་དུ་འཇོག་རོགས། Open In New Window སྒེའུ་ཁུང་གསར་པའི་ནང་ཁ་ཕྱེ། Can not open %1, %2 %1ཁ་ཕྱེ་མི་ཐུབ་པར།%2 Open In New Tab གདོང་འཛར་སྡེབ་ངོས་གསར་པའི་ནང་ཁ་ཕྱེ། Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... ངོ་རྟགས་རྣམ་པ། More tags... ངོ་རྟགས་དེ་ལས་མང་བ་ NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow རྩེ་མོའི་སྐར་ཁུངས། Show Hidden མངོན་མེད་ཡིག་ཆ། Show File Extension ཡིག་ཆའི་འགྲེམས་མིང་མངོན་པ། Show Create Time གསར་འཛུགས་དུས་ཚོད། Show Relative Time ལྟོས་བཅས་ཀྱི་དུས་འཆར་བ། Forbid thumbnailing བཀག་སྡོམ་བསྡུས་རིས། Resident in Backend རྒྱུན་སྡོད་རྒྱབ་རྟེན། Parallel Operations བཀོལ་སྤྱོད་གཤིབ་བགྲོད་བྱས་ཆོག Set samba password སང་པ་གསང་གྲངས་བསྲིངས་པ། Tips སྣེ་སྟོན། The user already has a samba password, do you need to reset the samba password? སྤྱོད་མཁན་འདི་ལ་sambaགསང་གྲངས་ཡོད་ལ།sambaགསང་གྲངས་བསྐྱར་དུ་འཇོག་དགོས་སམ། Samba set user password Sambaཡིས་མཛད་སྤྱོད་པའི་གསང་གྲངས་བཞག་ཡོད། Samba password: Sambaགསང་གྲངས། Warning ཐ་ཚིག་སྒྲོག་པ། Samba set password failed, Please re-enter! Sambaཡིས་གསང་གྲངས་བཞག་ནས་ཕམ་སོང་།ཡང་བསྐྱར་ནང་འཇུག་བྱེད་རོགས། Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! མཉམ་སྤྱོད་སྒྲིག་ཆས་ཀྱི་ཞབས་ཞུ་རྒྱུན་ལྡན་མིན་པས།ད་ལྟ་སྒྲུབ་བཞིན་པའི་མཉམ་སྤྱོད་སྒྲིག་ཆས་ཡོད་མེད་དང་།ཡང་ན་བསྐྱར་དུ་བཀོད་སྒྲིག་དང་མཉམ་སྤྱོད་བྱེད་རོགས། Open each folder in a new window སྒེའུ་ཁུང་གསར་བ་ནས་ཡིག་ཆའི་སྒམ་ཕྱེ། Plugin manager Settings བསྒར་ལྷུ་དོ་དམ་སྒྲིག་འགོད། Show Network དྲ་ཐོག་གི་ཁྱིམ་མཚེས་གསལ་པོར་མངོན་ཡོད། Connect to Server ཞབས་ཞུ་ཆས་ལ་སྦྲེལ་བ། Help རོགས་རམ། About འབྲེལ་ཡོད་ཀྱི་སྐོར། OperationMenuEditWidget Edit རྩོམ་སྒྲིག copy འདྲ་ཕབ། paste སྦྱར་བ། cut གཏུབ་པ། trash སུབ་པ། Peony Satisfy All Conditions ཆ་རྐྱེན་ཚང་མ་བསང་དགོས། Peony::Intel::SideBarCloudItem CloudStorage ཆར་སྤྲིན་གསོག་འཇོག CloudFile ཆར་སྤྲིན་ཡིག་ཆ། Peony::Intel::SideBarFavoriteItem Favorites འགྲོས་མྱུར་ལྟ་སྤྱོད། Peony::Intel::SideBarFileSystemItem Computer རྩིས་འཁོར། 文件系统 ཡིག་ཆའི་མ་ལག System Disk མ་ལག་གི་སྡེར་མ། Peony::Intel::SideBarMenu Properties གཏོགས་གཤིས། Delete Symbolic སུབ་པ་ཡིན། Unmount བཤིག་འདོན། Eject དཀྲོལ་བ། format རྣམ་པར་འཇོག་པ། Peony::Intel::SideBarPersonalItem Personal མི་སྒེར། Peony::Intel::SideBarSeparatorItem (No Sub Directory) སྟོང་། Peony::Intel::SideBarUserDiskItem User Disk སྤྱོད་མཁན་སྡེར། Peony::Intel::TabletSideBarFactory Intel Side Bar Intelའགྲམ་ངོས་ཀྱི་སྡེ། Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Delete སུབ། Cancel མེད་པར་བཟོ་དགོས། PeonyApplication Peony-Qt 文件管理器 peony-qt ཡིག་ཆའི་དོ་དམ་ཆས། Files or directories to open ཁ་ཕྱེ་དགོས་པའི་ཡིག་ཆའམ་ཡིག་སྒམ། [FILE1, FILE2,...] ཡིག་ཆ1ཡིག་ཆ2 Warning ཐ་ཚིག་སྒྲོག་པ། Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. ཡིག་ཆའི་དོ་དམ་ཆས་ཀྱིས་མ་ལག་གི་རི་མོའི་བརྗོད་བྱ་ལེན་མི་ཐུབ།དེའི་རྒྱུ་རྐྱེན་ནི།1.དོ་དམ་པས་ཡིག་ཆ་དོ་དམ་ཆས་བཀོལ་བཞིན་ཡོད།དེ་ལས་ཁྱོད་ལ་དེ་ལས་མཐོ་བའི་དབང་ཆ་ཡོད་པ་མཚོན་ཡོད།འོན་ཀྱང་ཁྱོད་ཀྱིས་ངེས་པར་དུ་ཁྱོད་ལ་དུས་མཉམ་དུ་སྤྱོད་མཁན་དཀྱུས་མའི་འོག་ཏུ་ད་གཟོད་ཡོད་པའི་ཁྱད་ཆོས་འགའ་ཤོར་སོང་བ་རེད།དཔེར་ན།“ངའི་གློག་ཀླད”དང་མ་ལག་གི་བརྗོད་བྱ་གཙོ་བོ་རེད།གལ་ཏེ་དམིགས་བསལ་གྱི་གནས་ཚུལ་མིན་ན།དོ་དམ་པའི་སྤྱོད་མཁན་གྱིས་ཡིག་ཆ་དོ་དམ་ཆས་ཀྱི་ཁ་ཕྱེ་མི་དགོས།2.ཁྱོད་ཀྱིས་བཀོལ་སྤྱོད་བྱེད་པའི་མ་ལག་གི་བརྗོད་བྱ་གཙོ་བོ་ནི་qutཁས་ལེན་རྒྱབ་སྐྱོར་བྱེད་པའི་བརྗོད་བྱ་གཙོ་བོ་མིན་པར་མ་ཟད།ཁྱོད་ཀྱིས་འབྲེལ་ཡོད་ཀྱི་སྟེགས་བུ་བསྒར་མེད་པ་རེད།གལ་ཏེ་ཁྱོད་ཀྱིས་Gtk—mt-fatoreབརྗོད་བྱ་གཙོ་བོ་བྱས་ནས་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད། Peony is disabled to start ! ཡིག་ཆའི་དོ་དམ་ཆས་འགོ་སློང་བཀག་པ།! Peony Qt ཡིག་ཆའི་དོ་དམ་ཆས། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. རྩོམ་པ་པོ།YueLan〈lanyue.kylinos.cn〉MeihongHe〈hemeihong.kylinos.cn〉པར་དབང་ཡོད་ཚད།(C:2020ལོ།)ཆི་ལིན་མཉེན་ཆས་ཚད་ཡོད་ཀུང་སི། Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit སྒེའུ་ཁུང་ཚང་མ་བརྒྱབ་ནས་ཕྱིར་བུད། Show items ཡིག་ཆ་ཡོད་སའི་དཀར་ཆག་གི་ཁ་ཕྱེ་ནས་དེ་ཚོ་འདེམས་དགོས། Show folders ཡིག་ཆའི་འོག་གི་ནང་དོན་མངོན་ཡོད། Show properties ཡིག་ཆའི་ངོ་བོའི་སྒེའུ་ཁུང་ཕྱེ། QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed བཙན་ཤེད་ཀྱིས་བསུབ་པ་ལེགས་འགྲུབ་མ་བྱུང་། Error: %1 ནོར་འཁྲུལ།%,n Data synchronization is complete,the device has been unmount successfully! གཞི་གྲངས་གོམ་མཉམ་བྱུང་བ་དང་སྒྲིག་ཆས་བདེ་ལེགས་ངང་བསུབ་ཐུབ་སོང། Unmount failed བསུབ་མ་ཐུབ། Unable to unmount it, you may need to close some programs, such as: GParted etc. བསུབ་ཐུབ་མ་སོང། ཁྱེད་རང་གིས་དེའི་སྔོན་ལ་བྱང་རིམ་ཁ་ཤས་སྒོ་རྒྱག་དགོས་འདུག། དཔེར་ན་ཁུལ་དབྱེ་རྩོམ་སྒྲིག་ཆས་སོགས། Error: %1 Do you want to unmount forcely? ནོར་འཁྲུལ།%1བཙན་ཤེད་ཀྱིས་སུབ་པ་ཡིན་ནམ། Eject failed ཐོན་ཐུབ་མ་སོང། Cancel དོར་བ Eject Anyway 无论如何弹出 Data synchronization is complete and the device can be safely unplugged! གཞི་གྲངས་དུས་མཉམ་དུ་འགྲུབ་ན་སྒྲིག་ཆས་བདེ་འཇགས་ངང་ལེན་ཐུབ། Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器通知 File Manager ཡིག་ཆའི་དོ་དམ་ཆས། SortTypeMenu File Name 文件名称 Name མིང་། Time Modified བཟོ་བཅོས་རྒྱག་པའི་དུས་ཚོད File Size ཡིག་ཆའི་ཆེ་ཆུང་། Original Path གདོད་མའི་ཐབས་ལམ། Path འགྲོ་ལམ། Intelligent sort རིག་ནུས་གོ་རིམ། Add Mode རྣམ་པ་ཁ་སྣོན་བྱེད་པ། Manual Add Priority ལག་པས་དམིགས་སུ་བཀར་ནས་སྔོན་ཐོབ་ཀྱི་རིམ་པ་ཁ་ Conditional Screening Priority སྔོན་ཐོབ་དབང་ཆ་འདེམས་སྒྲུག་བྱ་རྒྱུའི་ཆ་རྐྱེན་འཛོམས་ཡོད། Manually added only ལག་པ་ཁོ་ནར་ཁ་སྣོན་རྒྱག་པ། Conditional additions only ཆ་རྐྱེན་ཁོ་ནར་ཁ་སྣོན་རྒྱག་པ། Descending Order རིམ་འབེབས། Ascending Order རིམ་འཕར། Use current sorting for all folders ཡིག་ཆ་ཚང་མས་མིག་སྔའི་གོ་རིམ་བཀོལ་སྤྱོད་བྱས་ཡོད། By %1 ལྟར།%1 Newest to oldest གསར་པ་ནས་རྙིང་པའི་བར། Oldest to newest གསར་པ་ནས་རྙིང་པའི་བར། Files from large to small ཆེ་བ་ནས་ཆུང་བ་བར། Files from small to large ཆེ་བ་ནས་ཆུང་བ་བར། Use global sorting 使用全局排序 File Type ཡིག་ཆའི་རིགས། Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1རྣམ་གྲངས། Searching for files ... འཚོལ་ཞིབ་བྱེད་བཞིན་ཡོད། selected%1%2 选中%1%2 selected %1 items %2 རྣམ་གྲངས་%1འདེམས་པ། %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items རྣམ་གྲངས་%1འདེམས་པ། TabWidget Trash ཕྱིར་སྡུད་ས་ཚིགས། Clear གསལ་པོར་བཤད་ན། Recover སྔར་གྱི་རྣམ་པ། Need to save changes to current space conditions? མིག་སྔའི་བར་སྟོང་ཆ་རྐྱེན་ལ་བཟོ་བཅོས་རྒྱག་དགོས་སམ། Not Save ཉར་ཚགས་མི་བྱེད་པ། Save གྲོན་ཆུང་བྱེད་དགོས། Location: གནས་ཡུལ་ནི། Save as Space བར་སྟོང་དུ་ལོགས་སུ་འཇོག་དགོས། Cancel དོར་བ Edit Conditiones རྩོམ་སྒྲིག་གི་ཆ་རྐྱེན། Contains དེའི་ནང་དུ་འདུས་ཡོད། Not Contains དེའི་ནང་ཚུད་མེད། FileName and FileContent Finammeདང་Finteetete Only FileName ཡིག་ཆའི་མིང་ཁོ་ན་ལས་མེད། File smart tags ཡིག་ཆའི་རིག་ནུས་ཀྱི་རྟགས་མཚན། Search Settings བཤེར་འཚོལ་སྒྲིག་འགོད། After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. གསལ་བང་གསར་དུ་བཟོས་རྗེས།ཕྱིས་སུ་བཤེར་འཚོལ་བྱེད་སྐབས་ཡིག་ཆའི་ནང་ཚིག་མིང་ཚིག་བཙལ་བའི་བཤེར་འབྲས་ཐོབ་ཐུབ།དེའི་རིང་ཁྱེད་ཀྱིས་རང་འདོད་དུ་ལྡེབ་ངོས་ནས་ཕྱིར་འབུད་ཆོག་ལ།ང་ཚོས་མུ་མཐུད་དེ་རྒྱབ་སྟེགས་སུ་གསར་བཟོ་བྱེད་ Computer རྩིས་འཁོར། Condition 条件 File Type ཡིག་ཆའི་རིགས། Modify time 修改时间 File Size ཡིག་ཆའི་ཆེ་ཆུང་། File Label ཡིག་ཆའི་ངོ་རྟགས། Close Filter. 关闭筛选。 Filter རླབས་འཚག་ཡོ་བྱད། Select Path འགྲོ་ལམ་གདམ་གསེས། Warning ཐ་ཚིག་སྒྲོག་པ། Error ནོར་འཁྲུལ།ནོར་འཁྲུལ་ Opening such files is not currently supported གནས་སྐབས་ཡིག་ཆ་འདིའི་རིགས་ཀྱི་ཁ་འབྱེད་པར་རྒྱབ་སྐྱོར་མི་བྱེད། Open failed ཁ་ཕྱེ་མ་ཐུབ། Open directory failed, you have no permission! ཡིག་ཆའི་ཁ་ཕྱེ་ནས་ཕམ་སོང་།ཁྱེད་ལ་དཀར་ཆག་འདིའི་དབང་ཚད་མེད། Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name མིང་། type རིགས། modify time བཅོས་པའི་དུས་ཚོད། file size ཡིག་ཆའི་མང་ཉུང་། all ཚང་མ། file folder ཡིག་སྒམ། image པར་རིས། video བརྙན་ཟློས། text file ཡིག་རྐྱང་ཡིག་ཚགས། audio སྒྲ་ཟློས། others གཞན། Satisfy All Conditions ཆ་རྐྱེན་ཚང་མ་བསང་དགོས། wps file WPSཡིག་ཆ། today དེ་རིང་། this week གཟའ་འཁོར་འདིར། this month ཟླ་འདིར། this year ད་ལོར། yesterday ཁ་སང་། last week གཟའ་འཁོར་སྔོན་མ། last month ཟླ་སྔོན་མ། last year ན་ནིང་། before last year ན་ནིང་གི་སྔོན་ལ། file name and content ཡིག་ཆའི་མིང་དང་།ནང་དོན། file name ཡིག་ཆའི་མིང་། Modify Time བཅོས་པའི་དུས་ཚོད། File Name ཡིག་ཆའི་མིང་། Condition Match Rule ཆ་རྐྱེན་ཆ་རྐྱེན་དང་སྒྲིག་སྲོལ། year ago 一年前 tiny(0-16K) ཤིན་ཏུ་ཆུང་།(0-16K) small(16k-1M) ཧ་ཅང་ཆུང་།(16k-1M) empty(0K) སྟོང་།(0K) medium(1M-128M) འབྲིང་རིམ་(1M—128M) big(128M-1G) ཆེ།(128M—1G) large(1-4G) ཤིན་ཏུ་ཆེ་བ།(1-4G) great(>4G) ཆེ།4G medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony ཡིག་ཆའི་དོ་དམ་ཆས། TopMenuBar Option བདམ་ཚན། Minimize ཉུང་དུ་གཏོང་གང་ཐུབ་བྱ་དགོས། Close ཁ་རྒྱག peony/translations/peony-qt/peony-qt_zh_CN.ts0000664000175000017500000020135615154271106020345 0ustar fengfeng AboutDialog Dialog 窗口 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel 标签 Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: 服务与支持团队: Peony 文件管理器 peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 版本号: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window 在新窗口中打开 Open In New Tab 在新标签页中打开 Rename 重命名 Edit Color 编辑颜色 Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back 后退 Go Forward 前进 Search 搜索 View Type 视图类型 Sort Type 排序类型 Option 选项 Operate Tips 操作提示 Go Up 上一级 Details 详情 &Copy 复制 Copy 复制 &Cut 剪切 Cut 剪切 &Select All 全选 Select All 全选 Deselect All 取消全选 &Delete to trash 删除到回收站 Delete to trash 删除到回收站 Don't find any terminal, please install at least one terminal! 没有找到任何终端插件,请确认您至少安装了一个! Select All Item 全部选择 Select 选择 Restore 还原 Maximize 最大化 Select Done 完成 MoveTo 移动到 Icon View 图标视图 图标视图 List View 列表视图 CopyTo 复制到 Delete 删除 Select path 选择路径 Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize 最小化 Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close 关闭 Intel::NavigationSideBar Open In &New Window 在新窗口中打开(&N) Open In New &Tab 在新标签页中打开(&T) Intel::TitleLabel Files 文件 MainWindow File Manager 文件管理器 Undo 撤销 idm:///新建智能空间 Redo 重做 warn 警告 This operation is not supported. 不支持此操作。 Search 搜索 Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder 新建文件夹 NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn 警告 This operation is not supported. 不支持此操作。 Tips 提示 The device is in busy state, please perform this operation later. 设备正忙, 请稍后执行此操作. This is an abnormal Udisk, please fix it or format it 这是个异常U盘,请将其修复或格式化 This is an empty drive, please insert a Disc. 这是一个空光驱, 请插入光盘. Open In New Window 在新窗口中打开 Can not open %1, %2 无法打开%1, %2 Open In New Tab 在新标签页中打开 Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... 标识模式 More tags... 更多标识 NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow 置顶窗口 Show Hidden 显示隐藏文件 Show File Extension 显示文件扩展名 Show Create Time 显示创建时间 Show Relative Time 显示相对时间 Forbid thumbnailing 禁用缩略图 Resident in Backend 常驻后台 Parallel Operations 允许操作并行 Set samba password 设置samba共享密码 Tips 提示 The user already has a samba password, do you need to reset the samba password? 用户已经设置了samba共享密码, 是否希望重新设置? Samba set user password 设置samba共享密码 Samba password: 共享密码: Warning 警告 Samba set password failed, Please re-enter! 设置共享密码失败, 请重新输入 Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! 共享设置服务异常, 请确认是否已经有正在进行的共享设置操作, 或者重新设置共享! Open each folder in a new window 在新窗口打开文件夹 Plugin manager Settings 插件管理设置 Show Network 显示网上邻居 Connect to Server 连接远程服务器 Help 帮助 About 关于 OperationMenuEditWidget Edit 编辑 copy 复制 paste 粘贴 cut 剪切 trash 删除 Peony Satisfy All Conditions 满足全部条件 type 类型 file size 文件大小 modify time 修改时间 name 名称 Peony::Intel::SideBarCloudItem CloudStorage 云存储 CloudFile 云文件 Peony::Intel::SideBarFavoriteItem Favorites 快速访问 Peony::Intel::SideBarFileSystemItem Computer 计算机 文件系统 文件系统 System Disk 系统盘 Peony::Intel::SideBarMenu Properties 属性 Delete Symbolic 删除链接 Unmount 卸载 Eject 弹出 format 格式化 Peony::Intel::SideBarPersonalItem Personal 个人 Peony::Intel::SideBarSeparatorItem (No Sub Directory) (无子目录) Peony::Intel::SideBarUserDiskItem User Disk 用户盘 Peony::Intel::TabletSideBarFactory Intel Side Bar Intel侧边栏 Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Delete 删除 Cancel 取消 PeonyApplication Peony-Qt 文件管理器 peony-qt 文件管理器 Files or directories to open 需要打开的文件或文件夹 [FILE1, FILE2,...] [文件1,文件2...] Warning 警告 Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. 文件管理器无法获取系统图标主题,可能的原因是: 1.正在以管理员用户运行文件管理器,虽然这意味着你拥有更高的权限,但是你必须了解你同时也失去了一些在普通用户下才能够拥有的特征,例如“我的电脑”以及系统主题。如果不是特殊情况,请不要使用管理员用户打开文件管理器。 2.你使用的系统主题不是qt默认支持的主题,并且你没有安装相关的平台插件。如果你正在使用Gtk主题作为系统主题,尝试安装qt5-gtk2-platformtheme以解决此问题。 Peony is disabled to start ! 文件管理器被禁止启动! Peony Qt 文件管理器 Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2020, 麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit 关闭所有窗口并退出 Show items 打开文件所在目录并选中它们 Show folders 显示文件夹下的内容 Show properties 打开文件属性窗口 QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed 强制卸载失败 Error: %1 错误:%1 Data synchronization is complete,the device has been unmount successfully! 数据同步完成,设备已经安全卸载! Unmount failed 卸载失败 Unable to unmount it, you may need to close some programs, such as: GParted etc. 无法卸载设备,可以尝试先关闭一些应用程序,比如GParted等。 Error: %1 Do you want to unmount forcely? 错误:%1 您确定要强制卸载吗? Eject failed 弹出失败 Cancel 取消 Eject Anyway 强制弹出 Data synchronization is complete and the device can be safely unplugged! 数据同步完成,设备可以安全移除了! Unable to eject %1 无法弹出 %1 PeonyNotify 文件管理器消息 File Manager 文件管理器 SortTypeMenu File Name 文件名称 Name 文件名称 Time Modified 修改时间 File Size 文件大小 Original Path 原始路径 Path 路径 Intelligent sort 智能排序 Add Mode 按添加方式 Manual Add Priority 手动添加优先 Conditional Screening Priority 条件筛选优先 Manually added only 仅手动添加 Conditional additions only 仅条件筛选 Descending Order 降序 Ascending Order 升序 Use current sorting for all folders 所有目录使用当前排序 By %1 按%1 Newest to oldest 从新到旧 Oldest to newest 从旧到新 Files from large to small 从大到小 Files from small to large 从小到大 Use global sorting 使用全局排序 File Type 文件类型 Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 个项目 Searching for files ... 正在搜索... selected%1%2 选中%1%2 selected %1 items %2 选中 %1 个项目 %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items 选中 %1 个项目 TabWidget Trash 回收站 Clear 清空 Recover 还原 Need to save changes to current space conditions? 需要保存对当前空间条件的修改吗? Not Save 不保存 Save 保存 Location: 范围: Save as Space 存为空间 Cancel 取消 Edit Conditiones 编辑空间 Contains 包含 Not Contains 不包含 FileName and FileContent 文件名称和文件内容 Only FileName 文件名称 File smart tags 文件智能标签 Search Settings 搜索设置 After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. 创建索引后,下次搜索可获取文件内容含搜索词的结果,期间您可随时退出页面,我们会在后台继续完成创建。 Computer 计算机 Condition 条件 File Type 文件类型 Modify time 修改时间 File Size 文件大小 File Label 文件标识 Close Filter. 关闭筛选。 Filter 筛选 Select Path 选择路径 Warning 警告 Error 错误 Opening such files is not currently supported 暂时不支持打开此类文件 Open failed 打开失败 Open directory failed, you have no permission! 打开文件夹失败,您没有该目录的权限! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name 名称 type 类型 modify time 修改时间 file size 文件大小 all 全部 file folder 文件夹 image 图片 video 视频 text file 文本文档 audio 音频 others 其他 Satisfy All Conditions 满足全部条件 wps file WPS文件 today 今天 this week 本周 this month 本月 this year 今年 yesterday 昨天 last week 上周 last month 上月 last year 去年 before last year 去年以前 file name and content 文件名称和内容 file name 文件名称 Modify Time 修改时间 File Name 文件名称 Condition Match Rule 匹配规则 year ago 一年前 tiny(0-16K) 极小(0-16K) small(16k-1M) 很小(16k-1M) empty(0K) 空(0K) medium(1M-128M) 中等(1M-128M) big(128M-1G) 大(128M-1G) large(1-4G) 巨大(1-4G) great(>4G) 极大(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony 文件管理器 TopMenuBar Option 选项 Minimize 最小化 Close 关闭 peony/translations/peony-qt/peony-qt_zh_Hant.ts0000664000175000017500000017763515154271106020753 0ustar fengfeng AboutDialog Dialog 視窗 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel 標籤 Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: 服務與支持團隊: Peony 檔管理員 peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 檔管理員是一款説明使用者管理系統文件的圖形化的軟體,為使用者提供常用的檔操作功能,比如檔查看,檔複製、粘貼、剪切、刪除、重命名,檔打開方式選擇,檔搜索,檔排序,檔預覽等,方便使用者在介面上直觀地管理系統檔。 Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 版本號: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window 在新視窗中打開 Open In New Tab 在新標籤頁中打開 Rename 重新命名 Edit Color 編輯顏色 Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back 後退 Go Forward 前進 Search 搜索 View Type 視圖類型 Sort Type 排序類型 Option 選項 Operate Tips 操作提示 Go Up 上一級 Details 详情 &Copy 複製 Copy 複製 &Cut 剪切 Cut 剪切 &Select All 全選 Select All 全選 Deselect All 取消全選 &Delete to trash 刪除到回收站 Delete to trash 刪除到回收站 Don't find any terminal, please install at least one terminal! 沒有找到任何終端外掛程式,請確認您至少安裝了一個! Select All Item 全部選擇 Select 選擇 Restore 還原 Maximize 最大化 Select Done 完成 MoveTo 移動到 Icon View 图标视图 圖示檢視 List View 清單檢視 CopyTo 複製到 Delete 刪除 Select path 選擇路徑 Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize 最小化 Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close 關閉 Intel::NavigationSideBar Open In &New Window 在新視窗開啟(&N) Open In New &Tab 在新分頁開啟(&T) Intel::TitleLabel Files MainWindow File Manager 檔管理員 Undo 撤銷 idm:///新建智能空间 Redo 重做 warn 警告 This operation is not supported. 不支援此操作。 Search 搜索 Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder 新建資料夾 NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn 警告 This operation is not supported. 不支援此操作。 Tips 提示 The device is in busy state, please perform this operation later. 裝置正忙, 請稍後執行此操作. This is an abnormal Udisk, please fix it or format it 這是個異常U盤,請將其修復或格式化 This is an empty drive, please insert a Disc. 這是一個空光碟機, 請插入光碟. Open In New Window 在新視窗中打開 Can not open %1, %2 無法開啟%1, %2 Open In New Tab 在新標籤頁中打開 Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... 標識模式 More tags... 更多標識 NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow 置頂視窗 Show Hidden 顯示隱藏檔案 Show File Extension 顯示檔擴展名 Show Create Time 顯示創建時間 Show Relative Time 顯示相對時間 Forbid thumbnailing 禁用縮圖 Resident in Backend 常駐後台 Parallel Operations 允許操作並行 Set samba password 設置samba共享密碼 Tips 提示 The user already has a samba password, do you need to reset the samba password? 用戶已經設置了samba共享密碼, 是否希望重新設置? Samba set user password 設置samba共享密碼 Samba password: 共用密碼: Warning 警告 Samba set password failed, Please re-enter! 設定共享密碼失敗, 請重新輸入 Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! 共用設定服務異常, 請確定是否已經有正在進行的共享設定操作, 或者重新設置共用! Open each folder in a new window 在新視窗打開資料夾 Plugin manager Settings 外掛程式管理設置 Show Network 顯示網上鄰居 Connect to Server 連接遠端伺服器 Help 幫助 About 關於 OperationMenuEditWidget Edit 編輯 copy 複製 paste 粘貼 cut 剪切 trash 刪除 Peony::Intel::SideBarCloudItem CloudStorage 雲存儲 CloudFile 雲檔 Peony::Intel::SideBarFavoriteItem Favorites 快速訪問 Peony::Intel::SideBarFileSystemItem Computer 計算機 文件系统 檔案系統 System Disk 系統盤 Peony::Intel::SideBarMenu Properties 屬性 Delete Symbolic 刪除連結 Unmount 卸載 Eject 彈出 format 格式化 Peony::Intel::SideBarPersonalItem Personal 個人 Peony::Intel::SideBarSeparatorItem (No Sub Directory) ( 無子目錄 ) Peony::Intel::SideBarUserDiskItem User Disk 用戶盤 Peony::Intel::TabletSideBarFactory Intel Side Bar Intel側邊欄 Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您確定要刪除這些檔案嗎? 一旦開始刪除,這些檔將不可再恢復。 Delete 刪除 Cancel 取消 PeonyApplication Peony-Qt 文件管理器 peony-qt 檔管理員 Files or directories to open 需要打開的檔或資料夾 [FILE1, FILE2,...] [檔1,檔2...] Warning 警告 Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. 檔管理員無法取得系統圖示主題,可能的原因是: 1.正在以管理員使用者運行檔管理器,雖然這意味著你擁有更高的許可權,但是你必須瞭解你同時也失去了一些在普通使用者下才能夠擁有的特徵,例如“我的電腦”以及系統主題。 如果不是特殊情況,請不要使用管理員使用者打開檔管理員。 2.你使用的系統主題不是qt默認支援的主題,並且你沒有安裝相關的平臺外掛程式。 如果你正在使用Gtk主題作為系統主題,嘗試安裝qt5-gtk2-platformtheme以解決此問題。 Peony is disabled to start ! 檔管理員被禁止啟動! Peony Qt 檔管理員 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2020, 麒麟軟體有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit 關閉所有視窗並退出 Show items 打開檔所在目錄並選取中它們 Show folders 顯示資料夾下的內容 Show properties 打開檔案屬性視窗 QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed 強制卸載失敗 Error: %1 錯誤:%1 Data synchronization is complete,the device has been unmount successfully! 數據同步完成,設備已經安全卸載! Unmount failed 卸載失敗 Unable to unmount it, you may need to close some programs, such as: GParted etc. 無法卸載設備,可以嘗試先關閉一些應用程式,比如GParted等。 Error: %1 Do you want to unmount forcely? 錯誤:%1 您確定要強制卸載嗎? Eject failed 彈出失敗 Cancel 取消 Eject Anyway 強制彈出 Data synchronization is complete and the device can be safely unplugged! 數據同步完成,設備可以安全移除了! Unable to eject %1 無法彈出 %1 PeonyNotify 檔管理員消息 File Manager 檔管理員 SortTypeMenu File Name 文件名称 Name 檔名稱 Time Modified 修改時間 File Size 檔大小 Original Path 原始路徑 Path 路徑 Intelligent sort 智慧排序 Add Mode 按添加方式 Manual Add Priority 手動添加優先 Conditional Screening Priority 條件篩選優先 Manually added only 僅手動添加 Conditional additions only 僅條件篩選 Descending Order 降序 Ascending Order 升序 Use current sorting for all folders 所有目錄使用當前排序 By %1 按%1 Newest to oldest 從新到舊 Oldest to newest 從舊到新 Files from large to small 從大到小 Files from small to large 從小到大 Use global sorting 使用全局排序 File Type 檔案類型 Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 個專案 Searching for files ... 搜尋中... selected%1%2 选中%1%2 selected %1 items %2 選取 %1 個專案 %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items 選取 %1 個專案 TabWidget Trash 回收站 Clear 清空 Recover 還原 Need to save changes to current space conditions? 需要保存對當前空間條件的修改嗎? Not Save 不保存 Save 保存 Location: 範圍: Save as Space 存為空間 Cancel 取消 Edit Conditiones 編輯空間 Contains 包含 Not Contains 不包含 FileName and FileContent 檔案名稱和文件內容 Only FileName 檔名稱 File smart tags 檔智能標籤 Search Settings 搜索設置 After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. 創建索引后,下次搜索可獲取文件內容含搜索詞的結果,期間您可隨時退出頁面,我們會在後台繼續完成創建。 Computer 計算機 Condition 条件 File Type 檔案類型 Modify time 修改时间 File Size 檔大小 File Label 檔標識 Close Filter. 关闭筛选。 Filter 篩選 Select Path 選擇路徑 Warning 警告 Error 錯誤 Opening such files is not currently supported 暫時不支持打開此類檔 Open failed 打開失敗 Open directory failed, you have no permission! 打開資料夾失敗,您沒有該目錄的許可權! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name 名稱 type 類型 modify time 修改時間 file size 檔大小 all 全部 file folder 資料夾 image 圖片 video 視頻 text file 文本文檔 audio 音訊 others 其他 Satisfy All Conditions 滿足全部條件 wps file WPS檔 today 今天 this week 本週 this month 本月 this year 今年 yesterday 昨天 last week 上周 last month 上月 last year 去年 before last year 去年以前 file name and content 檔案名稱和內容 file name 檔名稱 Modify Time 修改時間 File Name 檔名稱 Condition Match Rule 匹配規則 year ago 一年前 tiny(0-16K) 極小(0-16K) small(16k-1M) 很小(16k-1M) empty(0K) 空(0K) medium(1M-128M) 中等(1M-128M) big(128M-1G) 大(128M-1G) large(1-4G) 巨大(1-4G) great(>4G) 極大(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony 檔管理員 TopMenuBar Option 選項 Minimize 最小化 Close 關閉 peony/translations/peony-qt/peony-qt_fr.ts0000664000175000017500000017022015154271106017746 0ustar fengfeng AboutDialog Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel Service & Support: Peony Version number: %1 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. FileLabelBox Open In New Window Open In New Tab Rename Renommer Edit Color Modifier la couleur Delete Effacer Create New Label Créer une nouvelle étiquette HeaderBar Create Folder Créer le dossier Open Terminal Terminal ouvert Go Back Retourner Go Forward Aller en avant Search Chercher Go Up Icon View List View View Type Type de vue Sort Type Type de tri Option Option &Copy Copy &Cut Cut &Select All Select All Deselect All &Delete to trash Delete to trash Operate Tips Conseils d'utilisation Don't find any terminal, please install at least one terminal! Aucun terminal trouvé, veuillez installer au moins un terminal ! Restore Onar Maximize Büyüt Select All Item Select MoveTo CopyTo Delete Effacer Select path Sélectionner le chemin Select Done Minimize Küçült Close Kapat HeaderBarContainer Minimize Minimiser Maximize/Restore Agrandir/restaurer Restore Onar Maximize Büyüt Close Fermer Intel::NavigationSideBar Open In &New Window Ouvrir dans une &nouvelle fenêtre Open In New &Tab Ouvrir dans un nouvel onglet Intel::TitleLabel Files MainWindow File Manager Dosya Yöneticisi Undo Annuler idm:///新建智能空间 Redo Rétablir warn This operation is not supported. Search Chercher Delete file Warning Dosya Silme Uyarısı Delete Permanently Supprimer définitivement Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Peony Qt Peony Qt New Folder Nouveau dossier NavigationSideBar All tags... Tüm etiketler... Open In &New Window Ouvrir dans une &nouvelle fenêtre Open In New &Tab Ouvrir dans un nouvel onglet Tips The device is in busy state, please perform this operation later. Open In New Window Can not open %1, %2 Open In New Tab warn This operation is not supported. This is an abnormal Udisk, please fix it or format it This is an empty drive, please insert a Disc. NavigationSideBarContainer All tags... Toutes les balises... Manager tags... More tags... NavigationTabBar Search "%1" in "%2" Rechercher "%1" dans "%2" OperationMenu Advance Search Gelişmiş Arama Keep Allow Garder la permission Show Hidden Afficher masqué Show File Extension Show Create Time Show Relative Time Forbid thumbnailing Interdire la vignette Resident in Backend Résident dans l'arrière-plan Parallel Operations Opérations parallèles Set samba password Tips The user already has a samba password, do you need to reset the samba password? Samba password: Samba set user password Warning Attention Samba set password failed, Please re-enter! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Open each folder in a new window Plugin manager Settings Show Network Connect to Server Help Aide About À propos OperationMenuEditWidget Edit Éditer copy copier paste coller cut couper trash corbeille Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites Peony::Intel::SideBarFileSystemItem Computer 文件系统 System Disk Peony::Intel::SideBarMenu Properties Delete Symbolic Unmount Eject format Peony::Intel::SideBarPersonalItem Personal Peony::Intel::SideBarSeparatorItem (No Sub Directory) Peony::Intel::SideBarUserDiskItem User Disk Peony::Intel::TabletSideBarFactory Intel Side Bar Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Êtes-vous sûr de vouloir supprimer ces fichiers ? Une fois que vous avez commencé une suppression, les fichiers supprimés ne seront plus jamais restaurés. Delete Effacer Cancel PeonyApplication Peony-Qt Dosya Yöneticisi peony-qt Dosya Yöneticisi Files or directories to open Fichiers ou répertoires à ouvrir [FILE1, FILE2,...] [FILE1, FILE2,...] Warning Attention Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt ne peut pas obtenir le thème d'icônes du système. Il y a 2 raisons qui peuvent conduire à ce problème : 1. Peony-Qt peut fonctionner en tant que root, cela signifie que vous avez la permission la plus élevée et que vous pouvez faire certaines choses qui sont normalement interdites. Mais, vous devez savoir que si vous étiez dans une racine, le système de fichiers virtuel perdra une certaine fonction telle que vous ne pouvez pas utiliser "Poste de travail", le thème et les icônes pourraient également mal tourner. Donc, exécuter peony-qt dans une racine n'est pas recommandé. 2. Vous utilisez un thème non-qt pour votre système mais vous n'avez pas installé le plugin de thème de plate-forme pour qt applications. Si vous utilisez gtk-theme, essayez d'installer le package qt5-gtk2-platformtheme pour résoudre ce problème. Peony is disabled to start ! Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Auteurs : Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C) : 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif Hakkı(C): 2019-2020, KYLIN Software Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Close all peony-qt windows and quit Fermer toutes les fenêtres de peony-qt et quitter Show items Afficher les éléments Show folders Afficher les dossiers Show properties Afficher les propriétés QObject Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Unable to unmount it, you may need to close some programs, such as: GParted etc. Error: %1 Do you want to unmount forcely? Eject failed Cancel Eject Anyway Data synchronization is complete and the device can be safely unplugged! Unable to eject %1 PeonyNotify File Manager Dosya Yöneticisi SortTypeMenu File Name Nom de fichier Name Time Modified File Size Taille du fichier Original Path Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large File Type Type de fichier Modified Date Date modifiée Modified Data Düzenlenen Veri Ascending Ascendant Descending Descendant TabStatusBar ; %1 folders ; %1 dossiers ; %1 files, %2 total ; %1 fichiers, %2 total ; %1 folder ; %1 dossier ; %1 file, %2 ; %1 fichier, %2 %1 selected %1 sélectionné Search "%1" in "%2" Rechercher "%1" dans "%2" Searching for files ... %1 items selected %1 items %2 selected %1 items TabWidget Trash Corbeille Clear Nettoyer Recover Récupérer Need to save changes to current space conditions? Not Save Save Location: Computer Filter Save as Space Cancel Edit Conditiones Select Path Warning Attention Error Opening such files is not currently supported Open failed Open directory failed, you have no permission! Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Close advance search. Fermer la recherche avancée. Search Chercher Choose other path to search. Choisir un autre chemin de recherche. Search recursively Rechercher récursivement more options plus d'options Show/hide advance search Afficher/masquer la recherche avancée Select path Sélectionner le chemin is est Please input key words... Veuillez saisir les mots clés... Please input kay words... Lütfen anahtar kelimeler girin ... contains contient name Nom type type modify time modifier l'heure file size taille du fichier all tout file folder dossier de fichiers image image video vidéo text file fichier texte audio audio others autres wps file fichier wps today aujourd'hui this week cette semaine this month ce mois-ci this year cette année yesterday last week last month last year before last year empty(0K) medium(1M-128M) moyen (1M-100M) {1M?} {128M?} big(128M-1G) grand (100M-1G) {128M?} {1G?} large(1-4G) great(>4G) file name and content file name File Type Type de fichier File Size Taille du fichier Modify Time File Name Nom de fichier File Label Condition Match Rule year ago il y'a un an tiny(0-16K) minuscule (0-16K) small(16k-1M) petit (16k-1M) medium(1M-100M) moyen (1M-100M) big(100M-1G) grand (100M-1G) large(>1G) large (>1G) TitleLabel Peony TopMenuBar Option Option Minimize Close peony/translations/peony-qt/peony-qt_fa.ts0000664000175000017500000006560415154271070017736 0ustar fengfeng AboutDialog Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> TextLabel Service & Support: Peony Version number: %1 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. none FileLabelBox Rename تغییر نام Edit Color تغییر رنگ Delete حذف Create New Label ایجاد برچسب جدید HeaderBar Create Folder ایجاد پوشه Open Terminal باز‌کردن ترمینال Go Back بازگشت به عقب Go Forward رفتن به جلو Search جستجو View Type نحوۀ نمایش Sort Type نحوۀ مرتب‌سازی Option Operate Tips Don't find any terminal, please install at least one terminal! Minimize Küçült Close Kapat HeaderBarContainer Minimize Küçült Maximize/Restore Restore Onar Maximize Büyüt Close بستن MainWindow File Manager Dosya Yöneticisi Undo واگرد Redo از نو Tips info Trash has no file need to be cleaned. Delete file Warning Dosya Silme Uyarısı Delete Permanently حذف همیشگی Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. آیا از حذف این فایل‌ها اطمینان دارید؟ پس از حذف، امکان بازگرداندن فایل‌ها وجود ندارد. Peony Qt Peony Qt New Folder پوشۀ جدید NavigationSideBar All tags... Tüm etiketler... Open In New Window Can not open %1, %2 Open In New Tab NavigationSideBarContainer All tags... Tüm etiketler... NavigationTabBar Search "%1" in "%2" OperationMenu Advance Search Gelişmiş Arama Keep Allow Show Hidden نمایش موارد پنهان Forbid thumbnailing Resident in Backend Parallel Operations عملیات‌های موازی Help راهنما About OperationMenuEditWidget Edit تغییر copy paste cut trash PeonyApplication Peony-Qt Dosya Yöneticisi peony-qt Dosya Yöneticisi Files or directories to open [FILE1, FILE2,...] Warning هشدار Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif Hakkı(C): 2019-2020, KYLIN Software Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Close all peony-qt windows and quit Show items نمایش موارد Show folders نمایش پوشه‌ها Show properties نمایش مشخصات SortTypeMenu File Name نام فایل File Size حجم فایل File Type نوع فایل Modified Date Modified Data Düzenlenen Veri Ascending افزایشی Descending کاهشی TabStatusBar ; %1 folders ; %1 files, %2 total ; %1 folder ; %1 file, %2 %1 selected Search "%1" in "%2" TabWidget Trash Clear Recover بازگرداندن Close advance search. بستن جستجوی پیشرفته Search جستجو Choose other path to search. مسیر جستجوی دیگری را انتخاب کنید. Search recursively more options گزینه‌های بیشتر Show/hide advance search نمایش/پنهان‌کردن جستجوی پیشرفته Select path is Please input key words... لطفاً کلمات کلیدی را وارد نمایید... Please input kay words... Lütfen anahtar kelimeler girin ... contains name نام type نوع modify time file size حجم فایل all همه file folder image تصویر video ویدیو text file فایل متنی audio صدا others سایر wps file فایل WPS today امروز this week این هفته this month این ماه this year امسال year ago tiny(0-16K) small(16k-1M) medium(1M-100M) big(100M-1G) large(>1G) peony/translations/peony-qt/peony-qt_kk.ts0000664000175000017500000021032115154271106017741 0ustar fengfeng AboutDialog Dialog ديالوگ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC“//W3C//DTD HTML 4.0//EN”http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name=“qrichtext”content=“1”/><style type=“text/css”> p、 li{قۇرعاق:الدىن تۇسىرۋ;} </style></head><body style=“font-family:'Noto Sans CJK SC';font-size:10pt;font-كەڭدىگى:400;font-style:نورمال;”> <p style=“-qtابزاس تيپى:قۇرعاق;شاراپات جان ارالققا شوقى بولەك:0px;شاراپات جاق ارالققا استٸ بولەك:0px,سول شاراپات جاق ارالققا0px;وڭ شاراپات جان ارالققا0px;-qtپارشا تارايتۋ كولەمى :0;تەكىسىت تارايتۋ كولەمى :0px;ٴارىپ ۇلكەن كشىلگى:11pt;”><br/></p></body></html> TextLabel تەكىسىت بەلگىسى Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: قىزىمەت ۋا قولداعان كوللەكتيوۆ Peony پيون peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. حۇجات باسقارۋشٸسٸ قاريدارلاردىڭ سەستيما حۇجاتىن باسقارۋعا جاردەم بەرەتٸن گراقيكالىق جۇمساق دەتال. ول ٸستەتۋشٸلەردٸ ۇنەمى ىستەتەتىن حۇجات جوبالاۋ رولدارٸ مەنەن قامدالادٸ، ماسەلەن، حۇجات كورۋ، حۇجات كوشىرۋ، شاپتاۋ، كەسۋ، ٴوشىرۋ، ات وزگەرتۋ، حۇجات تالداۋ، پٸروگٸرامما ٸشٸۋ، حۇجات ٸزدەۋ، حۇجات تۇرگە ايىرۋ، حۇجات كورىپ باعۋ قاتارلىلار. قاريدارلاردىڭ كورىنبە بەتىندە تٸكە سەستيما حۇجاتىن تٸكە باسقارۋ قولايلىق بولادٸ. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 باسىلىمى نومەرى: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window جاڭا تەرەزەدە ٸشٸۋ Open In New Tab جاڭا قويىندىدا ٸشٸۋ Rename قاتە ات فاميليا ەتۋ Edit Color رەڭ تالداۋجاساۋ Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back قايت Go Forward العا ىلگەرلەۋ Search 搜索 View Type كورۋ تۇرى Sort Type سۇرىپتاۋ تيپى Option تالداۋ Operate Tips جوبالاۋ ەسكەرتپەسٸ Go Up ٷستٸنەن شىعۋ Details 详情 &Copy كوشىرىڭىز Copy كوشىرۋ &Cut كەسۋ Cut كەسۋ &Select All ٴبارىن تالدا Select All جالپىسىن تالداۋ Deselect All ٴبارىن تاڭداۋدى بوس ەتۋ &Delete to trash ٴوشىرۋ قوقسىق ساندىعىنا Delete to trash قوقسىق بوشكە تاستالۋ Don't find any terminal, please install at least one terminal! سوڭعٸ ۇشٸ تابالاسىزبا، از دەگەندە بٸر سوڭعٸ ۇشٸ ورناتٸڭٸز! Select All Item بارلٸق مۇشەلەردى تالدا Select تالدا Restore قالپىنا قايتارۋ Maximize ۇلكەندىگى Select Done توگەدى تالدا MoveTo جوتكەپ بەرۋ Icon View 图标视图 اي كۇن كورىنۋى List View تٸزٸمدٸك كورىنۋى CopyTo كوشىرۋ Delete حابار Select path جول تالداۋ Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize تومەنگە تۇسىرۋ Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close تىعنداۋ Intel::NavigationSideBar Open In &New Window Open In &New كوز بەك Open In New &Tab جاڭا ٸشٸۋ > Tab Intel::TitleLabel Files حۇجاتتار MainWindow File Manager حۇجات اكىمشى Undo قايتىپ الۋ idm:///新建智能空间 Redo قاتە ٸستەۋ warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋ قولدامايدى. Search ىزدە Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder جاڭا حۇجات قىسقىش NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋ قولدامايدى. Tips ەسكەرتپە The device is in busy state, please perform this operation later. اسباب قاربالاس كۇيدە ەكەن، سەل تۇرٸپ نۇ جوبالاۋدى اتقار ىستەڭ. This is an abnormal Udisk, please fix it or format it نۇ نورما Udisk ، وڭشاپ قويىڭىز ياكي فورماتتاپ بەر This is an empty drive, please insert a Disc. نۇ قۇرعاق قوزعالتۋ اسبابى، دەسكانى قىستىرىڭىز. Open In New Window جاڭا تەرەزەدە ٸشٸۋ Can not open %1, %2 %1, %2 نى اشۋئاجرىتىششىن بولمادى Open In New Tab جاڭا قويىندىدا ٸشٸۋ Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... باسقارۋشٸسٸ قىسترعىلارى... More tags... الٸدە كوپ قىستىرمالار... NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow يجاراتنى ساقتاۋ Show Hidden جاسىرىن كورسەتۋ Show File Extension حۇجات كەڭەيتپەسى كورسەتۋ Show Create Time ۋاقىت قۇرۋدى كورسەتۋ Show Relative Time قاتىناسى ۋاقىت كورسەتۋ Forbid thumbnailing كشكەنە كورىنسىن مانى ەتۋ Resident in Backend Backend دا سەتتلەر Parallel Operations پاراللەل جوبالاۋ Set samba password سامبا پارولدى بەلگٸلەۋ Tips ەسكەرتپە The user already has a samba password, do you need to reset the samba password? ابونتىنڭ سامبا قۇپيا نومەرى بار، سامبا قۇپيا نومەرىنى قاتە بەلگٸلەۋ كەرەكپە؟ Samba set user password سامبا پايدالانۋشٸ پارولدى بەلگٸلەيدٸ Samba password: سامبا پارول: Warning ەسكەرتۋ Samba set password failed, Please re-enter! Samba بەلگىلەەن قۇپيا نومەر جەڭىلىپ قالدى، قاتە كىرگىزىڭىز! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! ھەمبەھىرلەش تولىقتاماسى قىزىمەت وتەگىشتەن سىرتىنا، ھەمبەھىرلەش جوبالاۋى جالعاسىپ جاتقان ياكي جوقتىعىن ارينە، ياكي ھەمبەھىرنى قاتە بەلگٸلە! Open each folder in a new window ٵر بٸر حۇجات قىسقىشىنى جاڭا تەرەزەدە ٸشٸۋ Plugin manager Settings قىستىرما باسقارۋشى تەڭگەرگٸش Show Network توردى كورسەتۋ Connect to Server قىزىمەت وتەۋ اسبابىنا بايلانۋٸ Help جاردەم About جايىندا OperationMenuEditWidget Edit تالداۋجاساۋ copy كوشىرۋ paste شاپتاۋ cut كەسۋ trash قوقسىق Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites جاقسى كۆرگۈچىلەر Peony::Intel::SideBarFileSystemItem Computer كومپيۋتەر 文件系统 System Disk سەستما ديسكاسى Peony::Intel::SideBarMenu Properties قاسيەتى Delete Symbolic سيمۆلدىق ٴوشىرۋ Unmount ٴوشىرۋ Eject جاريالاۋ format ٴپىشىم Peony::Intel::SideBarPersonalItem Personal حۇجات باسقارۋشٸسٸ ۇقتىرۋى Peony::Intel::SideBarSeparatorItem (No Sub Directory) (تارماق باس مازمۇن) Peony::Intel::SideBarUserDiskItem User Disk پايدالانۋشٸ ديسكاسى Peony::Intel::TabletSideBarFactory Intel Side Bar ئىنتىل يانبالداقى Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. ٴسىز شىنىندا نۇ حۇجاتتاردى ئۆچۈرەمٴسىز؟ ٶشٸرۋشٸنٸ باستاعان اقىرىندا، ٶشٸرٸلگەن حۇجاتتار ماڭگى قالپىنا كەلتىرەالمايدى. Delete حابار Cancel كۇشىنەن قالدىرۋ PeonyApplication Peony-Qt 文件管理器 peony-qt حۇجات باسقارۋشٸسٸ-QT Files or directories to open اشۋعا تىيىستى حۇجات ياكي باس مازمۇن [FILE1, FILE2,...] [حۇجات 1، حۇجات 2,...] Warning ەسكەرتۋ Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt سەستامانىڭ سىن بەلگىسى مانەر قول جەتكٸزبەدٸ. نۇ ماسەلەنى كەتىرىپ جاريالاۋ ٷشٸن ەكٸ سەبەپ بار: Peony is disabled to start ! حۇجات باسقارۋشٸسٸ مۇگەدەك بولىپ قالدى ! Peony Qt حۇجات باسقارۋشٸسٸ Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. اۆتور: ولان <lanyue @kylinos. cn> خې مەيگ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2020، KylinSoft جۇمساق دەتال جارنا شەكتى سەرىكتى شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit بارلٸق حۇجات باسقارۋشٸسٸ-qt تەرەزەنى تاقاۋ ۋا شەگنىپ شىعۋ Show items مۇشەلەردى كورسەتۋ Show folders حۇجات قىسقىشتاردى كورسەتۋ Show properties دارالقتى كورسەتۋ QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed ماجبۇر ٸشٸۋ جەڭىلىپ قالدى Error: %1 قاتەلىك بايقالدٸ: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندىق مالىمەت بۇرشاق قادامدىق تامامدالدٸ،اسباب ٴساتتٸ اشىق! Unmount failed تۇسٸرۋدەن جەڭىلىپ قالدى Unable to unmount it, you may need to close some programs, such as: GParted etc. ونى ٶشٸرگەلٸ بولماعانشا، بارٸ پٸروگٸراممالاردٸ جابۋعا دۇرٸس كەلەدى، ماسەلەن: GParted قاتارلىلار. Error: %1 Do you want to unmount forcely? قاتەلىك: %1 زورلىق مەنەن چۈشۈرمەكچىمۇ؟ Eject failed جاريالاۋ جەڭىلىپ قالدى Cancel كۇشىنەن قالدىرۋ Eject Anyway ايتەۋىر جاريالاۋ Data synchronization is complete and the device can be safely unplugged! ساندىق مالىمەت بۇرشاق قادامدىق تامامدالدٸ، اسبابٸن حاۋٸپسٸز ۇزىپ ەتكەلى بولادٸ! Unable to eject %1 %1 شٸعارۋعا بولمادى PeonyNotify File Manager حۇجات اكىمشى SortTypeMenu File Name 文件名称 Name ات-فاميليا Time Modified File Size حۇجات ۇلكەندىگى Original Path وڭ جول Path جول Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order تومەندەۋ جاعٸ Ascending Order ورلەۋ جاعٸ Use current sorting for all folders بارلٸق حۇجات قىسقشتار ٷشٸن كەزەكتەگى تۇرگە ايىرۋ تاسٸلدٸ قولدانۋ By %1 %1 تىن Newest to oldest ەڭ جاڭا ۋا ەڭ قادامى Oldest to newest ەڭ كونە ەڭ جاڭا Files from large to small ۇلكەنىرەك كىچىكگىچە حۇجاتتار Files from small to large كىچىكدىن چوڭغىچە حۇجات Use global sorting 使用全局排序 File Type حۇجات تيپى Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 تۇر Searching for files ... حۇجات ٸزدەپ جاتٸر ... selected%1%2 选中%1%2 selected %1 items %2 %1 تۇر %2 نى تالدادٸ %1 items selected %2 items %1 项 选中 %2 项 selected %1 items تالدانعانٸن %1 تۇر TabWidget Trash قوقسق ساندىعى Clear تازالاۋ Recover قالپىنا كەلتىرىلگەن Need to save changes to current space conditions? Not Save ساقتالمدى Save ساقتاۋ Location: ورنى: Save as Space Cancel كۇشىنەن قالدىرۋ Edit Conditiones Contains ٶز ىشىنە العان Not Contains FileName and FileContent Only FileName File smart tags Search Settings ٸزدەۋ تەڭشەۋلەرى After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. كورسەتكىش قۇرىلعاندا كەيىن، كەيىنكى رەت ٸزدەۋ بارىسىندا ٸزدەۋ اتالۋٸنٸ ٶز ىشىنە العان حۇجات مازمۇننىڭ ناتيجەسىنە يە بولعالٸ بولادٸ، نۇ بارىسىندا قالاعان ۋاقىتتا بەتتەن شەگنىپ شىعا الاسىز، ٴبٸز جالعاستى ارتى كورىنستە جاسامپازدىق قىزمەتنى بىتتى. Computer كومپيۋتەر Condition 条件 File Type حۇجات تيپى Modify time 修改时间 File Size حۇجات ۇلكەندىگى File Label حۇجات بەلگىسى Close Filter. 关闭筛选。 Filter سۇزۋ Select Path جول تالداۋ Warning ەسكەرتۋ Error قاتەلىك Opening such files is not currently supported نۇ تۇردەگى حۇجاتتاردى ٸشٸۋ كەزەكتە قولدامايدى. Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باس مازمۇن ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ماقۇلداۋ جوق! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name مى type تيپى modify time ۋاقىتتى وزگەرتۋ file size حۇجات ۇلكەندىگى all جالپىسى file folder حۇجات قىسقىش image راسىم video سىن text file تەكىسىت حۇجاتى audio ۇن others باسقالار Satisfy All Conditions wps file WPS حۇجاتى today بوگٸن this week نۇ اپتا this month نۇ ايدا- this year نۇ جىل yesterday كەشە last week الداعٸ اپتا last month الداعٸ اي last year وتكەن ﹣جىلى before last year file name and content حۇجات مى ۋا مازمۇنى file name حۇجات مى Modify Time ۋاقىتتى وزگەرتۋ File Name قولحات مى Condition Match Rule year ago 一年前 tiny(0-16K) كشكەنە(0-16K) small(16k-1M) كشكەنە(16k-1M) empty(0K) قۇرعاق(0K) medium(1M-128M) ورتاشا (1M-128M) big(128M-1G) ۇلكەن(128M-1G) large(1-4G) ۇلكەن(1-4G) great(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony پيون TopMenuBar Option تالداۋ Minimize تومەنگە تۇسىرۋ Close تىعنداۋ peony/translations/peony-qt/peony-qt_ky.ts0000664000175000017500000021117415154271106017766 0ustar fengfeng AboutDialog Dialog كۅزۅنۅك <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="QRICHTEXT" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Noto Sans CJK SC'; قات ۉلگۉسۉنۉن چوڭدۇعۇ :10pt; قات ۉلگۉسۉنۉن ووردۇعۇ :400; font-style:normal;" ><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; تەكىست:0px; قات ۉلگۉسۉ :11pt;" ><br /></p></body></html> TextLabel Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: تەيلۅۅ جانا قولدوعون جامااتتىق Peony پئون peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. ۅجۅت باشقارعۇۇچۇ ابونىتتاردىن ساامالىق ۅجۅتۉن باشقارۇۇعا جەرلىك بەرەتۇرعان گرافىكالىق جۇمشاق تەتىك . ال ىشتەتۉۉچۉلۅرگۅ دايىما ىشتەتىلەتۇرعان ۅجۅت ماشقۇلدانۇۇ قۇرباتى مەنەن قامدايت، مىسالى، ۅجۅت كۅرۉۉ ، ۅجۅت گۅچۉرۉش ، چاپتوو، قىيىش ، ۅچۉرۉۉ، ات ۅزگۅرتۉش ، ۅجۅت تانداش ، پراگرامما اچۇۇ، ۅجۅت ىزدۅۅ، ۅجۅت تۉرگۅ بۆلۉش، ۅجۅت كۅرۉپ باعۇۇ قاتارلۇۇلار. ابونىتتاردىن كۅرۉنمۅ بەتىندە تىكە بارۇۇ ، ۇدۇل بارۇۇ ساامالىق ۅجۅتۉن تىكە بارۇۇ ، ۇدۇل بارۇۇ باشقارىش ىڭعايلۇۇ بولوت . Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 باسماسى نومۇرۇ : %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window جاڭى كۅزۅنۅكتۅ اچۇۇ Open In New Tab جاڭى ۋقلادقادا اچۇۇ Rename اتىن ۅزگۅرتۉش Edit Color تۉس تۅپتۅش Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back قايت Go Forward العا ىلگەرلۅۅ Search 搜索 View Type كۅرۉۉ تۉرۉ Sort Type تۉرگۅ بۆلۉش تۉرۉ Option تانداش Operate Tips ماشقۇلدانۇۇ ەسكەرتمەسى Go Up ۉستۉنۅن سىندىرۇۇ Details 详情 &Copy گۅچۉرۉش (&C) Copy گۅچۉرۉش &Cut قىيىش Cut قىيىش &Select All باردىعىن تانداڭ Select All باردىعىن تانداڭ Deselect All باردىعىن تانداشتى بەكەر جاسوو ،اتقارۇۇ &Delete to trash ۅچۉرۉۉ شىپىرىندى ساندىققا Delete to trash شىپىرىندى چەلەك تاشلىۋېتىش Don't find any terminal, please install at least one terminal! تىرمىنال تابا الباساڭىز، از دەگەندە بىر تىرمىنال ورنوتۇڭ! Select All Item باردىق مۉچۅلۅردۉ تانداڭ Select تانداش Restore العاچىنا كەلتىرۉۉ Maximize چوڭويتۇش Select Done تۉگۅدۉ تانداڭ MoveTo جۅتكۅپ بەرۉۉ Icon View 图标视图 شارتتۇۇ بەلگىنى كۅرۉۉ List View تىزىمدىك گۅرۉنۉشۉ CopyTo گۅچۉرۉش Delete ۅچۉرۉۉ Select path جول تانداش Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize كىچىرەيتۉۉ Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close جابۇۇ Intel::NavigationSideBar Open In &New Window Open In &New كۅزۅنۅك Open In New &Tab جاڭى اچۇۇ > Tab Intel::TitleLabel Files ۅجۅت MainWindow File Manager ۅجۅت ادمئنىستراتور Undo ارعادان قالتىرىش idm:///新建智能空间 Redo قايرا جاسوو ،اتقارۇۇ warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇ قولدوبويت. Search ىزدۅۅ Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder جاڭى ۅجۅت قىپچىعىچ NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇ قولدوبويت. Tips ەسكەرتمە The device is in busy state, please perform this operation later. شايمان الدىراش ابالدا ەكەن ، سەل تۇرۇپ بۇل ماشقۇلدانۇۇنۇ اتقارماق قىلىڭ. This is an abnormal Udisk, please fix it or format it بۇل نورمالسىز Udisk ، وڭشوپ قويۇڭ كۅرۉنۉشتۅرۉ فورماتتاپ بەرىڭ This is an empty drive, please insert a Disc. بۇل كۅڭدۅي قوزعوتقۇچ ، دىسكاسىن قىستىرىڭ. Open In New Window جاڭى كۅزۅنۅكتۅ اچۇۇ Can not open %1, %2 %1, %2 نى اچقالى بولبودۇ Open In New Tab جاڭى ۋقلادقادا اچۇۇ Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... باشقارعۇۇچۇ قىستىرما قاعازدارى ... More tags... داعى ەلە كۅپ تەگى... NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow ۇرۇقساتتار ساقتوو Show Hidden جاشىرىن كۅرسۅتۉۉ Show File Extension ۅجۅت كەڭەيتمەسى كۅرسۅتۉۉ Show Create Time ۇباقىت قۇرۇشتۇ كۅرسۅتۉۉ Show Relative Time سالىشتۇرمالۇۇلۇق ۇباقىت كۅرسۅتۉۉ Forbid thumbnailing كىچىك كۅرۉنۉشۉن چەكتۅۅ جاسوو ،اتقارۇۇ Resident in Backend Backend دا وتۇرۇقتاشقان Parallel Operations پارالەل ماشقۇلدانۇۇ Set samba password سامبا سىر سۅزدۉ بەلگىلۅۅ Tips ەسكەرتمە The user already has a samba password, do you need to reset the samba password? ابونىتتىن سامبا جاشىرۇۇن نومۇرۇ بار، سامبا جاشىرۇۇن نومۇرۇ نى قايرا بەلگىلۅۅ كەرەكبى؟ Samba set user password سامبا ىشتەتۉۉچۉ سىر سۅزدۉ بەلگىىلەيت Samba password: سامبا پارول : Warning ەسكەرتۉۉ Samba set password failed, Please re-enter! Samba كۅرسۅتۉلگۅن جاشىرۇۇن نومۇر جەڭىلۉۉ بولدۇ ، قايرا كىرگىزىڭ! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! بۅلۉشۉۉ سەپتەمەسى تەيلۅۅسۉنۅن مۇستەسنا، بۅلۉشۉۉ ماشعۇلاتى ۇلانىپ اتقان كۅرۉنۉشتۅرۉ جوقتۇعۇن البەتتە.، كۅرۉنۉشتۅرۉ بۅلۉشۉۉ قايرا كۅرسۅتۉڭ ! Open each folder in a new window ار بىر بىر ۅجۅت قىپچىعىچتى جاڭى كۅزۅنۅكتۅ اچۇۇ Plugin manager Settings قىستىرما باشقارعىچ تەڭشەگى Show Network توردۇ كۅرسۅتۉۉ Connect to Server تەيلەمەگە ۇلوو Help جەرلىك About جۅنۉندۅ OperationMenuEditWidget Edit تۅپتۅۅچۉ copy گۅچۉرۉش paste چاپتوو cut قىيىش trash شىپىرىندى Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites جاقشى كۉبۅلۅر. Peony::Intel::SideBarFileSystemItem Computer ەسەپتەگۉچ 文件系统 System Disk سەستىما دىسكاسى Peony::Intel::SideBarMenu Properties قاسىيەتىن Delete Symbolic سىمۋولىكا ۅچۉرۉۉ Unmount ئچىپ جىبەرۉۉ Eject ۅندۉرۉش format فورمات Peony::Intel::SideBarPersonalItem Personal ۅجۅت باشقارعۇۇچۇ ۇقتۇرۇشتۇ Peony::Intel::SideBarSeparatorItem (No Sub Directory) (بۅلۉمچۅ تىزىمدىك) Peony::Intel::SideBarUserDiskItem User Disk ىشتەتۉۉچۉ دىسكاسى Peony::Intel::TabletSideBarFactory Intel Side Bar ىنتەل يانبالداقى Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. سىز ىراس ەلە بۇل ۅجۅتتۅرۉن ۅچۉرۅسۉزبۉ؟ ۅچۉرۉۉنۉ باشتاعان امان، ۅچۉرۉلگەن ۅجۅتتۅر تۉبۅلۉك العاچىنا كەلتىرىلبەيت. Delete ۅچۉرۉۉ Cancel ارعادان قالتىرىش PeonyApplication Peony-Qt 文件管理器 peony-qt ۅجۅت باشقارعۇۇچۇ-QT Files or directories to open اچىشقا اقىلۇۇ ۅجۅت كۅرۉنۉشتۅرۉ تىزىمدىك [FILE1, FILE2,...] [ۅجۅت 1، ۅجۅت 2,...] Warning ەسكەرتۉۉ Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt سەستىمانىن سىن بەلگىسى ستئلى ەە بولوالبادى. بۇل ماسەلەنى كەلىترىپ ۅندۉرۉش ۉچۉن ەكى سەبەپ بار: Peony is disabled to start ! ۅجۅت باشقارعۇۇچۇ مايىپتار بولۇپ قالدى ! Peony Qt ۅجۅت باشقارعۇۇچۇ Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. اپتور: ولان <lanyue @kylinos. cn> ح مەي <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2020، KylinSoft جۇمشاق تەتىك پاي چەكتۉۉ شەركەتى چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit باردىق ۅجۅت باشقارعۇۇچۇ-qt كۅزۅنۅگۉن بەكىتىش جانا جانىپ سىندىرۇۇ Show items مۉچۅلۅردۉ كۅرسۅتۉۉ Show folders ۅجۅت قىپچىعىچتاردى كۅرسۅتۉۉ Show properties قاسىيەتتى كۅرسۅتۉۉ QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed زوردۇق مەنەن اچۇۇ جەڭىلۉۉ بولدۇ Error: %1 قاتاالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندۇۇ بايانداما شاي قادامدۇۇ بۉتۉردۉ دىققات،شايمان جەڭىشتۉۉ اچىق.! Unmount failed تۉشۉرۉدۅن جەڭىلۉۉ بولدۇ Unable to unmount it, you may need to close some programs, such as: GParted etc. انى ۅچۉرگۅلۉ بولبوعوندۇقتان، گەەبىر پراگراممالاردى تاقووعو تۇۇرا گەلەت ، مىسالى: GParted قاتارلۇۇلار. Error: %1 Do you want to unmount forcely? قاتاالىق : %1 زوردۇق مەنەن چۈشۈرمەكچىمۇ؟ Eject failed ۅندۉرۉش جەڭىلۉۉ بولدۇ Cancel ارعادان قالتىرىش Eject Anyway ئىشقىلىپ ۅندۉرۉش Data synchronization is complete and the device can be safely unplugged! ساندۇۇ بايانداما شاي قادامدۇۇ بۉتۉردۉ دىققات، اسپاپتى قووپسۇز ۉزۉپ جىبەرگەلى بولوت ! Unable to eject %1 %1 ۅندۉرۉشكۅ بولبودۇ PeonyNotify File Manager ۅجۅت ادمئنىستراتور SortTypeMenu File Name 文件名称 Name ناامى Time Modified File Size ۅجۅت چوڭدۇعۇ Original Path العاچى جول Path جول Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order تۅمۅندۅش تارتىبى Ascending Order جوعورۇلو تارتىبى Use current sorting for all folders باردىق ۅجۅت قلىپتەر ۉچۉن گەزەكتەكى تۉرگۅ بۆلۉش ىڭعايىن قولدونۇش By %1 %1 تىن Newest to oldest ەڭ جاڭى جانا ەڭ قادامى Oldest to newest ەڭ بايىرقى ەڭ جاڭى Files from large to small چوڭۇرااق. كىچىكگىچە ۅجۅتتۅر Files from small to large كىچىكدىن چوڭغىچە ۅجۅت Use global sorting 使用全局排序 File Type ۅجۅت تۉرۉ Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 تۉر Searching for files ... ۅجۅت ىزدەپ جاتات ... selected%1%2 选中%1%2 selected %1 items %2 %1 تۉر %2 نى تاندادى %1 items selected %2 items %1 项 选中 %2 项 selected %1 items تاندالعانى %1 تۉر TabWidget Trash شىپىرىندى ساندىعى Clear تازالوو Recover العاچىنا كەلتىرۉۉ Need to save changes to current space conditions? Not Save ساقتالبادى Save ساقتوو Location: وردۇ: Save as Space Cancel ارعادان قالتىرىش Edit Conditiones Contains ۅز ىچىنە العان Not Contains FileName and FileContent Only FileName File smart tags Search Settings ىزدۅۅ تەڭشەكتەرى After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. بەلگىلەنگن نارق قۇرۇلعاندان كىيىن، كىيىنكى ىرەت ىزدۅۅ بارىشندا ىزدۅۅ تەرمىنولوگىيا ۅز ىچىنە العان ۅجۅت مازمۇۇنۇنۇن ناتىيجاسىنا ەە بولعولۇ بولوت ، بۇل ورتوسۇندا قاالاعان ۇباقىتتا بەتتىن جانىپ چىقالايسىز، بىز جالعاشتۇۇ ارقا گۅرۉنۉشتۅ جاراتۇۇ قىزماتتى بۉتتۉ.. Computer ەسەپتەگۉچ Condition 条件 File Type ۅجۅت تۉرۉ Modify time 修改时间 File Size ۅجۅت چوڭدۇعۇ File Label ۅجۅت ەنى ، تامعاسى Close Filter. 关闭筛选。 Filter سۉزۉش ،قالپىش Select Path جول تانداش Warning ەسكەرتۉۉ Error قاتاالىق Opening such files is not currently supported بۇل تۉردۅكۉ ۅجۅتتۅرۉن اچۇۇ گەزەكتە قولدوبويت. Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! تىزىمدىك اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇرۇقسات جوق! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name ناامى type تۉرۉ modify time ۇباقتىن ۅزگۅرتۉش file size ۅجۅت چوڭدۇعۇ all باردىعى file folder ۅجۅت قىپچىعىچ image سۉرۅت video ايىپ text file تەكىست ۅجۅتۉۉ audio دوبۇش others باشقالار Satisfy All Conditions wps file WPS ۅجۅتۉۉ today بۉگۉن this week بۇل اپتا this month بۇل ايدا this year بۇل جىل yesterday كەچە last week الدىنقى اپتا last month الدىنقى اي last year ۅتكۅن جىلى before last year file name and content ۅجۅت ناامى جانا مازمۇنۇ file name ۅجۅت ناامى Modify Time ۇباقتىن ۅزگۅرتۉش File Name ۅجۅت ناامى Condition Match Rule year ago 一年前 tiny(0-16K) كىچىك (0-16K) small(16k-1M) كىچىك (16k-1M) empty(0K) كۅڭدۅي(0K) medium(1M-128M) ورتوچو (1M-128M) big(128M-1G) چوڭ(128M-1G) large(1-4G) چوڭ(1-4G) great(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony پئون TopMenuBar Option تانداش Minimize كىچىرەيتۉۉ Close جابۇۇ peony/translations/peony-qt/peony-qt_es.ts0000664000175000017500000017305415154271106017756 0ustar fengfeng AboutDialog Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: Peony peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window Open In New Tab Rename Edit Color Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back Go Forward Search 搜索 View Type Sort Type Option 选项 Operate Tips Go Up &Copy Copy &Cut Cut &Select All Select All Deselect All &Delete to trash Delete to trash Don't find any terminal, please install at least one terminal! Select All Item Select Restore 还原 Maximize 最大化 Select Done MoveTo Icon View List View CopyTo Delete 删除标记 Select path 选择路径 Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize 最小化 Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close 关闭 Intel::NavigationSideBar Open In &New Window 在新窗口中打开(&N) Open In New &Tab 在新标签页中打开(&T) Intel::TitleLabel Files MainWindow File Manager 文件管理器 Undo idm:///新建智能空间 Redo warn This operation is not supported. Search 搜索 Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn This operation is not supported. Tips The device is in busy state, please perform this operation later. This is an abnormal Udisk, please fix it or format it This is an empty drive, please insert a Disc. Open In New Window Can not open %1, %2 Open In New Tab Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... More tags... NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow Show Hidden Show File Extension Show Create Time Show Relative Time Forbid thumbnailing Resident in Backend Parallel Operations Set samba password Tips The user already has a samba password, do you need to reset the samba password? Samba set user password Samba password: Warning Samba set password failed, Please re-enter! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Open each folder in a new window Plugin manager Settings Show Network Connect to Server Help About OperationMenuEditWidget Edit copy paste cut trash Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites Peony::Intel::SideBarFileSystemItem Computer 计算机 文件系统 System Disk Peony::Intel::SideBarMenu Properties Delete Symbolic Unmount Eject format Peony::Intel::SideBarPersonalItem Personal Peony::Intel::SideBarSeparatorItem (No Sub Directory) Peony::Intel::SideBarUserDiskItem User Disk Peony::Intel::TabletSideBarFactory Intel Side Bar Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Delete 删除标记 Cancel PeonyApplication Peony-Qt 文件管理器 peony-qt Files or directories to open [FILE1, FILE2,...] Warning Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony is disabled to start ! Peony Qt 文件管理器 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit Show items Show folders Show properties QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Unable to unmount it, you may need to close some programs, such as: GParted etc. Error: %1 Do you want to unmount forcely? Eject failed Cancel Eject Anyway Data synchronization is complete and the device can be safely unplugged! Unable to eject %1 PeonyNotify File Manager 文件管理器 SortTypeMenu Time Modified File Size Original Path Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large File Type Name Modified Data 修改日期 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items Searching for files ... selected%1%2 选中%1%2 selected %1 items %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items TabWidget Trash Clear Recover Need to save changes to current space conditions? Not Save Save Location: Save as Space Cancel Edit Conditiones Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer 计算机 File Type File Size File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path Warning Error 错误 Opening such files is not currently supported Open failed Open directory failed, you have no permission! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 Please input kay words... 请输入关键词... name type modify time file size file folder image video text file audio others all wps file today this week this month this year yesterday last week last month last year before last year tiny(0-16K) small(16k-1M) empty(0K) medium(1M-128M) 中等(1M-100M) {1M?} {128M?} big(128M-1G) 很大(100M-1G) {128M?} {1G?} large(1-4G) great(>4G) file name and content file name Modify Time File Name Condition Match Rule medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony TopMenuBar Option 选项 Minimize 最小化 Close 关闭 peony/translations/peony-qt/peony-qt_de.ts0000664000175000017500000020211215154271106017723 0ustar fengfeng AboutDialog Dialog Dialogfeld <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li { white-space: pre-wrap; } </style> </head> <body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"> <br /> </p> </body> </html> TextLabel TextBeschriftung Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: Service & Support: Peony Pfingstrose peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Peony ist eine grafische Software, die Benutzern hilft, Systemdateien zu verwalten. Es bietet allgemeine Dateioperationsfunktionen für Benutzer, wie z. B. Dateianzeige, Kopieren, Einfügen, Ausschneiden, Löschen, Umbenennen, Dateiauswahl, Anwendungsöffnung, Dateisuche, Dateisortierung, Dateivorschau usw. Es ist bequem für Benutzer, Systemdateien intuitiv auf der Benutzeroberfläche zu verwalten. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 Versionsnummer: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window In neuem Fenster öffnen Open In New Tab In neuem Tab öffnen Rename Umbenennen Edit Color Farbe bearbeiten Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back Zurück Go Forward Vorwärts gehen Search 搜索 View Type Typ der Ansicht Sort Type Art der Sortierung Option Option Operate Tips Tipps zur Bedienung Go Up Hinaufgehen Details Details &Copy &Kopieren Copy Kopieren &Cut & Schneiden Cut Schneiden &Select All &Alles auswählen Select All Alles auswählen Deselect All Auswahl aufheben &Delete to trash &In den Papierkorb löschen Delete to trash In den Papierkorb löschen Don't find any terminal, please install at least one terminal! Sie finden kein Terminal, bitte installieren Sie mindestens ein Terminal! Select All Item Alle Elemente auswählen Select Auswählen Restore Wiederherstellen Maximize Maximieren Select Done Wählen Sie Fertig aus MoveTo Verschieben nach Icon View List View CopyTo Kopieren in Delete Löschen Select path Pfad auswählen Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize Minimieren Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close Schließen Intel::NavigationSideBar Open In &New Window Öffnen in & Neues Fenster Open In New &Tab In Neu öffnen &Tab Intel::TitleLabel Files Dateien MainWindow File Manager Dateimanager Undo Aufmachen idm:///新建智能空间 Redo Noch einmal machen warn warnen This operation is not supported. Dieser Vorgang wird nicht unterstützt. Search Suchen Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder Neuer Ordner NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn warnen This operation is not supported. Dieser Vorgang wird nicht unterstützt. Tips Tipps The device is in busy state, please perform this operation later. Das Gerät ist ausgelastet, bitte führen Sie diesen Vorgang später durch. This is an abnormal Udisk, please fix it or format it Dies ist eine abnormale Udisk, bitte beheben Sie sie oder formatieren Sie sie This is an empty drive, please insert a Disc. Dies ist ein leeres Laufwerk, bitte legen Sie eine Disc ein. Open In New Window In neuem Fenster öffnen Can not open %1, %2 %1, %2 kann nicht geöffnet werden Open In New Tab In neuem Tab öffnen Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... Manager-Tags... More tags... Mehr Tags... NavigationTabBar Computer 计算机 Search "%1" in "%2" Suchen nach "%1" in "%2" OperationMenu Advance Search 高级搜索 Keep Allow Zulassen beibehalten Show Hidden Ausgeblendet anzeigen Show File Extension Dateierweiterung anzeigen Show Create Time Erstellungszeit anzeigen Show Relative Time Forbid thumbnailing Thumbnails verbieten Resident in Backend Resident im Backend Parallel Operations Parallele Operationen Set samba password Samba-Passwort festlegen Tips Tipps The user already has a samba password, do you need to reset the samba password? Der Benutzer hat bereits ein Samba-Passwort, müssen Sie das Samba-Passwort zurücksetzen? Samba set user password Samba-Benutzerkennwort festlegen Samba password: Samba-Passwort: Warning Warnung Samba set password failed, Please re-enter! Samba-Passwort fehlgeschlagen, Bitte erneut eingeben! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Ausnahme für den freigegebenen Konfigurationsdienst, bitte bestätigen Sie, ob ein laufender gemeinsamer Konfigurationsvorgang vorhanden ist, oder setzen Sie die Freigabe zurück! Open each folder in a new window Öffnen Sie jeden Ordner in einem neuen Fenster Plugin manager Settings Plugin-Manager-Einstellungen Show Network Connect to Server Help Hilfe About Über OperationMenuEditWidget Edit Redigieren copy kopieren paste Kleister cut schneiden trash Müll Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage Cloud-Speicher CloudFile Cloud-Datei Peony::Intel::SideBarFavoriteItem Favorites Favoriten Peony::Intel::SideBarFileSystemItem Computer Computer 文件系统 文件系统 System Disk Systemdatenträger Peony::Intel::SideBarMenu Properties Eigenschaften Delete Symbolic Symbolisch löschen Unmount Aushängen Eject Ausstoßen format Format Peony::Intel::SideBarPersonalItem Personal Persönlich Peony::Intel::SideBarSeparatorItem (No Sub Directory) (Kein Unterverzeichnis) Peony::Intel::SideBarUserDiskItem User Disk Benutzer-Datenträger Peony::Intel::TabletSideBarFactory Intel Side Bar Intel Seitenleiste Peony::SearchWidget Search Suchen Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Sind Sie sicher, dass Sie diese Dateien löschen möchten? Sobald Sie einen Löschvorgang gestartet haben, werden die gelöschten Dateien nie wieder hergestellt. Delete Löschen Cancel Abbrechen PeonyApplication Peony-Qt 文件管理器 peony-qt Pfingstrose-QT Files or directories to open Zu öffnende Dateien oder Verzeichnisse [FILE1, FILE2,...] [DATEI1, DATEI2,...] Warning Warnung Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt kann das Icon-Theme des Systems nicht abrufen. Es gibt 2 Gründe, die zu diesem Problem führen können: 1. Peony-Qt könnte als root laufen, d.h. Sie haben die höhere Berechtigung und können einige Dinge tun, die normalerweise verboten sind. Sie sollten jedoch lernen, dass, wenn Sie sich in einem Stammverzeichnis befinden, das virtuelle Dateisystem einige Funktionen verliert, wie z. B. dass Sie "Arbeitsplatz" nicht verwenden können, das Thema und die Symbole könnten auch schief gehen. Daher wird das Ausführen von peony-qt in einem Stammverzeichnis nicht empfohlen. 2. Sie verwenden ein Nicht-QT-Theme für Ihr System, aber Sie haben das Plattform-Theme-Plugin für die QT-Anwendungen nicht installiert. Wenn Sie gtk-theme verwenden, versuchen Sie, das Paket qt5-gtk2-platformtheme zu installieren, um dieses Problem zu beheben. Peony is disabled to start ! Peony Qt Pfingstrose Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Verfasser: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit Schließen Sie alle peony-qt-Fenster und beenden Sie das Programm Show items Artikel anzeigen Show folders Ordner anzeigen Show properties Eigenschaften anzeigen QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed Aufheben der Bereitstellung erzwingen fehlgeschlagen Error: %1 Fehler: %1 Data synchronization is complete,the device has been unmount successfully! Die Datensynchronisierung ist abgeschlossen, das Gerät wurde erfolgreich ausgemountet! Unmount failed Unmount fehlgeschlagen Unable to unmount it, you may need to close some programs, such as: GParted etc. Da es nicht möglich ist, es auszuhängen, müssen Sie möglicherweise einige Programme schließen, wie z.B.: GParted usw. Error: %1 Do you want to unmount forcely? Fehler: %1 Willst du gewaltsam absteigen? Eject failed Auswurf fehlgeschlagen Cancel Abbrechen Eject Anyway Trotzdem auswerfen Data synchronization is complete and the device can be safely unplugged! Die Datensynchronisation ist abgeschlossen und das Gerät kann sicher vom Stromnetz getrennt werden! Unable to eject %1 %1 kann nicht ausgeworfen werden PeonyNotify PfingstroseNotify File Manager Dateimanager SortTypeMenu File Name Dateiname Name Time Modified File Size Dateigröße Original Path Ursprünglicher Pfad Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large Use global sorting Globale Sortierung verwenden File Type Dateityp Modified Date Änderungsdatum Modified Data 修改日期 Ascending Aufsteigend Descending Absteigend TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items %1 Artikel Searching for files ... Suche nach Dateien ... selected%1%2 选中%1%2 selected %1 items %2 Ausgewählte %1 Artikel %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items Ausgewählte %1 Elemente TabWidget Trash Müll Clear Klar Recover Genesen Need to save changes to current space conditions? Not Save Save Location: Save as Space Cancel Abbrechen Edit Conditiones Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer Computer File Type Dateityp File Size Dateigröße File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path Pfad auswählen Warning Warnung Error 错误 Opening such files is not currently supported Das Öffnen solcher Dateien wird derzeit nicht unterstützt Open failed Öffnen fehlgeschlagen Open directory failed, you have no permission! Open Directory fehlgeschlagen, Sie haben keine Berechtigung! Close advance search. 关闭高级搜索。 Search Suchen Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is ist Please input key words... Bitte geben Sie Stichworte ein... Please input kay words... 请输入关键词... contains enthält name Name type Art modify time Zeit ändern file size Dateigröße all alle file folder Ordner image Bild video Video text file Textdatei audio Audio others andere wps file WPS-Datei today Heute this week Diese Woche this month Diesen Monat this year dieses Jahr yesterday last week last month last year before last year file name and content file name Modify Time File Name Dateiname Condition Match Rule year ago vor einem Jahr tiny(0-16K) winzig (0-16K) small(16k-1M) klein (16k-1M) empty(0K) leer(0K) medium(1M-128M) mittel (1M-128M) big(128M-1G) groß (128M-1G) large(1-4G) groß (1-4G) great(>4G) großartig (>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony Pfingstrose TopMenuBar Option Option Minimize Minimieren Close Schließen peony/translations/peony-qt/peony-qt_kk_KZ.ts0000664000175000017500000020773115154271106020360 0ustar fengfeng AboutDialog Dialog Диалог <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li { ақ кеңістік: алдын ала орау; } </style> </head> <body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"> <br /> </p> </body> </html> TextLabel تېكىست بەلگىسى Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: Қызмет және қолдау: Peony Пеони peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Peony — пайдаланушыларға жүйелік файлдарды басқаруға көмектесетін графикалық бағдарламалық жасақтама. Ол пайдаланушылар үшін ортақ файлдық операция функцияларын қамтамасыз етеді, мысалы, файлды көру, файлды көшіру, қою, қиып алу, жою, атын өзгерту, файл таңдау, қолданба ашу, файлды іздеу, файлды сұрыптау, файлды алдын ала қарау және т.б. Пайдаланушыларға жүйелік файлдарды интерфейсте интуитивті басқару ыңғайлы. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 Нұсқа нөмірі:% 1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window Жаңа терезеде ашу Open In New Tab Жаңа қойындыда ашу Rename Атын өзгерту Edit Color Түсті өңдеу Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back Қайтып бар Go Forward Алға жылжу Search 搜索 View Type Көрініс түрі Sort Type Сұрыптау түрі Option Опция Operate Tips Кеңестерді пайдалану Go Up Жоғарыға шығу Details Егжей- тегжей &Copy & Көшіру Copy Көшіру &Cut Қиып алу Cut Қиып алу &Select All Барлығын таңдау Select All Барлығын таңдау Deselect All Барлығын басу &Delete to trash Өшірілгенге дейін өшіру Delete to trash Өшірілгенге дейін өшіру Don't find any terminal, please install at least one terminal! Ешбір терминалды таппаңыз, кем дегенде бір терминал орнатуыңызды сұраймыз! Select All Item Барлық элементті таңдау Select Таңдау Restore Қалпына келтіру Maximize Барынша көбейту Select Done Орындалды тармағын таңдау MoveTo Жылжыту Icon View List View CopyTo Көшіріп алу Delete Өшіру Select path Жолды таңдау Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize Кішірейту Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close Жабу Intel::NavigationSideBar Open In &New Window Жаңа терезені ашу Open In New &Tab Жаңа > қойындысын ашу Intel::TitleLabel Files Файлдар MainWindow File Manager Файл менеджері Undo Болдырмау idm:///新建智能空间 Redo Редо warn Ескерту This operation is not supported. Бұл операцияға қолдау көрсетілмеген. Search Іздеу Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder Жаңа қапшық NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn Ескерту This operation is not supported. Бұл операцияға қолдау көрсетілмеген. Tips Кеңестер The device is in busy state, please perform this operation later. Құрылғы бос емес күйде, бұл операцияны кейінірек орындауыңызды сұраймыз. This is an abnormal Udisk, please fix it or format it Бұл аномальды Удиск, оны түзетіңіз немесе пішімдеңіз This is an empty drive, please insert a Disc. Бұл бос диск, диск кірістіруіңізді сұраймыз. Open In New Window Жаңа терезеде ашу Can not open %1, %2 % 1, % 2 ашылмады Open In New Tab Жаңа қойындыда ашу Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... Менеджер тегтері... More tags... Қосымша тегтер... NavigationTabBar Computer 计算机 Search "%1" in "%2" "% 1" дегенді "% 2" дегенде іздеу OperationMenu Advance Search 高级搜索 Keep Allow Рұқсатты сақтау Show Hidden Жасырын көрсету Show File Extension Файл кеңейтімі көрсетілсін Show Create Time Уақыт жасауды көрсету Show Relative Time Forbid thumbnailing Нобайлауға тыйым салу Resident in Backend Backend тұрғыны Parallel Operations Параллель операциялар Set samba password Samba құпия сөзін орнату Tips Кеңестер The user already has a samba password, do you need to reset the samba password? Пайдаланушыда әлдеқашан samba құпия сөзі бар, samba құпия сөзін қалпына келтіру керек пе? Samba set user password Samba пайдаланушы құпия сөзін орнатты Samba password: Samba паролі: Warning Ескерту Samba set password failed, Please re-enter! Samba құпиясөзі жаңылысы, Қайта енгізуіңізді сұраймын! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Ортақ конфигурация қызметінен ерекшелік, ортақ конфигурация операциясы жалғасып жатқанын растаңыз немесе үлесті қалпына келтіруіңізді сұраймыз! Open each folder in a new window Әр қалтаны жаңа терезеде ашу Plugin manager Settings Плагин модулін реттеуші параметрлері Show Network Connect to Server Help Анықтама About Шамамен OperationMenuEditWidget Edit Өңдеу copy көшіру paste қою cut қиып алу trash себет Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudStorage CloudFile CloudFile Peony::Intel::SideBarFavoriteItem Favorites Таңдаулылар Peony::Intel::SideBarFileSystemItem Computer Компьютер 文件系统 文件系统 System Disk Жүйе дискісі Peony::Intel::SideBarMenu Properties Сипаттары Delete Symbolic Символдық мәнді өшіру Unmount Еңсерілмеу Eject Эжек format пішімі Peony::Intel::SideBarPersonalItem Personal Жеке Peony::Intel::SideBarSeparatorItem (No Sub Directory) (Ішкі каталог жоқ) Peony::Intel::SideBarUserDiskItem User Disk Пайдаланушы дискісі Peony::Intel::TabletSideBarFactory Intel Side Bar Intel Side тақтасы Peony::SearchWidget Search Іздеу Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Осы файлдарды жойғыңыз келетініне сенімдісіз бе? Жоюды бастағаннан кейін жойған файлдар ешқашан қалпына келтірілмеуі тиіс. Delete Өшіру Cancel Болдырмау PeonyApplication Peony-Qt 文件管理器 peony-qt | | | | | | | | | | | | Files or directories to open Ашылатын файлдар немесе каталогтар [FILE1, FILE2,...] [FILE1, FILE2,...] Warning Ескерту Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt жүйенің белгіше тақырыбын ала алмайды. Бұл проблемаға әкелуі мүмкін 2 себеп бар: 1. Peony-Qt түбір ретінде жұмыс істеуі мүмкін, демек, сізде жоғары рұқсат бар және әдетте тыйым салынған кейбір әрекеттерді жасай аласыз. Бірақ, егер сіз түбірде болсаңыз, виртуалды файл жүйесі «Менің компьютерім» дегенді пайдалана алмайтындай кейбір ерліктерін жоғалтатынын білуіңіз керек, тақырып пен белгішелер де қате болуы мүмкін. Сонымен, түбірдегі пеони-qt жүгіру ұсынылмайды. 2. Жүйеңізге арналған Qt емес тақырыпты пайдаланып жатырсыз, бірақ qt қосымшалары үшін платформа тақырыбының плагинін орнатпадыңыз. Егер gtk-тақырыпты пайдаланып жатсаңыз, осы мәселені шешу үшін Qt5-gtk2-платформалық пакетін орнатып көріңіз. Peony is disabled to start ! Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Авторы: Юэ Лан <lanyue@kylinos.cn> Мейхун Хэ <hemeihong@kylinos.cn> Авторлық құқық (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit Барлық peony-qt терезелерді жабу және шығу Show items Элементтерді көрсету Show folders Қалталарды көрсету Show properties Сипаттарды көрсету QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed Күшін жою жаңылысы Error: %1 Қате:% 1 Data synchronization is complete,the device has been unmount successfully! Деректерді синхрондау аяқталды, құрылғы сәтті өтті! Unmount failed Ð Ð°Ñ Ð1/2аÐ1/2 Unable to unmount it, you may need to close some programs, such as: GParted etc. Оны болдырмау мүмкін емес, кейбір бағдарламаларды жабу қажет болуы мүмкін, мысалы: GParted және т.б. Error: %1 Do you want to unmount forcely? Қате:% 1 Күшпен болдырмауды қалайсыз ба? Eject failed Шығарылу жаңылысы Cancel Болдырмау Eject Anyway Сонда да шығарылсын Data synchronization is complete and the device can be safely unplugged! Деректерді синхрондау аяқталды және құрылғы қауіпсіз ажыратылуы мүмкін! Unable to eject %1 % 1 шығарылмады PeonyNotify PeonyNotify File Manager Файл менеджері SortTypeMenu File Name Файл атауы Name Time Modified File Size Файл өлшемі Original Path Бастапқы жол Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large Use global sorting Ғаламдық сұрыптауды пайдалану File Type Файл түрі Modified Date Өзгертілген күн Modified Data 修改日期 Ascending Көтерілу Descending Кему TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items % 1 элементтер Searching for files ... Файлдарды іздеу... selected%1%2 选中%1%2 selected %1 items %2 % 1 элементі таңдалған% 2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items % 1 элементі таңдалған TabWidget Trash Себет Clear Тазалау Recover Қалпына келтіру Need to save changes to current space conditions? Not Save Save Location: Save as Space Cancel Болдырмау Edit Conditiones Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer Компьютер File Type Файл түрі File Size Файл өлшемі File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path Жолды таңдау Warning Ескерту Error 错误 Opening such files is not currently supported Мұндай файлдарды ашуға қазіргі уақытта қолдау көрсетілмейді Open failed Ашу жаңылысы Open directory failed, you have no permission! Каталогты ашу жаңылысы, рұқсатыңыз жоқ! Close advance search. 关闭高级搜索。 Search Іздеу Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is i Please input key words... Негізгі сөздерді енгізуіңізді сұраймын... Please input kay words... 请输入关键词... contains құрамында name атауы type түрі modify time уақытты өзгерту file size файл өлшемі all барлығы file folder файл қалтасы image кескіні video бейне text file мәтін файлы audio дыбыс others басқалары wps file wps файлы today бүгін this week осы аптада this month осы айда this year осы жылы yesterday last week last month last year before last year file name and content file name Modify Time File Name Файл атауы Condition Match Rule year ago жыл бұрын tiny(0-16K) қаңылтыр(0-16К) small(16k-1M) кіші(16к-1М) empty(0K) бос( 0K) medium(1M-128M) орташа(1М-128М) big(128M-1G) үлкен(128М-1Г) large(1-4G) үлкен(1-4G) great(>4G) great(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony Пеони TopMenuBar Option Опция Minimize Кішірейту Close Жабу peony/translations/peony-qt/peony-qt_ug_CN.ts0000664000175000017500000021277415154271106020345 0ustar fengfeng AboutDialog Dialog ۋاقىت وزگەرتۋ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC“//W3C//DTD HTML 4.0//EN”http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name=“qrichtext”content=“1”/><style type=“text/css”> p、 li{قۇرعاق:الدىن تۇسىرۋ;} </style></head><body style=“font-family:'Noto Sans CJK SC';font-size:10pt;font-كەڭدىگى:400;font-style:نورمال;”> <p style=“-qtابزاس تيپى:قۇرعاق;شاراپات جان ارالققا شوقى بولەك:0px;شاراپات جاق ارالققا استٸ بولەك:0px,سول شاراپات جاق ارالققا0px;وڭ شاراپات جان ارالققا0px;-qtپارشا تارايتۋ كولەمى :0;تەكىسىت تارايتۋ كولەمى :0px;ٴارىپ ۇلكەن كشىلگى:11pt;”><br/></p></body></html> TextLabel تەكىسىت بەلگىسى Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: قىزىمەت ۋا قولداۋ كوللېكتىپى: Peony حۇجات باسقارۋشٸسٸ peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Peony بولسا بٸر ٴتۇر قاريدارلاردىڭ حۇجات باسقارۋ سەستاماسىعا جاردەم بەرەتٸن گرافيىك جۇمساق دەتال. ول ٸستەتۋشٸلەردٸ كوپ ولچرايدىغان حۇجات جوبالاۋ رولدارٸ مەنەن قامدالادٸ، ماسەلەن، حۇجات كورۋ، حۇجات نۇسٴتۇراش، شاپتاۋ، كەسۋ، ٴوشىرۋ، قاتە دىمقىل بەرۋ، حۇجات تالداۋ، جيۋ ٸشٸۋ، حۇجات ٸزدەۋ، حۇجاتلەرنى رەتتەۋ، حۇجاتلەرنى الدىن كورۋ قاتارلىلار ٸستەتۋشٸلەردٸڭ كورىنبە بەتتە بىرباستا قالدا حۇجات باسقارۋ سەستاماسىعا قولايلىق جاراتىپ بەرەدٸ. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 باسىلىم نومەرى:%1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window جاڭا تەرەزەدە اشىلۋ Open In New Tab جاڭا بەلگى بەتتە اشىلۋ Rename قاتە ات فاميليا ەتۋ Edit Color رەڭ مونتاژلىق Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back قايتۋ Go Forward الدىنا ماڭ Search 搜索 View Type كورىنۋ تيپى Sort Type رەتتەلگەن تيپ Option تالدانبا Operate Tips جوبالاۋ ەسكەرتپەسٸ Go Up ٷستٸنەن قاراپ Details 详情 &Copy كوشىرۋ Copy كوشىرۋ &Cut & كەسۋ Cut كەسۋ &Select All ٴبارىن تالداۋ(&S) Select All ٴبارىن تالدا Deselect All تاڭداۋدى بوس ەتۋ &Delete to trash & قوقسىق ساندىعىنا تاستاۋ Delete to trash قوقسىق ساندىعىنا تاستاۋ Don't find any terminal, please install at least one terminal! ەشقانداي سوڭعٸ ۇشٸ تاباالمادٸق، از دەگەندە بٸر سوڭعٸ ۇشٸ تۇسىرىڭىز! Select All Item بارلٸق توردى تالدا Select تالداۋ Restore قالپىنا كەلتىرىلگەن Maximize ەڭ ۇلكەن شەككە Select Done تالداپ اقىرلاسىتر MoveTo جوتكەپ بەرۋ Icon View 图标视图 پىشىن كورىنۋى List View تٸزٸمدٸك كورىنۋى CopyTo عا كوشىرۋ Delete ٴوشىرۋ Select path جول تالداۋ Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize كىشرەيتۋ Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close تىعنداۋ Intel::NavigationSideBar Open In &New Window جاڭا تەرەزەدە ٸشٸۋ (&N) Open In New &Tab جاڭا تالداۋ كارتاسىندا ٸشٸۋ (&T) Intel::TitleLabel Files حۇجاتتار MainWindow File Manager حۇجات باسقارۋشى Undo ٸشٸۋ idm:///新建智能空间 Redo قاتە-قاتە warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋدى قولدامايدى. Search ٸزدەۋ Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder جاڭا حۇجات قىسقىش NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ەسكەرتۋ This operation is not supported. نۇ جوبالاۋدى قولدامايدى. Tips ەسكەرتپەۋ The device is in busy state, please perform this operation later. جابدىقتار قاربالاس، سەل تۇرٸپ نۇ جوبالاۋدى اتقار ىستەڭ. This is an abnormal Udisk, please fix it or format it نۇ بٸر بينورمال Udisk، ونى قالپٸناكەلتٸر ياكي فورماتتا This is an empty drive, please insert a Disc. نۇ بٸر قۇرعاق قوزعالتۋ اسبابى، بٸر پارشا ديسكا ديسكا قىستىرىڭىز. Open In New Window جاڭا تەرەزەدە اشىلۋ Can not open %1, %2 %1 نى اشۋئاجرىتىششىن بولمادى، %2 Open In New Tab جاڭا بەلگى بەتتە اشىلۋ Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... باسقارۋشى بەلگىسى... More tags... الٸدە كوپ بەلگى... NavigationTabBar Computer 计算机 Search "%1" in "%2" ٸزدەۋ "%1" in "%2" OperationMenu Advance Search 高级搜索 Keep Allow جول قويۋدى ساقتاپ قىلۋ Show Hidden جاسىرىن تۇرلەردى كورسەتۋ Show File Extension حۇجات كەڭەيتىلمە اتاعىن كورسەتۋ Show Create Time قۇرۋ ۋاقىتىن كورسەتەدى. Show Relative Time قاتىناسى ۋاقىتتى كورسەتەدى. Forbid thumbnailing تۇراقتاندىرۋ شەكتەلىنەدى Resident in Backend ارتى جاقتا تۇرۋ. Parallel Operations پاراللەل جوبالاۋ ەتۋ Set samba password samba قۇپيا نۇمىردى ورنالاسترعان ەتۋ Tips ەسكەرتپەۋ The user already has a samba password, do you need to reset the samba password? قاريدارلاردىڭ samba قۇپيا نومەرى بار قالدى، سامبا قۇپيا نومەرىنى قالپىنا كەلتىرىلگەن كەرەكپە؟ Samba set user password Samba ابونت قۇپيا نۇمىردى ورناتقان Samba password: قۇپيا نومەرى Samba Warning ەسكەرتۋ Samba set password failed, Please re-enter! قۇپيا نومەر ورناتۋ جەڭىلىپ قالدى، قايتادان كىرگىزىڭىز Samba Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! ھەمبەھىرلىنىش تولىقتاماسى قىزىمەت وتەۋى نورمال ەمەس، قازىر ھەمبەھىرلىنىش جوبالاۋى يۈرگۈزۈلۈۋاتقان ياكي يۈزگۈزىلىۋاتمىغانلىقىنى انىقتاڭىز ياكي قايتادان ھەمبەھىرلىنىڭ Open each folder in a new window جاڭا تەرەزەدە ٵر بٸر حۇجات قىسقىشىنى ٴٸشڭٸز Plugin manager Settings قىستىرما باسقارۋشى تەڭگەرگٸش Show Network Connect to Server Help جاردەم About جايٸندا OperationMenuEditWidget Edit تالداۋجاساۋ copy نۇسقالاۋ paste جولى cut راسىم ۇستاۋ trash قوقسىق Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudStorage ساقتاعىش CloudFile Cloud حۇجاتى Peony::Intel::SideBarFavoriteItem Favorites جاقسى كۆرىدىغانلار Peony::Intel::SideBarFileSystemItem Computer كومپيۋتەر 文件系统 حۇجات سەستيماسى System Disk سەستيما ديسكاسى Peony::Intel::SideBarMenu Properties سۋرەت قاسيەتى Delete Symbolic بەلگٸنٸ ٴوشىرۋ Unmount جۋىپ جىبەرۋ Eject جاريالاۋ format فورماتتاۋ Peony::Intel::SideBarPersonalItem Personal جەكە Peony::Intel::SideBarSeparatorItem (No Sub Directory) (تارماق باسمازمۇن جوق) Peony::Intel::SideBarUserDiskItem User Disk ابونت ديسكاسى Peony::Intel::TabletSideBarFactory Intel Side Bar Intel جان بالداعى Peony::SearchWidget Search ٸزدەۋ Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. ٴسىز نۇ حۇجاتتاردى ٶشٸرۋشٸنٸ جەزملەشتۈرەلەمٴسىز؟ ٶشٸرۋگە باستاعان اقىرىندا، ٶشٸرٸلگەن حۇجات ماڭگى قالپىنا كەلمەيدى. Delete ٴوشىرۋ Cancel كۇشىنەن قالدىرۋ PeonyApplication Peony-Qt 文件管理器 peony-qt peony-qt حۇجات باسقارۋشى Files or directories to open اشاتىن حۇجات ياكي باس مازمۇن [FILE1, FILE2,...] [حۇجات1, حۇجات2,...] Warning ەسكەرتۋ Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt سەستاماسىنىڭ اي كۇن ئۇسلۇبىغا قول جەتكٸزبەدٸ.. ەكٸ سەبەپ نۇ ماسەلەنى كەتىرىپ شٸعۋٸ مۇمكان: 1. Peony-Qtبالكٸم روت سالاۋاتى مەنەن اتقار بولۋٸ مۇمكان، نۇ، ٴٴسىزدىڭ الٸدە جوعارعى ۇقىق دائىرىڭىزنىڭ بارلىقىدىن دەرەك بەرەدٸ ادەتتە شەكتەلگەن جۇمىستاردى ورىنداسا بولادٸ. بىراق بٸلۋٸڭٸز كەرەك، قيسٸق ٴٴسىز جۇلدىز باس مازمۇنىندا بولساڭٸز، جاساندى حۇجات سەستيماسى بارٸ قابٸلەتتتەردٸ جوعالتادى, ماسەلەن، ٴٴسىز «مەنىڭ كٶمپيٶتەرٸم» نى ئىشلىتەلمەيٴٴسىز، باس تەمە ۋا سىنبەلگىدىمۇ قاتەلىك كورىلۋى مۇمكان. سوندىقتان، Peony-Qt نى جۇلدىزدا ماڭدۇرۇش ۇسٸنٸس بەرۋ ورىندالمايدى. 2. ٴسىزدىڭ سەستاماڭىزعا qt بولماعان سلوب ٸستەتكەن، ٴبىراق ٴسىز qt جيۋ دەتالىنا سۇپى باس تەمە قىستىرماسىن كىرگىزبەدىڭىز. قيسٸق ٴسىزدىڭ ٸستەتكەنٸڭٸز gtk سلوبى بولسا، نۇ ماسەلەنى شەشىم ەتۋ ەتۋ ٷشٸن qt 5 gtk 2 platform theme بۇلاق تۇسىرىپ سىناپ كور. Peony is disabled to start ! Peony Qt Peony Qt حۇجات باسقارۋشى Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. اۆتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسىلىم ۇقىعى يەگەرلٸك ۇقىعى (C):2020، KylinSoft جۇمساق دەتال جارنا شەكتى سەرىكتى شەكتى سەرىكتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit بارلٸق Peony-Qt تەرەزەنى جابۋ شەگنىپ شٸق Show items كورسەتۋ تۇرى Show folders حۇجات قىسقىشىنى كورسەتۋ Show properties قاسيەتىن كورسەتۋ QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed ماجبۇر دومالاتۋ جەڭىلىپ قالدى. Error: %1 قاتەلىك بايقالدٸ: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندىق مالىمەت بۇرشاق قادامدا تامامدالدٸ ، اسباب سەستيماسى ناتيجەلى قالدا يۇيۇۋېتىلدى ! Unmount failed جۋۋ جەڭىلىپ قالدى Unable to unmount it, you may need to close some programs, such as: GParted etc. جۇكتى جۋعالى بولمايدى، ٴسىز بالكٸم الدٸمەن بارٸ پرٶگراممالاردى ئېتىۋېتىشىڭىز بولۋٸ مۇمكان، ماسەلەن، رايونعا بولىنىپ رەدەكسيا اسبابٸ قاتارلىلار. Error: %1 Do you want to unmount forcely? قاتەلىك كورىلدى: ٪1 ماجبۇر يۇيامدۇق؟ Eject failed تەز كورىنبە جەڭىلىپ قالدى Cancel كۇشىنەن قالدىرۋ Eject Anyway قانداقلا بولماسىن تەز كورىنبە جيٸلٸك Data synchronization is complete and the device can be safely unplugged! ساندىق مالىمەتتە بۇرشاق قادامدا تامامدالدٸ، اسپاپتاردى حاۋٸپسٸز قالدا الماقشٸ بولادٸ! Unable to eject %1 %1 قاقپا تەرەزەسى شٸعارعالٸ بولمايدى PeonyNotify Peony ۇقتىرۋى File Manager حۇجات باسقارۋشى SortTypeMenu File Name حۇجات مى Name Time Modified File Size حۇجات ۇلكەندىگى Original Path وڭ جول Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders بارلٸق حۇجات قىسقىشقا قارتا كەزەكتەگى رەتتەۋدى ٸستەتڭٸز. By %1 %1 تىن Newest to oldest ەڭ يېڭىسىدىن ەڭ كونىسىغىچە Oldest to newest ەڭ كونىسىدىن ەڭ يېڭىسىغىچە Files from large to small حۇجات چوڭدىن كىچىككە قاراتىپ Files from small to large حۇجات كىشىدەن ۇلكەنگە قاراتىپ Use global sorting 使用全局排序 File Type حۇجات تۇرى Modified Date وزگەرتىلگەن ۋاقىتى Modified Data 修改日期 Ascending كىشىدەن ۇلكەنگە قاراتىپ تىزۋ Descending چوڭدىن كىچىككە قاراتىپ تىزۋ TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items %1 تۇر Searching for files ... قازىر حۇجات ٸزدەپ جاتٸر. . . selected%1%2 选中%1%2 selected %1 items %2 %1 تۇر %2 نى تالدادٸ %1 items selected %2 items %1 项 选中 %2 项 selected %1 items تالدانعانٸن %1 تۇر TabWidget Trash قوقسىق Clear تازالاۋ Recover قالپىنا كەلتىرىلگەن Need to save changes to current space conditions? Not Save Save Location: Save as Space Cancel كۇشىنەن قالدىرۋ Edit Conditiones Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer كومپيۋتەر File Type حۇجات تۇرى File Size حۇجات ۇلكەندىگى File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path تالدا ش جولى Warning ەسكەرتۋ Error قاتە Opening such files is not currently supported كەزەكتە نۇ ٴتۇر حۇجاتتاردى اشۋدٸ قولدامايدى. Open failed ٸشٸۋ جەڭىلىپ قالدى Open directory failed, you have no permission! باسمازمۇندى ٸشٸۋ جەڭىلىپ قالدى، سىزدىڭ ۇقىعىڭىز جوق! Close advance search. 关闭高级搜索。 Search ٸزدەۋ Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is بولسا Please input key words... شەشۋشٸ سوزدەردى كىرگىزۋ... Please input kay words... 请输入关键词... contains ٶز ىشىنە الادٸ name مى type تۇرى modify time تۇزەتۋ ۋاقىتى file size حۇجات ۇلكەندىگى all بارلٸق file folder حۇجات قىسقىش image راسىم video سىن text file تەكىسىت حۇجاتى audio اۋا others باسقالار wps file wpsحۇجاتى today بوگٸن this week نۇ اپتا this month نۇ اي this year نۇ جىل yesterday كەشە last week الداعٸ اپتا last month الداعٸ اي last year جۇلدىز before last year file name and content file name Modify Time File Name حۇجات مى Condition Match Rule year ago 一年前 tiny(0-16K) ازىراق (0-16K) small(16k-1M) كشكەنە (16k-1M) empty(0K) قۇرعاق (0K) medium(1M-128M) ورتا كۇي (1M-128M) big(128M-1G) ۇلكەن (128M-1G) large(1-4G) ۇلكەنىرەك (1-4G) great(>4G) وتە ۇلكەن (>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony حۇجات باسقارۋشٸسٸ TopMenuBar Option تالدانبا Minimize كىشرەيتۋ Close تىعنداۋ peony/translations/peony-qt/peony-qt_tr.ts0000664000175000017500000016763115154271106020000 0ustar fengfeng AboutDialog Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel Service & Support: Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. File Manager Dosya Yöneticisi Peony Version number: %1 FileLabelBox Open In New Window Open In New Tab Rename Yeniden Adlandır Edit Color Rengi Düzenle Delete Sil Create New Label Yeni Etiket Oluştur HeaderBar Create Folder Klasör Oluştur Open Terminal Uçbirim Aç Go Back Geri Go Forward İleri Search Ara Go Up Icon View List View View Type Görünüm Türü Sort Type Sıralama Türü Option Seçenek &Copy Copy &Cut Cut &Select All Select All Deselect All &Delete to trash Delete to trash Operate Tips İşlet İpuçları Don't find any terminal, please install at least one terminal! Herhangi bir uçbirim bulunamadı, lütfen en az bir uçbirim kurun! Restore Onar Maximize Büyüt Select All Item Select MoveTo CopyTo Delete Sil Select path Yol seç Select Done Minimize Küçült Close Kapat HeaderBarContainer Minimize Küçült Maximize/Restore Büyüt/Onar Restore Onar Maximize Büyüt Close Kapat Intel::NavigationSideBar Open In &New Window Yeni Pencerede Aç Open In New &Tab Yeni Sekmede Aç Intel::TitleLabel Files MainWindow File Manager Dosya Yöneticisi Undo Geri idm:///新建智能空间 Redo İleri warn This operation is not supported. Search Ara Delete file Warning Dosya Silme Uyarısı Delete Permanently Kalıcı Olarak Sil Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Peony Qt Peony Qt New Folder Yeni Klasör NavigationSideBar All tags... Tüm etiketler... Open In &New Window Yeni Pencerede Aç warn This operation is not supported. Tips The device is in busy state, please perform this operation later. This is an abnormal Udisk, please fix it or format it This is an empty drive, please insert a Disc. Open In New Window Can not open %1, %2 Open In New Tab Open In New &Tab Yeni Sekmede Aç NavigationSideBarContainer All tags... Tüm etiketler... Manager tags... More tags... NavigationTabBar Search "%1" in "%2" "%2" de "%1" ara OperationMenu Advance Search Gelişmiş Arama Keep Allow İzin Ver Show Hidden Gizlileri Göster Show File Extension Show Create Time Show Relative Time Forbid thumbnailing Küçük Resimleri Yasakla Resident in Backend Arka Uçta Yerleşik Parallel Operations Paralel İşlemler Set samba password Tips The user already has a samba password, do you need to reset the samba password? Samba password: Samba set user password Warning Uyarı Samba set password failed, Please re-enter! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Open each folder in a new window Plugin manager Settings Show Network Connect to Server Help Yardım About Hakkında OperationMenuEditWidget Edit Düzenle copy Kopyala paste Yapıştır cut Kes trash Çöp Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites Peony::Intel::SideBarFileSystemItem Computer 文件系统 System Disk Peony::Intel::SideBarMenu Properties Delete Symbolic Unmount Eject format Peony::Intel::SideBarPersonalItem Personal Peony::Intel::SideBarSeparatorItem (No Sub Directory) Peony::Intel::SideBarUserDiskItem User Disk Peony::Intel::TabletSideBarFactory Intel Side Bar Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Bu dosyaları silmek istediğinizden emin misiniz? Bir silme işlemini başlattığınızda, silinen dosyalar bir daha geri yüklenmeyecektir. Delete Sil Cancel PeonyApplication Peony-Qt Dosya Yöneticisi peony-qt Dosya Yöneticisi Files or directories to open Açılacak dosyalar veya dizinler [FILE1, FILE2,...] [DOSYA1, DOSYA2,...] Warning Uyarı Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt sistem simgesi teması alınamıyor. Bu soruna yol açabilecek 2 neden vardır: 1. Peony-Qt root olarak çalışıyor olabilir, bu da daha yüksek izne sahip olduğunuz ve normalde yasak olan bazı şeyleri yapabileceğiniz anlamına gelir. Ancak, eğer root iseniz, sanal dosya sisteminin Bilgisayarımı kullanamayacağınız gibi bazı özellikleri kaybedeceğini, temanın ve simgelerin de yanlış gidebileceğini öğrenmelisiniz. Yani, bir root olarak Peony-qt çalıştırmak önerilmez. 2. Sisteminiz için qt olmayan bir tema kullanıyorsunuz ancak qt uygulamaları için platform tema eklentisini yüklemediniz. Gtk-theme kullanıyorsanız, bu sorunu çözmek için qt5-gtk2-platformtheme paketini yüklemeyi deneyin. Peony is disabled to start ! Peony Qt Dosya Yöneticisi Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif Hakkı (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif Hakkı(C): 2019-2020, KYLIN Software Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Close all peony-qt windows and quit Tüm peony-qt pencerelerini kapatın ve çıkın Show items Öğeleri göster Show folders Klasörleri göster Show properties Seçenekleri göster QObject Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Unable to unmount it, you may need to close some programs, such as: GParted etc. Error: %1 Do you want to unmount forcely? Eject failed Cancel Eject Anyway Data synchronization is complete and the device can be safely unplugged! Unable to eject %1 PeonyNotify File Manager Dosya Yöneticisi SortTypeMenu File Name Dosya Adı Name Time Modified File Size Dosya Boyutu Original Path Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large File Type Dosya Türü Modified Date Düzenleme Tarihi Modified Data Düzenlenen Veri Ascending Artan Descending Azalan TabStatusBar ; %1 folders ; %1 klasör ; %1 files, %2 total ; %1 dosya, %2 toplam ; %1 folder ; %1 klasör ; %1 file, %2 ; %1 dosya, %2 %1 selected %1 seçildi Search "%1" in "%2" %1 de %1 bul Searching for files ... %1 items selected %1 items %2 selected %1 items TabWidget Trash Çöp Clear Temizle Recover Geri Yükle Need to save changes to current space conditions? Not Save Save Location: Computer Filter Save as Space Cancel Edit Conditiones Select Path Warning Uyarı Error Opening such files is not currently supported Open failed Open directory failed, you have no permission! Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Close advance search. Gelişmiş aramayı kapat. Search Ara Choose other path to search. Aramak için başka bir yol seçin. Search recursively Yinelemeli olarak ara more options Daha fazla seçenek Show/hide advance search Gelişmiş aramayı göster/gizle Select path Yol seç is de Please input key words... Lütfen anahtar kelimeler girin ... Please input kay words... Lütfen anahtar kelimeler girin ... contains İçerik name İsim type Tür modify time Değiştirme Zamanı file size Dosya Boyutu all Tümü file folder Dosya klasör image Resim video Video text file Metin dosyası audio Ses others Diğer wps file Wps Dosyası today Bugün this week Bu hafta this month Bu ay this year Bu yıl yesterday last week last month last year before last year file name and content file name File Type Dosya Türü File Size Dosya Boyutu Modify Time File Name Dosya Adı File Label Condition Match Rule year ago Geçen yıl tiny(0-16K) Çok küçük(0-16K) small(16k-1M) Küçük(16k-1M) empty(0K) medium(1M-128M) Orta(1M-100M) {1M?} {128M?} big(128M-1G) Büyük(100M-1G) {128M?} {1G?} large(1-4G) great(>4G) medium(1M-100M) Orta(1M-100M) big(100M-1G) Büyük(100M-1G) large(>1G) Daha büyük(>1G) TitleLabel Peony TopMenuBar Option Seçenek Minimize Küçült Close Kapat peony/translations/peony-qt/peony-qt_zh_HK.ts0000664000175000017500000017763315154271106020361 0ustar fengfeng AboutDialog Dialog 視窗 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel 標籤 Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: 服務與支持團隊: Peony 檔管理員 peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 檔管理員是一款説明使用者管理系統文件的圖形化的軟體,為使用者提供常用的檔操作功能,比如檔查看,檔複製、粘貼、剪切、刪除、重命名,檔打開方式選擇,檔搜索,檔排序,檔預覽等,方便使用者在介面上直觀地管理系統檔。 Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 版本號: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window 在新視窗中打開 Open In New Tab 在新標籤頁中打開 Rename 重新命名 Edit Color 編輯顏色 Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back 後退 Go Forward 前進 Search 搜索 View Type 視圖類型 Sort Type 排序類型 Option 選項 Operate Tips 操作提示 Go Up 上一級 Details 详情 &Copy 複製 Copy 複製 &Cut 剪切 Cut 剪切 &Select All 全選 Select All 全選 Deselect All 取消全選 &Delete to trash 刪除到回收站 Delete to trash 刪除到回收站 Don't find any terminal, please install at least one terminal! 沒有找到任何終端外掛程式,請確認您至少安裝了一個! Select All Item 全部選擇 Select 選擇 Restore 還原 Maximize 最大化 Select Done 完成 MoveTo 移動到 Icon View 图标视图 圖示檢視 List View 清單檢視 CopyTo 複製到 Delete 刪除 Select path 選擇路徑 Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize 最小化 Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close 關閉 Intel::NavigationSideBar Open In &New Window 在新視窗開啟(&N) Open In New &Tab 在新分頁開啟(&T) Intel::TitleLabel Files MainWindow File Manager 檔管理員 Undo 撤銷 idm:///新建智能空间 Redo 重做 warn 警告 This operation is not supported. 不支援此操作。 Search 搜索 Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder 新建資料夾 NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn 警告 This operation is not supported. 不支援此操作。 Tips 提示 The device is in busy state, please perform this operation later. 裝置正忙, 請稍後執行此操作. This is an abnormal Udisk, please fix it or format it 這是個異常U盤,請將其修復或格式化 This is an empty drive, please insert a Disc. 這是一個空光碟機, 請插入光碟. Open In New Window 在新視窗中打開 Can not open %1, %2 無法開啟%1, %2 Open In New Tab 在新標籤頁中打開 Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... 標識模式 More tags... 更多標識 NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow 置頂視窗 Show Hidden 顯示隱藏檔案 Show File Extension 顯示檔擴展名 Show Create Time 顯示創建時間 Show Relative Time 顯示相對時間 Forbid thumbnailing 禁用縮圖 Resident in Backend 常駐後台 Parallel Operations 允許操作並行 Set samba password 設置samba共享密碼 Tips 提示 The user already has a samba password, do you need to reset the samba password? 用戶已經設置了samba共享密碼, 是否希望重新設置? Samba set user password 設置samba共享密碼 Samba password: 共用密碼: Warning 警告 Samba set password failed, Please re-enter! 設定共享密碼失敗, 請重新輸入 Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! 共用設定服務異常, 請確定是否已經有正在進行的共享設定操作, 或者重新設置共用! Open each folder in a new window 在新視窗打開資料夾 Plugin manager Settings 外掛程式管理設置 Show Network 顯示網上鄰居 Connect to Server 連接遠端伺服器 Help 幫助 About 關於 OperationMenuEditWidget Edit 編輯 copy 複製 paste 粘貼 cut 剪切 trash 刪除 Peony::Intel::SideBarCloudItem CloudStorage 雲存儲 CloudFile 雲檔 Peony::Intel::SideBarFavoriteItem Favorites 快速訪問 Peony::Intel::SideBarFileSystemItem Computer 計算機 文件系统 檔案系統 System Disk 系統盤 Peony::Intel::SideBarMenu Properties 屬性 Delete Symbolic 刪除連結 Unmount 卸載 Eject 彈出 format 格式化 Peony::Intel::SideBarPersonalItem Personal 個人 Peony::Intel::SideBarSeparatorItem (No Sub Directory) ( 無子目錄 ) Peony::Intel::SideBarUserDiskItem User Disk 用戶盤 Peony::Intel::TabletSideBarFactory Intel Side Bar Intel側邊欄 Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您確定要刪除這些檔案嗎? 一旦開始刪除,這些檔將不可再恢復。 Delete 刪除 Cancel 取消 PeonyApplication Peony-Qt 文件管理器 peony-qt 檔管理員 Files or directories to open 需要打開的檔或資料夾 [FILE1, FILE2,...] [檔1,檔2...] Warning 警告 Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. 檔管理員無法取得系統圖示主題,可能的原因是: 1.正在以管理員使用者運行檔管理器,雖然這意味著你擁有更高的許可權,但是你必須瞭解你同時也失去了一些在普通使用者下才能夠擁有的特徵,例如“我的電腦”以及系統主題。 如果不是特殊情況,請不要使用管理員使用者打開檔管理員。 2.你使用的系統主題不是qt默認支援的主題,並且你沒有安裝相關的平臺外掛程式。 如果你正在使用Gtk主題作為系統主題,嘗試安裝qt5-gtk2-platformtheme以解決此問題。 Peony is disabled to start ! 檔管理員被禁止啟動! Peony Qt 檔管理員 Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版權所有(C): 2020, 麒麟軟體有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit 關閉所有視窗並退出 Show items 打開檔所在目錄並選取中它們 Show folders 顯示資料夾下的內容 Show properties 打開檔案屬性視窗 QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed 強制卸載失敗 Error: %1 錯誤:%1 Data synchronization is complete,the device has been unmount successfully! 數據同步完成,設備已經安全卸載! Unmount failed 卸載失敗 Unable to unmount it, you may need to close some programs, such as: GParted etc. 無法卸載設備,可以嘗試先關閉一些應用程式,比如GParted等。 Error: %1 Do you want to unmount forcely? 錯誤:%1 您確定要強制卸載嗎? Eject failed 彈出失敗 Cancel 取消 Eject Anyway 強制彈出 Data synchronization is complete and the device can be safely unplugged! 數據同步完成,設備可以安全移除了! Unable to eject %1 無法彈出 %1 PeonyNotify 檔管理員消息 File Manager 檔管理員 SortTypeMenu File Name 文件名称 Name 檔名稱 Time Modified 修改時間 File Size 檔大小 Original Path 原始路徑 Path 路徑 Intelligent sort 智慧排序 Add Mode 按添加方式 Manual Add Priority 手動添加優先 Conditional Screening Priority 條件篩選優先 Manually added only 僅手動添加 Conditional additions only 僅條件篩選 Descending Order 降序 Ascending Order 升序 Use current sorting for all folders 所有目錄使用當前排序 By %1 按%1 Newest to oldest 從新到舊 Oldest to newest 從舊到新 Files from large to small 從大到小 Files from small to large 從小到大 Use global sorting 使用全局排序 File Type 檔案類型 Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 個專案 Searching for files ... 搜尋中... selected%1%2 选中%1%2 selected %1 items %2 選取 %1 個專案 %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items 選取 %1 個專案 TabWidget Trash 回收站 Clear 清空 Recover 還原 Need to save changes to current space conditions? 需要保存對當前空間條件的修改嗎? Not Save 不保存 Save 保存 Location: 範圍: Save as Space 存為空間 Cancel 取消 Edit Conditiones 編輯空間 Contains 包含 Not Contains 不包含 FileName and FileContent 檔案名稱和文件內容 Only FileName 檔名稱 File smart tags 檔智能標籤 Search Settings 搜索設置 After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. 創建索引后,下次搜索可獲取文件內容含搜索詞的結果,期間您可隨時退出頁面,我們會在後台繼續完成創建。 Computer 計算機 Condition 条件 File Type 檔案類型 Modify time 修改时间 File Size 檔大小 File Label 檔標識 Close Filter. 关闭筛选。 Filter 篩選 Select Path 選擇路徑 Warning 警告 Error 錯誤 Opening such files is not currently supported 暫時不支持打開此類檔 Open failed 打開失敗 Open directory failed, you have no permission! 打開資料夾失敗,您沒有該目錄的許可權! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name 名稱 type 類型 modify time 修改時間 file size 檔大小 all 全部 file folder 資料夾 image 圖片 video 視頻 text file 文本文檔 audio 音訊 others 其他 Satisfy All Conditions 滿足全部條件 wps file WPS檔 today 今天 this week 本週 this month 本月 this year 今年 yesterday 昨天 last week 上周 last month 上月 last year 去年 before last year 去年以前 file name and content 檔案名稱和內容 file name 檔名稱 Modify Time 修改時間 File Name 檔名稱 Condition Match Rule 匹配規則 year ago 一年前 tiny(0-16K) 極小(0-16K) small(16k-1M) 很小(16k-1M) empty(0K) 空(0K) medium(1M-128M) 中等(1M-128M) big(128M-1G) 大(128M-1G) large(1-4G) 巨大(1-4G) great(>4G) 極大(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony 檔管理員 TopMenuBar Option 選項 Minimize 最小化 Close 關閉 peony/translations/peony-qt/peony-qt_ky_KG.ts0000664000175000017500000021417015154271106020346 0ustar fengfeng AboutDialog Dialog ۇباقىت ۅزگۅرتۉش <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC“//W3C//DTD HTML 4.0//EN”http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name=“qrichtext”content=“1”/><style type=“text/css”> p、 li{كۅڭدۅي:الدىن قاچالوو;} </style></head><body style=“font-family:'Noto Sans CJK SC';font-size:10pt;font-گەڭدىگى :400;font-style:نورماال ;”> <p style=“-qtبۅلۉك تۉرۉ:كۅڭدۅي;بەت ۇقۇق ،امال ارالىعى چوقۇ بۅلۅگۉ :0px;بەت تاراپ ارالىعى الدى بۅلۅگۉ :0px,سول بەت تاراپ ارالىعى 0px;وڭ بەت ۇقۇق ،امال ارالىعى 0px;-qt پارچا كىچىرەيتۉۉ ۅلچۅمۉ :0;تەكىست كىچىرەيتۉۉ ۅلچۅمۉ :0px;قات چوڭ كىچىكتىگى :11pt;”><br/></p></body></html> TextLabel تەكىست ەنى ، تامعاسى Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: تەيلۅۅ جانا قولدوش ، دەم بەرىش كوللېكتىپى: Peony ۅجۅت باشقارعۇۇچۇ peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Peony بولسو بىر تۉر ابونىتتاردىن ۅجۅت باشقارىش ساامالىعىنا جەرلىك بەرەتۇرعان گىرافىك جۇمشاق تەتىك . ال ىشتەتۉۉچۉلۅرگۅ كۅپ ال چرايدىغان ۅجۅت ماشقۇلدانۇۇ قۇرباتى مەنەن قامدايت، مىسالى، ۅجۅت كۅرۉۉ ، ۅجۅت نۇستۉر اش، چاپتوو، قىيىش ، ۅچۉرۉۉ، قايرا اتاق بەرۉۉ، ۅجۅت تانداش ، ئەپ اچۇۇ، ۅجۅت ىزدۅۅ، ۅجۅتلەرنى قاتارلاش ، ۅجۅتلەرنى الدىن كۅرۉۉ قاتارلۇۇلار ىشتەتۉۉچۉلۅرگۅڭ كۅرۉنمۅ بەتىندە تىكەلەي ، تۉز ەلە ابالدا ۅجۅت باشقارىش ساامالىعىنا ىڭعايلۇۇ يارىتىپ بەرەت. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 باسما نومۇرۇ :%1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window جاڭى كۅزۅنۅكتۅ اچىلىش Open In New Tab جاڭى بەلگە بەتتە اچىلىش Rename قايرا ات تەك ات جاسوو ،اتقارۇۇ Edit Color تۉس مونتاژلىق Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back قايتۇۇ Go Forward الدىنا ماڭ Search 搜索 View Type كۅرۉنۉش تۉرۉ Sort Type ىرەتتەلگەن تىپ Option تاندالما Operate Tips ماشقۇلدانۇۇ ەسكەرتمەسى Go Up ۉستۉنۅن قاراپ Details 详情 &Copy گۅچۉرۉش Copy گۅچۉرۉش &Cut & قىيىش Cut قىيىش &Select All باردىعىن تانداش (&S) Select All باردىعىن تانداڭ Deselect All تانداشتى بەكەر جاسوو ،اتقارۇۇ &Delete to trash & شىپىرىندى ساندىققا تاشتاش Delete to trash شىپىرىندى ساندىققا تاشتاش Don't find any terminal, please install at least one terminal! ەچقانداي تىرمىنال تابالبادىق، از دەگەندە بىر تىرمىنال قاچالاڭ! Select All Item باردىق تۉردۉ تانداڭ Select تانداش Restore العاچىنا كەلتىرۉۉ Maximize ەڭ چوڭ چەككە Select Done تانداپ بۉتۉرۉڭ MoveTo جۅتكۅپ بەرۉۉ Icon View 图标视图 تۉر گۅرۉنۉشۉ List View تىزىمدىك گۅرۉنۉشۉ CopyTo عا گۅچۉرۉش Delete ۅچۉرۉۉ Select path جول تانداش Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize كىچىرەيتۉۉ Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close جابۇۇ Intel::NavigationSideBar Open In &New Window جاڭى كۅزۅنۅكتۅ اچۇۇ (&N) Open In New &Tab جاڭى تانداش كارتاىسندا اچۇۇ (&T) Intel::TitleLabel Files ۅجۅتتۅر MainWindow File Manager ۅجۅت باشقارعىچ Undo اچۇۇ idm:///新建智能空间 Redo قايرا-قايرا warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇنۇ قولدوبويت. Search ىزدۅۅ Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder جاڭى ۅجۅت قىپچىعىچ NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ەسكەرتۉۉ This operation is not supported. بۇل ماشقۇلدانۇۇنۇ قولدوبويت. Tips ەسكەرتۉۉ The device is in busy state, please perform this operation later. زاپجاستار الدىراش، سەل تۇرۇپ بۇل ماشقۇلدانۇۇنۇ اتقارماق قىلىڭ. This is an abnormal Udisk, please fix it or format it بۇل بىر بۅتۅنچۅ Udisk، انى وڭشوڭ كۅرۉنۉشتۅرۉ فورماتتاڭ This is an empty drive, please insert a Disc. بۇل بىر كۅڭدۅي قوزعوتقۇچ ، بىر پارچا دىسكا قىستىرىڭ. Open In New Window جاڭى كۅزۅنۅكتۅ اچىلىش Can not open %1, %2 %1 نى اچقالى بولبودۇ، %2 Open In New Tab جاڭى بەلگە بەتتە اچىلىش Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... باشقارعىچ ەنى ، تامعاسى ... More tags... داعى ەلە كۅپ بەلگە ... NavigationTabBar Computer 计算机 Search "%1" in "%2" ىزدۅۅ "%1" in "%2" OperationMenu Advance Search 高级搜索 Keep Allow جول قويۇنۇ ساقتاپ قىلۇۇ Show Hidden جاشىرىن تۉرلۅردۉ كۅرسۅتۉۉ Show File Extension ۅجۅت گەڭەيتىلمە اتاعىن كۅرسۅتۉۉ Show Create Time قۇرۇۇ ۇباقتىن كۅرسۅتۅت. Show Relative Time سالىشتۇرمالۇۇلۇق ۇباقتىن كۅرسۅتۅت. Forbid thumbnailing تۇرۇقتاندىرۇۇ چەكتەلەت Resident in Backend ارقا تاراپتا تۇرۇش . Parallel Operations پارالەل ماشقۇلدانۇۇ جاسوو ،اتقارۇۇ Set samba password samba جاشىرۇۇن نومۇرۇن قۇرۇۇ ، اچۇۇ ، باشتوو جاسوو ،اتقارۇۇ Tips ەسكەرتۉۉ The user already has a samba password, do you need to reset the samba password? ابونىتتاردىن samba جاشىرۇۇن نومۇرۇ بار بولدۇ ، سامبا جاشىرۇۇن نومۇرۇ نى العاچىنا كەلتىرۉۉ كەرەكبى؟ Samba set user password Samba كەرەكتۅۅچۉ جاشىرۇۇن نومۇرۇن ورنوتقون Samba password: جاشىرۇۇن نومۇرۇ Samba Warning ەسكەرتۉۉ Samba set password failed, Please re-enter! جاشىرۇۇن نومۇر ورنوتۇ جەڭىلۉۉ بولدۇ ، قايتادان كىرگىزىڭ Samba Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! ھەمبەھىرلىنىش سەپتەمەسى سان قاينارى نورماال ەمەس ، ازىر ھەمبەھىرلىنىش ماشعۇلاتى يۈرگۈزۈلۈۋاتقان كۅرۉنۉشتۅرۉ يۈزگۈزىلىۋاتمىغانلىقىنى ايقىنداڭ كۅرۉنۉشتۅرۉ قايتادان ھەمبەھىرلىنىڭ Open each folder in a new window جاڭى كۅزۅنۅكتۅ ار بىر بىر ۅجۅت قىپچىعىچتى اچىڭ Plugin manager Settings قىستىرما باشقارعىچ تەڭشەگى Show Network Connect to Server Help جەرلىك About تۇراسىندا OperationMenuEditWidget Edit تۅپتۅش copy ۉلگۉسۉن الۇۇ paste جولۇ cut سۉرۅت تۇقتۇۇ trash شىپىرىندى Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudStorage ساقتاعىچ CloudFile Cloud ۅجۅتۉۉ Peony::Intel::SideBarFavoriteItem Favorites جاقشى كۆرىدىغانلار Peony::Intel::SideBarFileSystemItem Computer كومپىيۇتەر 文件系统 ۅجۅت ساامالىعى System Disk ساامالىق دىسكاسى Peony::Intel::SideBarMenu Properties سۉرۅت قاسىيەتىن Delete Symbolic بەلگىنى ۅچۉرۉۉ Unmount جۇۇپ جىبەر Eject ۅندۉرۉش format فورماتتاش Peony::Intel::SideBarPersonalItem Personal جەكەلىك Peony::Intel::SideBarSeparatorItem (No Sub Directory) (بۅلۉمچۅ مازمۇۇنۇ جوق) Peony::Intel::SideBarUserDiskItem User Disk كەرەكتۅۅچۉ دىسكاسى Peony::Intel::TabletSideBarFactory Intel Side Bar Intel ۇقۇق ،امال بالدىقى Peony::SearchWidget Search ىزدۅۅ Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. سىز بۇل ۅجۅتتۅرۉن ۅچۉرۉۉنۉ جەزملەشتۈرەلەمسىز؟ ۅچۉرۉۉگۅ باشتاعان امان، ۅچۉرۉلگەن ۅجۅت تۉبۅلۉك العاچىنا گەلبەيت . Delete ۅچۉرۉۉ Cancel ارعادان قالتىرىش PeonyApplication Peony-Qt 文件管理器 peony-qt peony-qt ۅجۅت باشقارعىچ Files or directories to open اچاتۇرعان ۅجۅت كۅرۉنۉشتۅرۉ تىزىمدىك [FILE1, FILE2,...] [ۅجۅت1, ۅجۅت2,...] Warning ەسكەرتۉۉ Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt ساامالىعىنىن شارتتۇۇ بەلگى ئۇسلۇبىغا ەە بولوالبادى.. ەكى سەبەپ بۇل ماسەلەنى كەلىترىپ ۅندۉرۉشۉ مۉمكۉن: 1. Peony-Qtبالكىم روت كۉبۅلۉگۉ مەنەن اتقارماق بولۇۇسۇ مۉمكۉن، بۇل، سىزدىن داعى ەلە جوعورۇ ۇقۇق دائىرىڭىزنىڭ بارلىقىدىن دارەك بەرەت دەمەيدە چەكتەلگەن جۇمۇشتاردى قىلسا بولوت . بىروق بىلۉۉڭۉز كەرەك، ەگەر سىز جىلدىز تىزىمدىگىندە بولسوڭۇز، جورۇما ۅجۅت ساامالىعى گەەبىر قۇرباتتارىن جوعوتوت, مىسالى، سىز «مەنىن كومپىيۇتەرىم» نى ىشتەتەالبايسىز، باش سىيۇجەت جانا سىنبەلگىدىمۇ قاتاالىق كۅرۉلۉسۉ مۉمكۉن. وشوعو، Peony-Qt نى جىلدىزدا ماڭدۇرۇش كەڭەش قىلىنبايت. 2. سىزدىن سىستېمىڭىزغا qt بولبوعون ۇسلۇپ ىشتەتىلگەن، بىروق سىز qt ئەپ تەتىگىنە سۇپا باش سىيۇجەت قىستۇرمىسىنى قاچالابادىڭىز. ەگەر سىزدىن ىشتەتكەنىڭىز gtk ۇسلۇپى بولسو، بۇل ماسەلەنى بىر تاراپ قىلۇۇ جاسوو ،اتقارۇۇ ۉچۉن qt 5 gtk 2 platform theme تولۇعۇن قاچالاپ سىناپ باعىڭ. Peony is disabled to start ! Peony Qt Peony Qt ۅجۅت باشقارعىچ Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. اپتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> باسما ۇقۇعۇ ەەلىك ۇقۇعۇ (C):2020، KylinSoft جۇمشاق تەتىك پاي چەكتۉۉ شەركەتى چەكتۉۉ شەركەتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit باردىق Peony-Qt كۅزۅنۅگۉن تاقاپ جانىپ چىعىڭ Show items كۅرسۅتۉۉ تۉرۉ Show folders ۅجۅت قىپچىعىچتى كۅرسۅتۉۉ Show properties قاسىيەتىن كۅرسۅتۉۉ QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed زوردۇق مەنەن تۉشۉرۉ جەڭىلۉۉ بولدۇ . Error: %1 قاتاالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! ساندۇۇ بايانداما شاي قادامدا بۉتۉردۉ دىققات ، شايمان ساامالىعى جەڭىشتۉۉ ابالدا يۇيۇۋېتىلدى ! Unmount failed جۇۇش جەڭىلۉۉ بولدۇ Unable to unmount it, you may need to close some programs, such as: GParted etc. يۈكنى جۇۇعالى بولبويت ، سىز بالكىم الدىن گەەبىر پىروگىراممالاردى ئېتىۋېتىشىڭىز بولۇۇسۇ مۉمكۉن، مىسالى، رايونۇنا بۅلۉنۉپ راداكسىيالاعىچ قاتارلۇۇلار. Error: %1 Do you want to unmount forcely? قاتاالىق كۅرۉلدۉ: ٪1 زوردۇق مەنەن يۇيامدۇق؟ Eject failed تەز كۅرۉنمۅ جەڭىلۉۉ بولدۇ Cancel ارعادان قالتىرىش Eject Anyway قانداقلا بولبوسۇن تەز كۅرۉنمۅ چاستوتا Data synchronization is complete and the device can be safely unplugged! ساندۇۇ باياندامالار شاي قادامدا بۉتۉردۉ دىققات، زاپچاستارى قووپسۇز ابالدا الىپتاشتاعالى بولوت ! Unable to eject %1 %1 قاڭقىما كۅزۅنۅكتۉ چىعارعالى بولبويت PeonyNotify Peony ۇقتۇرۇشتۇ File Manager ۅجۅت باشقارعىچ SortTypeMenu File Name ۅجۅت ناامى Name Time Modified File Size ۅجۅت چوڭدۇعۇ Original Path العاچى جول Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders باردىق ۅجۅت قىسقىچقا قاراتا گەزەكتەكى ىرەتتۅۅنۉ ىشتەتىڭ. By %1 %1 تىن Newest to oldest ەڭ يېڭىسىدىن ەڭ كونىسىغىچە Oldest to newest ەڭ كونىسىدىن ەڭ يېڭىسىغىچە Files from large to small ۅجۅت چوڭدىن كىچىككە قاراتىپ Files from small to large ۅجۅت كىچىكتەن چوڭىغا قاراتىپ Use global sorting 使用全局排序 File Type ۅجۅت تۉرۉ Modified Date ۅزگۅرتۉلگۅن ۇباقتى Modified Data 修改日期 Ascending كىچىكتەن چوڭعو قاراتىپ تىزۉۉ Descending چوڭدىن كىچىككە قاراتىپ تىزۉۉ TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items %1 تۉر Searching for files ... ازىر ۅجۅت ىزدەپ جاتات. . . selected%1%2 选中%1%2 selected %1 items %2 %1 تۉر %2 نى تاندادى %1 items selected %2 items %1 项 选中 %2 项 selected %1 items تاندالعانى %1 تۉر TabWidget Trash شىپىرىندى Clear تازالوو Recover العاچىنا كەلتىرۉۉ Need to save changes to current space conditions? Not Save Save Location: Save as Space Cancel ارعادان قالتىرىش Edit Conditiones Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer كومپىيۇتەر File Type ۅجۅت تۉرۉ File Size ۅجۅت چوڭدۇعۇ File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path تاندا ش جولۇ Warning ەسكەرتۉۉ Error قاتاا Opening such files is not currently supported گەزەكتە بۇل تۉر ۅجۅتتۅرۉن اچۇۇنۇ قولدوبويت. Open failed اچۇۇ جەڭىلۉۉ بولدۇ Open directory failed, you have no permission! مازمۇۇندۇ اچۇۇ جەڭىلۉۉ بولدۇ ، سىزدىن ۇقۇعۇڭۇز جوق! Close advance search. 关闭高级搜索。 Search ىزدۅۅ Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is بولسو Please input key words... تۉيۉندۉۉ سۅزدۅردۉ كىرگىزۉۉ... Please input kay words... 请输入关键词... contains ۅز ىچىنە الات name ناامى type تۉرۉ modify time تۉزۅتۉۉ ۇباقتى file size ۅجۅت چوڭدۇعۇ all باردىق file folder ۅجۅت قىپچىعىچ image سۉرۅت video ايىپ text file تەكىست ۅجۅتۉۉ audio دووش others باشقالار wps file wpsۅجۅتۉۉ today بۉگۉن this week بۇل اپتا this month بۇل اي this year بۇل جىل yesterday كەچە last week الدىنقى اپتا last month الدىنقى اي last year بۇلتۇر before last year file name and content file name Modify Time File Name ۅجۅت ناامى Condition Match Rule year ago 一年前 tiny(0-16K) ازىرااق (0-16K) small(16k-1M) كىچىك (16k-1M) empty(0K) كۅڭدۅي (0K) medium(1M-128M) ورتوسۇ ابال (1M-128M) big(128M-1G) چوڭ (128M-1G) large(1-4G) چوڭۇرااق (1-4G) great(>4G) غايەت چوڭ (>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony ۅجۅت باشقارعۇۇچۇ TopMenuBar Option تاندالما Minimize كىچىرەيتۉۉ Close جابۇۇ peony/translations/peony-qt/peony-qt_vi.ts0000664000175000017500000016624615154271106017772 0ustar fengfeng AboutDialog Dialog Định dạng <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel Dung lượng Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: Đội ngũ dịch vụ và hỗ trợ: Peony Trình quản lý tệp peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Trình quản lý tệp là một phần mềm đồ họa giúp người dùng quản lý các tệp hệ thống, cung cấp cho người dùng các chức năng thao tác tệp thông dụng như xem tệp, sao chép, dán, cắt, xóa, đổi tên, chọn cách mở tệp, tìm kiếm tệp, sắp xếp tệp, xem trước tệp, v.v., giúp người dùng dễ dàng quản lý các tệp hệ thống một cách trực quan trên giao diện. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 Phiên bản: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window Open In New Tab Rename Đổi tên Edit Color Chỉnh sửa màu sắc Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back Lùi về Go Forward Tiến lên Search 搜索 View Type Loại chế độ xem Sort Type Loại sắp xếp Option Tùy chọn Operate Tips Mẹo Go Up Details 详情 &Copy Copy Sao chép &Cut Cut Cắt &Select All Chọn tất cả (&S) Select All Chọn tất cả Deselect All Hủy chọn tất cả &Delete to trash Delete to trash Xóa vào thùng rác Don't find any terminal, please install at least one terminal! Không tìm thấy trình cắm (plugin) dòng lệnh nào, vui lòng kiểm tra xem bạn đã cài đặt ít nhất một trình cắm (plugin) chưa! Select All Item Select Lựa chọn Restore Khôi phục Maximize Phóng to Select Done MoveTo Icon View 图标视图 Chế độ xem biểu tượng List View Chế độ xem danh sách CopyTo Delete Xóa đánh dấu Select path Chọn đường dẫn Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize Cực tiểu hóa Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close Tắt Intel::NavigationSideBar Open In &New Window Open In New &Tab Intel::TitleLabel Files Tệp đính kèm được tải lên MainWindow File Manager Trình quản lý tệp Undo Hủy bỏ Redo Làm lại warn Cảnh báo This operation is not supported. Không hỗ trợ thao tác này. Search Tìm kiến Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn Cảnh báo This operation is not supported. Không hỗ trợ thao tác này. Tips The device is in busy state, please perform this operation later. Thiết bị đang bận, vui lòng thử lại sau. This is an abnormal Udisk, please fix it or format it Đây là một USB bị lỗi, vui lòng sửa chữa hoặc định dạng nó This is an empty drive, please insert a Disc. Đây là ổ đĩa quang trống, vui lòng chèn đĩa vào. Open In New Window Can not open %1, %2 Không thể mở %1, %2 Open In New Tab Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... More tags... NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow Ghim cửa sổ Show Hidden Hiển thị tệp ẩn Show File Extension Hiển thị phần mở rộng tệp Show Create Time Hiển thị thời gian tạo Show Relative Time Hiển thị ngày tương đối Forbid thumbnailing Tắt hình thu nhỏ Resident in Backend Chạy thường trú tronh nền Parallel Operations Cho phép hoạt động đồng thời Set samba password Cài đặt mật khẩu samba Tips The user already has a samba password, do you need to reset the samba password? Người dùng này đã có mật khẩu samba, có cần đặt lại mật khẩu samba không? Samba set user password Cài đặt mật khẩu người dùng Samba Samba password: Mật khẩu Samba: Warning Cảnh báo Samba set password failed, Please re-enter! Cài đặt mật khẩu Samba thất bại, vui lòng nhập lại! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Dịch vụ cấu hình chia sẻ gặp sự cố, vui lòng xác nhận xem có đang thực hiện thao tác chia sẻ nào không, hoặc hãy thiết lập chia sẻ lại! Open each folder in a new window Plugin manager Settings Cài đặt quản lý plugin Show Network Hiển thị hàng xóm trên mạng Connect to Server Kết nối đến máy chủ Help Trợ giúp About Về OperationMenuEditWidget Edit Chỉnh sửa copy paste cut trash Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites Peony::Intel::SideBarFileSystemItem Computer Máy tính 文件系统 System Disk Ổ hệ thống Peony::Intel::SideBarMenu Properties Thuộc tính Delete Symbolic Xóa Unmount Gỡ cài đặt Eject Tống ra format Peony::Intel::SideBarPersonalItem Personal Cá nhân Peony::Intel::SideBarSeparatorItem (No Sub Directory) (Trống) Peony::Intel::SideBarUserDiskItem User Disk Peony::Intel::TabletSideBarFactory Intel Side Bar Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Delete Xóa đánh dấu Cancel Tắt PeonyApplication Peony-Qt 文件管理器 peony-qt Trình quản lý tệp Files or directories to open Tệp hoặc thư mục cần mở [FILE1, FILE2,...] [Tệp 1, Tệp 2, ...] Warning Cảnh báo Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Trình quản lý tệp không thể lấy chủ đề biểu tượng hệ thống, nguyên nhân có thể là: 1. Bạn đang chạy trình quản lý tệp với quyền quản trị viên, mặc dù điều này có nghĩa là bạn có quyền cao hơn, nhưng bạn phải hiểu rằng bạn cũng mất đi một số tính năng mà chỉ người dùng thông thường mới có, chẳng hạn như "Máy tính của tôi" và chủ đề hệ thống. Nếu không phải trường hợp đặc biệt, xin đừng sử dụng tài khoản quản trị viên để mở trình quản lý tệp. 2.Bạn đang sử dụng chủ đề hệ thống không phải là chủ đề mặc định được hỗ trợ bởi qt, và bạn chưa cài đặt plugin nền tảng liên quan. Nếu bạn đang sử dụng chủ đề Gtk làm chủ đề hệ thống, hãy thử cài đặt qt5-gtk2-platformtheme để giải quyết vấn đề này. Peony is disabled to start ! Trình quản lý tệp đã bị vô hiệu hóa! Peony Qt Trình quản lý tệp Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit Tắt tất cả các cửa sổ và thoát Show items Mở thư mục chứa tệp và chọn chúng Show folders Hiển thị nội dung trong thư mục Show properties Mở cửa sổ thuộc tính tệp QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed Gỡ cài đặt cưỡng chế thất bại Error: %1 Lỗi: %1 Data synchronization is complete,the device has been unmount successfully! Dữ liệu đã được đồng bộ hoàn tất, thiết bị đã tháo thành công! Unmount failed Gỡ cài đặt thất bại Unable to unmount it, you may need to close some programs, such as: GParted etc. Không thể gỡ cài đặt, bạn có thể cần tắt một số chương trình trước, chẳng hạn như trình chỉnh sửa phân vùng. Error: %1 Do you want to unmount forcely? Lỗi: %1 Có phải gỡ cài đặt cưỡng chế? Eject failed Lỗi khi đẩy ra Cancel Tắt Eject Anyway Dù sao cũng phải đẩy ra Data synchronization is complete and the device can be safely unplugged! Đồng bộ dữ liệu hoàn tất,có thể rút thiết bị an toàn! Unable to eject %1 PeonyNotify File Manager Trình quản lý tệp SortTypeMenu File Name 文件名称 Name Tên người dùng File Size Original Path Đường dẫn gốc Path Đường dẫn Descending Order Thứ tự giảm dần Ascending Order Thứ tự tăng dần Use current sorting for all folders Tất cả các thư mục sắp xếp theo thứ tự hiện tại By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large Use global sorting 使用全局排序 File Type Loại tệp Modified Date Sửa đổi ngày Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在%2中搜索%1 %1 items %1 mục Searching for files ... Đang tìm kiếm... selected%1%2 选中%1%2 selected %1 items %2 Đã chọn %1 mục %2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items Đã chọn %1 mục TabWidget Trash Xóa Clear Xóa sạch Recover Khôi phục Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Computer Máy tính Condition Điều kiện File Type Loại tệp Modify time File Size File Label Close Filter. 关闭筛选。 Filter 筛选 Select Path Warning Cảnh báo Error Lỗi Opening such files is not currently supported Hiện tại không hỗ trợ mở loại tệp này Open failed Open directory failed, you have no permission! Mở thư mục thất bại,bạn không có quyền truy cập vào thư mục này! Close advance search. 关闭高级搜索。 Search Tìm kiến Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... Vui lòng nhập từ khóa... Please input kay words... 请输入关键词... contains 包含 name type modify time file size all 全部 file folder Thư mục image video text file Văn bản audio others wps file Tệp WPS today this week Tuần này this month Tháng này this year Năm nay yesterday last week last month last year file name and content file name Tên tệp year ago 一年前 tiny(0-16K) Cực tiểu(0-16K) small(16k-1M) Nhỏ hơn(16k-1M) empty(0K) Trống(0K) medium(1M-128M) Trung bình (1M-128M) big(128M-1G) Lớn(128M-1G) large(1-4G) Siêu lớn(1-4G) great(>4G) Cực kỳ lớn (>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony Trình quản lý tệp TopMenuBar Option Tùy chọn Minimize Cực tiểu hóa Close Tắt peony/translations/peony-qt/peony-qt_ug.ts0000664000175000017500000021405515154271106017757 0ustar fengfeng AboutDialog Dialog دىئالوگ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="QRICHTEXT" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Noto Sans CJK SC'; خەت نۇسخىسىنىڭ چوڭلۇقى:10pt; خەت نۇسخىسىنىڭ ئېغىرلىقى:400; font-style:normal;" ><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; تېكىست:0px; خەت نۇسخىسى:11pt;" ><br /></p></body></html> TextLabel TextLabel Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: Peony مودەنگۈل peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. ھۆججەت باشقۇرغۇچى ئابونتلارنىڭ سىستېما ھۆججىتىنى باشقۇرۇشقا ياردەم بېرىدىغان گرافىكىلىق يۇمشاق دېتال. ئۇ ئىشلەتكۈچىلەرنى دائىم ئىشلىتىدىغان ھۆججەت مەشغۇلات ئىقتىدارى بىلەن تەمىنلەيدۇ، مەسىلەن، ھۆججەت كۆرۈش، ھۆججەت كۆچۈرۈش، چاپلاش، كېسىش، ئۆچۈرۈش، ئىسىم ئۆزگەرتىش، ھۆججەت تاللاش، پروگرامما ئېچىش، ھۆججەت ئىزدەش، ھۆججەت تۈرگە ئايرىش، ھۆججەت كۆرۈپ بېقىش قاتارلىقلار. ئابونتلارنىڭ كۆرۈنمە يۈزىدە بىۋاستە سىستېما ھۆججىتىنى بىۋاستە باشقۇرۇش قولايلىق بولىدۇ. Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 نەشرى نومۇرى: %1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window يېڭى كۆزنەكتە ئېچىش Open In New Tab يېڭى بەتكۈچتە ئېچىش Rename ئىسمىنى ئۆزگەرتىش Edit Color رەڭ تەھرىرلەش Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back قايت Go Forward ئالغا ئىلگىرىلەش Search 搜索 View Type كۆرۈش تىپى Sort Type تۈرگە ئايرىش تىپى Option تاللاش Operate Tips مەشغۇلات ئەسكەرتمىسى Go Up ئۈستىگە چىقىش Details 详情 &Copy كۆچۈرۈش(&C) Copy كۆچۈرۈش &Cut كېسىش Cut كېسىش &Select All ھەممىنى تاللاش(&S) Select All ھەممىنى تاللا Deselect All تاللاشنى بىكار قىلىش &Delete to trash ئۆچۈرۈش ئەخلەت ساندۇقىغا Delete to trash ئۆچۈرۈش ئەخلەت ساندۇقىغا Don't find any terminal, please install at least one terminal! تېرمىنال تاپالمىسىڭىز، ئاز دېگەندە بىر تېرمىنال ئورنىتىڭ! Select All Item بارلىق ئەزالارنى تاللاڭ Select تاللاش Restore ئەسلىگە كەلتۈرۈش Maximize چوڭايتىش Select Done تۈگىدى تاللاڭ MoveTo يۆتكەپ بېرىش Icon View 图标视图 سىنبەلگىنى كۆرۈش List View تىزىملىك كۆرۈنۈشى CopyTo كۆچۈرۈش Delete ئۆچۈر Select path يول تاللاش Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize كىچىكلىتىش Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close ياپ Intel::NavigationSideBar Open In &New Window Open In &New كۆزنەك Open In New &Tab يېڭىدا ئېچىش > Tab Intel::TitleLabel Files ھۆججەت MainWindow File Manager ھۆججەت باشقۇرغۇ Undo ئەمەلدىن قالدۇرۇش idm:///新建智能空间 Redo قايتا قىلىش warn ئاگاھلاندۇرۇش This operation is not supported. بۇ مەشغۇلات قوللىمايدۇ. Search ئىزدەش Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder يېڭى ھۆججەت قىسقۇچ NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ئاگاھلاندۇرۇش This operation is not supported. بۇ مەشغۇلات قوللىمايدۇ. Tips ئەسكەرتمە The device is in busy state, please perform this operation later. ئۈسكۈنە ئالدىراش ھالەتتە ئىكەن، سەل تۇرۇپ بۇ مەشغۇلاتنى ئىجرا قىلىڭ. This is an abnormal Udisk, please fix it or format it بۇ نورمالسىز Udisk ، ئوڭشاپ قويۇڭ ياكى فورماتلاپ بېرىڭ This is an empty drive, please insert a Disc. بۇ قۇرۇق قوزغاتقۇچ، دىسكىنى قىستۇرۇڭ. Open In New Window يېڭى كۆزنەكتە ئېچىش Can not open %1, %2 %1, %2 نى ئاچقىلى بولمىدى Open In New Tab يېڭى بەتكۈچتە ئېچىش Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... باشقۇرغۇچى خەتكۈچلىرى... More tags... تېخىمۇ كۆپ خەتكۈچلەر... NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow ئىجازەتنى ساقلاش Show Hidden يۇشۇرۇن كۆرسىتىش Show File Extension ھۆججەت كېڭەيتمىسى كۆرسىتىش Show Create Time ۋاقىت قۇرۇشنى كۆرسىتىش Show Relative Time نىسپىي ۋاقىت كۆرسىتىش Forbid thumbnailing كىچىك كۆرۈنۈشنى مەنئى قىلىش Resident in Backend Backend دا ئولتۇرۇشلۇق Parallel Operations پاراللېل مەشغۇلات Set samba password سامبا پارولىنى بەلگىلەش Tips ئەسكەرتمە The user already has a samba password, do you need to reset the samba password? ئابونىتنىڭ سامبا مەخپىي نومۇرى بار، سامبا مەخپىي نومۇرىنى قايتا بەلگىلەش كېرەكمۇ؟ Samba set user password سامبا ئىشلەتكۈچى پارولىنى بەلگىلەيدۇ Samba password: سامبا پارول: Warning ئاگاھلاندۇرۇش Samba set password failed, Please re-enter! Samba بەلگىلىگەن مەخپىي نومۇر مەغلۇپ بولدى، قايتا كىرگۈزۈڭ! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! ھەمبەھىرلەش سەپلىمىسى مۇلازىمىتىدىن مۇستەسنا، ھەمبەھىرلەش مەشغۇلاتى داۋاملىشىۋاتقان ياكى يوقلىقىنى جەزملەڭ، ياكى ھەمبەھىرنى قايتا بەلگىلەڭ! Open each folder in a new window ھەر بىر ھۆججەت قىسقۇچنى يېڭى كۆزنەكتە ئېچىش Plugin manager Settings قىستۇرما باشقۇرغۇچ تەڭشىكى Show Network تورنى كۆرسىتىش Connect to Server مۇلازىمىتىرغا ئۇلاش Help ياردەم About ھەققىدە OperationMenuEditWidget Edit تەھرىر copy كۆچۈرۈش paste چاپلاش cut كېسىش trash ئەخلەت Peony::Intel::SideBarCloudItem CloudStorage CloudStorage CloudFile CloudFile Peony::Intel::SideBarFavoriteItem Favorites ياخشى كۆرگۈچىلەر Peony::Intel::SideBarFileSystemItem Computer ھېسابلىغۇچ 文件系统 ھۆججەت سىستېمىسى System Disk سىستىما دىسكىسى Peony::Intel::SideBarMenu Properties خۇسۇسىيەتلەر Delete Symbolic سىمۋوللۇق ئۆچۈرۈش Unmount ئېچىۋېتىش Eject چىقىرىش format فورمات Peony::Intel::SideBarPersonalItem Personal شەخسىي Peony::Intel::SideBarSeparatorItem (No Sub Directory) (تارماق مۇندەرىجىسى يوق) Peony::Intel::SideBarUserDiskItem User Disk ئابونت دېسكىسى Peony::Intel::TabletSideBarFactory Intel Side Bar Intel يان بالدىقى Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. سىز بۇ ھۆججەتلەرنى ئۆچۈرۈشنى جەزملەشتۈرەلەمسىز؟ ئۆچۈرۈشكە باشلىغان ھامان، ئۆچۈرۈلگەن ھۆججەت مەڭگۈ ئەسلىگە كەلمەيدۇ. Delete ئۆچۈر Cancel ئەمەلدىن قالدۇرۇش PeonyApplication Peony-Qt 文件管理器 peony-qt peony-qt ھۆججەت باشقۇرغۇچ Files or directories to open ئاچىدىغان ھۆججەت ياكى مۇندەرىجە [FILE1, FILE2,...] [ھۆججەت1, ھۆججەت2,...] Warning ئاگاھلاندۇرۇش Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony-Qt سىستېمىسىنىڭ سىنبەلگە ئۇسلۇبىغا ئېرىشەلمىدى.. ئىككى سەۋەب بۇ مەسىلىنى كەلتۈرۈپ چىقىرىشى مۇمكىن: 1. Peony-Qtبەلكىم روت سالاھىيىتى بىلەن ئىجرا بولۇشى مۇمكىن، بۇ، سىزنىڭ تېخىمۇ يۇقىرى ھوقۇق دائىرىڭىزنىڭ بارلىقىدىن دېرەك بېرىدۇ ئادەتتە چەكلەنگەن ئىشلارنى قىلسا بولىدۇ. لېكىن بىلىشىڭىز كېرەك، ئەگەر سىز يىلتىز مۇندەرىجىسىدە بولسىڭىز، مەۋھۇم ھۆججەت سىستېمىسى بەزى ئىقتىدارلىرىنى يوقىتىدۇ, مەسىلەن، سىز «مېنىڭ كومپيۇتېرىم» نى ئىشلىتەلمەيسىز، باش تېما ۋە سىنبەلگىدىمۇ خاتالىق كۆرۈلۈشى مۇمكىن. شۇڭا، Peony-Qt نى يىلتىزدا ماڭدۇرۇش تەۋسىيە قىلىنمايدۇ. 2. سىزنىڭ سىستېمىڭىزغا qt بولمىغان ئۇسلۇب ئىشلىتىلگەن، ئەمما سىز qt ئەپ دېتالىغا سۇپا باش تېما قىستۇرمىسىنى قاچىلىمىدىڭىز. ئەگەر سىزنىڭ ئىشلەتكىنىڭىز gtk ئۇسلۇبى بولسا، بۇ مەسىلىنى ھەل قىلىش ئۈچۈن qt 5 gtk 2 platform theme بولىقىنى قاچىلاپ سىناپ بېقىڭ. Peony is disabled to start ! مودەنگۈل مېيىپ بولۇپ قالدى ! Peony Qt مودەنگۈل Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. ئاپتور: يۆلەن <lanyue @kylinos. cn> خې مېيخوڭ <hemeihong@ kylinos> cn> نەشر ھوقۇقى ئىگىدارلىق ھوقۇقى (C):2020، KylinSoft يۇمشاق دېتال پاي چەكلىك شىركىتى چەكلىك شىركىتى. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit بارلىق Peony-Qt كۆزنىكىنى تاقاپ چېكىنىپ چىقىڭ Show items كۆرسىتىش تۈرى Show folders ھۆججەت قىسقۇچنى كۆرسىتىش Show properties خاسلىقىنى كۆرسىتىش QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed مەجبۇرىي ئېچىش مەغلۇپ بولدى Error: %1 خاتالىق بايقالدى: %1 /n Data synchronization is complete,the device has been unmount successfully! سانلىق مەلۇمات ماس قەدەملىك تاماملاندى،ئۈسكۈنە ئوڭۇشلۇق ئېچىۋېتىلدى! Unmount failed چۈشۈرۈشتىن مەغلۇپ بولدى Unable to unmount it, you may need to close some programs, such as: GParted etc. ئۇنى ئۆچۈرگىلى بولمىغاچقا، بەزى پروگراممىلارنى تاقاشقا توغرا كېلىدۇ، مەسىلەن: GParted قاتارلىقلار. Error: %1 Do you want to unmount forcely? خاتالىق: %1 زورلۇق بىلەن چۈشۈرمەكچىمۇ؟ Eject failed چىقىرىش مەغلۇپ بولدى Cancel ئەمەلدىن قالدۇرۇش Eject Anyway ئىشقىلىپ چىقىرىش Data synchronization is complete and the device can be safely unplugged! سانلىق مەلۇمات ماس قەدەملىك تاماملاندى، ئۈسكۈنىنى بىخەتەر ئۈزۈۋەتكىلى بولىدۇ! Unable to eject %1 %1 قاڭقىما كۆزنەكنى چىقارغىلى بولمايدۇ PeonyNotify Peony ئۇقتۇرۇشى File Manager ھۆججەت باشقۇرغۇ SortTypeMenu File Name 文件名称 Name نامى Time Modified ۋاقىت ئۆزگەرتىلدى File Size ھۆججەت چوڭلۇقى Original Path ئەسلى يول Path يول Intelligent sort ئەقلىي ئىقتىدارلىق تۈرگە ئايرىش Add Mode ئەندىزە قوشۇش Manual Add Priority قولدا ئالدىن قوشۇش Conditional Screening Priority شەرتلىك تەكشۈرۈشنى ئالدىنقى ئورۇنغا قويۇش Manually added only پەقەت قولدا قوشۇلغان Conditional additions only پەقەت شەرتلىك قوشۇمچە Descending Order تۆۋەنلەش تەرتىپى Ascending Order ئۆرلەش تەرتىپى Use current sorting for all folders بارلىق ھۆججەت قىسقۇچقا قارىتا نۆۋەتتىكى رەتلەشنى ئىشلىتىڭ. By %1 %1 تىن Newest to oldest ئەڭ يېڭى ۋە ئەڭ قەدىمى Oldest to newest ئەڭ قەدىمىدىن ئەڭ يېڭى Files from large to small چوڭىدىن كىچىكگىچە ھۆججەتلەر Files from small to large كىچىكدىن چوڭغىچە ھۆججەت Use global sorting 使用全局排序 File Type ھۆججەت تىپى Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 تۈر Searching for files ... ھازىر ھۆججەت ئىزدەۋاتىدۇ. . . selected%1%2 选中%1%2 selected %1 items %2 %1 تۈر %2 نى تاللىدى %1 items selected %2 items %1 项 选中 %2 项 selected %1 items تاللانغىنى %1 تۈر TabWidget Trash ئەخلەت ساندۇقى Clear تازلاش Recover ئەسلىگە كەلتۈرۈش Need to save changes to current space conditions? نۆۋەتتىكى بوشلۇق شارائىتىدىكى ئۆزگىرىشلەرنى ساقلاش كېرەكمۇ؟ Not Save ساقلانمىدى Save ساقلاش Location: ئورنى: Save as Space بوشلۇق قىلىپ ساقلاش Cancel ئەمەلدىن قالدۇرۇش Edit Conditiones شەرتلەرنى تەھرىرلەش Contains ئۆز ئىچىگە ئالغان Not Contains ئۆز ئىچىگە ئالمايدۇ FileName and FileContent ھۆججەت نامى ۋە ھۆججەت مەزمۇنى Only FileName پەقەت ھۆججەت نامى File smart tags ھۆججەت ئەقلىي ئىقتىدارلىق خەتكۈچلەر Search Settings ئىزدەش تۈرى تەسىس قىلىش After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. ئىندېكس قۇرۇلغاندىن كېيىن، كېيىنكى قېتىم ئىزدەش جەريانىدا ئىزدەش ئاتالغۇسىنى ئۆز ئىچىگە ئالغان ھۆججەت مەزمۇنىنىڭ نەتىجىسىگە ئېرىشكىلى بولىدۇ، بۇ جەرياندا خالىغان ۋاقىتتا بەتتىن چېكىنىپ چىقالايسىز، بىز داۋاملىق ئارقا كۆرۈنۈشتە ئىجادىيەت خىزمىتىنى تاماملايمىز. Computer ھېسابلىغۇچ Condition 条件 File Type ھۆججەت تىپى Modify time 修改时间 File Size ھۆججەت چوڭلۇقى File Label ھۆججەت بەلگىسى Close Filter. 关闭筛选。 Filter سۈزۈش Select Path يول تاللاش Warning ئاگاھلاندۇرۇش Error خاتالىق Opening such files is not currently supported نۆۋەتتە بۇ خىل ھۆججەتلەرنى ئېچىشنى قوللىمايدۇ. Open failed ئېچىش مەغلۇپ بولدى Open directory failed, you have no permission! مۇندەرىجە ئېچىش مەغلۇپ بولدى، سىزنىڭ ئىجازەت يوق! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name نامى type تىپى modify time ۋاقىتنى ئۆزگەرتىش file size ھۆججەت چوڭلۇقى all ھەممىسى file folder ھۆججەت قىسقۇچ image رەسىم video سىن text file تېكىست ھۆججىتى audio ئۈن others باشقىلار Satisfy All Conditions بارلىق شەرتلەرگە ئۇيغۇن بولۇش wps file WPS ھۆججىتى today بۈگۈن this week بۇ ھەپتە this month بۇ ئاي this year بۇ يىل yesterday تۈنۈگۈن last week ئالدىنقى ھەپتە last month ئۆتكەن ئاي last year ئۆتكەن يىلى before last year ئۆتكەن يىلدىن بۇرۇن file name and content ھۆججەت نامى ۋە مەزمۇنى file name ھۆججەت نامى Modify Time ۋاقىتنى ئۆزگەرتىش File Name ھۆججەت نامى Condition Match Rule شەرت ماسلاشتۇرۇش قائىدىسى year ago 一年前 tiny(0-16K) ئازراق (0-16K) small(16k-1M) كىچىك (16k-1M) empty(0K) قۇرۇق (0K) medium(1M-128M) ئوتتۇرا ھال (1M-128M) big(128M-1G) چوڭ (128M-1G) large(1-4G) چوڭراق (1-4G) great(>4G) غايەت چوڭ (>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony مودەنگۈل TopMenuBar Option تاللاش Minimize كىچىكلىتىش Close ياپ peony/translations/peony-qt/peony-qt_cs.ts0000664000175000017500000015331615154271106017753 0ustar fengfeng AboutDialog Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel Service & Support: Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. Version number: %1 Peony FileLabelBox Open In New Window Open In New Tab Rename Edit Color HeaderBar Go Back Go Forward Go Up Icon View List View View Type Sort Type Option &Copy Copy &Cut Cut &Select All Select All Deselect All &Delete to trash Delete to trash Operate Tips Don't find any terminal, please install at least one terminal! Restore Onar Maximize Büyüt Select All Item Select MoveTo CopyTo Delete Select path Select Done Minimize Küçült Close Kapat HeaderBarContainer Minimize Küçült Restore Onar Maximize Büyüt Close Kapat Intel::NavigationSideBar Open In &New Window Open In New &Tab Intel::TitleLabel Files MainWindow idm:///新建智能空间 Undo Redo warn This operation is not supported. Search File Manager Peony Qt Peony Qt New Folder NavigationSideBar All tags... Tüm etiketler... warn This operation is not supported. Tips The device is in busy state, please perform this operation later. This is an abnormal Udisk, please fix it or format it This is an empty drive, please insert a Disc. Open In New Window Can not open %1, %2 Open In New Tab NavigationSideBarContainer All tags... Tüm etiketler... Manager tags... More tags... OperationMenu Advance Search Gelişmiş Arama Keep Allow Show Hidden Show File Extension Show Create Time Show Relative Time Forbid thumbnailing Resident in Backend Parallel Operations Set samba password Tips The user already has a samba password, do you need to reset the samba password? Samba password: Samba set user password Warning Samba set password failed, Please re-enter! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! Open each folder in a new window Plugin manager Settings Show Network Connect to Server Help About OperationMenuEditWidget Edit copy paste cut trash Peony Satisfy All Conditions Peony::Intel::SideBarCloudItem CloudStorage CloudFile Peony::Intel::SideBarFavoriteItem Favorites Peony::Intel::SideBarFileSystemItem Computer 文件系统 System Disk Peony::Intel::SideBarMenu Properties Delete Symbolic Unmount Eject format Peony::Intel::SideBarPersonalItem Personal Peony::Intel::SideBarSeparatorItem (No Sub Directory) Peony::Intel::SideBarUserDiskItem User Disk Peony::Intel::TabletSideBarFactory Intel Side Bar Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. Delete Cancel PeonyApplication Peony-Qt Dosya Yöneticisi peony-qt Dosya Yöneticisi Files or directories to open [FILE1, FILE2,...] Warning Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. Peony is disabled to start ! Peony Qt Peony Qt Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif Hakkı(C): 2019-2020, KYLIN Software Co., Ltd. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, KYLIN Software Co., Ltd. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Yazar: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Telif (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. Close all peony-qt windows and quit Show items Show folders Show properties QObject Force unmount failed Error: %1 Data synchronization is complete,the device has been unmount successfully! Unmount failed Unable to unmount it, you may need to close some programs, such as: GParted etc. Error: %1 Do you want to unmount forcely? Eject failed Cancel Eject Anyway Data synchronization is complete and the device can be safely unplugged! Unable to eject %1 PeonyNotify File Manager SortTypeMenu Name Time Modified File Size Original Path Path Intelligent sort Add Mode Manual Add Priority Conditional Screening Priority Manually added only Conditional additions only Descending Order Ascending Order Use current sorting for all folders By %1 Newest to oldest Oldest to newest Files from large to small Files from small to large File Type Modified Data Düzenlenen Veri TabStatusBar Searching for files ... %1 items selected %1 items %2 selected %1 items TabWidget Trash Clear Recover Need to save changes to current space conditions? Not Save Save Location: Computer Save as Space Cancel Edit Conditiones Warning Error Opening such files is not currently supported Contains Not Contains FileName and FileContent Only FileName File smart tags Search Settings After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. Filter Select Path Open failed Open directory failed, you have no permission! Please input kay words... Lütfen anahtar kelimeler girin ... name type modify time file size all file folder image video text file audio others wps file today this week this month this year yesterday last week last month last year before last year file name and content file name File Type File Size Modify Time File Name File Label Condition Match Rule tiny(0-16K) small(16k-1M) empty(0K) medium(1M-128M) big(128M-1G) large(1-4G) great(>4G) TitleLabel Peony TopMenuBar Option Minimize Küçült Close Kapat peony/translations/peony-qt/peony-qt_mn.ts0000664000175000017500000023321115154271106017751 0ustar fengfeng AboutDialog Dialog ᠶᠠᠷᠢᠯᠴᠠᠭ᠎ᠠ ᠃ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> ᠫ᠂ li】 ᠬᠣᠭᠣᠰᠣᠨ ᠵᠠᠭ᠄ ᠤᠷᠢᠳᠴᠢᠯᠠᠨ ᠰᠣᠯᠢᠬᠤ ᠪᠠᠩᠬᠢ; </style></head><body style=" font-family:'Noto Sans CJK SC'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p></body></html> TextLabel ᠲᠸᠺᠰᠲ ᠱᠤᠰᠢᠭ᠎ᠠ Offical Website: 官方网站: Service & Technology Support: 服务与技术支持: Service & Support: ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦ ᠬᠢᠬᠡᠳ ᠳᠡᠮᠵᠢᠬᠦ ᠪᠦᠯᠬᠦᠮ: Peony ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ peony 文件管理器 Peony is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠳᠠ ᠵᠢᠨ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠹᠠᠢᠯ ᠢ᠋ ᠵᠢᠷᠤᠭᠴᠢᠯᠠᠬᠤ ᠰᠤᠹᠲ᠂ ᠲᠡᠷᠡ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢᠳ ᠲᠤ᠌ ᠪᠠᠢᠩᠭᠤ ᠠᠰᠢᠭᠯᠠᠳᠠᠭ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠴᠢᠳᠠᠪᠬᠢ ᠵᠢ ᠬᠠᠩᠭᠠᠨ᠎ᠠ᠂ ᠵᠢᠱ᠌ᠢᠶᠡᠯᠡᠪᠡᠯ᠂ ᠹᠠᠢᠯ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠦᠵᠡᠬᠦ᠂ ᠹᠠᠢᠯ ᠺᠤᠫᠢᠳᠠᠬᠤ ᠪᠠ ᠨᠠᠭᠠᠬᠤ᠂ ᠡᠰᠬᠡᠬᠦ᠂ ᠤᠰᠠᠳᠬᠠᠬᠤ᠂ ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ᠂ ᠹᠠᠢᠯ ᠨᠡᠬᠡᠬᠡᠬᠦ ᠠᠷᠭ᠎ᠠ ᠵᠢ ᠰᠤᠩᠭᠤᠬᠤ᠂ ᠹᠠᠢᠯ ᠬᠠᠢᠬᠤ᠂ ᠹᠠᠢᠯ ᠵᠢᠭᠰᠠᠭᠠᠬᠤ᠂ ᠹᠠᠢᠯ ᠢ᠋ ᠤᠷᠢᠳᠴᠢᠯᠠᠨ ᠦᠵᠡᠬᠦ ᠬᠡᠬᠦ ᠮᠡᠳᠦ ᠡᠨᠡ ᠨᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠠᠭᠠᠭ ᠭᠠᠳᠠᠷᠭᠤ ᠳᠡᠭᠡᠷ᠎ᠡ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠹᠠᠢᠯ ᠢ᠋ ᠰᠢᠭ᠋ᠤᠳ ᠬᠠᠮᠢᠶᠠᠷᠬᠤ ᠳ᠋ᠤ᠌ ᠳᠦᠬᠦᠮ ᠦᠵᠡᠬᠦᠯᠳᠡᠭ ᠃ Hot Service: 服务热线: File Manager 文件管理器 Version number: %1 ᠬᠡᠪᠯᠡᠯ ᠤ᠋ᠨ ᠨᠤᠮᠸᠷ:%1 File manager is a graphical software to help users manage system files. It provides common file operation functions for users, such as file viewing, file copy, paste, cut, delete, rename, file selection, application opening, file search, file sorting, file preview, etc. it is convenient for users to manage system files intuitively on the interface. 文件管理器是一款帮助用户管理系统文件的图形化的软件,为用户提供常用的文件操作功能,比如文件查看,文件复制、粘贴、剪切、删除、重命名,文件打开方式选择,文件搜索,文件排序,文件预览等,方便用户在界面上直观地管理系统文件。 none FileLabelBox Open In New Window ᠰᠢᠨ᠎ᠡ ᠴᠤᠨᠭᠬᠤᠨ ᠳᠣᠲᠣᠷ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠬᠦ Open In New Tab ᠰᠢᠨ᠎ᠡ ᠱᠣᠰᠢᠭ᠎ᠠ ᠵᠢᠨ ᠨᠢᠭᠤᠷ᠎ᠲᠤ ᠨᠡᠭᠡᠭᠡᠬᠦ Rename ᠳᠠᠬᠢᠨ ᠨᠡᠷᠡᠢᠳᠬᠦ Edit Color ᠦᠩᠬᠡ ᠵᠢ ᠨᠠᠢᠷᠠᠭᠤᠯᠬᠤ Delete 删除标记 Create New Label 创建标记 HeaderBar Create Folder 新建文件夹 Open Terminal 打开终端 Go Back ᠤᠬᠤᠷᠢᠬᠤ Go Forward ᠤᠷᠤᠭᠰᠢᠯᠠᠬᠤ Search 搜索 View Type ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ ᠤ᠋ᠨ ᠵᠠᠭᠪᠤᠷ Sort Type ᠳᠠᠷᠠᠭᠠᠯᠠᠯ ᠤ᠋ᠨ ᠳᠦᠷᠦᠯ ᠵᠦᠢᠯ Option ᠰᠤᠨᠭᠭᠤᠭᠳᠠᠬᠤᠨ Operate Tips ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ Go Up ᠳᠡᠭᠡᠷ᠎ᠡ Details 详情 &Copy ᠺᠤᠫᠢᠳᠠᠬᠤ (&C) Copy ᠺᠤᠫᠢᠳᠠᠬᠤ &Cut & ᠡᠰᠬᠡᠬᠦ Cut ᠬᠠᠢᠴᠢᠯᠠᠬᠤ &Select All ᠪᠦᠬᠦᠨ ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ (&S) Select All ᠪᠦᠬᠦᠨ᠎ᠢ᠋ ᠰᠣᠩᠭᠣᠬᠤ Deselect All ᠰᠣᠩᠭᠣᠭᠤᠯᠢ ᠶᠢ ᠦᠭᠡᠶᠢᠰᠬᠡᠨ᠎ᠡ ᠃ &Delete to trash ᠬᠤᠭᠯᠠᠭᠤᠷ᠎ᠲᠤ᠌ ᠬᠠᠰᠤᠬᠤ Delete to trash ᠬᠠᠰᠤᠵᠤ ᠬᠤᠭᠯᠠᠭᠤᠷ ᠲᠤ᠌ ᠤᠷᠤᠭᠤᠯᠬᠤ Don't find any terminal, please install at least one terminal! ᠶᠠᠮᠠᠷᠴᠤ ᠦᠵᠦᠭᠦᠷ᠎ᠦ᠋ᠨ ᠵᠠᠯᠭᠠᠰᠤ᠎ᠶ᠋ᠢ ᠡᠷᠢᠵᠦ ᠣᠯᠤᠭᠰᠠᠨ ᠥᠬᠡᠢ ᠂ ᠲᠠ ᠠᠳᠠᠭ᠎ᠲᠠᠭᠠᠨ ᠨᠢᠭᠡ᠎ᠶ᠋ᠢ ᠰᠠᠭᠤᠯᠭᠠᠭᠰᠠᠨ᠎ᠢ᠋ᠶ᠋ᠠᠨ ᠪᠠᠲᠤᠯᠠᠭᠠᠷᠠᠢ ! Select All Item ᠪᠦᠬᠦᠨ᠎ᠢ ᠰᠤᠨᠭᠭᠤᠬᠤ Select ᠰᠤᠩᠭᠤᠬᠤ Restore ᠰᠡᠷᠭᠦᠭᠡᠬᠦ Maximize ᠬᠠᠮᠤᠭ ᠤ᠋ᠨ ᠶᠡᠬᠡᠴᠢᠯᠡᠯ Select Done ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠬᠦ MoveTo ᠰᠢᠯᠵᠢᠭᠦᠯᠦᠭᠡᠳ Icon View 图标视图 ᠰᠢᠪᠠᠭ᠎ᠠ ᠵᠢᠨ ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ List View ᠵᠢᠭᠰᠠᠭᠠᠭᠰᠠᠨ ᠬᠠᠷᠠᠭᠠᠨ ᠵᠢᠷᠤᠭ CopyTo ᠺᠤᠫᠢᠳᠠᠭᠠᠳ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Select path ᠵᠠᠮ ᠱᠤᠭᠤᠮ ᠢ᠋ ᠰᠤᠩᠭᠤᠬᠤ Minimize 最小化 Close 关闭 HeaderBarContainer Option 选项 Minimize ᠬᠠᠮᠤᠭ ᠤ᠋ᠨ ᠪᠠᠭᠠᠴᠢᠯᠠᠯ Maximize/Restore 最大化/还原 Restore 还原 Maximize 最大化 Close ᠬᠠᠭᠠᠬᠤ Intel::NavigationSideBar Open In &New Window ᠰᠢᠨ᠎ᠡ ᠴᠣᠩᠬᠣ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ ᠃ Open In New &Tab ᠰᠢᠨ᠎ᠡ ᠪᠡᠷ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠪᠠ ᠰᠣᠩᠭᠣᠬᠤ ᠺᠠᠷᠲ ᠳᠣᠲᠣᠷ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠨ᠎ᠡ ᠃ Intel::TitleLabel Files ᠳᠠᠭᠠᠯᠳᠤᠭᠤᠯᠤᠯ ᠎ᠢ ᠳᠡᠭᠡᠭ᠍ᠰᠢ ᠳᠠᠮᠵᠢᠭᠤᠯᠬᠤ MainWindow File Manager ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Undo ᠬᠦᠴᠦᠨ ᠦᠬᠡᠢ ᠪᠣᠯᠭᠠᠬᠤ idm:///新建智能空间 Redo ᠰᠡᠷᠬᠦᠬᠡᠬᠦ warn ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ This operation is not supported. ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠬᠡᠢ᠃ Search ᠪᠦᠬᠦ ᠳᠠᠯ᠎ᠠ ᠪᠡᠷ ᠬᠠᠢᠬᠤ Tips info 温馨提示 Trash has no file need to be cleaned. 回收站没有文件需要被清空! Delete file Warning 删除文件警告 Delete Permanently 永久删除 Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. 您确定要删除这些文件吗?一旦开始删除,这些文件将不可再恢复。 Peony Qt 文件管理器 New Folder ᠰᠢᠨ᠎ᠡ᠎ᠪᠡᠷ ᠪᠠᠢᠭᠤᠯᠬᠤ ᠹᠠᠢᠯ᠎ᠤᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ NavigationSideBar All tags... 所有标记... Open In &New Window 在新窗口中打开(&N) warn ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ This operation is not supported. ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠬᠡᠢ᠃ Tips ᠰᠠᠨᠠᠭᠤᠯᠬᠤ The device is in busy state, please perform this operation later. ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠶᠠᠭᠠᠷᠠᠤ ᠪᠠᠢᠨ᠎ᠠ ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠲᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ᠎ᠶ᠋ᠢ ᠬᠡᠷᠡᠭᠵᠢᠭᠦᠯᠬᠦ ᠪᠣᠯᠪᠠᠤ This is an abnormal Udisk, please fix it or format it ᠡᠨᠡ ᠪᠣᠯ ᠨᠢᠭᠡᠨ ᠬᠡᠪ᠎ᠦ᠋ᠨ ᠪᠤᠰᠤ U ᠳ᠋ᠢᠰᠺ ᠂ ᠲᠡᠭᠦᠨ᠎ᠢ᠋ ᠵᠠᠰᠠᠬᠤ ᠪᠤᠶᠤ ᠹᠤᠷᠮᠠᠲ᠋ᠯᠠᠭᠠᠷᠠᠢ This is an empty drive, please insert a Disc. ᠡᠨᠡ ᠪᠣᠯ ᠨᠢᠭᠡᠨ ᠬᠣᠭᠣᠰᠣᠨ ᠭᠡᠷᠡᠯᠢᠭ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠂ ᠭᠡᠷᠡᠯᠢᠭ ᠳ᠋ᠢᠰᠺ᠎ᠢ᠋ ᠬᠠᠪᠴᠢᠭᠤᠯ Open In New Window ᠰᠢᠨ᠎ᠡ ᠴᠤᠨᠭᠬᠤᠨ ᠳᠣᠲᠣᠷ᠎ᠠ ᠨᠡᠭᠡᠭᠡᠬᠦ Can not open %1, %2 %1, %2 ᠢ᠋/ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠬᠡᠢ Open In New Tab ᠰᠢᠨ᠎ᠡ ᠱᠣᠰᠢᠭ᠎ᠠ ᠵᠢᠨ ᠨᠢᠭᠤᠷ᠎ᠲᠤ ᠨᠡᠭᠡᠭᠡᠬᠦ Open In New &Tab 在新标签页中打开(&T) NavigationSideBarContainer All tags... 所有标记... Manager tags... ᠢᠯᠭᠠᠬᠤ ᠬᠡᠯᠪᠡᠷᠢ ᠮᠠᠶᠢᠭ More tags... ᠨᠡᠩ ᠤᠯᠠᠨ ᠱᠣᠰᠢᠭ᠎ᠠ NavigationTabBar Computer 计算机 Search "%1" in "%2" 在%2中搜索%1 OperationMenu Advance Search 高级搜索 Keep Allow ᠣᠷᠣᠢ᠎ᠶ᠋ᠢᠨ ᠴᠣᠩᠬᠣ Show Hidden ᠨᠢᠭᠤᠭᠳᠠᠮᠠᠯ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠢᠯᠡᠷᠡᠭᠦᠯᠬᠦ Show File Extension ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠥᠷᠭᠡᠳᠬᠡᠭᠰᠡᠨ ᠨᠡᠷ᠎ᠡ ᠵᠢ ᠢᠯᠡᠷᠡᠬᠦᠯᠬᠦ Show Create Time ᠡᠭᠦᠳᠦᠨ ᠪᠠᠶᠢᠭᠤᠯᠬᠤ ᠴᠠᠭ᠎ᠢ ᠢᠯᠡᠷᠡᠭᠦᠯᠦᠨ᠎ᠡ Show Relative Time ᠬᠠᠷᠢᠴᠠᠨᠭᠭᠤᠢ ᠴᠠᠭ ᠢᠯᠡᠷᠡᠬᠦ Forbid thumbnailing ᠠᠪᠴᠢᠭᠤᠯᠤᠯ ᠵᠢᠷᠤᠭ᠎ᠢ ᠴᠠᠭᠠᠵᠠᠯᠠᠬᠤ Resident in Backend ᠠᠷᠤ ᠵᠢᠨ ᠳᠠᠪᠴᠠᠩ ᠳ᠋ᠤ᠌ ᠪᠠᠢᠩᠭᠤ ᠰᠠᠭᠤᠬᠤ Parallel Operations ᠠᠵᠢᠯᠯᠠᠬᠤᠢ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠶᠠᠪᠤᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠵᠥᠪᠰᠢᠶᠡᠷᠡᠬᠦ Set samba password samba ᠬᠠᠮᠲᠤ ᠡᠳ᠋ᠯᠡᠬᠦ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋᠎ᠢ᠋ ᠵᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ Tips ᠰᠠᠨᠠᠭᠤᠯᠬᠤ The user already has a samba password, do you need to reset the samba password? ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ samba ᠬᠠᠮᠲᠤ ᠡᠳ᠋ᠯᠡᠬᠦ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋᠎ᠢ᠋ ᠵᠣᠬᠢᠷᠠᠭᠤᠯᠪᠠ ᠂ ᠳᠠᠬᠢᠨ ᠵᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠬᠦᠰᠡᠵᠦ ᠪᠠᠢᠬᠤ ᠤᠤ ? Samba set user password Samba ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠢ᠋ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ Samba password: Samba ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋: Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Samba set password failed, Please re-enter! Samba ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠢ᠋ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ᠂ ᠳᠠᠬᠢᠨ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ! Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share! ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠤᠭ᠎ᠠ ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠡ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ᠂ ᠶᠠᠪᠤᠭᠳᠠᠵᠤ ᠪᠤᠢ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠤᠭ᠎ᠠ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠪᠠᠢᠬᠤ ᠡᠰᠡᠬᠦ ᠵᠢ ᠪᠠᠳᠤᠯᠠᠭᠠᠷᠠᠢ᠂ ᠡᠰᠡᠪᠡᠯ ᠬᠠᠮᠳᠤᠪᠠᠷ ᠡᠳ᠋ᠯᠡᠬᠦ ᠵᠢ ᠳᠠᠬᠢᠨ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠤᠭᠠᠷᠠᠢ! Open each folder in a new window ᠰᠢᠨ᠎ᠡ ᠴᠣᠩᠬᠣᠨ᠎ᠳ᠋ᠤ᠌ ᠹᠠᠢᠯ ᠬᠠᠪᠴᠢᠭᠤᠷ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ Plugin manager Settings ᠤᠭᠯᠠᠭᠤᠷᠭ᠎ᠠ ᠲᠣᠨᠣᠭ᠎ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ᠎ᠶ᠋ᠢᠨ ᠵᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯ Show Network ᠨᠧᠲ ᠳᠡᠭᠡᠷᠡᠬᠢ ᠰᠠᠭᠠᠬᠠᠯᠲᠠ ᠢᠯᠡᠷᠡᠬᠦ Connect to Server ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠦᠷ ᠎ᠢ ᠬᠣᠯᠪᠣᠨ᠎ᠠ Help ᠬᠠᠪᠰᠤᠷᠤᠯᠭ᠎ᠠ About ᠲᠤᠬᠠᠢ OperationMenuEditWidget Edit ᠨᠠᠢᠷᠠᠭᠤᠯᠬᠤ copy ᠺᠤᠫᠢᠳᠠᠬᠤ paste ᠨᠠᠭᠠᠬᠤ cut ᠡᠰᠬᠡᠵᠤ ᠠᠪᠬᠤ trash ᠬᠠᠰᠤᠬᠤ Peony Satisfy All Conditions ᠪᠤᠢ ᠪᠥᠬᠥᠢ ᠨᠥᠬᠥᠴᠡᠯ ᠢ ᠬᠠᠩᠭᠠᠨ᠎ᠠ ᠃ Peony::Intel::SideBarCloudItem CloudStorage ᠡᠭᠦᠯᠡᠨ ᠬᠠᠳᠠᠭᠠᠯᠠᠮᠵᠢ CloudFile ᠡᠭᠦᠯᠡᠨ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ Peony::Intel::SideBarFavoriteItem Favorites ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ Peony::Intel::SideBarFileSystemItem Computer ᠺᠤᠮᠫᠢᠦᠲᠸᠷ 文件系统 ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠰᠢᠰᠲ᠋ᠧᠮ System Disk ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠲᠠᠪᠠᠭ Peony::Intel::SideBarMenu Properties ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ᠎ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠠᠲᠤ ᠴᠢᠨᠠᠷ Delete Symbolic ᠬᠠᠰᠤᠬᠤ Unmount ᠤᠰᠠᠳᠬᠠᠬᠤ Eject ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠬᠤ format ᠠᠩᠬᠠᠵᠢᠭᠤᠯᠬᠤ Peony::Intel::SideBarPersonalItem Personal ᠬᠤᠪᠢ ᠬᠥᠮᠦᠨ Peony::Intel::SideBarSeparatorItem (No Sub Directory) (᠎ᠬᠣᠭᠣᠰᠣᠨ ) Peony::Intel::SideBarUserDiskItem User Disk ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ᠎ᠶ᠋ᠢᠨ ᠲᠠᠪᠠᠭ Peony::Intel::TabletSideBarFactory Intel Side Bar Intel ᠬᠠᠵᠠᠭᠤ ᠪᠤᠯᠤᠨᠭ Peony::SearchWidget Search 搜索 Peony::TrashWarnDialog Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again. ᠲᠠ ᠨᠡᠬᠡᠷᠡᠨ ᠡᠳᠡᠭᠡᠷ ᠹᠠᠢᠯ ᠢ᠋ ᠬᠠᠰᠤᠵᠤ ᠬᠠᠶᠠᠬᠤ ᠤᠤ? ᠬᠠᠰᠤᠵᠤ ᠡᠬᠢᠯᠡᠭᠰᠡᠬᠡᠷ ᠡᠳᠡᠭᠡᠷ ᠹᠠᠢᠯ ᠢ᠋ ᠳᠠᠬᠢᠵᠤ ᠰᠡᠷᠬᠦᠬᠡᠵᠤ ᠳᠡᠢᠯᠬᠦ ᠦᠬᠡᠢ Delete ᠤᠰᠠᠳᠬᠠᠠᠬᠤ Cancel ᠪᠣᠯᠢᠬᠤ PeonyApplication Peony-Qt 文件管理器 peony-qt ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Files or directories to open ᠨᠡᠬᠡᠬᠡᠬᠦ ᠴᠢᠬᠤᠯᠠᠳᠠᠢ ᠹᠠᠢᠯ ᠪᠤᠶᠤ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ [FILE1, FILE2,...] [ ᠹᠠᠢᠯ1,ᠹᠠᠢᠯ2...] Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Peony-Qt can not get the system's icon theme. There are 2 reasons might lead to this problem: 1. Peony-Qt might be running as root, that means you have the higher permission and can do some things which normally forbidden. But, you should learn that if you were in a root, the virtual file system will lose some featrue such as you can not use "My Computer", the theme and icons might also went wrong. So, run peony-qt in a root is not recommended. 2. You are using a non-qt theme for your system but you didn't install the platform theme plugin for qt's applications. If you are using gtk-theme, try installing the qt5-gtk2-platformtheme package to resolve this problem. ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠰᠢᠪᠠᠭ᠎ᠠ ᠵᠢᠨ ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠢ᠋ ᠤᠯᠵᠤ ᠴᠢᠳᠠᠬᠤ ᠦᠬᠡᠢ ᠵᠢᠨ ᠰᠢᠯᠳᠠᠭᠠᠨ ᠨᠢ: 1.ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠪᠡᠷ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ ᠢ᠋ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠵᠤ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠡᠨᠡ ᠨᠢ ᠬᠡᠳᠦᠢᠪᠡᠷ ᠲᠠᠨ ᠳ᠋ᠤ᠌ ᠨᠡᠩ ᠶᠡᠬᠡ ᠡᠷᠭᠡ ᠲᠠᠢ ᠭᠡᠳᠡᠭ ᠢ᠋ ᠬᠠᠷᠠᠭᠤᠯᠵᠤ ᠪᠠᠢᠭ᠎ᠠ ᠪᠤᠯᠪᠠᠴᠤ ᠲᠠ ᠵᠠᠪᠠᠯ ᠡᠩ ᠤ᠋ᠨ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠳᠤᠤᠷ᠎ᠠ ᠰᠠᠶᠢ ᠪᠠᠢᠳᠠᠭ ᠤᠨᠴᠠᠯᠢᠭ ᠤ᠋ᠳ ᠵᠢᠨᠨ ᠠᠯᠳᠠᠭᠰᠠᠨ ᠵᠢᠨᠨ ᠤᠢᠯᠠᠭᠠᠬᠤ ᠬᠡᠷᠡᠭᠳᠡᠢ ᠵᠢᠱ᠌ᠢᠶᠡᠯᠡᠪᠡᠯ " ᠮᠢᠨᠤ ᠺᠤᠮᠫᠢᠦ᠋ᠲᠸᠷ" ᠵᠢᠴᠢ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠬᠡᠷᠪᠡ ᠤᠨᠴᠠᠭᠠᠢ ᠪᠠᠢᠳᠠᠯ ᠪᠢᠰᠢ ᠪᠤᠯ ᠪᠢᠳᠡᠬᠡᠢ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠪᠡᠷ ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠷᠡᠢ. 2. ᠲᠠᠨ ᠤ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠪᠠᠢᠭ᠎ᠠ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠪᠤᠯ qt ᠠᠶᠠᠳᠠᠯ ᠳᠡᠮᠵᠢᠬᠦ ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠪᠢᠰᠢ᠂ ᠳᠡᠬᠡᠬᠦ ᠮᠦᠷᠳᠡᠭᠡᠨ ᠲᠠ ᠬᠠᠮᠢᠶᠠᠳᠠᠢ ᠳᠠᠪᠴᠠᠩ ᠤ᠋ᠨ ᠤᠭᠯᠤᠷᠭ᠎ᠠ ᠲᠤᠨᠤᠭ ᠢ᠋ ᠤᠭᠰᠠᠷᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ ᠬᠡᠷᠪᠡ ᠲᠠ ᠶᠠᠭ Gtk ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠰᠢᠰᠲ᠋ᠧᠮ ᠤ᠋ᠨ ᠭᠤᠤᠯ ᠰᠡᠳᠦᠪ ᠪᠤᠯᠭᠠᠭᠰᠠᠨ ᠪᠤᠯ qt5-gtk2-platformtheme ᠢ᠋/ ᠵᠢ ᠤᠭᠰᠠᠷᠴᠤ ᠲᠤᠰ ᠠᠰᠠᠭᠤᠳᠠᠯ ᠢ᠋ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠬᠦ ᠪᠡᠷ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠤᠯᠤᠨ᠎ᠠ. Peony is disabled to start ! ᠹᠠᠢᠯ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ᠎ᠢ ᠡᠬᠢᠯᠡᠵᠦ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ ᠵᠢ ᠴᠠᠭᠠᠵᠠᠯᠠᠪᠠ Peony Qt ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2020, KylinSoft Co., Ltd. ᠵᠤᠬᠢᠶᠠᠭᠴᠢ: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> ᠬᠡᠪᠯᠡᠯ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠲᠠᠢ(C): 2020, ᠴᠢ ᠯᠢᠨ ᠰᠤᠹᠲ ᠤ᠋ᠨ ᠬᠢᠵᠠᠭᠠᠷᠳᠤ ᠺᠤᠮᠫᠠᠨᠢ. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Author: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, KYLIN Software Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,麒麟软件有限公司. Authour: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> Copyright (C): 2019-2020, Tianjin KYLIN Information Technology Co., Ltd. 作者: Yue Lan <lanyue@kylinos.cn> Meihong He <hemeihong@kylinos.cn> 版权所有(C): 2019-2020,天津麒麟信息技术有限公司. Close all peony-qt windows and quit ᠪᠦᠬᠦ ᠴᠤᠩᠬᠤ ᠵᠢ ᠬᠠᠭᠠᠭᠠᠳ ᠪᠤᠴᠠᠵᠤ ᠭᠠᠷᠬᠤ Show items ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠪᠠᠢᠭ᠎ᠠ ᠭᠠᠷᠴᠠᠭ ᠢ᠋ ᠨᠡᠬᠡᠬᠡᠳ ᠳᠡᠳᠡᠨᠡᠷ ᠢ᠋ ᠰᠤᠩᠭᠤᠬᠤ Show folders ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤᠨ ᠳ᠋ᠡᠬᠢ ᠠᠭᠤᠯᠭ᠎ᠠ ᠵᠢ ᠢᠯᠡᠷᠡᠬᠦᠯᠬᠦ Show properties ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠷᠢᠶᠡᠳᠦ ᠴᠢᠨᠡᠷ ᠤ᠋ᠨ ᠴᠤᠩᠬᠤ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠬᠦ QObject Error 错误 Can not open %1. 无法打开 %1. Force unmount failed ᠠᠯᠪᠠᠳᠠᠯᠭ᠎ᠠ᠎ᠪᠠᠷ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠢᠯᠠᠭᠳᠠᠪᠠ Error: %1 ᠪᠤᠷᠤᠭᠤ: %1 Data synchronization is complete,the device has been unmount successfully! ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠪᠡ ᠂ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠨᠢᠭᠡᠨᠲᠡ ᠠᠮᠵᠢᠯᠲᠠ᠎ᠲᠠᠢ ᠪᠠᠭᠤᠯᠭᠠᠪᠠ ! Unmount failed ᠠᠴᠢᠶ᠎ᠠ ᠪᠠᠭᠤᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ Unable to unmount it, you may need to close some programs, such as: GParted etc. ᠪᠠᠭᠤᠯᠭᠠᠬᠤ᠎ᠶ᠋ᠢ ᠬᠠᠰᠤᠬᠤ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ ᠂ ᠲᠠ ᠪᠠᠷᠤᠭ ᠤᠷᠢᠳᠠᠪᠡᠷ ᠵᠠᠷᠢᠮ ᠫᠷᠤᠭ᠌ᠷᠠᠮ᠎ᠢ᠋ ᠬᠠᠭᠠᠬᠤ ᠴᠢᠬᠤᠯᠠᠲᠠᠢ ᠂ ᠵᠢᠱ᠌ᠢᠶᠡᠯᠡᠪᠡᠯ ᠬᠤᠪᠢᠶᠠᠷᠢ ᠲᠤᠭᠤᠷᠢᠭ ᠤ᠋ᠨ ᠨᠠᠢᠷᠠᠭᠤᠯᠤᠭᠤᠷ ᠵᠡᠷᠭᠡ ᠃ Error: %1 Do you want to unmount forcely? ᠪᠤᠷᠤᠭᠤ: %1 ᠠᠯᠪᠠ ᠪᠡᠷ ᠪᠠᠭᠤᠯᠭᠠᠬᠤ ᠤᠤ? Eject failed ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠴᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Cancel ᠪᠣᠯᠢᠬᠤ Eject Anyway ᠠᠯᠪᠠ᠎ᠪᠡᠷ ᠦᠰᠦᠷᠴᠤ ᠭᠠᠷᠬᠤ Data synchronization is complete and the device can be safely unplugged! ᠳ᠋ᠠᠢᠲ᠋ᠠ᠎ᠶ᠋ᠢ ᠵᠡᠷᠭᠡᠪᠡᠷ ᠪᠡᠶᠡᠯᠡᠭᠦᠯᠪᠡ ᠂ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠰᠤᠭᠤᠯᠵᠤ ᠪᠣᠯᠤᠨ᠎ᠠ ! Unable to eject %1 %1 ᠦᠰᠦᠷᠦᠨ ᠬᠠᠷᠠᠬᠤ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠦᠭᠡᠢ PeonyNotify ᠹᠠᠢᠯ ᠬᠠᠮᠢᠶᠠᠷᠠᠭᠤᠷ᠎ᠤ᠋ᠨ ᠮᠡᠳᠡᠭᠡ File Manager ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ SortTypeMenu File Name 文件名称 Name ᠨᠡᠷ᠎ᠡ Time Modified ᠴᠠᠭ ᠢᠶᠠᠨ ᠵᠠᠰᠠᠨ᠎ᠠ ᠃ File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ Original Path ᠤᠭ ᠤ᠋ᠨ ᠵᠢᠮ Path ᠵᠠᠮ Intelligent sort ᠤᠶᠤᠨᠴᠢ ᠵᠢᠭ᠌ᠰᠠᠭᠠᠯᠲᠠ ᠃ Add Mode ᠨᠡᠮᠡᠬᠦ ᠵᠠᠭᠪᠤᠷ ᠨᠡᠮᠡᠬᠦ Manual Add Priority ᠭᠠᠷ ᠢᠶᠠᠷ ᠢᠶᠠᠨ ᠤᠷᠢᠳᠠᠪᠠᠷ ᠨᠡᠮᠡᠵᠡᠢ ᠃ Conditional Screening Priority ᠨᠥᠬᠥᠴᠡᠯ ᠲᠡᠶ ᠪᠠᠶᠢᠵᠤ ᠤᠷᠢᠳᠠᠪᠠᠷ ᠰᠣᠩᠭᠣᠬᠤ ᠡᠷᠬᠡ ᠲᠡᠶ᠃ Manually added only ᠵᠥᠪᠭᠡᠨ ᠭᠠᠷ ᠢᠶᠠᠷ ᠨᠡᠮᠡᠬᠦ ᠯᠠ ᠃ Conditional additions only ᠵᠥᠪᠭᠡᠨ ᠨᠥᠬᠥᠴᠡᠯ ᠨᠡᠮᠡᠬᠦ Descending Order ᠪᠠᠭᠤᠷᠠᠬᠤ Ascending Order ᠥᠭᠰᠥᠬᠦ ᠶᠠᠪᠤᠴᠠ Use current sorting for all folders ᠪᠦᠬᠦ ᠭᠠᠷᠴᠠᠭ ᠣᠳᠣᠬᠢ ᠳᠠᠷᠠᠭᠠᠯᠠᠯ᠎ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ By %1 ᠳᠠᠷᠤᠬᠤ%1 Newest to oldest ᠰᠢᠨ᠎ᠡ ᠡᠴᠡ ᠬᠠᠭᠤᠴᠢᠨ ᠳ᠋ᠤ᠌ Oldest to newest ᠬᠠᠭᠤᠴᠢᠨ ᠡᠴᠡ ᠰᠢᠨ᠎ᠡ ᠳ᠋ᠤ᠌ Files from large to small ᠶᠡᠬᠡ ᠡᠴᠡ ᠪᠠᠭ᠎ᠠ ᠳ᠋ᠤ᠌ Files from small to large ᠪᠠᠭ᠎ᠠ ᠡᠴᠡ ᠶᠡᠬᠡ ᠳ᠋ᠤ᠌ Use global sorting 使用全局排序 File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ Modified Date 修改日期 Modified Data 修改日期 Ascending 升序 Descending 降序 TabStatusBar Current path has: 当前路径包含: %1 folders, %2 files %1 文件夹,%2 文件 %1 folders %1 文件夹 %1 files %1 文件 ; %1 folders ; %1 个文件夹 ; %1 files, %2 total ; %1 个文件, 共%2 ; %1 folder ; %1 个文件夹 ; %1 file, %2 ; %1 个文件, %2 %1 selected 选中%1个 Search "%1" in "%2" 在“%2”中搜索“%1” %1 items %1 ᠲᠥᠰᠦᠯ Searching for files ... ᠶᠠᠭ ᠰᠠᠢᠬᠠᠨ ᠬᠠᠢᠵᠦ ᠪᠣᠢ selected%1%2 选中%1%2 selected %1 items %2 % 1 ᠲᠥᠰᠦᠯ᠎ᠢ ᠰᠤᠨᠭᠭᠤᠬᠤ % 2 %1 items selected %2 items %1 项 选中 %2 项 selected %1 items %1 ᠲᠥᠰᠦᠯ ᠢ᠋ ᠰᠤᠩᠭᠤᠬᠤ TabWidget Trash ᠬᠤᠭᠯᠠᠭᠤᠷ Clear ᠪᠠᠯᠠᠯᠠᠬᠤ Recover ᠪᠤᠴᠠᠭᠠᠬᠤ Need to save changes to current space conditions? ᠣᠳᠣᠬᠠᠨ ᠤ ᠣᠷᠣᠨ ᠵᠠᠶ ᠶᠢᠨ ᠨᠥᠬᠥᠴᠡᠯ ᠢ ᠥᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠢ ᠤᠤ ? Not Save ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ ᠦᠭᠡᠢ Save ᠰᠢᠷᠪᠢᠬᠡᠳ Location: ᠪᠠᠢᠷᠢᠰᠢᠯ: Save as Space ᠠᠰᠲᠠᠭᠠᠨ ᠬᠠᠳᠠᠭᠠᠯᠠᠬᠤ ᠨᠢ ᠣᠷᠣᠨ ᠵᠠᠶ ᠪᠣᠯᠣᠨ᠎ᠠ ᠃ Cancel ᠪᠣᠯᠢᠬᠤ Edit Conditiones ᠨᠠᠢ᠌ᠷᠠᠭᠤᠯᠬᠤ ᠨᠥᠬᠥᠴᠡᠯ ᠃ Contains ᠠᠭᠤᠯᠠᠭᠳᠠᠬᠤ Not Contains ᠪᠠᠭᠲᠠᠭᠠᠬᠤ ᠦᠭᠡᠢ᠃ FileName and FileContent ᠹᠢᠯᠧᠨᠮ ᠪᠣᠯᠣᠨ ᠹᠢᠯᠧᠺᠧᠲ᠋ ᠃ Only FileName ᠵᠥᠪᠭᠡᠨ ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠨᠡᠷ᠎ᠡ ᠃ File smart tags ᠪᠢᠴᠢᠭ᠌ ᠮᠠᠲ᠋ᠧᠷᠢᠶᠠᠯ ᠤᠨ ᠤᠶᠤᠨᠲᠤ ᠲᠡᠮᠳᠡᠭ᠍ ᠃ Search Settings ᠬᠠᠢᠯᠳᠡ ᠵᠢᠨ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯᠲᠠ After the creation of the index, the next search can get the results of the document content containing the search term, during which you can exit the page at any time, we will continue to complete the creation in the background. ᠬᠡᠯᠬᠢᠶᠡᠰᠦ ᠪᠠᠢᠭᠤᠯᠤᠭᠰᠠᠨ᠎ᠤ ᠳᠠᠷᠠᠭ᠎ᠠ᠂ ᠳᠠᠷᠠᠭ᠎ᠠ ᠤᠳᠠᠭ᠎ᠠ ᠬᠠᠢᠪᠠᠯ ᠹᠠᠢᠯ᠎ᠤᠨ ᠠᠭᠤᠯᠭ᠎ᠠ᠎ᠳᠤ ᠡᠷᠢᠯᠲᠡ ᠵᠢᠨ ᠦᠭᠡ ᠠᠭᠤᠯᠤᠭᠰᠠᠨ ᠦᠷ᠎ᠡ ᠳ᠋ᠦᠩ᠎ᠢ ᠤᠯᠵᠦ ᠪᠣᠯᠤᠨ᠎ᠠ᠂ ᠡᠨᠡ ᠬᠤᠭᠤᠴᠠᠭᠠᠨ᠎ᠳᠤ ᠲᠠ ᠴᠠᠭ ᠲᠤᠬᠠᠢ᠎ᠳᠤᠨᠢ ᠨᠢᠭᠤᠷ᠎ᠡᠴᠡ ᠭᠠᠷᠴᠤ ᠪᠣᠯᠤᠨ᠎ᠠ᠂ ᠪᠢᠳᠡ ᠠᠷᠦ ᠲᠠᠪᠴᠠᠩ᠎ᠳᠤ ᠦᠷᠭᠦᠯᠵᠢᠯᠡᠨ ᠪᠠᠢᠭᠤᠯᠤᠨ᠎ᠠ᠃ Computer ᠺᠤᠮᠫᠢᠦᠲᠸᠷ Condition 条件 File Type ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠲᠥᠷᠥᠯ Modify time 修改时间 File Size ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ File Label ᠹᠠᠢᠯ᠎ᠤᠨ ᠲᠡᠮᠳᠡᠭ Close Filter. 关闭筛选。 Filter ᠰᠢᠭᠰᠢᠨ ᠰᠣᠩᠭᠣᠬᠤ Select Path ᠵᠠᠮ ᠱᠤᠭᠤᠮ ᠢ᠋ ᠰᠤᠩᠭᠤᠬᠤ Warning ᠰᠡᠷᠡᠮᠵᠢ ᠥᠭᠬᠦ Error ᠪᠤᠷᠤᠭᠤ Opening such files is not currently supported ᠡᠢᠮᠦ ᠹᠠᠢᠯ᠎ᠢ᠋ ᠨᠡᠭᠡᠭᠡᠬᠦ᠎ᠶ᠋ᠢ ᠲᠦᠷ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ Open failed ᠨᠡᠬᠡᠬᠡᠬᠦ ᠵᠢᠨ ᠠᠷᠭ᠎ᠠ ᠥᠬᠡᠢ Open directory failed, you have no permission! ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠳᠠᠰᠤ ᠵᠢ ᠨᠡᠬᠡᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠲᠠᠨ ᠳ᠋ᠤ᠌ ᠳᠤᠰ ᠭᠠᠷᠴᠠᠭ ᠤ᠋ᠨ ᠡᠷᠬᠡ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ! Close advance search. 关闭高级搜索。 Search 搜索 Choose other path to search. 选择其他搜索路径。 Search recursively 递归搜索 more options 更多选项 Show/hide advance search 显示/隐藏高级搜索 Select path 选择路径 is Please input key words... 请输入关键词... Please input kay words... 请输入关键词... contains 包含 name ᠨᠡᠷᠡᠢᠳᠦᠯ type ᠬᠡᠯᠪᠡᠷᠢ modify time ᠴᠠᠭ ᠵᠠᠰᠠᠬᠤ file size ᠹᠠᠢᠯ᠎ᠤᠨ ᠶᠡᠬᠡ ᠪᠠᠭ᠎ᠠ all ᠪᠦᠬᠦᠢᠯᠡ file folder ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠪᠴᠢᠭᠤᠷ image ᠢᠮᠡᠭᠸ ᠵᠢᠷᠤᠭ video ᠸᠢᠳᠢᠤ᠋ text file ᠲᠧᠺᠰᠲ audio ᠠᠦ᠋ᠳᠢᠤ᠋ others ᠪᠤᠰᠤᠳ Satisfy All Conditions ᠪᠤᠢ ᠪᠥᠬᠥᠢ ᠨᠥᠬᠥᠴᠡᠯ ᠢ ᠬᠠᠩᠭᠠᠨ᠎ᠠ ᠃ wps file WPS ᠹᠠᠢᠯ today ᠥᠨᠥᠳᠦᠷ this week ᠳᠤᠰ ᠭᠠᠷᠠᠭ this month ᠳᠤᠰ ᠰᠠᠷ᠎ᠠ this year ᠡᠨᠡ ᠵᠢᠯ yesterday ᠥᠴᠥᠭᠡᠳᠦᠷ last week ᠲᠦᠷᠦᠭᠦᠦ ᠭᠠᠷᠠᠭ last month ᠲᠦᠷᠦᠭᠦᠦ ᠰᠠᠷ᠎ᠠ last year ᠲᠦᠷᠦᠭᠦᠦ ᠵᠢᠯ before last year ᠨᠢᠳᠤᠨᠤᠨ ᠠᠴᠠ ᠡᠮᠦᠨ᠎ᠡ ᠃ file name and content ᠹᠠᠢᠯ᠎ᠤᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ ᠪᠠ ᠠᠭᠤᠯᠭ᠎ᠠ file name ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠨᠡᠷᠡᠢᠳᠦᠯ Modify Time ᠴᠠᠭ ᠵᠠᠰᠠᠬᠤ File Name ᠹᠠᠢᠯ᠎ᠤ᠋ᠨ ᠨᠡᠷ᠎ᠡ Condition Match Rule ᠨᠥᠬᠥᠴᠡᠯ ᠢ ᠲᠣᠬᠢᠷᠠᠯᠴᠠᠭᠤᠯᠬᠤ ᠳᠦᠷᠢᠮ᠃ year ago 一年前 tiny(0-16K) ᠮᠠᠰᠢ ᠪᠠᠭ᠎ᠠ(0-16K) small(16k-1M) ᠨᠡᠯᠢᠶᠡᠳ ᠪᠠᠭ᠎ᠠ(16k-1M) empty(0K) ᠬᠤᠭᠤᠰᠤᠨ(0K) medium(1M-128M) ᠳᠤᠮᠳᠠ ᠵᠡᠷᠭᠡ(1M-128M) big(128M-1G) ᠶᠡᠬᠡ(128M-1G) large(1-4G) ᠮᠤᠨᠳᠠᠭ ᠶᠡᠬᠡ(1-4G) great(>4G) ᠮᠠᠰᠢ ᠶᠡᠭᠡ(>4G) medium(1M-100M) 中等(1M-100M) big(100M-1G) 很大(100M-1G) large(>1G) 极大(>1G) TitleLabel Peony ᠹᠠᠢᠯ ᠤ᠋ᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠤᠷ TopMenuBar Option ᠰᠤᠨᠭᠭᠤᠭᠳᠠᠬᠤᠨ Minimize ᠬᠠᠮᠤᠭ ᠤ᠋ᠨ ᠪᠠᠭᠠᠴᠢᠯᠠᠯ Close ᠬᠠᠭᠠᠬᠤ peony/translations/clean-translated-resources.sh0000775000175000017500000000016215154271070021144 0ustar fengfengecho "clean qm files..." for file in $(dirname $0)/*/*.qm do echo "delete $file" rm -f ${file} done echo "done" peony/plugin-iface/0000775000175000017500000000000015154271106013177 5ustar fengfengpeony/plugin-iface/plugin-iface.pri0000664000175000017500000000107615154271106016262 0ustar fengfengINCLUDEPATH += $$PWD \ HEADERS += \ $$PWD/emblem-plugin-iface.h \ $$PWD/menu-plugin-iface.h \ $$PWD/plugin-iface.h \ $$PWD/preview-page-plugin-iface.h \ $$PWD/directory-view-plugin-iface.h \ $$PWD/search-plugin-iface.h \ $$PWD/side-bar-plugin-iface.h \ $$PWD/tool-bar-action-plugin-iface.h \ $$PWD/properties-window-tab-iface.h \ $$PWD/properties-window-tab-page-plugin-iface.h \ $$PWD/style-plugin-iface.h \ $$PWD/directory-view-plugin-iface2.h \ $$PWD/vfs-info-plugin-iface.h \ $$PWD/vfs-plugin-iface.h SOURCES += peony/plugin-iface/menu-plugin-iface.h0000664000175000017500000000612115154271070016655 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef MENUPLUGINIFACE_H #define MENUPLUGINIFACE_H #include #include #include #include #include "plugin-iface.h" #define MenuPluginInterface_iid "org.ukui.peony-qt.plugin-iface.MenuPluginInterface" namespace Peony { /** * @brief The MenuPluginInterface class * @details MenuPluginInterface is a Qt Plugin Interface, the methods of this class must all be * pure VIRTUAL and has ZERO as return value. * Otherwise, the plugin will not be loaded correctly. * For example, if we define a virtual QString method, we must do as this: *
 *  virtual QString xxx() = 0;
 * 
* DO NOT FORGET to initial virtual method in class definition. */ class MenuPluginInterface : public PluginInterface { public: /*! * \brief The Type enum * \details * Type is a enum filter which could help you return different actions * by different menu iface type. * For example, if you write a desktop background wrapper plugin, * you should only return your actions when the passing type is * DesktopBackground. */ enum Type { Invalid, DirectoryView, SideBar, DesktopWindow, Other }; Q_DECLARE_FLAGS(Types, Type) virtual ~MenuPluginInterface() {} virtual QString testPlugin() = 0; /*! * \brief menuActions * \param types * \param uri * \param selectionUris * \return * In peony-qt, user can install the menu extensions. This is because * peony-qt's view/menu frameworks is desgined to be extensible. * When a peony view context menu was request it will call the plugin's * menuActions method get the extension actions. * \note * A menu can be more than one type, a desktop background menu is also * could be a directory background menu. This is decied by peony-qt's * view/menu framework itself. * You can only implement one type of a menu, but you should never directly * return the actions without a type check, this might cause actions in menu * duplicated. */ virtual QList menuActions(Types types, const QString &uri, const QStringList &selectionUris) = 0; }; } Q_DECLARE_OPERATORS_FOR_FLAGS(Peony::MenuPluginInterface::Types) Q_DECLARE_INTERFACE (Peony::MenuPluginInterface, MenuPluginInterface_iid) #endif peony/plugin-iface/vfs-info-plugin-iface.h0000664000175000017500000001047115154271106017443 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2023, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * */ #ifndef VFSINFOPLUGINIFACE_H #define VFSINFOPLUGINIFACE_H #include "plugin-iface.h" #include "custom-error-handler.h" #include #include #include #define VFSInfoPluginInterface_iid "org.ukui.peony-qt.plugin-iface.VFSInfoPluginInterface" namespace Peony { typedef enum{ ERROR_FAILED, ERROR_NOT_FOUND, ERROR_EXISTS, ERROR_IS_DIRECTORY, ERROR_NOT_DIRECTORY, ERROR_NOT_EMPTY, ERROR_NOT_REGULAR_FILE, ERROR_NOT_SYMBOLIC_LINK, ERROR_NOT_MOUNTABLE_FILE, ERROR_FILENAME_TOO_LONG, ERROR_INVALID_FILENAME, ERROR_TOO_MANY_LINKS, ERROR_NO_SPACE, ERROR_INVALID_ARGUMENT, ERROR_PERMISSION_DENIED, ERROR_NOT_SUPPORTED, ERROR_NOT_MOUNTED, ERROR_ALREADY_MOUNTED, ERROR_CLOSED, ERROR_CANCELLED, ERROR_PENDING, ERROR_READ_ONLY, ERROR_CANT_CREATE_BACKUP, ERROR_WRONG_ETAG, ERROR_TIMED_OUT, ERROR_WOULD_RECURSE, ERROR_BUSY, ERROR_WOULD_BLOCK, ERROR_HOST_NOT_FOUND, ERROR_WOULD_MERGE, ERROR_FAILED_HANDLED, ERROR_TOO_MANY_OPEN_FILES, ERROR_NOT_INITIALIZED, ERROR_ADDRESS_IN_USE, ERROR_PARTIAL_INPUT, ERROR_INVALID_DATA, ERROR_DBUS_ERROR, ERROR_HOST_UNREACHABLE, ERROR_NETWORK_UNREACHABLE, ERROR_CONNECTION_REFUSED, ERROR_PROXY_FAILED, ERROR_PROXY_AUTH_FAILED, ERROR_PROXY_NEED_AUTH, ERROR_PROXY_NOT_ALLOWED, ERROR_BROKEN_PIPE, ERROR_CONNECTION_CLOSED = ERROR_BROKEN_PIPE, ERROR_NOT_CONNECTED, ERROR_MESSAGE_TOO_LARGE, ERROR_NO }ErrorType; typedef enum{ INVALID = 0, STRING, BYTESTRING, BOOLEAN, UINT32, INT32, UINT64, INT64, OBJECT, STRINGV }AttributeType; typedef enum{ NONE = 0, NOFOLLOWSYMLINKS = (1 << 0) }QueryFlag; Q_DECLARE_FLAGS(QueryFlags, QueryFlag) struct VFSError { ErrorType code = ERROR_NO; QString message; }; class PEONYCORESHARED_EXPORT HanderTransfer : public QObject { Q_OBJECT public: explicit HanderTransfer(QObject* parent = nullptr); Q_SIGNALS: void fileCreate(const QString &path); void fileDelete(const QString &path); void fileChanged(const QString &path); void fileRenamed(const QString &oldPath, const QString &newPath); }; class FileVFSInfo; class PEONYCORESHARED_EXPORT VFSInfoPluginIface : public PluginInterface { public: virtual ~VFSInfoPluginIface() {} virtual QString pathScheme() = 0; virtual bool holdInSideBar() = 0; virtual QString displayName() = 0; virtual QString displayIcon() = 0; virtual CustomErrorHandler *customErrorHandler() = 0; virtual QStringList fileEnumerator(const QString &path) = 0; virtual std::shared_ptr queryFile(const QString &path) = 0; //file operation virtual VFSError* handerMakeDirectory(const QString &uri, bool &ret) = 0; virtual VFSError* handerFileCreate(const QString &uri, bool &ret) = 0; virtual VFSError* handerFileDelete(const QString &uri, bool &ret) = 0; virtual VFSError* handerFileCopy(const QString &sourceUri, const QString &destUri, bool &ret) = 0; virtual VFSError* handerFileMove(const QString &sourceUri, const QString &destUri, bool &ret) = 0; virtual VFSError* handerFileRename(const QString &sourceUri, const QString &newName) = 0; virtual void handerMonitorDirectory(HanderTransfer *transfer, const QString &uri) = 0; virtual VFSError* handleSetAttribute(const QString &uri, const QString attribute, AttributeType type, QueryFlags flags, void* value, bool &ret) = 0; }; } Q_DECLARE_INTERFACE(Peony::VFSInfoPluginIface, VFSInfoPluginInterface_iid) #endif // VFSINFOPLUGINIFACE_H peony/plugin-iface/emblem-plugin-iface.h0000664000175000017500000000245315154271070017156 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef EMBLEMPLUGINIFACE_H #define EMBLEMPLUGINIFACE_H #include "plugin-iface.h" #include "peony-core_global.h" #include "emblem-provider.h" #define EmblemPluginInterface_iid "org.ukui.peony-qt.plugin-iface.EmblemPluginInterface" namespace Peony { class PEONYCORESHARED_EXPORT EmblemPluginInterface : public PluginInterface { public: virtual ~EmblemPluginInterface() {} virtual EmblemProvider *create() = 0; }; } Q_DECLARE_INTERFACE (Peony::EmblemPluginInterface, EmblemPluginInterface_iid) #endif // EMBLEMPLUGINIFACE_H peony/plugin-iface/vfs-plugin-iface.h0000664000175000017500000000526115154271070016513 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef VFSPLUGINIFACE_H #define VFSPLUGINIFACE_H #include "plugin-iface.h" #include "peony-core_global.h" #include "custom-error-handler.h" #define VFSPluginInterface_iid "org.ukui.peony-qt.plugin-iface.VFSPluginInterface" namespace Peony { class PEONYCORESHARED_EXPORT VFSPluginIface : public PluginInterface { public: virtual ~VFSPluginIface() {} /*! * \brief uriScheme * \return * \details * indicate the uri scheme you want to register. */ virtual QString uriScheme() = 0; /*! * \brief holdInSideBar * \return * \details * indicate if it should display as an parent item in sidebar. */ virtual bool holdInSideBar() = 0; /*! * \brief initVFS * \details * peony will init your custom app vfs with this interface at early stage. * you should call g_vfs_register_uri_scheme() in your own implement to register * your vfs into peony. * \note * you should implement your vfs registion with your uri scheme. */ virtual void initVFS() = 0; /*! * \brief parseUriToVFSFile * \param uri * \return a GFile Handler represent crosponding uri. * \details * backup function for while register costom uri scheme is not supported. * \note * in old glib version, there is no g_vfs_register_uri_scheme(), and in new * glib, register a vfs into system is asynchronous, those means it might not be * registered and can not use GVfsFileLookupFunc to get file handler. */ virtual void* parseUriToVFSFile(const QString &uri) = 0; /*! * \brief customErrorHandler * \return * custom error handler for this vfs. normally it using with FileEnumerator::prepare(), * and FileEnumerator::handleError(). */ virtual CustomErrorHandler *customErrorHandler() = 0; }; } Q_DECLARE_INTERFACE(Peony::VFSPluginIface, VFSPluginInterface_iid) #endif // VFSPLUGINIFACE_H peony/plugin-iface/preview-page-plugin-iface.h0000664000175000017500000000340215154271070020303 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PREVIEWPAGEPLUGINIFACE_H #define PREVIEWPAGEPLUGINIFACE_H #include #include #include #include "plugin-iface.h" #define PreviewPagePluginIface_iid "org.ukui.peony-qt.plugin-iface.PreviewPagePluginInterface" namespace Peony { class PreviewPageIface; class PreviewPagePluginIface : public PluginInterface { public: virtual ~PreviewPagePluginIface() {} virtual PreviewPageIface *createPreviewPage() = 0; }; class PreviewPageIface { public: enum PreviewType { Attribute, Text, Pictrue, PDF, OfficeDoc, Other }; virtual ~PreviewPageIface() {} virtual void prepare(const QString &uri, PreviewType type) = 0; virtual void prepare(const QString &uri) = 0; virtual void startPreview() = 0; virtual void cancel() = 0; virtual void closePreviewPage() = 0; }; } Q_DECLARE_INTERFACE(Peony::PreviewPagePluginIface, PreviewPagePluginIface_iid) #endif // PREVIEWPAGEPLUGINIFACE_H peony/plugin-iface/directory-view-plugin-iface.h0000664000175000017500000002136115154271106020670 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef DIRECTORYVIEWPLUGINIFACE_H #define DIRECTORYVIEWPLUGINIFACE_H #include "plugin-iface.h" #include #include #define DirectoryViewPluginIface_iid "org.ukui.peony-qt.plugin-iface.DirectoryViewPluginInterface" namespace Peony { class DirectoryViewIface; class DirectoryViewProxyIface; class FileItemModel; class FileItemProxyFilterSortModel; /*! * \brief The DirectoryViewPluginIface class * \details * It is a few complex to implement a peony-qt's directory view's plugin. * There are 3 interface class must to be implemented. * 1. DirectoryViewPluginIface: * This is the entry of a plugin, peony-qt's application will dynamicly * load external view modules when it started. After a plugin loaded * it will be registered in peony-qt's application globally, then we can * create such a view by create(); * \see DirectoryViewFactoryManager * * 2. DirectoryViewIface: * This class define a set of methods a dervied class of directory view * must implement. a dervied view could most be a dervied QAbstractItemView, * such as QListView or QTreeView, but not certain. * the directory view must implement these virtual method and make them * seem worked in there own implement. * \see DirectoryViewIface * * 3. DirectoryViewProxyIface * \see DirectoryViewProxyIface * * \deprecated * This interface is deprecated, and it should be removed from codes. * * To make a directory view extension, * you have to implement DirectoryViewPluginIface2, not this. * * \see * DirectoryViewPluginIface2 */ class DirectoryViewPluginIface : public PluginInterface { public: virtual ~DirectoryViewPluginIface() {} virtual QString viewIdentity() = 0; virtual QIcon viewIcon() = 0; virtual bool supportUri(const QString &uri) = 0; /*! * \brief zoom_level_hint * \return the description value of this type of view's zoom level. * \details * Peony-Qt doesn't deal the zoom level in a kind of view. Insteadly, * there is a value for a view for describing its zoom level. Through * this zoom level, Peony-Qt can realize "zoom in/out" by switch the view's * type. * * We usually use the Peony-Qt's default icon view. Its zoom level hint is 100. * If you want to implement a larger directory view extension you should set the * zoom level hint bigger than the default one, vice versa. */ virtual int zoom_level_hint() = 0; /*! * \brief priority * \return the priority of view that should be show when went to a location. * \details * In Peony-Qt, there are some special view should be shown when we went to some * special directory, such as computer, it should be shown as a computer view. * Peony-Qt first judge if it should switch the view if there is a higher-priority * view than current view when the location change begin. * * The default icon view and details view's priority value is 0. If you want to * implement an extension view replace the current view in some location, you should * set the priority value larger than the default one. */ virtual int priority(const QString &directoryUri) = 0; virtual DirectoryViewIface *create() = 0; }; /*! * \brief The DirectoryViewIface class * \details * This class define a set of interface for view operation. * In peony-qt the directory view is desgin to be extensive, * and every kind of view will have a global factory to create * the view's instance. the factories will be managed by peony-qt * in global, too. * A peony-qt's file item view will implement this interface. * \note * Every DirectoryViewIface instance should have a DirectoryViewProxyIface * instance, we usually use this proxy control the view. * \see DirectoryViewProxyIface * * \note * This interface is useless for implement of new directory view extensions, but * it will be keeped for fitting translations about old view (IconView & ListView) and view's factory to * new view (IconView2 & ListView2) and factory. * * To make a directory view extension, * you have to implement DirectoryViewPluginIface2, not this. * * \see * DirectoryViewPluginIface2 */ class DirectoryViewIface { public: virtual ~DirectoryViewIface() {} virtual void bindModel(FileItemModel *sourceModel, FileItemProxyFilterSortModel *proxyModel) = 0; virtual void setProxy(DirectoryViewProxyIface *proxy) = 0; const virtual QString viewId() = 0; //location const virtual QString getDirectoryUri() = 0; //selections const virtual QStringList getSelections() = 0; //children const virtual QStringList getAllFileUris() = 0; /* //loaction void openRequest(const QStringList &uri, bool newWindow); void viewDirectoryChanged(); void viewSelectionChanged(); //menu void menuRequest(const QPoint &pos); //clipboard void cutSelectionsRequest(); void copySelectionsRequest(); void pasteSelectionsRequest(); //zoom void zoomedIn(); void zoomedOut(); */ //location virtual void open(const QStringList &uris, bool newWindow) = 0; virtual void setDirectoryUri(const QString &uri) = 0; virtual void beginLocationChange() = 0; virtual void stopLocationChange() = 0; virtual void closeView() = 0; //selections virtual void setSelections(const QStringList &uris) = 0; virtual void invertSelections() = 0; virtual void scrollToSelection(const QString &uri) = 0; //clipboard virtual void setCutFiles(const QStringList &uris) = 0; virtual DirectoryViewProxyIface *getProxy() = 0; virtual int getSortType() = 0; virtual void setSortType(int sortType) = 0; virtual int getSortOrder() = 0; virtual void setSortOrder(int sortOrder) = 0; //edit virtual void editUri(const QString &uri) = 0; /*! * \brief editUris * \param uris * \todo * implement batch rename */ virtual void editUris(const QStringList uris) = 0; }; /*! * \brief The DirectoryViewProxyIface class * \deprecated * This interface is deprecated, and it should be removed from codes. * To make a directory view extension, * you have to implement DirectoryViewPluginIface2, not this. * * \see * DirectoryViewPluginIface2 */ class DirectoryViewProxyIface: public QObject { Q_OBJECT public: explicit DirectoryViewProxyIface(QObject *parent = nullptr) : QObject(parent) {} ~DirectoryViewProxyIface() {} virtual void switchView(DirectoryViewIface *view) = 0; virtual DirectoryViewIface *getView() = 0; //location const virtual QString getDirectoryUri() = 0; //selections const virtual QStringList getSelections() = 0; //children const virtual QStringList getAllFileUris() = 0; Q_SIGNALS: //loaction //FIXME: support open in new TAB? void openRequest(const QStringList &uri, bool newWindow); void viewDoubleClicked(const QString &uri); void viewDirectoryChanged(); void viewSelectionChanged(); //menu void menuRequest(const QPoint &pos); //window void updateWindowLocationRequest(const QString &uri); public Q_SLOTS: //location virtual void open(const QStringList &uris, bool newWindow) = 0; virtual void setDirectoryUri(const QString &uri) = 0; virtual void beginLocationChange() = 0; virtual void stopLocationChange() = 0; virtual void closeProxy() = 0; //selections virtual void setSelections(const QStringList &uris) = 0; virtual void invertSelections() = 0; virtual void scrollToSelection(const QString &uri) = 0; //clipboard //cut items should be drawn differently. virtual void setCutFiles(const QStringList &uris) = 0; virtual void setSortType(int sortType) = 0; virtual void setSortOrder(int sortOrder) = 0; virtual void editUri(const QString &uri) = 0; virtual void editUris(const QStringList uris) = 0; virtual int getSortType() = 0; virtual int getSortOrder() = 0; }; } Q_DECLARE_INTERFACE(Peony::DirectoryViewPluginIface, DirectoryViewPluginIface_iid) #endif // DIRECTORYVIEWPLUGINIFACE_H peony/plugin-iface/directory-view-plugin-iface2.h0000664000175000017500000000563015154271070020753 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef DIRECTORYVIEWPLUGINIFACE2_H #define DIRECTORYVIEWPLUGINIFACE2_H #include "plugin-iface.h" #include #define DirectoryViewPluginIface2_iid "org.ukui.peony-qt.plugin-iface.DirectoryViewPluginInterface2" namespace Peony { class DirectoryViewWidget; /*! * \brief The DirectoryViewPluginIface2 class * \details * This class is a pure virtual interface class. It defines an extensionalbe * interface for making newly type item view for peony. * * There are 2 kinds of internal implement at peony, icon view and list view. * * \verbatim * * Directory View's Zoom In/Out: * * It is not cool that every view zoom in/out in itself at all. * The zoom of the view should be linked with the view type, * and the transition should be as smooth as possible. * * I defined some rules to indicate how peony zoom its view. * there are 3 mainly parts: * * 1. the default zoom level hint of a view. * 2. the range for a view can be zoomed. * 3. wether a view supports zoomed. * * Zoom level has a range at 0 to 100. The hint should both contained * in the range and between view's min zoom level and max zoom level. * * Due to all view rebase the rules, there could be a common interface controling * the zoom of a window. * * For some special view, it might could not zoom, it better to indicate * with a clearly state for that case. * * \endverbatim * * \see IconView2, ListView2 */ class DirectoryViewPluginIface2 : public PluginInterface { public: virtual ~DirectoryViewPluginIface2() {} virtual QString viewIdentity() = 0; virtual QString viewName() = 0; virtual QIcon viewIcon() = 0; virtual bool supportUri(const QString &uri) = 0; virtual int zoom_level_hint() = 0; virtual int minimumSupportedZoomLevel() = 0; virtual int maximumSupportedZoomLevel() = 0; virtual int priority(const QString &directoryUri) = 0; virtual bool supportZoom() = 0; //virtual void fillDirectoryView(DirectoryViewWidget *view) = 0; virtual DirectoryViewWidget *create() = 0; }; } Q_DECLARE_INTERFACE (Peony::DirectoryViewPluginIface2, DirectoryViewPluginIface2_iid) #endif // DIRECTORYVIEWPLUGINIFACE2_H peony/plugin-iface/properties-window-tab-iface.h0000664000175000017500000000344115154271070020664 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef PROPERTIESWINDOWTABIFACE_H #define PROPERTIESWINDOWTABIFACE_H #include #include "peony-core_global.h" #define PropertiesWindowTabIface_iid "org.ukui.peony-qt.plugin-iface.PropertiesWindowTabInterface" namespace Peony { class PEONYCORESHARED_EXPORT PropertiesWindowTabIface : public QWidget { Q_OBJECT public: PropertiesWindowTabIface(QWidget *parent = nullptr) : QWidget(parent){} virtual ~PropertiesWindowTabIface() {} PropertiesWindowTabIface(); bool m_thisPageChanged = false; /*! * 作为当前页面是否改变的依据 * \brief */ virtual void thisPageChanged() { this->m_thisPageChanged = true; } /*! * \brief 响应确认按钮保存全部数据 */ virtual void saveAllChange() {}; Q_SIGNALS: /*! * 当前tab页面请求关闭窗口 * \brief */ void requestCloseMainWindow(); }; } Q_DECLARE_INTERFACE(Peony::PropertiesWindowTabIface, PropertiesWindowTabIface_iid) #endif // PROPERTIESWINDOWTABIFACE_H peony/plugin-iface/plugin-iface.h0000664000175000017500000000321515154271106015714 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PLUGINIFACE_H #define PLUGINIFACE_H #include #include //#define PluginInterface_iid "org.ukui.peony-qt.PluginInterface" namespace Peony { class PluginInterface { public: enum PluginType { Invalid, MenuPlugin, PreviewPagePlugin, DirectoryViewPlugin, DirectoryViewPlugin2, ToolBarPlugin, PropertiesWindowPlugin, ColumnProviderPlugin, StylePlugin, VFSPlugin, EmblemPlugin, SideBarPlugin, VFSINFOPlugin, SearchPlugin, Other }; virtual ~PluginInterface() {} virtual PluginType pluginType() = 0; virtual const QString name() = 0; virtual const QString description() = 0; virtual const QIcon icon() = 0; virtual void setEnable(bool enable) = 0; virtual bool isEnable() = 0; }; } #endif // PLUGINIFACE_H peony/plugin-iface/search-plugin-iface.h0000664000175000017500000000151515154271106017160 0ustar fengfeng#ifndef SEARCHPLUGINIFACE_H #define SEARCHPLUGINIFACE_H #include #include #define SearchPluginInterface_iid "org.ukui.peony-qt.plugin-iface.SearchPluginInterface" namespace Peony { class PEONYCORESHARED_EXPORT SearchPluginIface : public PluginInterface { public: virtual ~SearchPluginIface() {} virtual bool isSupportUri(const QString &uri) = 0; virtual int priority() = 0; virtual void initSearch(const QString &searchUri = "", const QStringList &searchDir = {""}, const QStringList &searchKey = {""}) = 0; virtual void startSearch() = 0; virtual void stopSearch() = 0; virtual QQueue& getSearchResult() = 0; virtual void resultDequeue() = 0; }; } Q_DECLARE_INTERFACE(Peony::SearchPluginIface, SearchPluginInterface_iid) #endif // SEARCHPLUGINIFACE_H peony/plugin-iface/unstable/0000775000175000017500000000000015154271070015014 5ustar fengfengpeony/plugin-iface/unstable/window-plugin-iface.pri0000664000175000017500000000117115154271070021400 0ustar fengfengINCLUDEPATH += $$PWD \ HEADERS += \ $$PWD/emblem-plugin-iface.h \ $$PWD/main-window-factory-iface.h \ $$PWD/menu-plugin-iface.h \ $$PWD/plugin-iface.h \ $$PWD/preview-page-plugin-iface.h \ $$PWD/directory-view-plugin-iface.h \ $$PWD/side-bar-plugin-iface.h \ $$PWD/tool-bar-action-plugin-iface.h \ $$PWD/properties-window-tab-iface.h \ $$PWD/properties-window-tab-page-plugin-iface.h \ $$PWD/style-plugin-iface.h \ $$PWD/directory-view-plugin-iface2.h \ $$PWD/vfs-info-plugin-iface.h \ $$PWD/vfs-plugin-iface.h \ $$PWD/properties-window-factory-plugin-iface.h SOURCES += peony/plugin-iface/unstable/properties-window-factory-plugin-iface.h0000664000175000017500000000360415154271070024677 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yan Wei Yang * */ #ifndef PROPERTIESWINDOWFACTORYPLUGINIFACE_H #define PROPERTIESWINDOWFACTORYPLUGINIFACE_H #include #include #include #include #include "properties-window-tab-page-plugin-iface.h" #define PropertiesWindowFactoryPluginIface_iid "org.ukui.peony-qt.plugin-iface.PropertiesWindowFactoryPluginIface" namespace Peony { class PropertiesWindowFactoryPluginIface { public: virtual const QString name() = 0; virtual const QString description() = 0; virtual const QIcon icon() = 0; virtual void setEnable(bool enable) = 0; virtual bool isEnable() = 0; virtual ~PropertiesWindowFactoryPluginIface() {} virtual const QString version() = 0; virtual QMainWindow *create(const QStringList &uris, QWidget *parent) = 0; virtual void closeFactory() = 0; virtual bool registerFactory(QObject *factory) = 0; virtual bool unregisterFactory(QObject *factory) = 0; virtual void show() = 0; }; } Q_DECLARE_INTERFACE(Peony::PropertiesWindowFactoryPluginIface, PropertiesWindowFactoryPluginIface_iid) #endif // PROPERTIESWINDOWTABPAGEPLUGINIFACE_H peony/plugin-iface/unstable/main-window-factory-iface.h0000664000175000017500000000311415154271070022127 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yan Wei Yang * */ #ifndef MAINWINDOWFACTORYIFACE_H #define MAINWINDOWFACTORYIFACE_H #include #include "FMWindowIface.h" #include "peony-core_global.h" #include #define MainWindowFactoryIface_iid "org.ukui.peony-qt.MainWindowFactoryIface" namespace Peony { /*! * \brief The FMWindowFactory class * \deprecated */ class PEONYCORESHARED_EXPORT MainWindowFactoryIface { public: virtual const QString name() = 0; ~MainWindowFactoryIface() {} virtual QWidget *createWindow(const QString &uri = nullptr) = 0; virtual QWidget *createWindow(const QStringList &uris) = 0; virtual QWidget *createWindow(const QString &uri, QStringList selectUris) = 0; }; } Q_DECLARE_INTERFACE (Peony::MainWindowFactoryIface, MainWindowFactoryIface_iid) #endif // FMWINDOWFACTORY_H peony/plugin-iface/tool-bar-action-plugin-iface.h0000664000175000017500000000303115154271070020700 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef TOOLBARACTIONPLUGINIFACE_H #define TOOLBARACTIONPLUGINIFACE_H #include "plugin-iface.h" #include #define ToolBarActionPluginIface_iid "org.ukui.peony-qt.plugin-iface.ToolBarActionPluginInterface" namespace Peony { class ToolBarExtensionActionIface : public QAction { Q_OBJECT ~ToolBarExtensionActionIface() {} public Q_SLOTS: virtual void excuteAction(const QString &directoryUri, const QStringList &selectedUris) = 0; }; class ToolBarActionPluginIface : public PluginInterface { public: ~ToolBarActionPluginIface() {} virtual ToolBarExtensionActionIface *create() = 0; }; } Q_DECLARE_INTERFACE(Peony::ToolBarActionPluginIface, ToolBarActionPluginIface_iid) #endif // TOOLBARACTIONPLUGINIFACE_H peony/plugin-iface/properties-window-tab-page-plugin-iface.h0000664000175000017500000000330715154271070023073 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PROPERTIESWINDOWTABPAGEPLUGINIFACE_H #define PROPERTIESWINDOWTABPAGEPLUGINIFACE_H #include #include #include #include "plugin-iface.h" #include "properties-window-tab-iface.h" class QWidget; #define PropertiesWindowTabPagePluginIface_iid "org.ukui.peony-qt.plugin-iface.PropertiesWindowTabPagePluginInterface" namespace Peony { class PropertiesWindowTabPagePluginIface : public PluginInterface { public: virtual ~PropertiesWindowTabPagePluginIface() {} virtual int tabOrder() = 0; virtual bool supportUris(const QStringList &uris) = 0; // virtual QWidget *createTabPage(const QStringList &uris) = 0; virtual PropertiesWindowTabIface *createTabPage(const QStringList &uris) = 0; virtual void closeFactory() = 0; }; } Q_DECLARE_INTERFACE(Peony::PropertiesWindowTabPagePluginIface, PropertiesWindowTabPagePluginIface_iid) #endif // PROPERTIESWINDOWTABPAGEPLUGINIFACE_H peony/plugin-iface/style-plugin-iface.h0000664000175000017500000000245715154271070017061 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STYLEPLUGINIFACE_H #define STYLEPLUGINIFACE_H #include #include #include #include "plugin-iface.h" #define StylePluginIface_iid "org.ukui.peony-qt.plugin-iface.StylePluginInterface" class QProxyStyle; namespace Peony { class StylePluginIface : public PluginInterface { public: ~StylePluginIface() {} virtual int defaultPriority() = 0; virtual QProxyStyle *getStyle() = 0; }; } Q_DECLARE_INTERFACE(Peony::StylePluginIface, StylePluginIface_iid) #endif // STYLEPLUGINIFACE_H peony/plugin-iface/side-bar-plugin-iface.h0000664000175000017500000000305215154271070017377 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef SIDEBARPLUGINIFACE_H #define SIDEBARPLUGINIFACE_H #include "side-bar.h" #include "plugin-iface.h" #include #include #include #define SideBarPluginInterface_iid "org.ukui.peony-qt.plugin-iface.SideBarPluginInterface" namespace Peony { class SideBarPluginInterface : public PluginInterface { public: virtual ~SideBarPluginInterface() {} /*! * \brief keys * usually a special string for recognizing. */ virtual const QStringList keys() = 0; /*! * \brief create * \return * a SideBar instance with its own implement. */ virtual SideBar *create(QWidget *parent) = 0; }; } Q_DECLARE_INTERFACE (Peony::SideBarPluginInterface, SideBarPluginInterface_iid) #endif // SIDEBARPLUGINIFACE_H peony/README.md0000664000175000017500000001037715154271070012123 0ustar fengfeng# peony peony is the default filemanager application of UKUI Desktop Environment. # About this project - [Wiki on Gitee](https://gitee.com/openkylin/peony/wiki) - [zh_CN](GUIDE_ZH_CN.md) # Description Peony uses the same underlying layer(glib/gvfs/gio) as old peony project(forked from caja), but uses Qt to refactor or improve anything else. Peony can be roughly divided into the following parts: > 1. peony-qt-core: the abstraction of glib/gvfs/gio object or method from glib/c to qt/c++. > 2. file-operation: file operation set based on core. > 3. model: mapping core and operation to Qt's model/view framework. > 4. extensions framework: migration of the Peony's extension framework. > 5. ui: reconstructed based on the above parts and qt's ui framework. # How to understand Although Peony's documentation is limited and might be outdated, I still recommend you read them through. The documents in this project can be come together with doxygen, see [how to generate the document files](doxygen/README.md). # Build and test ## Preparation ### **In Debian/Ustable and Ubuntu** Peony has been uploaded to debian/unstable, and downstreams can get the source in archive by: > apt source peony To build peony in local, we should > sudo apt build-dep peony ~~I recommend you use latest UbuntuKylin(19.10 for now), and you can build pre-depends with such command:~~ > ~~sudo apt install libglib2.0-dev qt5-default libqt5x11extras5-dev libgsettings-qt-dev libpoppler-qt5-dev qttools5-dev-tools~~ ~~NOTE: build-depends references the paragraph in debian/control.~~ ~~and this is a recommend plugin:~~ > ~~sudo apt install qt5-gtk2-platformtheme~~ NOTE: actually Peony is designed to adapt to all different qt styles, but for now there are lots of things to be done. You can also experience it with other styles, such as breeze, oxygen, not only gtk. This qpa plugin will let qt applications use system style in UbuntuKylin. ### **Porting to other distros** Peony provides some build options for trying to keep the build depencies simpler. For example, there are sevaral macros defined in [common.pri](common.pri). While building peony, it will attempt to find existed build depencies and set related macros for them. If a developer only wants to port peony without special depencies porivided by UKUI/KYSDK, or is porting whole UKUI/KYSDK, it's usually meaningful to help the developer know how peony handles the project building and implements function in different way. It is a little chalange for porting peony to other distros. If you want to try, please make sure the distro's qt's version is higher than 5.6, and glib's version is higher than 2.48. We recommend to build peony with Qt5.12 or later, glib2.0 2.64 or later, KF5(window system/screens) 5.68 or later. Note that although most of installtions of peony is implemented by qmake and make, I used some featrues provided by debhelper, which is the package tool in debian. That means it is better to know how to do those things without debhelper in other distros, too. If there are some problems during porting peony to other distros, commit an issue here. I'm willing to help you. ## build from source and test > git clone https://gitee.com/openkylin/peony.git > cd peony && mkdir build && cd build > qmake .. && make > sudo make install > /usr/bin/peony NOTE: Peony & peony-qt-desktop is based on libpeony3, so you should put the libpeony3.so to the directory which is included in ld's config file. # Examples Another way to get familiar with the project is through [some examples which I provided](https://github.com/Yue-Lan/libpeony-qt-development-examples). These examples are based on libpeony3 and display some basic usage of the Peony's api. It is simpler than the project but can help us understand how to use the libpeony3 for development. # Contribution I really welcome you to participate in this project. Before that, you'd better read the [contribution manual](CONTRIBUTING.md). # About third-party open source codes I used some third-party code and modified it to fit into my project. The 3rd parties codes would been placed in project's ${top-src-dir}/3rd-parties directory. Note that Peony/libpeony-qt might use different license (GPL/LGPL) with a 3rd parties' license. I will keep those 3rd parties codes' Copyrights and Licenses. peony/peony-qt-desktop/0000775000175000017500000000000015167662230014065 5ustar fengfengpeony/peony-qt-desktop/desktop-window-manager.cpp0000664000175000017500000004146715154271106021165 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #include "desktop-window-manager.h" #include "peony-desktop-application.h" #include "advanced-desktop-item-model.h" #include "desktop-menu-plugin-manager.h" #include #include "common.h" #include "file-info.h" #include "file-info-job.h" #include "file-meta-info.h" #include "global-settings.h" #include "file-action-controler.h" #include "global-settings-adapter.h" #include "background-manager.h" #include "screen-manager.h" #include "theme-style.h" #include "manager-control.h" #include "windowmanager/windowmanager.h" #include "desktop-item-proxy-model.h" #include "platformwindow.h" #include #include #include #include #include #include #include #include static int desktop_window_id = 0; static DesktopWindowManager *global_instance = nullptr; DesktopWindowManager *DesktopWindowManager::getInstance() { if (!global_instance) { global_instance = new DesktopWindowManager; } return global_instance; } DesktopWindowManager::DesktopWindowManager(QObject *parent) : QObject(parent) { registerCppTypeToQml(); initPeonyDbusService(); m_model = PeonyDesktopApplication::getModel(); connect(m_model, &AdvancedDesktopItemModel::emitFinish, this, &DesktopWindowManager::initModelFinish); connect(m_model, &AdvancedDesktopItemModel::sig_fileCreated, this, &DesktopWindowManager::fileCreated); connect(m_model, &AdvancedDesktopItemModel::setInfoPos, this, &DesktopWindowManager::setInfoPos); m_desktopAutoLayout = GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=](const QString &key){ if (key == DESKTOP_USE_AUTO_LAYOUT) { m_desktopAutoLayout = GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); } }); m_layoutTimeLine = new QTimeLine(500, this); m_modeTimeLine = new QTimeLine(500, this); connect(m_modeTimeLine, &QTimeLine::finished, this, &DesktopWindowManager::switchDisplayMode); connect(SCREEN_MANAGER, &ScreenManager::displayModeChanged, this, [=](){ m_layoutTimeLine->stop(); if (m_modeTimeLine->state() != QTimeLine::Running) { m_modeTimeLine->start(); } else { m_modeTimeLine->setCurrentTime(0); } }); connect(SCREEN_MANAGER, &ScreenManager::windowsRelocateRequired, this, [=](){ if (m_modeTimeLine->state() == QTimeLine::Running) { return; } if (m_layoutTimeLine->state() != QTimeLine::Running) { m_layoutTimeLine->start(); } else { m_layoutTimeLine->setCurrentTime(0); } }); QDBusConnection connection = QDBusConnection::sessionBus(); if (!connection.isConnected()) { qDebug() << "信号创建失败:" << connection.lastError().message(); return; } bool isDbusAvailable = connection.connect("org.ukui.ScreenSaver", "/", "org.ukui.ScreenSaver", "unlock", this,SLOT(startInitAnima())); m_dbusInterface = new QDBusInterface("org.ukui.ScreenSaver", "/", "org.ukui.ScreenSaver", QDBusConnection::sessionBus()); bool isQuickStart = qEnvironmentVariableIsSet("UKUI_QUICK_START") && qEnvironmentVariableIntValue("UKUI_QUICK_START") == 1; isQuickStartAvailable = isQuickStart && isDbusAvailable; } DesktopWindowManager::~DesktopWindowManager() { if (m_peonyDbusService) { delete m_peonyDbusService; m_peonyDbusService = nullptr; } } void DesktopWindowManager::registerCppTypeToQml() { qmlRegisterType("org.ukui.desktop", 1, 0, "AdvancedDesktopItemModel"); qmlRegisterType("org.ukui.desktop", 1, 0, "DesktopItemProxyModel"); qmlRegisterType("org.ukui.desktop", 1, 0, "FileActionController"); qmlRegisterType("org.ukui.desktop", 1, 0, "GlobalSettingsAdapter"); qmlRegisterType("org.ukui.desktop", 1, 0, "ThemeStyle"); qmlRegisterSingletonType("org.ukui.desktop", 1, 0, "ManagerControl", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject* { Q_UNUSED(engine) Q_UNUSED(scriptEngine) return Peony::ManagerControl::getInstance(); }); //qmlRegisterSingletonType(QUrl("qrc:/qml-desktop/EventBus.qml"), "org.ukui.desktop", 1, 0, "EventBus"); } void DesktopWindowManager::addQmlDesktop(QScreen *screen) { static bool pluginLoad = false; int screenId = SCREEN_MANAGER->getScreenId(screen); PlatformWindow *window = new PlatformWindow(screenId, screen); if (!pluginLoad) { connect(window, &PlatformWindow::viewUpdated, DesktopMenuPluginManager::getInstance(), &DesktopMenuPluginManager::loadAsync); pluginLoad = true; } qDebug() << "windowid" << screenId; SCREEN_MANAGER->addBackgroundWindow(window, screen, screenId); connect(this, &DesktopWindowManager::setSortType, window, &PlatformWindow::setSortType); connect(this, &DesktopWindowManager::setSortOrder, window, &PlatformWindow::setSortOrder); connect(this, &DesktopWindowManager::modeChanged, window, &PlatformWindow::updateView); connect(this, &DesktopWindowManager::emitFinish, window, &PlatformWindow::loadData); connect(m_layoutTimeLine, &QTimeLine::finished, window, &PlatformWindow::updateWindowGeometry); window->show(); initializeWindowView(window); setupWindowConnections(window); if (m_initMetaInfo) window->loadData(); } void DesktopWindowManager::singleScreenMode() { qDebug() <<"change singleScreenMode: backgroundwindows count:" <getBackgroundWindows().count()<<" screen count:"<allScreens().count(); bool isMainScreenOnlyData = true; for (auto window : SCREEN_MANAGER->getBackgroundWindows()) { PlatformWindow *tmpWindow = qobject_cast(window); if (!SCREEN_MANAGER->isPrimaryScreen(tmpWindow->bindScreen())) { tmpWindow->lower(); qDebug()<<"lower screen window :"<dataCount()<id(); if (0 != tmpWindow->dataCount()) { isMainScreenOnlyData = false; } // break; } else { qDebug()<<"raise screen window :"<dataCount()<id(); SCREEN_MANAGER->getWindowById(0)->raise(); } } qDebug() << "Has primary screen data " << isMainScreenOnlyData << "total item:" << m_model->rowCount(); if (SCREEN_MANAGER->displayMode() == ScreenManager::Extend && isMainScreenOnlyData) { m_model->clearExtendItemPos(); return; } SCREEN_MANAGER->getWindowById(0)->requestActivate(); m_model->getAllRestoreInfo(); m_model->saveExtendItemInfo(); Q_EMIT modeChanged(); } void DesktopWindowManager::multiscreenMode() { qDebug() <<"change multiscreen: backgroundwindows count:" <getBackgroundWindows().count()<<" screen count:"<allScreens().count(); if (SCREEN_MANAGER->getBackgroundWindows().count() != SCREEN_MANAGER->allScreens().count()) { return; } m_model->getAllRestoreInfo(); m_model->resetExtendItemInfo(); Q_EMIT modeChanged(); } void DesktopWindowManager::relocateIconView() { qInfo() << "start relocate icon view"; //task#74174 更新多屏显示,根据id过滤元素 int primaryId = SCREEN_MANAGER->getPrimaryScreenId(); PlatformWindow *primaryWindow = nullptr; for (auto window : SCREEN_MANAGER->getBackgroundWindows()) { PlatformWindow *tmpWindow = qobject_cast(window); if (SCREEN_MANAGER->isPrimaryScreen(tmpWindow->bindScreen())) { primaryWindow = qobject_cast(window); break; } } qDebug() << "primary screen id:" << primaryId; if (primaryWindow) { QList list = SCREEN_MANAGER->getBackgroundWindows(); for (int i = 0 ; i < list.count(); i++) { PlatformWindow *window = qobject_cast(list[i]); if (window->id() == 0 && window != primaryWindow) { m_model->getAllRestoreInfo(); // 交换ID qDebug() << "切换主副屏:" << primaryId; window->setId(primaryWindow->id()); primaryWindow->setId(primaryId); window->updateView(); primaryWindow->updateView(); break; } } QTimer::singleShot(100, primaryWindow, [=]() { primaryWindow->requestActivate(); }); } } void DesktopWindowManager::raiseWid() { QTimer::singleShot(2000, this, [=]() { //kdk::WindowManager::activateWindow(SCREEN_MANAGER->getWindowById(0), nullptr); return; }); } void DesktopWindowManager::layoutViewItems() { // for (auto bgWindow : m_bgWindows) { // auto view = bgWindow->getIconView(); // view->layoutItems(); // } } void DesktopWindowManager::initModelFinish() { if (m_initMetaInfo) return; switchDisplayMode(); relocateIconView(); m_initMetaInfo = true; Q_EMIT emitFinish(); } void DesktopWindowManager::markCreateFilePos(const QPoint &pos) { //如果当前创建文件的屏幕满了,则找到一个空的屏幕,按照顺序添加 PlatformWindow *window =qobject_cast(SCREEN_MANAGER->getWindowAt(pos)); int screenId = SCREEN_MANAGER->getScreenIdAt(pos); QPoint localPos = SCREEN_MANAGER->mapFromGlobal(screenId, pos); if (QGuiApplication::layoutDirection() == Qt::RightToLeft) { int newLocalX = SCREEN_MANAGER->getScreenSize(screenId).isValid()? SCREEN_MANAGER->getScreenSize(screenId).width() - localPos.x() : localPos.x(); localPos.setX(newLocalX); } //鼠标坐标点转化成网格标点; QPoint tmpPos = window->getGridPosFromMousePos(localPos); if (window->isFull()) { QList list = SCREEN_MANAGER->getBackgroundWindows(); for (int i = 0 ; i < list.count(); i++) { PlatformWindow *window = qobject_cast(list[i]); if (!window->isFull()) { m_markMousePressPos = QPoint(0, 0); m_markMousePressId = window->id(); return; } } m_markMousePressPos = QPoint(0, 0); m_markMousePressId = window->id(); } else { m_markMousePressPos = window->checkGridPos(tmpPos); m_markMousePressId = window->id(); } } void DesktopWindowManager::createIdAndPos(int *id, QPoint *pos) { if (m_markMousePressPos == QPoint(-1, -1)) { PlatformWindow *window =qobject_cast(SCREEN_MANAGER->getWindowAt(QCursor::pos())); bool isFull = window? window->isFull() : true; if (!isFull) { *id = window->id(); *pos = window->findNextEmptyGridPos(); return; } QList list = SCREEN_MANAGER->getBackgroundWindows(); for (int i = 0 ; i < list.count(); i++) { PlatformWindow *emptyPosWindow = qobject_cast(list[i]); isFull = emptyPosWindow? emptyPosWindow->isFull() : true; if (!isFull) { *id = emptyPosWindow->id(); *pos = emptyPosWindow->findNextEmptyGridPos(); return; } } *id = window->id(); *pos = QPoint(-1, -1); return; } PlatformWindow *window =qobject_cast(SCREEN_MANAGER->getWindowById(m_markMousePressId)); *id = m_markMousePressId; *pos = m_desktopAutoLayout? window->findNextEmptyGridPos(): m_markMousePressPos;//自动排列的情况下清空位置的记录 m_markMousePressPos = QPoint(-1, -1); m_markMousePressId = 0; return; } void DesktopWindowManager::setInfoPos(const QString &uri) { auto info = FileInfo::fromUri(uri); QPoint currentPos; int id; createIdAndPos(&id, ¤tPos); info->setProperty("createId", id); info->setProperty("createPos", currentPos); qDebug() << "Make the coordinate points of the newly creted file : "<indexFromUri(uri); QPoint metaPos = m_model->data(index,PositionRole).toPoint(); bool isRenaming = qApp->property("rename").toBool() && metaPos.x() >= 0 && metaPos.x() >= 0; if (isRenaming) { qApp->setProperty("rename", false); } bool isHidden = false; auto info = FileInfo::fromUri(uri); if (!GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool()) { auto metainfo = FileMetaInfo::fromUri(uri); if (metainfo->hasHiddenInfo()) { isHidden = metainfo->isHidden(); } else { isHidden = info->isHiddenFile(); } } if (isHidden) return; if (isRenaming) { int screenId = m_model->data(index, ScreenIdRole).toInt(); Q_EMIT m_model->idChanged(screenId, -1, QStringList(uri)); } else { int oldId = m_model->data(index, ScreenIdRole).toInt(); id = SCREEN_MANAGER->displayMode() == ScreenManager::Mirror? 0 : id; m_model->setData(index, id, ScreenIdRole); Q_EMIT m_model->idChanged(id, oldId, QStringList(uri)); } } void DesktopWindowManager::clearAllRestoreInfo() { for (int i = 0; i < m_model->rowCount(); i++) { auto index = m_model->index(i, 0); m_model->setData(index, QStringList(""), ExceptedPositionRole); } } void DesktopWindowManager::initializeWithScreens() { for (auto screen : SCREEN_MANAGER->allScreens()) { addQmlDesktop(screen); } connect(SCREEN_MANAGER, &ScreenManager::screenAdded, this, [this](QScreen* screen, int id) { this->addQmlDesktop(screen); }); connect(SCREEN_MANAGER, &ScreenManager::primaryScreenChanged, this, &DesktopWindowManager::relocateIconView); /* connect(SCREEN_MANAGER, &ScreenManager::singleScreenModeActivated, this, &DesktopWindowManager::singleScreenMode); connect(SCREEN_MANAGER, &ScreenManager::multiScreenModeActivated, this, &DesktopWindowManager::multiscreenMode)*/; } bool DesktopWindowManager::getQuickStartAvailable() { return isQuickStartAvailable; } void DesktopWindowManager::initializeWindowView(QQuickView* window) { if (!window) return; if (m_initMetaInfo) { switchDisplayMode(); relocateIconView(); } else if (window->screen() == SCREEN_MANAGER->primaryScreen()) { m_model->refresh(); } } void DesktopWindowManager::setupWindowConnections(QQuickView* window) { if (!window) return; QScreen* screen = qobject_cast(window)->bindScreen(); connect(SCREEN_MANAGER, &ScreenManager::screenRemoved, window, [=](QScreen* removedScreen, int id) { qDebug() << "removedScreen "<primaryScreen()->geometry(); if (screen != removedScreen) return; //SCREEN_MANAGER会发送显示模式切换信号 PlatformWindow *p =qobject_cast(window); p->destoryScreen(); window->disconnect(); SCREEN_MANAGER->removeBackgroundWindow(window); delete window; }); } void DesktopWindowManager::initPeonyDbusService() { m_peonyDbusService = new PeonyDbusService; m_peonyDbusService->DbusServerRegister(); } void DesktopWindowManager::switchDisplayMode() { int newMode = SCREEN_MANAGER->displayMode(); qDebug()<<"switch display mode" < reply = m_dbusInterface->call("GetLockState"); return reply.value(); } peony/peony-qt-desktop/primary-manager.h0000664000175000017500000000250615154271070017326 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef PRIMARYMANAGER_H #define PRIMARYMANAGER_H #include #include #include #include class PrimaryManager : public QObject { Q_OBJECT public: PrimaryManager(); void start(); int getScreenGeometry (QString methodName); QString getScreenName (QString methodName); Q_SIGNALS: void priScreenChangedSignal(int x, int y, int width, int height); public Q_SLOTS: void priScreenChanged(int x, int y, int width, int height); private: QDBusInterface *mDbusXrandInter; }; #endif // PRIMARYMANAGER_H peony/peony-qt-desktop/controls/0000775000175000017500000000000015154271106015722 5ustar fengfengpeony/peony-qt-desktop/controls/file-action-controler.cpp0000664000175000017500000007017515154271106022637 0ustar fengfeng#include "file-action-controler.h" #include "global-settings.h" #include "clipboard-utils.h" #include "file-enumerator.h" #include "file-meta-info.h" #include "thumbnail-manager.h" #include "file-info.h" #include "file-info-job.h" #include "file-info-manager.h" #include "file-watcher.h" #include "file-operation-manager.h" #include "file-move-operation.h" #include "file-trash-operation.h" #include "file-copy-operation.h" #include "file-operation-utils.h" #include "file-utils.h" #include "desktop-menu.h" #include "peony-desktop-application.h" #include "audio-play-manager.h" #include "file-launch-manager.h" #include "file-rename-operation.h" #include "file-batch-rename-operation.h" #include "advanced-desktop-item-model.h" #include "image-mount-manager.h" #include "manager-control.h" //#include #include #ifdef KY_SDK_WAYLANDHELPER #include #include #endif #include #include #include #include #include #include #include #include #include #define MINGRIDSIZE 64 #define MAXGRIDSIZE 200 #define GRIDMARGIN 15 #define ICONMARGIN 5 using namespace Peony; static bool meetSpecialConditions(const QStringList& selectedUris) { /* The desktop home directory, computer, and trash do not allow operations such as copying, cutting, * deleting, renaming, moving, or using shortcut keys for corresponding operations.add by 2021/06/17 */ static QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (selectedUris.contains("computer:///") ||selectedUris.contains("trash:///") ||selectedUris.contains(homeUri)){ return true; } return false; } static FileActionController *global_instance = nullptr; FileActionController *FileActionController::getInstance() { if (!global_instance) { global_instance = new FileActionController; } return global_instance; } FileActionController::FileActionController(QObject *parent) { m_directryUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); auto zoolLevel = getZoomLevel(); setDefaultZoomLevel(zoolLevel); connect(qApp, &QApplication::fontChanged, this, [=](){ //直接调用槽函数,获取font的高度是没改变之前的 QTimer::singleShot(100, this, [this]() { QSize newGridSize = recalculateGridSize(); setGridSize(newGridSize); }); }); m_initialized = true; } bool FileActionController::enableShortcutKeys() { return GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool(); } void FileActionController::fileCopy(const QStringList &selectedUris) { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } Q_EMIT changeOpacity(1); qDebug() << "copy:" << selectedUris; if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)){ ClipboardUtils::setClipboardFiles(selectedUris, false); } } void FileActionController::fileCut(const QStringList &selectedUris) { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris) && MANAGER_CONTROL->canDeleteItems(selectedUris, m_directryUri)) { Q_EMIT changeOpacity(0.5); ClipboardUtils::setClipboardFiles(selectedUris, true); } } void FileActionController::filePaste(const QStringList &selectedUris) { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (qApp->clipboard()->mimeData()->hasFormat ("uos/remote-copy")) { Q_EMIT changeOpacity(1); auto op = ClipboardUtils::pasteClipboardFiles(m_directryUri); if (!op) { // viewport()->update(); } } else { paste(selectedUris); } } void FileActionController::paste(const QStringList &selectedUris) { //auto clipUris = ClipboardUtils::getClipboardFilesUris(); if (ClipboardUtils::getInstance()->isClipboardHasFiles() && !meetSpecialConditions(selectedUris)) { Q_EMIT changeOpacity(1); auto op = ClipboardUtils::pasteClipboardFiles(m_directryUri); if (op) { connect(op, &Peony::FileOperation::operationFinished, this, [=](){ auto opInfo = op->getOperationInfo(); auto targetUirs = opInfo->dests(); QTimer::singleShot(300, this, [=](){ QStringList newFiles; for (QString uri : targetUirs) { auto origin = FileUtils::getOriginalUri(uri); newFiles<getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris) && MANAGER_CONTROL->canDeleteItems(selectedUris, m_directryUri)){ FileOperationUtils::trash(selectedUris, true); } } void FileActionController::undo() { qApp->setProperty("rename", true); FileOperationManager::getInstance()->undo(); } void FileActionController::redo() { // do not relayout item with redo. qApp->setProperty("rename", true); FileOperationManager::getInstance()->redo(); } void FileActionController::zoomIn() { if (Huge == m_zoom_level) { return; } switch (getZoomLevel()) { case Small: m_zoom_level = Normal; break; case Normal: m_zoom_level = Large; break; case Large: m_zoom_level = Huge; break; default: break; } setDefaultZoomLevel(m_zoom_level); } void FileActionController::zoomOut() { if (Small == m_zoom_level) { return; } switch (getZoomLevel()) { case Huge: m_zoom_level = Large; break; case Large: m_zoom_level = Normal; break; case Normal: m_zoom_level = Small; break; default: break; } setDefaultZoomLevel(m_zoom_level); } void FileActionController::setDefaultZoomLevel(ZoomLevel level) { qDebug()<<"set default zoom level:"<setMetaInfoInt("peony-qt-desktop-zoom-level", int(m_zoom_level)); } GlobalSettings::getInstance()->setValue(DEFAULT_DESKTOP_ZOOM_LEVEL, m_zoom_level); setEmblemSize(emblemSize); setIconSize(newIconSize); QSize newGridSize = recalculateGridSize(); setGridSize(newGridSize); } ZoomLevel FileActionController::getZoomLevel() const { //FIXME: if (m_zoom_level != ZoomLevel::Invalid) return m_zoom_level; auto metaInfo = FileMetaInfo::fromUri("computer:///"); if (metaInfo) { auto i = metaInfo->getMetaInfoInt("peony-qt-desktop-zoom-level"); return ZoomLevel(i); } GFile *computer = g_file_new_for_uri("computer:///"); GFileInfo *info = g_file_query_info(computer, "metadata::peony-qt-desktop-zoom-level", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); char* zoom_level = g_file_info_get_attribute_as_string(info, "metadata::peony-qt-desktop-zoom-level"); if (!zoom_level) { //qDebug()<<"======================no zoom level meta info\n\n\n"; g_object_unref(info); g_object_unref(computer); return Normal; } g_object_unref(info); g_object_unref(computer); QString zoomLevel = zoom_level; g_free(zoom_level); //qDebug()<setDefaultZoomLevel(Normal); return nullptr; } g_object_unref(info); QString zoomLevel = zoom_level; g_free(zoom_level); int level =(zoomLevel.toInt()) == ZoomLevel::Invalid? Normal: ZoomLevel(QString(zoomLevel).toInt()); p_this->setDefaultZoomLevel(ZoomLevel(level)); return nullptr; } else { if (err) { qDebug()<code<message; g_error_free(err); } p_this->setDefaultZoomLevel(Normal); return nullptr; } } void FileActionController::editUri(const QString &selectedUri) { if (selectedUri.isEmpty() || meetSpecialConditions(QStringList(selectedUri))) { return; } auto origin = FileUtils::getOriginalUri(selectedUri); QTimer::singleShot(100, this, [=]() { Q_EMIT edit(selectedUri); }); } void FileActionController::remove(const QStringList &selectedUris) { //Qt::SHIFT + Qt::Key_Delete qDebug() << "=====================" << selectedUris; if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (!meetSpecialConditions(selectedUris) && MANAGER_CONTROL->canDeleteItems(selectedUris, m_directryUri)){ qDebug() << "delete" << selectedUris; FileOperationUtils::executeRemoveActionWithDialog(selectedUris); } } void FileActionController::help() { PeonyDesktopApplication::showGuide(); } void FileActionController::showProperties(const QStringList &selectedUris) { //Qt::ALT + Qt::Key_Return ,Qt::ALT + Qt::Key_Enter if (!m_menu) { delete m_menu; m_menu = nullptr; } m_menu = new DesktopMenu(m_directryUri, selectedUris); if (selectedUris.count() > 0) { m_menu->showProperties(selectedUris); } else { QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); m_menu->showProperties(desktopPath); } } void FileActionController::newFolder() { //QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_N) CreateTemplateOperation op(m_directryUri, CreateTemplateOperation::EmptyFolder, tr("New Folder")); op.run(); auto targetUri = op.target(); QTimer::singleShot(300, this, [=]() { QString origin = FileUtils::getOriginalUri(targetUri); Q_EMIT edit(origin); }); } void FileActionController::refresh() { //QKeySequence(Qt::CTRL + Qt::Key_R) | Qt::Key_F5 //fix refresh clear copy files issue, link to bug#109247 if (Peony::ClipboardUtils::isDesktopFilesBeCut()) Peony::ClipboardUtils::clearClipboard();/* Refresh clear cut status */ if (!m_freshing) { QGuiApplication::setOverrideCursor(Qt::WaitCursor); m_freshing = true; PeonyDesktopApplication::getModel()->refresh(); } } void FileActionController::finishRefresh() { QGuiApplication::setOverrideCursor(Qt::ArrowCursor); m_freshing = false; } void FileActionController::invertSelections() { //QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L) invertSelections(); } void FileActionController::recoverNormalLevel() { //QKeySequence(Qt::CTRL + Qt::Key_0) if (m_zoom_level == Normal) return; this->setDefaultZoomLevel(Normal); } void FileActionController::editUris(const QStringList &selectedUris) { //QList()<isExist(SHOW_HIDDEN_PREFERENCE)) { bool showHidden = settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(); settings->setValue(SHOW_HIDDEN_PREFERENCE, !showHidden); } } void FileActionController::clearClipboard() { //Qt::Key_Escape Peony::ClipboardUtils::clearClipboard(); // Q_EMIT update(); } void FileActionController::setSelectAll() { //QKeySequence::SelectAll if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } Q_EMIT selectAll(); } void FileActionController::showMenu(const QStringList &selectedUris, const QPoint &globalPos) { if (selectedUris.isEmpty()) { if (!MANAGER_CONTROL->checkBackgroundMenuPermission()) { qDebug() << "Desktop background menu disabled by management control"; return; } } else { for (const QString &uri : selectedUris) { if (!MANAGER_CONTROL->checkRightMenuPermission(uri)) { qDebug() << "Right menu disabled for item:" << uri; return; } } } if (m_menu) { delete m_menu; m_menu = nullptr; } m_menu = new DesktopMenu(m_directryUri, selectedUris); #ifdef KY_SDK_WAYLANDHELPER auto wmHelper = new UkuiWindowHelper(m_menu); wmHelper->removeTitleBar(); #endif connect(m_menu, &DesktopMenu::editUri, this, &FileActionController::editUri); connect(m_menu, &DesktopMenu::editUris, this, &FileActionController::editUris); connect(m_menu, &DesktopMenu::invertSelections, this, &FileActionController::selectAll); connect(m_menu, &DesktopMenu::setDefaultZoomLevel, this, &FileActionController::setDefaultZoomLevel); connect(m_menu, &DesktopMenu::refresh, this, &FileActionController::refresh); connect(m_menu, &DesktopMenu::changeOpacity, this, &FileActionController::changeOpacity); connect(m_menu, &DesktopMenu::paste, this, &FileActionController::paste); QTimer::singleShot(130, m_menu, [=]() { m_menu->exec(globalPos); m_urisToEdit = m_menu->urisToEdit(); }); } void FileActionController::closeMenu() { if (m_menu) { m_menu->hide(); } } void FileActionController::openFileByUri(QString uri) { if (!MANAGER_CONTROL->checkMouseClickPermission(uri, true)) { qDebug() << "Double click disabled for item:" << uri; return; } auto info = FileInfo::fromUri(uri); auto job = new FileInfoJob(info); job->setAutoDelete(); job->connect(job, &FileInfoJob::queryAsyncFinished, [=]() { if ((info->isDir() || info->isVolume() || info->isVirtual())) { QDir dir(info->filePath()); if (! dir.exists()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); auto result = QMessageBox::question(nullptr, tr("Open Link failed"), tr("File not exist, do you want to delete the link file?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (result == QMessageBox::Yes) { qDebug() << "Delete unused symbollink in desktop."; QStringList selections; selections.push_back(uri); FileOperationUtils::trash(selections, true); } return; } if (! info->uri().startsWith("trash://") && ! info->uri().startsWith("computer://") && ! info->canExecute()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); QMessageBox::critical(nullptr, tr("Open failed"), tr("Open directory failed, you have no permission!")); return; } #if 1 FileLaunchManager::openAsync(uri, false, false); #else #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; QUrl url = uri; p.setProgram("peony"); p.setArguments(QStringList() << url.toEncoded() <<"%U&"); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); QRect rect = info.get()->property("iconGeometry").toRect(); #ifdef KY_SDK_WAYLANDHELPER ukuiStartupManager()->setStartupGeometryByPid(pid, rect.x(), rect.y(), rect.width(), rect.height()); #endif #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY if (rect.isValid()) data.setIconGeometry(rect); #endif //data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); KStartupInfo::resetStartupEnv(); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()<isImageFile(uri)) { IMAGE_MOUNT_MANAGER->mountImage(uri); return; } if (!(info->isDesktopFile() && execSharedFileLink(uri))) { FileLaunchManager::openAsync(uri, false, false); } } //this->clearSelection(); }); job->queryAsync(); } void FileActionController::openFileByUri(const QStringList &uris) { QStringList dirs; QStringList files; QStringList isoFiles; for (auto uri : uris) { auto info = FileInfo::fromUri(uri); if (info->isDir() || info->isVolume()) { dirs<isImageFile(uri)) { isoFiles << uri; } else { files<openWindow(dirs); if (!files.isEmpty()) { Peony::FileLaunchManager::openFilesByDefaultApplications(files); } for (auto iso_uri: isoFiles) { IMAGE_MOUNT_MANAGER->mountImage(iso_uri); } } void FileActionController::openWindow(const QStringList &uris) { QStringList args; for (auto arg : uris) { QUrl url = arg; args<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders"<isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } if (uri.endsWith(".desktop")) { GKeyFile* key_file = g_key_file_new(); QUrl url = uri; QString desktopfp = url.path(); g_key_file_load_from_file(key_file, desktopfp.toUtf8().constData(), G_KEY_FILE_KEEP_COMMENTS, nullptr); GError* error = NULL; if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-Peony-CMD", nullptr)) { if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, nullptr)) { g_autofree char* val = g_key_file_get_value(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, &error); if (error) { qWarning() << "get desktop file:" << uri << " name error:" << error->code << " -- " << error->message; g_error_free(error); error = nullptr; } else { #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; p.setProgram("peony"); QString str = val; str = str.replace("peony ",""); p.setArguments(QStringList() << str); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = /*QX11Info::isPlatformX11() ? QX11Info::appUserTime() :*/ 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY QRect rect = info.get()->property("iconGeometry").toRect(); if (rect.isValid()) { data.setIconGeometry(rect); } #endif //data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()< 1) { auto fileOpMgr = FileOperationManager::getInstance(); QStringList lists = selections; auto renameOp = new FileBatchRenameOperation(lists, newName); qApp->setProperty("rename", true); //select file when rename finished connect(renameOp, &FileBatchRenameOperation::operationFinished, this, [=](){ auto info = renameOp->getOperationInfo().get(); auto uri = info->target(); QTimer::singleShot(100, this, [=](){ Q_EMIT setSelectedUris(QStringList()<startOperation(renameOp, true); } else if (selections.count() == 1) { QString uri = selections.first(); auto fileOpMgr = FileOperationManager::getInstance(); auto renameOp = new FileRenameOperation(uri, newName); qApp->setProperty("rename", true); //select file when rename finished connect(renameOp, &FileRenameOperation::operationFinished, this, [=](){ auto info = renameOp->getOperationInfo().get(); auto uri = info->target(); QTimer::singleShot(100, this, [=](){ Q_EMIT setSelectedUris(QStringList()<startOperation(renameOp, true); } } QIcon FileActionController::icon(const QString &uri) { FileInfo* info = FileInfo::fromUri(uri).get(); return info->getIcon(); } void FileActionController::updateFileElideStatus(const QString &uri, bool isElided) { auto info = FileInfo::fromUri(uri); if (info) { bool _isElided = info->property("isElided").toBool(); if (_isElided != isElided) { info->setProperty("isElided", isElided); PeonyDesktopApplication::getModel()->updateTooltips(uri); } } } void FileActionController::setClickedScreenId(const int screenId) { qDebug() << "setClickedScreenId"<isDesktopFile() && nullptr != info->desktopName()) { return info->desktopName().remove(".desktop"); } return ""; } QString FileActionController::getLanguageSpecificSample() { // 获取系统语言环境 QLocale locale = QLocale::system(); QLocale::Language language = locale.language(); // 根据语言和文字系统返回对应的测试文本 switch (language) { case QLocale::Tibetan: // 藏文 return QStringLiteral("ཀཁགངཅཆཇཉཏཐདནཔཕབམཙཚཛཝཞཟའཡརལཤསཧཨ"); case QLocale::Mongolian: // 蒙文 return QStringLiteral("ᠠᠡᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳ"); case QLocale::Chinese: // 中文 return QStringLiteral("简体中文示例文字"); default: // 语言样本,包含各种字符 return QStringLiteral("中ཀᠠTextÀÁРусالعربيةहिन्दी"); } } QSize FileActionController::recalculateGridSize() { QSize newGridSize; Peony::GlobalSettings *settings = Peony::GlobalSettings::getInstance(); if (!m_initialized && settings) { QSize sizeFromConfig = settings->getValue(DEFAULT_GRID_SIZE).toSize(); if (!sizeFromConfig.isEmpty() && sizeFromConfig.width() > MINGRIDSIZE && sizeFromConfig.width() < MAXGRIDSIZE && sizeFromConfig.height() > MINGRIDSIZE && sizeFromConfig.height() < MAXGRIDSIZE) { newGridSize = sizeFromConfig; return newGridSize; } } newGridSize = QSize(GRIDMARGIN, GRIDMARGIN + ICONMARGIN); // padding: 5 newGridSize += m_iconSize; // icon size newGridSize += QSize(0, ICONMARGIN); // text-icon-padding: 5 QFontMetrics fm = qApp->fontMetrics(); //The current height obtained is in english, The Chinese text is approximately 1.5 to 2 times as long // newGridSize += QSize(0, fm.height() > 30? fm.height()*2 : fm.height()*2*1.5); // 2 line text height, todo: fix bo_CN, /* * 在某些字体下中文通过QFontMetrics::height得到的字体高度不准确, * 因此对不同语言进行QFontMetrics::boundingRect特殊处理得到其高度,取 * QFontMetrics::height与boundingRect.height的最大值 */ QString str = getLanguageSpecificSample(); QRect rect = fm.boundingRect(str); qDebug()<<"QFontMetrics::height"<setValue(DEFAULT_GRID_SIZE, m_gridSize); } } } peony/peony-qt-desktop/controls/controls.pri0000664000175000017500000000037415154271070020305 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/file-action-controler.h \ $$PWD/global-settings-adapter.h \ $$PWD/theme-style.h SOURCES += \ $$PWD/file-action-controler.cpp \ $$PWD/global-settings-adapter.cpp \ $$PWD/theme-style.cpp peony/peony-qt-desktop/controls/global-settings-adapter.h0000664000175000017500000000341015154271070022605 0ustar fengfeng#ifndef GLOBALSETTINGSADAPTER_H #define GLOBALSETTINGSADAPTER_H #include #include #include class QGSettings; class GlobalSettingsAdapter : public QObject { Q_OBJECT // 拆分的四个边距属性 Q_PROPERTY(int panelMarginLeft READ panelMarginLeft NOTIFY panelMarginsChanged) Q_PROPERTY(int panelMarginTop READ panelMarginTop NOTIFY panelMarginsChanged) Q_PROPERTY(int panelMarginRight READ panelMarginRight NOTIFY panelMarginsChanged) Q_PROPERTY(int panelMarginBottom READ panelMarginBottom NOTIFY panelMarginsChanged) public: static GlobalSettingsAdapter *getInstance(); explicit GlobalSettingsAdapter(QObject *parent = nullptr); Q_INVOKABLE QVariant getValue(const QString &key) const; Q_INVOKABLE void setValue(const QString &key, const QVariant &value); Q_INVOKABLE bool isKeyAvailable(const QString &key) const; Q_INVOKABLE bool useAutoLayout(); public: int panelMarginLeft() const { return m_margins.left(); } int panelMarginTop() const { return m_margins.top(); } int panelMarginRight() const { return m_margins.right(); } int panelMarginBottom() const { return m_margins.bottom(); } QMargins panelMargins() const { return m_margins; } void setPanelMargins(const QMargins &newMargins) { if (m_margins != newMargins) { m_margins = newMargins; Q_EMIT panelMarginsChanged(); } } public Q_SLOTS: void panelSettingsChanged(); Q_SIGNALS: void panelMarginsChanged(); void valueChanged(const QString &key, const QVariant &value); private: // 连接到单例的信号 void onGlobalSettingsChanged(const QString &key); QGSettings *m_panelSetting = nullptr; QMargins m_margins; }; #endif // GLOBALSETTINGSADAPTER_H peony/peony-qt-desktop/controls/theme-style.h0000664000175000017500000000133215154271070020332 0ustar fengfeng#ifndef THEMESTYLE_H #define THEMESTYLE_H #include #include #include class ThemeStylePrivate; class ThemeStyle : public QObject { Q_OBJECT Q_PROPERTY(int radius READ getRadius WRITE setRadius NOTIFY radiusChanged) public: ThemeStyle(QObject *parent = nullptr); static ThemeStyle *instance(); Q_INVOKABLE QColor highlight(); Q_INVOKABLE QColor midlight(); int getRadius() const { return m_radius; }; void setRadius(int newRadius) { if (m_radius != newRadius) { m_radius = newRadius; Q_EMIT radiusChanged(); } }; Q_SIGNALS: void radiusChanged(); private: int m_radius = 6; }; #endif // THEMESTYLE_H peony/peony-qt-desktop/controls/theme-style.cpp0000664000175000017500000000267315154271070020676 0ustar fengfeng#include "theme-style.h" #include "global-settings.h" #include #include #include static ThemeStyle *global_instance = nullptr; ThemeStyle *ThemeStyle::instance() { if (!global_instance) { global_instance = new ThemeStyle; } return global_instance; } ThemeStyle::ThemeStyle(QObject *parent) : QObject(parent) { auto globalSettings = Peony::GlobalSettings::getInstance(); QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { setRadius(0); } else { setRadius(6); } connect(globalSettings, &Peony::GlobalSettings::valueChanged, this, [=](const QString &key){ if (key == "widgetThemeName") { QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { setRadius(0); } else { setRadius(6); } } }); } QColor ThemeStyle::highlight() { QVariant light = qApp->property("highlight-active"); QBrush brush = light.value(); QColor color = brush.color(); color.setAlpha(255*0.8); return color; } QColor ThemeStyle::midlight() { QVariant light = qApp->property("highlight-active"); QBrush brush = light.value(); QColor color = brush.color(); color.setAlpha(255*0.5); return color; } peony/peony-qt-desktop/controls/global-settings-adapter.cpp0000664000175000017500000000614315154271070023146 0ustar fengfeng#include "global-settings-adapter.h" #include "global-settings.h" #include "common.h" #include #include using namespace Peony; static GlobalSettingsAdapter *global_instance = nullptr; GlobalSettingsAdapter *GlobalSettingsAdapter::getInstance() { if (!global_instance) { global_instance = new GlobalSettingsAdapter; } return global_instance; } GlobalSettingsAdapter::GlobalSettingsAdapter(QObject *parent) : QObject(parent) { // 连接单例的信号到适配器信号 GlobalSettings* settings = GlobalSettings::getInstance(); connect(settings, &GlobalSettings::valueChanged, this, &GlobalSettingsAdapter::onGlobalSettingsChanged); if (QGSettings::isSchemaInstalled(PANEL_SETTINGS)) { //panel monitor if (!m_panelSetting) m_panelSetting = new QGSettings(PANEL_SETTINGS, QByteArray(), this); connect(m_panelSetting, &QGSettings::changed, this, [=](const QString &key){ if (key == "panelposition" || key == "panelsize" || key == "settingsislandposition" || key == "paneltype") { panelSettingsChanged(); } }); panelSettingsChanged(); } } QVariant GlobalSettingsAdapter::getValue(const QString &key) const { if (key == "panelposition" || key == "panelsize" || key == "settingsislandposition" || key == "paneltype") { return m_panelSetting->get(key); } return GlobalSettings::getInstance()->getValue(key); } void GlobalSettingsAdapter::setValue(const QString &key, const QVariant &value) { if (key == "panelposition" || key == "panelsize" || key == "settingsislandposition" || key == "paneltype") { return; } GlobalSettings::getInstance()->setValue(key, value); } bool GlobalSettingsAdapter::isKeyAvailable(const QString &key) const { return GlobalSettings::getInstance()->isExist(key); } bool GlobalSettingsAdapter::useAutoLayout() { return GlobalSettings::getInstance()->getValue("desktopUseAutoLayout").toBool(); } void GlobalSettingsAdapter::panelSettingsChanged() { int settingsislandposition = m_panelSetting->keys().contains("settingsislandposition") ? m_panelSetting->get("settingsislandposition").toInt() : -1; int paneltype = m_panelSetting->keys().contains("paneltype") ? m_panelSetting->get("paneltype").toInt() : -1; int position = m_panelSetting->get("panelposition").toInt(); int margins = m_panelSetting->get("panelsize").toInt(); if (settingsislandposition == 1 && paneltype == 1) { setPanelMargins(QMargins(0, 32, 0, margins)); return; } switch (position) { case 1: { setPanelMargins(QMargins(0, margins, 0, 0)); break; } case 2: { setPanelMargins(QMargins(margins, 0, 0, 0)); break; } case 3: { setPanelMargins(QMargins(0, 0, margins, 0)); break; } default: { setPanelMargins(QMargins(0, 0, 0, margins)); break; } } return; } void GlobalSettingsAdapter::onGlobalSettingsChanged(const QString &key) { QVariant value = getValue(key); Q_EMIT valueChanged(key, value); } peony/peony-qt-desktop/controls/file-action-controler.h0000664000175000017500000001153115154271106022273 0ustar fengfeng#ifndef FILEACTIONCONTROLER_H #define FILEACTIONCONTROLER_H #include #include #include #include "common.h" namespace Peony { class DesktopMenu; } class FileActionController : public QObject { Q_OBJECT Q_PROPERTY(QStringList selectedUris READ getSelectedUris WRITE setSelectedUris NOTIFY selectedUrisChanged) Q_PROPERTY(QString directryUri READ getDirectryUri WRITE setDirectryUri NOTIFY directryUriChanged) Q_PROPERTY(QSize iconSize READ getIconSize WRITE setIconSize NOTIFY iconSizeChanged) Q_PROPERTY(QSize gridSize READ getGridSize WRITE setGridSize NOTIFY gridSizeChanged) Q_PROPERTY(int emblemSize READ getEmblemSize WRITE setEmblemSize NOTIFY emblemChanged) //Q_PROPERTY(int clickedScreenId WRITE setClickedScreenId NOTIFY clickedScreenIdChanged) public: static FileActionController *getInstance(); explicit FileActionController(QObject *parent = nullptr); static GAsyncReadyCallback queryZoomLevelAsyncCallback(GObject *obj, GAsyncResult *res, FileActionController *p_this); Q_INVOKABLE QString iconName(QIcon icon) { return icon.name(); } Q_INVOKABLE QIcon icon(const QString &uri); Q_INVOKABLE bool enableShortcutKeys(); Q_INVOKABLE void fileCopy(const QStringList &selectedUris); Q_INVOKABLE void fileCut(const QStringList &selectedUris); Q_INVOKABLE void filePaste(const QStringList &selectedUris); Q_INVOKABLE void deleteToTrash(const QStringList &selectedUris); Q_INVOKABLE void undo(); Q_INVOKABLE void redo(); Q_INVOKABLE void zoomIn(); Q_INVOKABLE void zoomOut(); Q_INVOKABLE void editUri(const QString &selectedUri); Q_INVOKABLE void remove(const QStringList &selectedUris); Q_INVOKABLE void help(); Q_INVOKABLE void showProperties(const QStringList &selectedUris); Q_INVOKABLE void newFolder(); Q_INVOKABLE void refresh(); Q_INVOKABLE void invertSelections(); Q_INVOKABLE void recoverNormalLevel(); Q_INVOKABLE void setDefaultZoomLevel(ZoomLevel level); Q_INVOKABLE ZoomLevel getZoomLevel() const; Q_INVOKABLE void editUris(const QStringList &selectedUris); Q_INVOKABLE void setShowHidden(); Q_INVOKABLE void clearClipboard(); Q_INVOKABLE void setSelectAll(); Q_INVOKABLE void showMenu(const QStringList &selectedUris, const QPoint &globalPos); Q_INVOKABLE void closeMenu(); Q_INVOKABLE void openFileByUri(QString uri); Q_INVOKABLE void openFileByUri(const QStringList &uris); Q_INVOKABLE void rename(const QStringList& selections, const QString newName); Q_INVOKABLE void updateFileElideStatus(const QString &uri, bool isElided); Q_INVOKABLE void setClickedScreenId(const int screenId); Q_INVOKABLE QString getAppId(const QString uri); void openWindow(const QStringList &uris); void finishRefresh(); QStringList getSelectedUris(){ return m_newFilesToBeSelected; } void setSelectedUris(const QStringList &selectedUris){ m_newFilesToBeSelected = selectedUris; Q_EMIT selectedUrisChanged(m_newFilesToBeSelected); } QString getDirectryUri(){ return m_directryUri; } void setDirectryUri(const QString &directryUri){ m_directryUri = directryUri; } QSize getIconSize(){ return m_iconSize; } void setIconSize(const QSize &newIconSize){ if (m_iconSize != newIconSize) { m_iconSize = newIconSize; Q_EMIT iconSizeChanged(); } } QSize recalculateGridSize(); QSize getGridSize(){ return m_gridSize; } void setGridSize(const QSize &newGridSize); int getEmblemSize(){ return m_emblemSize; } void setEmblemSize(const int newEmblemSize){ if (m_emblemSize != newEmblemSize) { m_emblemSize = newEmblemSize; Q_EMIT emblemChanged(); } } QStringList& urisToEdit() { return m_urisToEdit; } static QString getLanguageSpecificSample(); public Q_SLOTS: void paste(const QStringList &selectedUris); Q_SIGNALS: void selectedUrisChanged(const QStringList &selectedUris); void directryUriChanged(); void iconSizeChanged(); void gridSizeChanged(); void emblemChanged(); void selectAll(); void edit(QString uri); void changeOpacity(double opacity); void clickedScreenIdChanged(int screenId); private: bool execSharedFileLink(const QString uri); private: QStringList m_newFilesToBeSelected; QStringList m_urisToEdit;/* 新建文件/文件夹,可编辑文件名list */ QString m_directryUri; ZoomLevel m_zoom_level = Invalid; QSize m_iconSize = QSize(64, 64); QSize m_gridSize = QSize(64, 64); Peony::DesktopMenu *m_menu = nullptr; int m_emblemSize = 16; int m_clickedScreenId = 0; bool m_freshing = false; bool m_initialized = false; }; #endif // FILEACTIONCONTROLER_H peony/peony-qt-desktop/fm-dbus-service.cpp0000664000175000017500000000356215154271070017564 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "fm-dbus-service.h" #include #include #include using namespace Peony; FMDBusService::FMDBusService(QObject *parent) : QObject(parent) { qDebug()<registerService(QStringLiteral("org.freedesktop.FileManager1"), QDBusConnectionInterface::QueueService); } void FMDBusService::ShowFolders(const QStringList& uriList, const QString& startUpId) { qDebug()<<"show folders:"< #include #include #include #include #include #include #include #include #include #include class ScreenManager : public QObject { Q_OBJECT Q_PROPERTY(QScreen* primaryScreen READ primaryScreen NOTIFY primaryScreenChanged) Q_PROPERTY(int screenCount READ screenCount NOTIFY screenCountChanged) Q_PROPERTY(int displayMode READ displayMode NOTIFY displayModeChanged) Q_PROPERTY(QRect virtualDesktopGeometry READ virtualDesktopGeometry NOTIFY virtualDesktopGeometryChanged) public: // 显示模式 enum DisplayMode { Unknown = 0, // 未知模式 Single = 1, // 单屏模式 Mirror = 2, // 镜像模式 Extend = 3 // 扩展模式 }; Q_ENUM(DisplayMode) static ScreenManager* getInstance(); // 屏幕信息方法 QScreen* primaryScreen() const; bool isPrimaryScreen(QScreen* screen) const; QList allScreens() const; int screenCount() const; int displayMode() const; QRect virtualDesktopGeometry() const; // 根据ID获取屏幕信息 Q_INVOKABLE QVariantMap getScreenInfo(int screenId) const; Q_INVOKABLE QScreen* getScreenById(int screenId) const; Q_INVOKABLE int getScreenId(QScreen* screen) const; Q_INVOKABLE int getPrimaryScreenId() const; // 屏幕位置和几何信息 Q_INVOKABLE QRect getScreenGeometry(int screenId) const; Q_INVOKABLE QPoint getScreenPosition(int screenId) const; Q_INVOKABLE QSize getScreenSize(int screenId) const; Q_INVOKABLE qreal getScreenScaleFactor(int screenId) const; // 判断一个点在哪个屏幕上 Q_INVOKABLE int getScreenIdAt(const QPoint& pos) const; Q_INVOKABLE QPoint mapToGlobal(int screenId, const QPoint& pos) const; Q_INVOKABLE QPoint mapFromGlobal(int screenId, const QPoint& pos) const; // 窗口管理 Q_INVOKABLE void relocateWindows(); // 屏幕模式管理 Q_INVOKABLE void switchToSingleScreenMode(); Q_INVOKABLE void switchToMultiScreenMode(); Q_INVOKABLE int checkScreenMode(const QRect& geometry); void initScreens(); bool updateDisplayMode(); void updateVirtualDesktopGeometry(); int generateScreenId(); void addBackgroundWindow(QQuickView* window, QScreen* screen, int id = -1); void removeBackgroundWindow(QQuickView* window); QList getBackgroundWindows() const; QQuickView *getWindowAt(const QPoint& pos) const; QQuickView *getWindowById(int screenId) const; public Q_SLOTS: void handleScreenAdded(QScreen* screen); void handleScreenRemoved(QScreen* screen); void handlePrimaryScreenChanged(QScreen* screen); void handleScreenGeometryChanged(QScreen *screen, const QRect &geometry); Q_SIGNALS: void primaryScreenChanged(); void screenAdded(QScreen* screen, int id); void screenRemoved(QScreen* screen, int id); void screenCountChanged(); void displayModeChanged(); void virtualDesktopGeometryChanged(); void windowsRelocateRequired(); // 模式切换信号 void switchDisplayModeActivated(); void singleScreenModeActivated(); void multiScreenModeActivated(); // 窗口管理信号 //void windowAdded(QQuickView* view, int screenId); //void windowRemoved(QQuickView* view, int screenId); void windowAdded(QObject* window, int screenId); void windowRemoved(QObject* window, int screenId); private: explicit ScreenManager(QObject *parent = nullptr); ~ScreenManager(); static ScreenManager* m_instance; QHash m_screenIds; QHash m_screens; QHash m_backgroundWindows; DisplayMode m_displayMode; QRect m_virtualDesktopGeometry; // 上次分配的ID int m_lastScreenId; }; #define SCREEN_MANAGER ScreenManager::getInstance() #endif // SCREENMANAGER_H peony/peony-qt-desktop/desktop-icon-view.qss0000664000175000017500000000051615154271070020160 0ustar fengfengPeony--DesktopIconView { background-color: transparent; border: 0px; padding: 0px; } Peony--DesktopIconView::Item { padding-top: 5px; image-position: bottom; } Peony--DesktopIconView::Item:hover { background-color: transparent; } Peony--DesktopIconView::Item:selected { background-color: transparent; } peony/peony-qt-desktop/user-dir-manager.h0000664000175000017500000000313715154271070017376 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef USERDIRMANAGER_H #define USERDIRMANAGER_H #include #include #include #include #include #include namespace Peony { class UserdirManager : public QObject { Q_OBJECT public: explicit UserdirManager(QObject *parent = nullptr); void getUserdir(); void moveFile(); Q_SIGNALS: void desktopDirChanged(); void thumbnailSetingChange(); private: QString m_user_name; QString m_user_path; QMap m_last_user_dir; QMap m_current_user_dir; QFileSystemWatcher *m_user_dir_watcher; QDir *m_dir; QStringList m_file_list; QSettings *m_settings; bool m_do_not_thumbnail = false; bool m_allow_parallel; bool m_showTrashDialog; int m_times = 9; }; } #endif // USERDIRMANAGER_H peony/peony-qt-desktop/desktop-menu.cpp0000664000175000017500000011603515154271106017204 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktop-menu.h" #include "file-delete-operation.h" #include "sound-effect.h" #include "directory-view-plugin-iface.h" #include "file-info-job.h" #include "file-info.h" #include "file-utils.h" #include "file-launch-action.h" #include "file-launch-manager.h" #include "file-lauch-dialog.h" #include "clipboard-utils.h" #include "file-operation-utils.h" #include "file-enumerator.h" #include "desktop-menu-plugin-manager.h" #include "manager-control.h" #include "global-settings.h" #include "audio-play-manager.h" #include "image-mount-manager.h" #include #include #include #include #include #include #include #include "desktop-window-manager.h" #include #include #include #include"directory-view-menu.h" using namespace Peony; DesktopMenu::DesktopMenu(DirectoryViewIface *view, QWidget *parent) : QMenu(parent) { //comment old highlight effect // setProperty("useIconHighlightEffect", true); // setProperty("iconHighlightEffectMode", 1); setProperty("fillIconSymbolicColor", true); m_view = view; m_directory = view->getDirectoryUri(); m_selections = view->getSelections(); fillActions(); } DesktopMenu::DesktopMenu(QString currentDirectory, QStringList selections, QWidget *parent) : QMenu(parent) { //comment old highlight effect setProperty("fillIconSymbolicColor", true); m_directory = currentDirectory; m_selections = selections; connect(this, &DesktopMenu::setSortType,this,[=](int i){ Q_EMIT DesktopWindowManager::getInstance()->setSortType(i); }); connect(this,&DesktopMenu::setSortOrder,this,[=](int i){ Q_EMIT DesktopWindowManager::getInstance()->setSortOrder(i); }); connect(this,&DesktopMenu::markFilePos, DesktopWindowManager::getInstance(), &DesktopWindowManager::markCreateFilePos); fillActions(); } QAction *DesktopMenu::exec(const QPoint &pos) { m_execPos = pos; return QMenu::exec(pos); } void DesktopMenu::fillActions() { //add open actions auto openActions = constructOpenOpActions(); if (!openActions.isEmpty()) addSeparator(); //add view actions auto viewActions = constructViewOpActions(); if (!viewActions.isEmpty()) addSeparator(); auto createTemplateActions = constructCreateTemplateActions(); if (!createTemplateActions.isEmpty()) addSeparator(); //add operation actions auto fileOpActions = constructFileOpActions(); if (!fileOpActions.isEmpty()) addSeparator(); //add propertries actions //if this is a background menu, then it should not add propertries actions bool isBackgroundMenu = m_selections.isEmpty(); if(isBackgroundMenu) { constructBackgroundMenuActions(); addSeparator(); } //add plugin actions auto pluginActions = constructMenuPluginActions(); if (!pluginActions.isEmpty()) addSeparator(); constructFilePropertiesActions(); } const QList DesktopMenu::constructOpenOpActions() { QList l; bool isBackgroundMenu = m_selections.isEmpty(); if (isBackgroundMenu) { l<openWindow(m_directory); }); } else { auto fileinfo = FileInfo::fromUri(m_selections.first()); auto mimeType = fileinfo->mimeType(); GAppInfo *m_app_info = nullptr; if(fileinfo->isDesktopFile()){ GDesktopAppInfo *appInfo = g_desktop_app_info_new_from_filename(fileinfo->filePath().toUtf8().constData()); m_app_info = G_APP_INFO(appInfo); }else{ GAppInfo *appinfo = g_app_info_get_default_for_type(mimeType.toUtf8().constData(), false); auto app_info = G_APP_INFO(appinfo); m_app_info = static_cast(g_object_ref(app_info)); } GIcon *icon = g_app_info_get_icon(m_app_info); QIcon appicon; auto iconName = FileUtils::getIconStringFromGIcon(icon); if (iconName.startsWith("/")) { appicon.addFile(iconName); } else { appicon = QIcon::fromTheme(iconName); } appicon = appicon.isNull() ? QIcon::fromTheme("document-open-symbolic") : appicon; if (m_selections.count() == 1 && !m_selections.first().startsWith("trash://") && !m_selections.first().startsWith("computer://") && (m_selections.first() != ("file://" + QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()))) { auto info = FileInfo::fromUri(m_selections.first()); auto displayName = info->displayName(); //FIXME: replace BLOCKING api in ui thread. if (displayName.isEmpty()) displayName = FileUtils::getFileDisplayName(info->uri()); //when name is too long, show elideText //qDebug() << "charWidth:" < ELIDE_TEXT_LENGTH) { int charWidth = fontMetrics().averageCharWidth(); displayName = fontMetrics().elidedText(displayName, Qt::ElideRight, ELIDE_TEXT_LENGTH * charWidth); } if (info->isDir()) { l<setShortcut(QKeySequence(Qt::Key_Enter)); connect(l.last(), &QAction::triggered, this, [=]() { this->openWindow(m_selections); }); auto recommendActions = FileLaunchManager::getRecommendActions(m_selections.first()); if (recommendActions.count() > 1) { auto openWithAction = addAction(QIcon::fromTheme("openwith-symbolic"),tr("Open with...")); QMenu *openWithMenu = new QMenu(this); for (auto action : recommendActions) { action->setParent(openWithMenu); openWithMenu->addAction(static_cast(action)); } auto fallbackActions = FileLaunchManager::getFallbackActions(m_selections.first()); for (auto action : fallbackActions) { action->setParent(openWithMenu); openWithMenu->addAction(static_cast(action)); } openWithMenu->addSeparator(); openWithMenu->addAction(tr("More applications..."), this, [=]() { FileLauchDialog d(m_selections.first()); d.exec(); }); openWithAction->setMenu(openWithMenu); } } else if (!info->isVolume()) { l<setShortcut(QKeySequence(Qt::Key_Enter)); connect(l.last(), &QAction::triggered, this, [=]() { auto uri = m_selections.first(); if (IMAGE_MOUNT_MANAGER->isImageFile(uri)) { IMAGE_MOUNT_MANAGER->mountImage(uri); return; } FileLaunchManager::openAsync(uri); }); bool containsWhitelist = MANAGER_CONTROL->containsWhitelistApp(m_selections); //FIXME: add sub menu for open with action. QMenu *openWithMenu = new QMenu(this); auto recommendActions = FileLaunchManager::getRecommendActions(m_selections.first()); auto fallbackActions = FileLaunchManager::getFallbackActions(m_selections.first()); //fix has default open app but no recommend actions issue, link to bug#61365 //fix open options has two same app issue, linkto bug#74480, 69977 if (recommendActions.count() == 0 && fallbackActions.count() ==0) { auto action = FileLaunchManager::getDefaultAction(m_selections.first()); if (action != NULL && action->getAppInfoDisplayName().length() > 0) recommendActions.append(action); } for (auto action : recommendActions) { action->setParent(openWithMenu); openWithMenu->addAction(static_cast(action)); } for (auto action : fallbackActions) { action->setParent(openWithMenu); openWithMenu->addAction(static_cast(action)); } openWithMenu->addSeparator(); openWithMenu->addAction(tr("More applications..."), this, [=]() { FileLauchDialog d(m_selections.first()); d.exec(); }); if (!containsWhitelist) { auto openWithAction = addAction(QIcon::fromTheme("openwith-symbolic"),tr("Open with...")); openWithAction->setMenu(openWithMenu); } } else { l<displayName(); l<setShortcut(QKeySequence(Qt::Key_Enter)); } else { bool containsWhitelist = MANAGER_CONTROL->containsWhitelistApp(m_selections); if (!containsWhitelist) { l<isDir() || info->isVolume()) { dirs<openWindow(dirs); if (!files.isEmpty()) { Peony::FileLaunchManager::openFilesByDefaultApplications(files); } }); } } return l; } const QList DesktopMenu::constructCreateTemplateActions() { QList l; if (m_selections.isEmpty()) { auto createAction = new QAction(QIcon::fromTheme("new-symbolic"),tr("New"), this); l<setMenu(subMenu); addAction(createAction); //enumerate template dir QDir templateDir(g_get_user_special_dir(G_USER_DIRECTORY_TEMPLATES)); QString templatePath = templateDir.path(); qWarning()<<"tempalte Path is"< info = FileInfo::fromUri(uri_str); QIcon tmpIcon; if (info->uri().endsWith(".desktop")) { QUrl url = info->uri(); auto path = url.path(); auto key_file = g_key_file_new(); if (g_key_file_load_from_file(key_file, path.toUtf8().constData(), G_KEY_FILE_NONE, 0)) { g_autofree gchar* icon_name = g_key_file_get_value(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, 0); if (icon_name) { QString iconName = icon_name; tmpIcon = QIcon::fromTheme(iconName); } g_key_file_free(key_file); } } else { QString iconName = FileUtils::updateFileIconName(info->uri(), true); tmpIcon = QIcon::fromTheme(iconName); } // QString mimeType = info->mimeType(); // if (mimeType.isEmpty()) { // FileInfoJob job(info); // job.querySync(); // mimeType = info->mimeType(); // } // QIcon tmpIcon; // GList *app_infos = g_app_info_get_recommended_for_type(mimeType.toUtf8().constData()); // GList *l = app_infos; // QList actions; // bool isOnlyUnref = false; // while (l) { // auto app_info = static_cast(l->data); // if (!isOnlyUnref) { // GThemedIcon *icon = G_THEMED_ICON(g_app_info_get_icon(app_info)); // const char * const * icon_names = g_themed_icon_get_names(icon); // if (icon_names) // tmpIcon = QIcon::fromTheme(*icon_names); // if(!tmpIcon.isNull()) // isOnlyUnref = true; // } // l = l->next; // } // g_list_free_full(app_infos, g_object_unref); fileNames.append(qinfo.fileName()); QAction *action = new QAction(tmpIcon, qinfo.baseName(), this); connect(action, &QAction::triggered, this, [=]() { Q_EMIT markFilePos(m_execPos); CreateTemplateOperation op(m_directory, CreateTemplateOperation::Template, t); op.run(); auto target = op.target(); //clear old data,fix bug#164160, not enter edit new file issue m_uris_to_edit.clear(); m_uris_to_edit<addAction(action); g_free(uri_str); g_object_unref(gtk_file); } //subMenu->addSeparator(); } else { qWarning()<<"template entries is empty"; } } else { qWarning()<<"template path is empty"; } templatePath = "/opt/kingsoft/wps-office/templates/"; if(!templatePath.isEmpty()) { QDir templateDir(templatePath); auto templates = templateDir.entryList(QDir::AllEntries|QDir::NoDotAndDotDot); if (!templates.isEmpty()) { for (auto t : templates) { QFileInfo qinfo(templateDir, t); auto abspath = qinfo.absoluteFilePath(); if (fileNames.contains(qinfo.fileName())) { continue; } qWarning()<<"template entry is"< info = FileInfo::fromUri(uri_str); QString mimeType = info->mimeType(); if (mimeType.isEmpty()) { FileInfoJob job(info); job.querySync(); mimeType = info->mimeType(); } QIcon tmpIcon; GList *app_infos = g_app_info_get_recommended_for_type(mimeType.toUtf8().constData()); GList *l = app_infos; QList actions; bool isOnlyUnref = false; while (l) { auto app_info = static_cast(l->data); if (!isOnlyUnref) { GThemedIcon *icon = G_THEMED_ICON(g_app_info_get_icon(app_info)); const char * const * icon_names = g_themed_icon_get_names(icon); if (icon_names) tmpIcon = QIcon::fromTheme(*icon_names); if(!tmpIcon.isNull()) isOnlyUnref = true; } l = l->next; } g_list_free_full(app_infos, g_object_unref); QAction *action = new QAction(tmpIcon, qinfo.baseName(), this); connect(action, &QAction::triggered, [=]() { // automatically check for conficts CreateTemplateOperation op(m_directory, CreateTemplateOperation::Template, abspath); Peony::FileOperationErrorDialogWarning dlg; connect(&op, &Peony::FileOperation::errored, &dlg, &Peony::FileOperationErrorDialogWarning::handle); op.run(); auto target = op.target(); m_uris_to_edit<addAction(action); g_free(uri_str); g_object_unref(gtk_file); } subMenu->addSeparator(); } else { qWarning()<<"template entries is empty"; } } else { qWarning()<<"template path is empty"; } QList actions; auto createEmptyFileAction = new QAction(QIcon::fromTheme("document-new-symbolic"), tr("Empty File"), this); actions<addActions(actions); } return l; } const QList DesktopMenu::constructViewOpActions() { QList l; if (m_selections.isEmpty()) { auto useAutoLayoutAction = addAction(QIcon::fromTheme("view-auto-sort-symbolic"),tr("Auto arrange")); useAutoLayoutAction->setCheckable(true); useAutoLayoutAction->setChecked(GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool()); connect(useAutoLayoutAction, &QAction::triggered, [=](bool checked){ useAutoLayoutAction->setChecked(checked); GlobalSettings::getInstance()->setGSettingValue(DESKTOP_USE_AUTO_LAYOUT, checked); }); l<getValue(DEFAULT_DESKTOP_ZOOM_LEVEL).toInt(); auto smallAction = viewTypeSubMenu->addAction(tr("Small"), this, [=]() { Q_EMIT setDefaultZoomLevel(Small); }); auto normalAction = viewTypeSubMenu->addAction(tr("Normal"), this, [=]() { Q_EMIT setDefaultZoomLevel(Normal); }); auto largeAction = viewTypeSubMenu->addAction(tr("Large"), this, [=]() { Q_EMIT setDefaultZoomLevel(Large); }); auto hugeAction = viewTypeSubMenu->addAction(tr("Huge"), this, [=]() { Q_EMIT setDefaultZoomLevel(Huge); }); switch (zoomLevel) { case Small: smallAction->setCheckable(true); smallAction->setChecked(true); break; case Normal: normalAction->setCheckable(true); normalAction->setChecked(true); break; case Large: largeAction->setCheckable(true); largeAction->setChecked(true); break; case Huge: hugeAction->setCheckable(true); hugeAction->setChecked(true); break; default: break; } viewTypeAction->setMenu(viewTypeSubMenu); //sort type auto sortTypeAction = addAction(QIcon::fromTheme("ukui-view-sort-letter-symbolic"),tr("Sort By")); l<setStyle(new MenuStyle(sortTypeMenu->style())); QList tmp; tmp<addAction(tr("Name")); tmp<addAction(tr("Time Modified")); tmp<addAction(tr("File Type")); tmp<addAction(tr("File Size")); int sortType = GlobalSettings::getInstance()->getValue(LAST_DESKTOP_SORT_ORDER).toInt();//m_view->getSortType(); qDebug() << "sortType:" <= tmp.count()) { sortType = GlobalSettings::getInstance()->getValue(LAST_DESKTOP_SORT_ORDER).toInt(); } tmp.at(sortType)->setCheckable(true); tmp.at(sortType)->setChecked(true); for (int i = 0; i < tmp.count(); i++) { connect(tmp.at(i), &QAction::triggered, this, [=]() { qDebug() << "setSortType in menu:" <setValue(LAST_DESKTOP_SORT_ORDER, i); }); } sortTypeAction->setMenu(sortTypeMenu); //sort order // auto sortOrderAction = addAction(tr("Sort Order")); // l<addSeparator(); tmp<addAction(tr("Descending Order")); tmp<addAction(tr("Ascending Order")); int sortOrder = GlobalSettings::getInstance()->getValue(DESKTOP_SORT_ORDER).toInt();//m_view->getSortOrder(); tmp.at(sortOrder)->setCheckable(true); tmp.at(sortOrder)->setChecked(true); for (int i = 0; i < tmp.count(); i++) { connect(tmp.at(i), &QAction::triggered, this, [=](){ Q_EMIT setSortOrder(i); GlobalSettings::getInstance()->setValue(DESKTOP_SORT_ORDER, i); }); } /* l<(m_view); desktopView->zoomIn(); }); l<(m_view); desktopView->zoomOut(); }); */ l<setShortcut(QKeySequence::Refresh); } return l; } const QList DesktopMenu::constructFileOpActions() { QList l; if (!m_selections.isEmpty()) { //don't show file operations when select home path QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (m_selections.count() == 1 && m_selections.first() == "trash:///") { FileEnumerator e; e.setEnumerateDirectory("trash:///"); e.enumerateSync(); auto trashChildren = e.getChildrenUris(); //comment to avoid uncorrect operation in desktop, only in trash can do it // l<setEnabled(!trashChildren.isEmpty()); l<setProperty("clearTrash",true); // if(removeop){ // removeop->connect(removeop,&Peony::FileDeleteOperation::operationFinished, [=](){ // Peony::SoundEffect::getInstance()->recycleBinClearMusic(); // }); // } // Peony::AudioPlayManager::getInstance()->playWarningAudio(); // auto result = QMessageBox::question(nullptr, tr("Delete Permanently"), tr("Are you sure that you want to delete these files? " // "Once you start a deletion, the files deleting will never be " // "restored again.")); // if (result == QMessageBox::Yes) { // FileEnumerator e; // FileOperationUtils::remove(trashChildren); // } }); l.last()->setEnabled(!trashChildren.isEmpty()); } else if (m_selections.count() == 1 && m_selections.first() == "computer:///") { } else if (! m_selections.contains(homeUri)) { l<setShortcut(QKeySequence::Cut); connect(l.last(), &QAction::triggered, this, [=]() { ClipboardUtils::setClipboardFiles(m_selections, true); Q_EMIT changeOpacity(0.5); }); l<setShortcut(QKeySequence::Copy); connect(l.last(), &QAction::triggered, this, [=]() { ClipboardUtils::setClipboardFiles(m_selections, false); //auto desktopView = dynamic_cast(m_view); //desktopView->viewport()->update(); }); if (m_selections.count() == 1){ l<setShortcut(QKeySequence(Qt::Key_F2)); connect(l.last(), &QAction::triggered, this, [=]() { Q_EMIT editUri(m_selections.first()); }); } else if (m_selections.count() > 1) { l<setShortcut(QKeySequence(Qt::Key_F2)); connect(l.last(), &QAction::triggered, this, [=]() { Q_EMIT editUris(m_selections); }); } if (!m_selections.contains("trash:///")) { bool canTrash = true; bool canDelete = true; bool containsWhitelist = MANAGER_CONTROL->containsWhitelistApp(m_selections); for (auto uri : m_selections) { auto info = FileInfo::fromUri(uri); if (! info->canTrash()) canTrash = false; if (! info->canDelete()) canDelete = false; } if (canTrash && !containsWhitelist) { l<setShortcut(QKeySequence::Delete); connect(l.last(), &QAction::triggered, this, [=]() { FileOperationUtils::trash(m_selections, true); }); } else if(canDelete && !containsWhitelist) { //comment delete forever right menu option,reference to mac and Windows //add delete forever option l<setShortcut(QKeySequence::Paste); pasteAction->setEnabled(ClipboardUtils::isClipboardHasFiles()); connect(l.last(), &QAction::triggered, this, [=]() { Q_EMIT paste(ClipboardUtils::getClipboardFilesUris()); }); } if (m_selections.isEmpty()){ addActions(FileOperationManager::getInstance()->getUndoRedoActions()); l<setShortcut(QKeySequence::SelectAll); connect(l.last(), &QAction::triggered, this, [=]() { //qDebug() << "select all"; Q_EMIT invertSelections(); }); } return l; } const QList DesktopMenu::constructFilePropertiesActions() { QList l; l<setShortcut(QKeySequence("Alt+Enter")); connect(l.last(), &QAction::triggered, this, [=]() { //FIXME: if (m_selections.isEmpty()) { this->showProperties(m_directory); } else { this->showProperties(m_selections); } }); return l; } void DesktopMenu::openWindow(const QString &uri) { QUrl url = uri; QProcess p; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders"< DesktopMenu::constructMenuPluginActions() { QList l; //FIXME: auto mgr = DesktopMenuPluginManager::getInstance(); if (mgr->isLoaded()) { //add debug log to check open-terminal not show in first time issue qDebug() << "DesktopMenu PluginManager is loaded"; // Sort plugins by their class name to ensure consistent ordering // across different languages, instead of using translated plugin names auto plugins = mgr->getPlugins(); std::sort(plugins.begin(), plugins.end(), [](MenuPluginInterface *a, MenuPluginInterface *b) { QObject *objA = dynamic_cast(a); QObject *objB = dynamic_cast(b); QString nameA = objA ? objA->metaObject()->className() : "Unknown"; QString nameB = objB ? objB->metaObject()->className() : "Unknown"; return nameA < nameB; }); for (auto plugin : plugins) { QObject *obj = dynamic_cast(plugin); if (obj) { qDebug() << "desktop plugin class:" << obj->metaObject()->className(); } QString pluginId = plugin->name(); QString pluginFileName = mgr->getPluginName(pluginId); // Check SMB share permission; if it's disabled, skip the share plugin if (!MANAGER_CONTROL->checkSmbSharePermission() && pluginFileName.contains("libpeony-share-menu-plugin.so")) { qDebug() << "SMB share plugin disabled, skipping desktop plugin:" << pluginFileName; continue; } auto actions = plugin->menuActions(MenuPluginInterface::DesktopWindow, m_directory, m_selections); for (auto action : actions) { action->setParent(this); if(action->icon().isNull()){ auto pluginicon = plugin->icon(); if(!pluginicon.isNull()){ action->setIcon(pluginicon); } } } l< DesktopMenu::constructIsoMountActions() { QList l; if (m_selections.count() == 1) { QString uri = m_selections.first(); if (!IMAGE_MOUNT_MANAGER->isImageFile(uri)) { return l; } auto mountAction = addAction(QIcon::fromTheme("drive-multidisk-symbolic"), tr("Mount")); l << mountAction; connect(mountAction, &QAction::triggered, this, [=]() { IMAGE_MOUNT_MANAGER->mountImage(uri); }); } return l; } const QList DesktopMenu::constructBackgroundMenuActions() { QList l; QAction *action = addAction(QIcon::fromTheme("desktop-background-symbolic"),QObject::tr("Set Background")); l << action; connect(action, &QAction::triggered, [=]() { //go to control center set background gotoSetBackground(); }); QAction *settingsAction = addAction(QIcon::fromTheme("display-settings-symbolic"),QObject::tr("Display Settings")); l << settingsAction; connect(settingsAction, &QAction::triggered, [=]() { //go to control center set resolution ratio gotoSetResolution(); }); return l; } void DesktopMenu::openWindow(const QStringList &uris) { QStringList args; for (auto arg : uris) { QUrl url = arg; args<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders"<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-properties"< 1) { args.removeAt(args.indexOf("trash:///")); QtConcurrent::run([=]() { QProcess p; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList() << "--show-properties" << "trash:///"); p.startDetached(); #else p.startDetached("/usr/bin/peony", QStringList()<<"--show-properties"<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList() << "--show-properties" << args); p.startDetached(); #else p.startDetached("/usr/bin/peony", QStringList()<<"--show-properties"<= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" << "About"); #endif p.waitForFinished(-1); } void DesktopMenu::gotoSetBackground() { QProcess p; p.setProgram("/usr/bin/ukui-control-center"); //old version use -b, new version use -m Wallpaper as para p.setArguments(QStringList()<<"-m" <<"Wallpaper"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" <<"Wallpaper"); #endif p.waitForFinished(-1); } void DesktopMenu::gotoSetResolution() { QProcess p; p.setProgram("/usr/bin/ukui-control-center"); p.setArguments(QStringList()<<"-m" <<"display"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" <<"display"); #endif p.waitForFinished(-1); } peony/peony-qt-desktop/waylandoutputmanager.h0000664000175000017500000000413615154271070020507 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef WAYLANDOUTPUTMANAGER_H #define WAYLANDOUTPUTMANAGER_H #include #include #include #include class QSocketNotifier; class QTimeLine; namespace KWayland { namespace Client { class Registry; } } class WaylandOutputManager : public QObject { Q_OBJECT public: explicit WaylandOutputManager(QObject *parent = nullptr); QList outputs(); QList xdgOutputs(); Q_SIGNALS: void outputAdded(KWayland::Client::Output *output); void xdgOutputsAdded(KWayland::Client::XdgOutput *xdgOutput); public Q_SLOTS: void run(); void setUKUIOutputEnable(bool enable); protected: void addXdgOutput(KWayland::Client::Output *output); private Q_SLOTS: void setUKUIOutputEnableInternal(); private: struct wl_display *m_display = nullptr; int m_fd = -1; KWayland::Client::Registry *m_registry = nullptr; KWayland::Client::EventQueue *m_eventQueue = nullptr; KWayland::Client::XdgOutputManager *m_xdgOutputManager = nullptr; QMap m_outputs; QSocketNotifier *m_socketNotifier = nullptr; struct ukui_output *m_ukuiOutput = nullptr; QTimeLine *m_timeLine = nullptr; }; #endif // WAYLANDOUTPUTMANAGER_H peony/peony-qt-desktop/peony-json-operation.cpp0000664000175000017500000001263215154271070020666 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #include "peony-json-operation.h" #include "bw-list-info.h" #include #include #include using namespace Peony; PeonyJsonOperation::PeonyJsonOperation(QObject *parent):QObject(parent) { m_configFile = nullptr; } PeonyJsonOperation::~PeonyJsonOperation() { m_configFile = nullptr; } void PeonyJsonOperation::setConfigFile(QString configFile) { //qDebug()<<"the configfile :" << configFile; m_configFile = configFile; } int PeonyJsonOperation::loadConfigFile(BWListInfo *bwListInfo) { //1、judge file exsit? QFileInfo file(m_configFile); if (!file.exists()){ // qWarning("config file %s do not exist", m_configFile); return -EEXIST; } //2、read json file QFile jsonFile(m_configFile); if (!jsonFile.open(QIODevice::ReadOnly)){ // qWarning("open file %s failed, errno[%d]", m_configFile, errno); return -errno; } QByteArray jsonCtxt = jsonFile.readAll(); jsonFile.close(); if (jsonCtxt.isEmpty()){ qWarning("get json context failed, or is empty"); return -EINVAL; } //3、load json file QJsonParseError jsonerror; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonCtxt, &jsonerror); if (jsonDoc.isNull() || jsonerror.error != QJsonParseError::NoError){ // qWarning("json load file %s failed, errno[%d]", m_configFile, jsonerror.error); return -EINVAL; } getBWListInfo(jsonDoc, bwListInfo); return 0; } void PeonyJsonOperation::releaseConfigFile() { } int PeonyJsonOperation::getBWListInfo(QJsonDocument &jsonDoc, BWListInfo *bwListInfo) { QJsonObject jsonObj = jsonDoc.object(); if (!jsonObj.contains("ukui-peony")) { qWarning("the json file is not ukui-peony"); return -EINVAL; } QJsonObject peonyObj = jsonObj.value("ukui-peony").toObject(); if (!peonyObj.contains("mode")) { qWarning("the json file does not contain model"); return -EINVAL; } QString model = peonyObj.value("mode").toString(); qDebug()<<"bw list mode:"<< model; if (BW_LIST_BLACK == model) { bwListInfo->setBWListModel(model); if (peonyObj.contains(BW_LIST_BLACK)) { QJsonValue bPkgValue = peonyObj.value(BW_LIST_BLACK); return bwPkgInfoParse(bPkgValue, bwListInfo); } } else if (BW_LIST_WHITE == model){ bwListInfo->setBWListModel(model); if (peonyObj.contains(BW_LIST_WHITE)) { QJsonValue wPkgValue = peonyObj.value(BW_LIST_WHITE); return bwPkgInfoParse(wPkgValue, bwListInfo); } } else if (BW_LIST_NORMAL == model){ bwListInfo->setBWListModel(model); } else { // qWarning("the mode %s is undefined", model); return -EINVAL; } return 0; } int PeonyJsonOperation::bwPkgInfoParse(QJsonValue &bwPkgValue, BWListInfo *bwListInfo) { if (!bwPkgValue.isArray()) { qWarning("the pkg info format is not array"); return -EINVAL; } QJsonArray pkgInfoArray = bwPkgValue.toArray(); int pkgCnt = pkgInfoArray.size(); for (int i = 0; i < pkgCnt; i++) { QJsonValue pkgElementValue = pkgInfoArray.at(i); if (!pkgElementValue.isObject()) { qWarning("the format of pkg element is not object"); return -EINVAL; } QJsonObject pkgElementObj = pkgElementValue.toObject(); if (!pkgElementObj.contains("entries")) { qWarning("the pkg info do not contain element entries"); return -EINVAL; } QJsonValue entryInfoValue = pkgElementObj.value("entries"); entryInfoParse(entryInfoValue, bwListInfo); } return 0; } int PeonyJsonOperation::entryInfoParse(QJsonValue &entryInfoValue, BWListInfo *bwListInfo) { if (!entryInfoValue.isArray()) { qWarning("the app config is not array"); return -EINVAL; } QJsonArray entryInfoArray = entryInfoValue.toArray(); int entryCnt = entryInfoArray.size(); for (int i = 0; i < entryCnt; i++) { QJsonValue appValue = entryInfoArray.at(i); if (!appValue.isObject()) { qWarning("the app config array element is not object"); return -EINVAL; } QJsonObject appObj = appValue.toObject(); if (!appObj.contains("path")) { qWarning("the config do not contain element path"); return -EINVAL; } QJsonValue pathValue = appObj.value("path"); if (!pathValue.isString()){ qWarning("path element is not string"); return -EINVAL; } QString appPath = pathValue.toString(); bwListInfo->addBWListElement(appPath); } return 0; } peony/peony-qt-desktop/background-manager.h0000664000175000017500000001263315154271106017764 0ustar fengfeng/* * Copyright (C) 2025, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Wenjie Xiang * */ #ifndef BACKGROUNDMANAGER_H #define BACKGROUNDMANAGER_H #include #include #include #include #include #include #include #define BACKGROUND_MATE_SETTINGS "org.mate.background" #define BACKGROUND_MATE_PATH "/org/mate/desktop/background/" #define BACKGROUND_SETTINGS "org.ukui.interface" #define BACKGROUND_PATH "/org/ukui/interface/" #define ACCOUNT_SETTINGS "org.freedesktop.Accounts" #define ACCOUNT_PATH "/org/freedesktop/Accounts" #define PICTUREFILENAME "pictureFilename" #define PICTUREOPTIONS "pictureOptions" #define PRIMARYCOLOR "primaryColor" #define PICTURE_FILENAME "picture-filename" #define DEFAULTBACKGROUND "/usr/share/backgrounds/ubuntukylin-default-settings.jpg" class QScreen; class BackgroundManager : public QObject { Q_OBJECT Q_PROPERTY(QString backgroundOption READ getBackgroundOption WRITE setBackgroundOption NOTIFY backgroundOptionChanged) Q_PROPERTY(QString accountBackground READ getAccountBackground WRITE setAccountBackground NOTIFY accountBackgroundChanged) Q_PROPERTY(bool usePureColor READ getUsePureColor WRITE setUsePureColor NOTIFY usePureColorChanged) Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QString backImagePath READ getBackImagePath NOTIFY backImagePathChanged) Q_PROPERTY(QString frontImagePath READ getFrontImagePath NOTIFY frontImagePathChanged) Q_PROPERTY(QSize frontImageSourceSize READ getFrontImageSourceSize NOTIFY frontImageSourceSizeChanged) Q_PROPERTY(QSize backImageSourceSize READ getBackImageSourceSize NOTIFY backImageSourceSizeChanged) public: static BackgroundManager *globalInstance(); Q_INVOKABLE QString getBackImagePath() const; Q_INVOKABLE QString getFrontImagePath() const; Q_INVOKABLE QString getBackgroundOption() const; Q_INVOKABLE void setBackgroundOption(const QString &backgroundOption); Q_INVOKABLE QString getAccountBackground() const; Q_INVOKABLE void setAccountBackground(const QString &backgroundPath); Q_INVOKABLE bool getUsePureColor() const; Q_INVOKABLE void setUsePureColor(const bool usePureColor); Q_INVOKABLE QColor getColor() const; Q_INVOKABLE void setColor(const QColor &color); Q_INVOKABLE QSize getFrontImageSourceSize() const; Q_INVOKABLE QSize getBackImageSourceSize() const; Q_INVOKABLE QRect calculateSpannedSourceRect(const QRect &screenGeometry, const QString &imagePath) const; Q_INVOKABLE QSize calculateOptimalSourceSize(const QString &imagePath) const; void forceUpdateBackground(); private: explicit BackgroundManager(QObject *parent = nullptr); void initGSettings(); void initBackground(); void switchBackground(); void initScreenMonitoring(); void connectScreenDpiSignals(QScreen *screen); bool shouldUpdateForScreenChange() const; void scheduleUpdateSourceSizes(); QSize maxScreenSize() const; QSize calculateWallpaperTargetSize(const QSize &originalSize, const QSize &screenSize) const; bool isLeftGreaterThanRightSize(const QSize &left, const QSize &right) const; QString normalizeImagePath(const QString &imagePath) const; void updateSourceSizes(); void updateImagePaths(const QString &newBackPath, const QString &newFrontPath); // Caching mechanism struct SourceSizeInfo { QSize size; qint64 lastModified; QSize maxScreenSize; QSize originalImageSize; bool operator==(const SourceSizeInfo& other) const { return size == other.size && lastModified == other.lastModified && maxScreenSize == other.maxScreenSize && originalImageSize == other.originalImageSize; } }; mutable QHash m_sourceSizeCache; QSize getCachedOptimalSourceSize(const QString &imagePath) const; void clearSourceSizeCache(); public Q_SLOTS: void onDelayedUpdateSourceSizes(); Q_SIGNALS: void backgroundOptionChanged(); void accountBackgroundChanged(); void usePureColorChanged(); void colorChanged(); void backImagePathChanged(); void frontImagePathChanged(); void forceUpdated(); void frontImageSourceSizeChanged(); void backImageSourceSizeChanged(); private: QString m_backImagePath; QString m_frontImagePath; bool m_usePureColor = false; QColor m_color = Qt::black; QString m_backgroundOption; QGSettings *m_backgroundSettings = nullptr; bool m_shouldSyncAccountBackground = true; QSize m_frontImageSourceSize; QSize m_backImageSourceSize; mutable QSize m_lastMaxScreenSize; QTimer* m_delayedUpdateTimer = nullptr; }; #endif // BACKGROUNDMANAGER_H peony/peony-qt-desktop/org.ukui.freedesktop.FileManager1.service0000664000175000017500000000012415154271070023745 0ustar fengfeng[D-BUS Service] Name=org.freedesktop.FileManager1 Exec=/usr/bin/peony-qt-desktop -d peony/peony-qt-desktop/ukui-output-core.c0000664000175000017500000000256515154271070017474 0ustar fengfeng/* Generated by wayland-scanner 1.18.0 */ /* * Copyright (C) 2021, KylinSoft Co., Ltd. * * This program 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. * * This program 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 https://www.gnu.org/licenses/. */ #include #include #include "wayland-util.h" #ifndef __has_attribute # define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ #endif #if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) #define WL_PRIVATE __attribute__ ((visibility("hidden"))) #else #define WL_PRIVATE #endif static const struct wl_interface *ukui_output_types[] = { NULL, }; static const struct wl_message ukui_output_requests[] = { { "set_outputs_paint_enabled", "u", ukui_output_types + 0 }, }; WL_PRIVATE const struct wl_interface ukui_output_interface = { "ukui_output", 1, 1, ukui_output_requests, 0, NULL, }; peony/peony-qt-desktop/primary-manager.cpp0000664000175000017500000000731415154271070017663 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "primary-manager.h" #include #include #define DBUS_NAME "org.ukui.SettingsDaemon" #define DBUS_PATH "/org/ukui/SettingsDaemon/wayland" #define DBUS_INTERFACE "org.ukui.SettingsDaemon.wayland" PrimaryManager::PrimaryManager() { QDBusConnection conn = QDBusConnection::sessionBus(); if (!conn.isConnected()) { qCritical()<<"failed to init primary screen manager, can not connect to session dbus"; return; } mDbusXrandInter = new QDBusInterface(DBUS_NAME, DBUS_PATH, DBUS_INTERFACE, QDBusConnection::sessionBus()); connect(mDbusXrandInter, SIGNAL(screenPrimaryChanged(int,int,int,int)), this, SLOT(priScreenChanged(int,int,int,int))); } void PrimaryManager::start() { int priX, priY, priWid, priHei; QString priName; priX = getScreenGeometry("x"); priY = getScreenGeometry("y"); priWid = getScreenGeometry("width"); priHei = getScreenGeometry("height"); priName = getScreenName ("priScreenName"); qDebug("Start: Primary screen geometry is x=%d, y=%d, windth=%d, height=%d,", priX, priY, priWid, priHei); qDebug()<<"Primary screen name = " << priName; } int PrimaryManager::getScreenGeometry(QString methodName) { int res = 0; QDBusMessage message = QDBusMessage::createMethodCall(DBUS_NAME, DBUS_PATH, DBUS_INTERFACE, methodName); QDBusMessage response = QDBusConnection::sessionBus().call(message, QDBus::Block, 3000); if (response.type() == QDBusMessage::ReplyMessage) { if(response.arguments().isEmpty() == false) { int value = response.arguments().takeFirst().toInt(); res = value; qDebug() << value; } } else { qCritical()<priScreenChangedSignal(x, y, width, height); qDebug("primary screen changed, geometry is x=%d, y=%d, windth=%d, height=%d", x, y, width, height); } peony/peony-qt-desktop/man/0000775000175000017500000000000015154271070014632 5ustar fengfengpeony/peony-qt-desktop/man/peony-qt-desktop.10000664000175000017500000000142015154271070020134 0ustar fengfeng.\" Man page for Peony-Qt desktop .TH Peony-Qt 1 "09 December 2019" "UKUI Desktop Environment" .SH "NAME" Peony-Qt-Desktop \- The UKUI3.0 desktop program. .SH "SYNOPSIS" .B peony-qt-desktop [OPTION] .SH "DESCRIPTION" Peony-Qt is the default file manager for UKUI3.0. .PP This is the desktop program command line tool for interaction of terminal. .SH "OPTIONS" .TP \fB -q, --quit\fR Close the desktop window, stop the running service and quit. .TP \fB -d, --daemon\fR Run program with DBus service. .TP \fB -w, --desktop-window\fR Show desktop window. .SH "BUGS" .SS Should you encounter any bugs, they may be reported at: https://github.com/ukui/peony/issues .SH "AUTHORS" .SS This Manual Page has been written for the UKUI Desktop Environment by: Yue Lan (2019) peony/peony-qt-desktop/bw-list-info.cpp0000664000175000017500000000360715154271070017103 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #include "bw-list-info.h" using namespace Peony; BWListInfo::BWListInfo(QObject *parent):QObject(parent) { m_workModel = BW_LIST_NORMAL; } BWListInfo::~BWListInfo() { clearBWlist(); } void BWListInfo::setBWListModel(QString model) { m_workModel = model; } int BWListInfo::addBWListElement(QString desktopName) { QStringList strList = desktopName.split("/"); // qDebug()<<"add bw list element" << strList.last(); m_bwListInfo.insert(strList.last()); return 0; } int BWListInfo::delBWListElement(QString desktopName) { m_bwListInfo.remove(desktopName); return 0; } int BWListInfo::clearBWlist() { if (!m_bwListInfo.isEmpty()) { m_bwListInfo.clear(); } m_workModel = BW_LIST_NORMAL; \ return 0; } bool BWListInfo::desktopNameExist(QString desktop) { //qDebug()<<"check desktop exsit" << desktop; return m_bwListInfo.contains(desktop); } bool BWListInfo::isBlackListMode() { return m_workModel == BW_LIST_BLACK; } bool BWListInfo::isWriteListMode() { return m_workModel == BW_LIST_WHITE; } bool BWListInfo::isNormalMode() { return m_workModel == BW_LIST_NORMAL; } peony/peony-qt-desktop/peony-qt-desktop-style.qrc0000664000175000017500000000014415154271070021146 0ustar fengfeng desktop-icon-view.qss peony/peony-qt-desktop/peony-desktop-application.cpp0000664000175000017500000010543015154271106021670 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * Authors: Meihong He * */ #include "peony-desktop-application.h" #include "fm-dbus-service.h" #include "desktop-menu-plugin-manager.h" #include "volume-manager.h" #include "global-settings.h" #include "desktop-menu.h" #include "global-settings.h" #include "file-enumerator.h" #include "advanced-desktop-item-model.h" #include "desktop-window-manager.h" #include "windowmanager/windowmanager.h" #include "screen-manager.h" #include "image-mount-manager.h" #include "background-manager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #define KYLIN_USER_GUIDE_PATH "/" #define KYLIN_USER_GUIDE_SERVICE QString("com.kylinUserGuide.hotel_%1").arg(getuid()) #define KYLIN_USER_GUIDE_INTERFACE "com.guide.hotel" #define DESKTOP_MEDIA_HANDLE "org.gnome.desktop.media-handling" static bool has_desktop = false; static bool has_daemon = false; static bool has_background = false; static QRect max_size = QRect(0, 0, 0, 0); static Peony::AdvancedDesktopItemModel *desktop_model = nullptr; static DesktopWindowManager *desktopManger = nullptr; static bool g_emitFinish = false; //record of desktop start time qint64 PeonyDesktopApplication::peony_desktop_start_time = 0; void guessContentTypeCallback(GObject* object,GAsyncResult *res,gpointer data); static void volume_mount_cb (GObject* source, GAsyncResult* res, gpointer udata); static void mount_added_cb (GVolumeMonitor *volume_monitor, GMount *mount, gpointer user_data); static void mount_changed_cb (GVolumeMonitor *volume_monitor, GMount *mount, gpointer user_data); void trySetDefaultFolderUrlHandler() { //NOTE: //There is a bug in qt concurrent. If we use QtConcurrent::run() //to start a async function in the init stage, the qapplication will //not quit when we call "peony-qt-desktop -q" in command line. // //To solve this problem, the simplest way is delaying a while to execute the //async lambda function. QTimer::singleShot(1000, []() { auto thread = QThread::create([=]() { GList *apps = g_app_info_get_all_for_type("inode/directory"); bool hasPeonyQtAppInfo = false; GList *l = apps; while (l) { GAppInfo *info = static_cast(l->data); QString cmd = g_app_info_get_executable(info); if (cmd.contains("peony")) { hasPeonyQtAppInfo = true; g_app_info_set_as_default_for_type(info, "inode/directory", nullptr); break; } l = l->next; } if (apps) { g_list_free_full(apps, g_object_unref); } if (!hasPeonyQtAppInfo) { GAppInfo *peony_qt = g_app_info_create_from_commandline("peony", nullptr, G_APP_INFO_CREATE_SUPPORTS_URIS, nullptr); g_app_info_set_as_default_for_type(peony_qt, "inode/directory", nullptr); g_object_unref(peony_qt); } return; }); thread->start(QThread::IdlePriority); }); } //task#147972, story#21858, GreatWall svn and SE9215 controler, all file provide trash option void greatWallDeviceInit() { auto thread = QThread::create([=]() { QProcess process; //process 中管道命令不生效,需要自己对读取的字符串进行处理 //process.start("lspci | grep -c 88SE9215"); process.start("lspci"); process.waitForFinished(); QString result = process.readAllStandardOutput(); QStringList retList = result.split("\n"); qDebug() << "greatWallDeviceInit lspci:"<=0){ qDebug() << "match info:"<setValue(TRASH_MOBILE_FILES, true); } break; } } }); thread->start(QThread::IdlePriority); } QRect caculateVirtualDesktopGeometry() { QRegion screensRegion; for (auto screen : qApp->screens()) { screensRegion += screen->geometry(); } auto rect = screensRegion.boundingRect(); if (rect.size().width()> rect.size().height()) { rect = QRect(0, 0, rect.size().width(), rect.size().width()); } else { rect = QRect(0, 0, rect.size().height(), rect.size().height()); } if (rect.size().width()> max_size.size().width()) { max_size = rect; } return max_size; } PeonyDesktopApplication::PeonyDesktopApplication(int &argc, char *argv[], const QString &applicationName) : QtSingleApplication (applicationName, argc, argv) { bool isWayland = QString(qgetenv("XDG_SESSION_DESKTOP")).contains("kylin-wlcom") || QString(qgetenv("XDG_SESSION_DESKTOP")).contains("ukui-wayland"); setProperty("isWayland", isWayland); setProperty("isDesktop", true); GlobalSettings::getInstance()->setDesktopStartUp(true); // fix #172774 QIcon::setFallbackSearchPaths(QIcon::fallbackSearchPaths()<<"/usr/share/pixmaps"); qDebug()<<"peony desktop constructor start"; setApplicationVersion(QString("v%1").arg(VERSION)); //setApplicationDisplayName(tr("Peony-Qt Desktop")); QTranslator *t = new QTranslator(this); t->load("/usr/share/libpeony-qt/libpeony-qt_"+QLocale::system().name()); QApplication::installTranslator(t); QTranslator *t2 = new QTranslator(this); t2->load("/usr/share/peony-qt-desktop/peony-qt-desktop_"+QLocale::system().name()); QApplication::installTranslator(t2); QTranslator *t3 = new QTranslator(this); t3->load("/usr/share/qt6/translations/qt_"+QLocale::system().name()); QApplication::installTranslator(t3); QTranslator *sdkTrans = new QTranslator(this); if (sdkTrans->load(":/translations/gui_" + QLocale::system().name() + ".qm")) { QApplication::installTranslator(sdkTrans); } setApplicationName(tr("peony-qt-desktop")); setWindowIcon(QIcon::fromTheme("system-file-manager")); //added for session call interactive //QGuiApplication::setFallbackSessionManagementEnabled(true); QGuiApplication::setQuitOnLastWindowClosed(false); // fix #145378, logout background displayment issue. QObject::connect(this, &QGuiApplication::saveStateRequest, this, [=](QSessionManager &manager){ if (KWindowSystem::isPlatformX11()) { if (manager.allowsErrorInteraction()) { qInfo()<<"session about to logout, clear the root window background"; // XSetWindowBackground(QX11Info::display(), QX11Info::appRootWindow(), 0); // XSync(QX11Info::display(), false); manager.release(); } else { qInfo()<<"session not support interaction or not x11 platform"; // XSetWindowBackground(QX11Info::display(), QX11Info::appRootWindow(), 0); // XSync(QX11Info::display(), false); } } }); // global settings if (QGSettings::isSchemaInstalled (FONT_SETTINGS)) { //font monitor QGSettings *fontSetting = new QGSettings (FONT_SETTINGS, QByteArray(), this); connect (fontSetting, &QGSettings::changed, this, [=] (const QString &key) { if (key == "systemFont" || key == "systemFontSize") { QFont font = this->font(); for(auto widget : qApp->allWidgets()) { widget->setFont(font); } } }); } if (!this->isRunning()) { qDebug()<<"isPrimary screen"; getDesktopWindowManager(); //check if is great wall device and init settings connect(desktopManger, &DesktopWindowManager::emitFinish, this , [=](){ if (g_emitFinish) return; g_emitFinish = true; GlobalSettings::getInstance()->setDesktopStartUp(false);/* 桌面启动结束 */ QDBusMessage message = QDBusMessage::createMethodCall("org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", "startupfinished"); QList args; args.append("peony-qt-desktop"); args.append("startupfinished"); message.setArguments(args); QDBusConnection::sessionBus().send(message); greatWallDeviceInit(); auto thread = QThread::create([=]() { /* 桌面启动之后再挂载本地分区和监听volumes变化 */ autoMountLocalDriver(); monitoringVolumesChanges();//end }); thread->start(QThread::IdlePriority); }); connect(this, &QtSingleApplication::messageReceived, [=](QString msg) { this->parseCmd(msg, true); }); QFile file(":/desktop-icon-view.qss"); file.open(QFile::ReadOnly); setStyleSheet(QString::fromLatin1(file.readAll())); file.close(); //add 5 seconds delay to load plugins //try to fix first time enter desktop right menu not show open terminal issue //fix need wait 5 seconds open terminal issue, link to bug#75654 //目前新的加载流程不需要等待那么久,加载出桌面时,应用都注册好了 // QTimer::singleShot(1000, [=]() { // Peony::DesktopMenuPluginManager::getInstance(); // }); /* QSystemTrayIcon *trayIcon = new QSystemTrayIcon(this); auto volumeManager = Peony::VolumeManager::getInstance(); connect(volumeManager, &Peony::VolumeManager::driveConnected, this, [=](const std::shared_ptr &drive){ trayIcon->show(); trayIcon->showMessage(tr("Drive"), tr("%1 connected").arg(drive->name())); }); connect(volumeManager, &Peony::VolumeManager::driveDisconnected, this, [=](const std::shared_ptr &drive){ trayIcon->show(); trayIcon->showMessage(tr("Drive"), tr("%1 disconnected").arg(drive->name())); }); connect(trayIcon, &QSystemTrayIcon::messageClicked, trayIcon, &QSystemTrayIcon::hide); */ // if(!GlobalSettings::getInstance()->isDesktopStartUp()){ // // auto mount local driver // qDebug()<<"auto mount local volumes"; // GVolumeMonitor* vm = g_volume_monitor_get (); // if (vm) { // GList* drives = g_volume_monitor_get_connected_drives(vm); // if (drives) { // for (GList* i = drives; nullptr != i; i = i->next) { // GDrive * d = static_cast(i->data); // if (G_IS_DRIVE(d)) { // GList* volumes = g_drive_get_volumes(d); // if (volumes) { // for (GList* j = volumes; nullptr != j; j = j->next) { // GVolume* v = static_cast(j->data); // if (G_IS_VOLUME(v)) { // g_autofree char* uuid = g_volume_get_uuid(v); // if (0 != g_strcmp0("2691-6AB8", uuid)) { // g_volume_mount(v, G_MOUNT_MOUNT_NONE, nullptr, nullptr, volume_mount_cb, nullptr); // } // g_object_unref(v); // } // } // g_list_free(volumes); // } // g_object_unref(d); // } // } // g_list_free(drives); // } // } // g_object_unref(vm); // g_signal_connect (g_volume_monitor_get(), "mount-added", G_CALLBACK(mount_added_cb), nullptr); // g_signal_connect (g_volume_monitor_get(), "mount-changed", G_CALLBACK(mount_added_cb), nullptr); // } // enumerat network:/// // 适配2503内存优化任务,桌面不拉起gvfsd-dnssd和gvfsd-network // note: 不后台启动可能会导致访问网络变慢,可能需要实际验证是否对用户体验有影响 // QThread* t = QThread::create ([=] () { // FileEnumerator e; // e.setEnumerateDirectory ("network:///"); // e.enumerateSync(); // e.getChildrenUris (); // }); // connect (t, &QThread::finished, t, &QObject::deleteLater); // t->start (); } //parse cmd qDebug()<<"parse cmd"; auto message = this->arguments().join(' ').toUtf8(); parseCmd(message, !isRunning()); // if(!GlobalSettings::getInstance()->isDesktopStartUp()){ // qDebug()<<"monitor volumes change"; // auto volumeManager = Peony::VolumeManager::getInstance(); // connect(volumeManager,&Peony::VolumeManager::mountAdded,this,[=](const std::shared_ptr &mount){ // // auto open dir for inserted dvd. // GMount* newMount = (GMount*) g_object_ref(mount->getGMount()); // //special Volumn of 839 M upgrade part can not mount // if (mount->uuid() != "2691-6AB8") // g_mount_guess_content_type(newMount, FALSE, NULL, guessContentTypeCallback, NULL); // // mount // }); // connect(volumeManager,&Peony::VolumeManager::volumeRemoved,this,&PeonyDesktopApplication::volumeRemovedProcess); // } // 获取max_size初始值 //caculateVirtualDesktopGeometry(); connect(IMAGE_MOUNT_MANAGER, &Peony::ImageMountManager::deviceMounted, this, [this](const QString &mountPoint) { if (QFileInfo(mountPoint).exists()) { QUrl url(QString("file://" + mountPoint)); QString uri = url.toEncoded(); QStringList args; args << uri; QProcess p; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders"< reply = conn.interface()->call("GetNameOwner", KYLIN_USER_GUIDE_SERVICE); return reply != ""; } void PeonyDesktopApplication::showGuide(const QString &appName) { if (!userGuideDaemonRunning()) { QUrl url = QUrl("help:ubuntu-kylin-help", QUrl::TolerantMode); QDesktopServices::openUrl(url); return; } bool bRet = false; QDBusMessage m = QDBusMessage::createMethodCall(KYLIN_USER_GUIDE_SERVICE, KYLIN_USER_GUIDE_PATH, KYLIN_USER_GUIDE_INTERFACE, "showGuide"); m << appName; QDBusMessage response = QDBusConnection::sessionBus().call(m); if (response.type()== QDBusMessage::ReplyMessage) { //bRet = response.arguments().at(0).toBool(); } else { QUrl url = QUrl("help:ubuntu-kylin-help", QUrl::TolerantMode); QDesktopServices::openUrl(url); } } void PeonyDesktopApplication::gotoSetBackground() { QProcess p; p.setProgram("/usr/bin/ukui-control-center"); //old version use -b, new version use -m Wallpaper as para p.setArguments(QStringList()<<"-m" <<"Wallpaper"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" <<"Wallpaper"); #endif p.waitForFinished(-1); } void PeonyDesktopApplication::gotoSetResolution() { QProcess p; p.setProgram("/usr/bin/ukui-control-center"); p.setArguments(QStringList()<<"-m" <<"display"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" <<"display"); #endif p.waitForFinished(-1); } void PeonyDesktopApplication::parseCmd(QString msg, bool isPrimary) { QCommandLineParser parser; QCommandLineOption quitOption(QStringList()<<"q"<<"quit", tr("Close the peony desktop window")); parser.addOption(quitOption); QCommandLineOption daemonOption(QStringList()<<"d"<<"daemon", tr("Take over the dbus service.")); parser.addOption(daemonOption); QCommandLineOption desktopOption(QStringList()<<"w"<<"desktop-window", tr("Take over the desktop displaying")); parser.addOption(desktopOption); QCommandLineOption backgroundOption(QStringList()<<"b"<<"background", tr("Setup backgrounds")); // parser.addOption(backgroundOption); QCommandLineOption clearIconsOption(QStringList()<<"c"<<"clear-icons", tr("Clear standard icons")); parser.addOption(clearIconsOption); QCommandLineOption layoutOption(QStringList()<<"l"<<"layout-items", tr("Layout item with top to bottom left to right")); parser.addOption(layoutOption); //story28307, 28308, force update background QCommandLineOption UpdateOption(QStringList()<<"u"<<"update-background", tr("Force update backgrounds")); parser.addOption(UpdateOption); if (isPrimary) { if (m_first_parse) { auto helpOption = parser.addHelpOption(); auto versionOption = parser.addVersionOption(); m_first_parse = false; } const QStringList args = QString(msg).split(' '); parser.process(args); if (parser.isSet(quitOption)) { QTimer::singleShot(1000, this, [=]() { if (desktopManger) { delete desktopManger; desktopManger = nullptr; } qApp->quit(); }); return; } if (parser.isSet(daemonOption)) { if (!has_daemon) { has_daemon = true; qDebug()<<"-d"; trySetDefaultFolderUrlHandler(); //FIXME: take over org.freedesktop.FileManager1 Peony::FMDBusService *service = new Peony::FMDBusService(this); connect(service, &Peony::FMDBusService::showItemsRequest, [=](const QStringList &urisList) { QProcess p; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-items"<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders"<= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-properties"<setConnection(QDBusConnection::sessionBus()); watcher->addWatchedService("org.ukui.KWin"); connect(watcher, &QDBusServiceWatcher::serviceRegistered, desktopManger, &DesktopWindowManager::raiseWid); } setupBgAndDesktop(); } if (parser.isSet(backgroundOption)) { setupBgAndDesktop(); } if (parser.isSet(clearIconsOption)) { if (has_desktop) { clearIcons(args); } } if (parser.isSet(layoutOption)) { desktopManger->layoutViewItems(); } if (parser.isSet(UpdateOption)) { //force update background use gsettings pictureFile //DesktopBackgroundManager::globalInstance()->forceUpdateBackground(); BackgroundManager::globalInstance()->forceUpdateBackground(); } connect(this, &QApplication::paletteChanged, this, [=](const QPalette &pal) { for (auto w : allWidgets()) { w->setPalette(pal); w->update(); } }); } else { auto helpOption = parser.addHelpOption(); auto versionOption = parser.addVersionOption(); if (arguments().count() < 2) { parser.showHelp(); } parser.process(arguments()); sendMessage(msg); } } void PeonyDesktopApplication::clearIcons(const QStringList &args) { //定制需求 int index = -1; if (args.contains("-c")) { index = args.indexOf("-c"); } else if (args.contains("--clear-icons")) { index = args.indexOf("--clear-icons"); } index++; if ((index <= 0) || (index >= args.count())) { return; } const QString &operationStr = args.value(index); bool isSuccess = false; int operationNum = operationStr.toInt(&isSuccess); // for (auto window : m_bg_windows) { // if (!window->getIconView()) { // return; // } // } if (isSuccess) { switch (operationNum) { case 1: GlobalSettings::getInstance()->setValue(DISPLAY_STANDARD_ICONS, false); break; default: GlobalSettings::getInstance()->setValue(DISPLAY_STANDARD_ICONS, true); } } } void PeonyDesktopApplication::autoMountLocalDriver() { // auto mount local driver qDebug()<<"auto mount local volumes"; GVolumeMonitor* vm = g_volume_monitor_get (); if (vm) { GList* drives = g_volume_monitor_get_connected_drives(vm); if (drives) { for (GList* i = drives; nullptr != i; i = i->next) { GDrive * d = static_cast(i->data); if (G_IS_DRIVE(d)) { GList* volumes = g_drive_get_volumes(d); if (volumes) { for (GList* j = volumes; nullptr != j; j = j->next) { GVolume* v = static_cast(j->data); if (G_IS_VOLUME(v)) { g_autofree char* uuid = g_volume_get_uuid(v); if (0 != g_strcmp0("2691-6AB8", uuid)) { g_volume_mount(v, G_MOUNT_MOUNT_NONE, nullptr, nullptr, volume_mount_cb, nullptr); } g_object_unref(v); } } g_list_free(volumes); } g_object_unref(d); } } g_list_free(drives); } } g_object_unref(vm); g_signal_connect (g_volume_monitor_get(), "mount-added", G_CALLBACK(mount_added_cb), nullptr); g_signal_connect (g_volume_monitor_get(), "mount-changed", G_CALLBACK(mount_added_cb), nullptr); } void PeonyDesktopApplication::monitoringVolumesChanges() { qDebug()<<"monitor volumes change"; auto volumeManager = Peony::VolumeManager::getInstance(); connect(volumeManager,&Peony::VolumeManager::mountAdded,this,[=](const std::shared_ptr &mount){ // auto open dir for inserted dvd. GMount* newMount = (GMount*) g_object_ref(mount->getGMount()); //special Volumn of 839 M upgrade part can not mount if (mount->uuid() != "2691-6AB8") g_mount_guess_content_type(newMount, FALSE, NULL, guessContentTypeCallback, NULL); // mount }); connect(volumeManager,&Peony::VolumeManager::volumeRemoved,this,&PeonyDesktopApplication::volumeRemovedProcess); } void PeonyDesktopApplication::setupDesktop() { //DesktopBackgroundManager::globalInstance(); DESKTOP_MANAGER->initializeWithScreens(); } void PeonyDesktopApplication::setupBgAndDesktop() { if (!has_background) { setupDesktop(); } has_background = true; } void PeonyDesktopApplication::clearViewCache() { // for (auto bgWindow : m_bg_windows) { // auto view = bgWindow->getIconView(); // view->clearCache(); // } } void guessContentTypeCallback(GObject* object, GAsyncResult *res,gpointer data) { qInfo() << "Starting guessContentTypeCallback"; char **guessType; GError *error; QString openFolderCmd; GFile* root; char *mountUri; bool openFolder; QProcess process; static QString lastMountUri; error = NULL; openFolder = true; root = g_mount_get_default_location(G_MOUNT(object)); // fix #205338 g_autoptr(GFileInfo) access_info = g_file_query_info(root, G_FILE_ATTRIBUTE_ACCESS_CAN_READ "," G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE, G_FILE_QUERY_INFO_NONE, nullptr, nullptr); openFolder = g_file_info_get_attribute_boolean(access_info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ) && g_file_info_get_attribute_boolean(access_info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE); qInfo() << "Initial openFolder permission:" << openFolder; mountUri = g_file_get_uri(root); qInfo() << "Mount URI:" << mountUri; openFolderCmd = "/usr/bin/peony " + QString(mountUri); qInfo() << "Open folder command:" << openFolderCmd; guessType = g_mount_guess_content_type_finish(G_MOUNT(object),res,&error); if (error) { qInfo() << "Error in guess content type:" << error->message; g_error_free(error); error = NULL; } else { GDrive *drive = g_mount_get_drive(G_MOUNT(object)); char *unixDevice = NULL; if(drive){ unixDevice = g_drive_get_identifier(drive,G_DRIVE_IDENTIFIER_KIND_UNIX_DEVICE); qInfo() << "Unix device:" << (unixDevice ? unixDevice : "null"); g_object_unref(drive); } if(guessType && g_strv_length(guessType) > 0){ qInfo() << "Found guess types"; int n; for(n = 0; guessType[n]; ++n){ qInfo() << "Processing guess type:" << guessType[n]; if(g_content_type_is_a(guessType[n],"x-content/image-dcf")) { openFolder = false; qInfo() << "Detected image-dcf, setting openFolder to false"; } if(g_content_type_is_a(guessType[n],"x-content/win32-software")) { openFolder = false; qInfo() << "Detected win32-software, setting openFolder to false"; } if(unixDevice && !strcmp(guessType[n],"x-content/bootable-media") && !strstr(unixDevice,"/dev/sr")) { openFolder = false; qInfo() << "Detected bootable-media (non-sr device), setting openFolder to false"; } if(!strcmp(guessType[n],"x-content/blank-dvd") || !strcmp(guessType[n],"x-content/blank-cd")) { openFolder = false; qInfo() << "Detected blank DVD/CD, setting openFolder to false"; } if(strstr(guessType[n],"x-content/audio-")){ qInfo() << "Detected audio content. Last mount URI:" << lastMountUri; if(!lastMountUri.compare(mountUri)){ lastMountUri.clear(); qInfo() << "Same as last mount URI, clearing lastMountUri"; break; } lastMountUri = mountUri; qInfo() << "Updated lastMountUri to:" << lastMountUri; } // Fix the issue of automatically opening a new window in the file manager when mounting ISO files QString currentType = QString(guessType[n]); if(openFolder && !unixDevice && currentType == "x-content/bootable-media") openFolder = false; if (!openFolder) break; QString uri = mountUri; if (uri.startsWith("gphoto") || uri.startsWith("mtp")) { qInfo() << "Detected gphoto/mtp device, breaking loop"; break; } if(g_content_type_is_a(guessType[n],"x-content/ostree-repository")) { openFolder = false; qInfo() << "Detected ostree-repository, setting openFolder to false"; break; } if(openFolder) { qInfo() << "Executing open folder command:" << openFolderCmd; process.startDetached(openFolderCmd); } openFolder = true; qInfo() << "Reset openFolder to true for next iteration"; } g_strfreev(guessType); }else{ qInfo() << "No guess types found"; //Only DvD devices are allowed to open folder automatically. if(unixDevice && !strcmp(unixDevice,"/dev/sr") && QGSettings::isSchemaInstalled(DESKTOP_MEDIA_HANDLE)){ qInfo() << "DVD device detected, checking automount settings"; QGSettings* autoMountSettings = new QGSettings(DESKTOP_MEDIA_HANDLE); if(autoMountSettings->get("automount-open").toBool()){ qInfo() << "Automount is enabled, executing open folder command"; process.startDetached(openFolderCmd); delete autoMountSettings; } } } g_free(unixDevice); } g_free(mountUri); g_object_unref(root); g_object_unref(object); qInfo() << "Finished guessContentTypeCallback"; } void PeonyDesktopApplication::volumeRemovedProcess(const std::shared_ptr &volume) { GVolume *gvolume = NULL; GDrive *gdrive = NULL; char *gdriveName = NULL; if(volume) gvolume = volume->getGVolume(); if(gvolume) gdrive = g_volume_get_drive(gvolume); //Do not stop the DVD/CD driver. if(gdrive){ gdriveName = g_drive_get_name(gdrive); if(gdriveName){ if(strstr(gdriveName,"DVD") || strstr(gdriveName,"CD")){ g_free(gdriveName); g_object_unref(gdrive); return; } g_free(gdriveName); } } //if it is possible, we stop it's drive after eject successfully. // if(gdrive && g_drive_can_stop(gdrive)) // g_drive_stop(gdrive,G_MOUNT_UNMOUNT_NONE,NULL,NULL,NULL,NULL); }; static void volume_mount_cb (GObject* source, GAsyncResult* res, gpointer udata) { g_volume_mount_finish(G_VOLUME (source), res, nullptr); Q_UNUSED(udata); } void mount_added_cb (GVolumeMonitor *volume_monitor, GMount *mount, gpointer user_data) { Q_UNUSED (volume_monitor) Q_UNUSED (user_data) g_autoptr (GFile) file = g_mount_get_root(mount); g_file_query_info_async(file, "*", G_FILE_QUERY_INFO_NONE, 0, 0, 0, 0); } void mount_changed_cb (GVolumeMonitor *volume_monitor, GMount *mount, gpointer user_data) { Q_UNUSED (volume_monitor) Q_UNUSED (user_data) g_autoptr (GFile) file = g_mount_get_root(mount); g_file_query_info_async(file, "*", G_FILE_QUERY_INFO_NONE, 0, 0, 0, 0); } peony/peony-qt-desktop/common.h0000664000175000017500000000477015154271070015530 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #ifndef COMMON_H #define COMMON_H #define PANEL_SETTINGS "org.ukui.panel.settings" #define UKUI_STYLE_SETTINGS "org.ukui.style" #define SCREEN_ID "metadata::peony-qt-desktop-id" #define ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-item-position" #define RESTORE_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-item-position" #define RESTORE_EXTEND_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-extend-item-position" #define RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-singlescreen-item-position" #define ITEM_GRID_POS_ATTRIBUTE "metadata::peony-qt-desktop-item-grid-pos" #define RESTORE_ITEM_GRID_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-item-grid-position" #define RESTORE_EXTEND_ITEM_GRID_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-extend-item-grid-position" #define RESTORE_SINGLESCREEN_ITEM_GRID_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-singlescreen-item-grid-position" #include enum DesktopIconRole { UriRole = Qt::UserRole, IsLinkRole = Qt::UserRole + 1, PositionRole = Qt::UserRole + 2, ScreenIdRole = Qt::UserRole + 3, ExceptedPositionRole = Qt::UserRole + 4, SinglesSreenPositionRole = Qt::UserRole + 5, ExtendScreenPositionRole = Qt::UserRole + 6, IsFloatItemRole = Qt::UserRole + 7, emblemRole = Qt::UserRole + 8, IsDirRole = Qt::UserRole + 9, SoftLinkRole = Qt::UserRole + 10 }; enum ZoomLevel { Invalid, Small, //icon: 24x24; grid: 64x64; hover rect: 60x60; font: system*0.8 Normal, //icon: 48x48; grid: 96x96; hover rect = 90x90; font: system Large, //icon: 64x64; grid: 115x135; hover rect = 105x118; font: system*1.2 Huge //icon: 96x96; grid: 140x170; hover rect = 120x140; font: system*1.4 }; #endif // COMMON_H peony/peony-qt-desktop/waylandoutputmanager.cpp0000664000175000017500000001253415154271070021043 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "waylandoutputmanager.h" #include "ukui-output-client.h" #include #include #include #include #include #include #include #include WaylandOutputManager::WaylandOutputManager(QObject *parent) : QObject(parent) { m_timeLine = new QTimeLine(1000, this); connect(m_timeLine, &QTimeLine::finished, this, &WaylandOutputManager::setUKUIOutputEnableInternal); auto _display = wl_display_connect(NULL); m_display = _display; int fd = wl_display_get_fd(_display); m_fd = fd; if (fd == -1) { return; } m_eventQueue = new KWayland::Client::EventQueue(this); m_eventQueue->setup(_display); m_registry = new KWayland::Client::Registry(this); m_registry->create(_display); m_registry->setEventQueue(m_eventQueue); } void WaylandOutputManager::run() { if (!m_registry) { return; } m_socketNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect(m_socketNotifier, &QSocketNotifier::activated, [=](){ wl_display_flush(m_display); if (wl_display_dispatch(m_display) == -1) { auto error = wl_display_get_error(m_display); if (error != 0) { if (m_display) { free(m_display); } return exit(error); } } m_eventQueue->dispatch(); }); connect(m_registry, &KWayland::Client::Registry::interfaceAnnounced, this, [=](QByteArray interface, quint32 name, quint32 version){ QString interfaceName = interface; if (interfaceName == "ukui_output") { m_ukuiOutput = static_cast(wl_registry_bind(*m_registry, name, &ukui_output_interface, version)); qDebug()<<"ukui output created"<createXdgOutputManager(name, version); qDebug()<<"xdg output manager"<createOutput(name, version); qDebug()<<"output added:"<model()<geometry(); }); QObject::connect(output, &KWayland::Client::Output::removed, [=](){ qDebug()<model(); m_outputs.remove(output); output->deleteLater(); }); Q_EMIT outputAdded(output); if (!m_xdgOutputManager) return; addXdgOutput(output); }); m_registry->setup(); m_eventQueue->dispatch(); } void WaylandOutputManager::setUKUIOutputEnable(bool enable) { m_timeLine->setCurrentTime(0); m_timeLine->start(); } void WaylandOutputManager::addXdgOutput(KWayland::Client::Output *output) { //auto _zxdg_output = static_cast(*xdgOutput); //eventQueue.addProxy(_zxdg_output); // set xdg output parent as output auto xdgOutput = m_xdgOutputManager->getXdgOutput(output, output); m_outputs.insert(output, xdgOutput); QObject::connect(xdgOutput, &KWayland::Client::XdgOutput::changed, [=](){ qDebug()<model()<<"changed:"<logicalPosition()<logicalSize(); }); QObject::connect(xdgOutput, &KWayland::Client::XdgOutput::destroyed, [=](){ //qDebug()<model()<<"removed"; qDebug()<stop(); m_timeLine->setCurrentTime(0); if (m_ukuiOutput) { //ukui_output_set_outputs_paint_enabled(m_ukuiOutput, true); // flush message to wayland server m_eventQueue->dispatch(); } } QList WaylandOutputManager::outputs() { return m_outputs.keys(); } QList WaylandOutputManager::xdgOutputs() { return m_outputs.values(); } peony/peony-qt-desktop/peony-dbus-service.h0000664000175000017500000000421315154271070017753 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #ifndef PEONYDBUSSERVICE_H #define PEONYDBUSSERVICE_H #include #include #include #include #include /* 名称:org.ukui.peony 对象路径:/org/ukui/peony 接口:org.ukui.peony 方法:GetSecurityConfigPath()//获取安全配置文件存放路径 ReloadSecurityConfig()// 重新加载安全配置 */ namespace Peony { class PeonyDbusService:public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.peony") public: explicit PeonyDbusService(QObject *parent=nullptr); ~PeonyDbusService(); void DbusServerRegister(); Q_SIGNALS: void sendSrcAndDestUrisOfCopyDspsFiles(const QStringList& sourceUris, const QStringList& destUris); void black_and_white_update(); void opreateFinishedOfEngrampa(const QString& path, bool finish);/* 第一个参数是解压/压缩的路径,第二个参数是操作是否完成;该信号用于归档管理器进行解压/压缩完成后通知文管 */ public Q_SLOTS: QString GetSecurityConfigPath(); int ReloadSecurityConfig(); void receiveSrcAndDestUrisOfCopy(const QStringList& sourceUris, const QStringList& destUris); QString getBlackAndWhiteModel(); bool getBlackAndWhiteListExist(QString name); QStringList getBWListInfo(); void sendEngrampaOpreateFinishSig(const QString& path, bool finish); private: }; } #endif // PEONYDBUSSERVICE_H peony/peony-qt-desktop/plasma-shell-manager.h0000664000175000017500000000261015154271070020221 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef PLASMASHELLMANAGER_H #define PLASMASHELLMANAGER_H #include #include #include class PlasmaShellManager : public QObject { Q_OBJECT public: static PlasmaShellManager *getInstance(); bool setRole(QWindow *window, KWayland::Client::PlasmaShellSurface::Role role); bool setPos(QWindow *window, const QPoint &pos); bool supportPlasmaShell(); KWayland::Client::PlasmaShellSurface *createSurface(QWindow *window); private: explicit PlasmaShellManager(QObject *parent = nullptr); KWayland::Client::PlasmaShell *m_shell = nullptr; }; #endif // PLASMASHELLMANAGER_H peony/peony-qt-desktop/main.cpp0000664000175000017500000001302615154271106015511 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-desktop-application.h" #include #include #include #include #include #include #include #include #include #include #include "xdg-portal-helper.h" #ifdef KY_SDK_KABASE #include #endif void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); QByteArray currentTime = QTime::currentTime().toString().toLocal8Bit(); QString logFilePath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/peony-qt-desktop.log"; bool showDebug = true; if (!QFile::exists(logFilePath)) { showDebug = false; } FILE *log_file = nullptr; if (showDebug) { log_file = fopen(logFilePath.toLocal8Bit().constData(), "a+"); } const char *file = context.file ? context.file : ""; const char *function = context.function ? context.function : ""; switch (type) { case QtDebugMsg: if (!log_file) { break; } fprintf(log_file, "Debug: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtInfoMsg: fprintf(log_file? log_file: stdout, "Info: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtWarningMsg: fprintf(log_file? log_file: stderr, "Warning: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtCriticalMsg: fprintf(log_file? log_file: stderr, "Critical: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; case QtFatalMsg: fprintf(log_file? log_file: stderr, "Fatal: %s: %s (%s:%u, %s)\n", currentTime.constData(), localMsg.constData(), file, context.line, function); break; } if (log_file) fclose(log_file); } int main(int argc, char *argv[]) { //qputenv("QT_QPA_PLATFORM", "wayland"); //bug#249961, limit set to wayland product //bug#267883, comment set code to avoid new bug // bool isWayland = QString(qgetenv("XDG_SESSION_DESKTOP")).contains("ukui-wayland"); // if (isWayland) // qunsetenv("SESSION_MANAGER"); PeonyDesktopApplication::peony_desktop_start_time = QDateTime::currentMSecsSinceEpoch(); QString xdgUserDirsUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/.config/user-dirs.dirs"; if (!QFile::exists(xdgUserDirsUri)) { if (QFile::exists("/usr/bin/xdg-user-dirs-update")) { QProcess p; p.setProgram("/usr/bin/xdg-user-dirs-update"); p.start(); p.waitForFinished(); } } Peony::XdgPortalHelper::getInstance()->tryUnusePortal(); // initUkuiLog4qt("peony-desktop"); // qInstallMessageHandler(messageOutput); #ifdef KY_SDK_KABASE qInstallMessageHandler(kdk::kabase::Log::logOutput); #else initUkuiLog4qt("peony"); #endif qDebug() << "desktop start time in main:" <= QT_VERSION_CHECK(5, 14, 0)) QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif QString id = "peony-qt-desktop" + qgetenv("DISPLAY"); PeonyDesktopApplication a(argc, argv, id); Peony::XdgPortalHelper::getInstance()->tryResetPortal(); if (a.isRunning()) return 0; // WaylandOutputManager waylandOutputManager; // QThread waylandThread; // waylandOutputManager.moveToThread(&waylandThread); // QObject::connect(&waylandThread, &QThread::started, &waylandOutputManager, &WaylandOutputManager::run); // QObject::connect(&a, &PeonyDesktopApplication::requestSetUKUIOutputEnable, &waylandOutputManager, &WaylandOutputManager::setUKUIOutputEnable); // waylandThread.start(); // QDBusMessage message = QDBusMessage::createMethodCall("org.gnome.SessionManager", // "/org/gnome/SessionManager", // "org.gnome.SessionManager", // "startupfinished"); // QList args; // args.append("peony-qt-desktop"); // args.append("startupfinished"); // message.setArguments(args); // QDBusConnection::sessionBus().send(message); return a.exec(); } peony/peony-qt-desktop/desktop-item-model.h0000664000175000017500000000774015154271070017743 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPITEMMODEL_H #define DESKTOPITEMMODEL_H #include #include #include #include #include "user-dir-manager.h" #include "desktop-icon-view.h" namespace Peony { class FileEnumerator; class FileInfo; class FileWatcher; class FileOperationInfo; class DesktopItemModel : public QAbstractListModel { friend class DesktopIconView; Q_OBJECT public: enum Role { UriRole = Qt::UserRole, IsLinkRole = Qt::UserRole + 1 }; Q_ENUM(Role) explicit DesktopItemModel(QObject *parent = nullptr); ~DesktopItemModel() override; const QModelIndex indexFromUri(const QString &uri); const QString indexUri(const QModelIndex &index); // Basic functionality: int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; // Add data: bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; bool insertRow(int row, const QModelIndex &parent = QModelIndex()); // Remove data: bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; bool removeRow(int row, const QModelIndex &parent = QModelIndex()); Qt::ItemFlags flags(const QModelIndex &index) const override; QMimeData *mimeData(const QModelIndexList& indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; Qt::DropActions supportedDropActions() const override; Qt::DropActions supportedDragActions() const override; bool acceptDropAction() const; void setAcceptDropAction(bool acceptDropAction); Peony::DesktopIconView *getIconView(const QString &uri); std::shared_ptr getFileInfo(const QModelIndex& index) const; Q_SIGNALS: void requestLayoutNewItem(const QString &uri); void requestClearIndexWidget(const QStringList &uris = QStringList()); void requestUpdateItemPositions(const QString &uri = nullptr); void refreshed(); void refreshFilter(); // void fileCreated(const QString &uri); void prepareRefresh(); public Q_SLOTS: void refresh(); protected Q_SLOTS: void onEnumerateFinished(bool successed); void clearFloatItems(); private: FileEnumerator *m_enumerator; QList> m_files; QList> m_querying_files; std::shared_ptr m_trash_watcher; std::shared_ptr m_desktop_watcher; std::shared_ptr m_thumbnail_watcher; //just handle the thumbnail created. // std::shared_ptr m_system_app_watcher; // std::shared_ptr m_andriod_app_watcher; QQueue m_new_file_info_query_queue; QStringList m_items_need_relayout; QStringList m_destoryItems; UserdirManager * m_dir_manager; std::shared_ptr m_desktop_info; std::shared_ptr m_renaming_operation_info; QPair m_renaming_file_pos; bool m_accept_drop_action = true; bool m_showFileExtension = true; private: void refreshInternal(); }; } #endif // DESKTOPITEMMODEL_H peony/peony-qt-desktop/advanced-desktop-icon-view.h0000664000175000017500000002451115154271070021345 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #ifndef ADVANCEDDESKTOPICONVIEW_H #define ADVANCEDDESKTOPICONVIEW_H #include #include #include #include "directory-view-plugin-iface.h" #include "peony-dbus-service.h" #include #include #include class QRubberBand; class QGSettings; namespace Peony { class AdvancedDesktopItemModel; class DesktopItemProxyModel; class DesktopWindow; class DesktopIndexWidget; class DesktopIconViewDelegate; class FileItemModel; class PeonyDbusService; } class AdvancedDesktopIconView : public QAbstractItemView, public Peony::DirectoryViewIface { friend class Peony::DesktopWindow; friend class Peony::DesktopIndexWidget; friend class Peony::DesktopIconViewDelegate; friend class Peony::AdvancedDesktopItemModel; Q_OBJECT public: enum ZoomLevel { Invalid, Small, //icon: 24x24; grid: 64x64; hover rect: 60x60; font: system*0.8 Normal, //icon: 48x48; grid: 96x96; hover rect = 90x90; font: system Large, //icon: 64x64; grid: 115x135; hover rect = 105x118; font: system*1.2 Huge //icon: 96x96; grid: 140x170; hover rect = 120x140; font: system*1.4 }; Q_ENUM(ZoomLevel) enum Direction { All, Right, Bottom }; Q_ENUM(Direction) enum DesktopIconRole { UriRole = Qt::UserRole, PositionRole = Qt::UserRole + 2, ScreenIdRole = Qt::UserRole + 3, ExceptedPositionRole = Qt::UserRole + 4, SinglesSreenPositionRole = Qt::UserRole + 5, ExtendScreenPositionRole = Qt::UserRole + 6, IsFloatItemRole = Qt::UserRole + 7 }; Q_ENUM (DesktopIconRole) explicit AdvancedDesktopIconView(QWidget *parent = nullptr); ~AdvancedDesktopIconView(); void initShoutCut(); void openFileByUri(QString uri); void initDoubleClick(); void bindModel(Peony::FileItemModel *sourceModel, Peony::FileItemProxyFilterSortModel *proxyModel) { Q_UNUSED(sourceModel) Q_UNUSED(proxyModel) } void setProxy(Peony::DirectoryViewProxyIface *proxy) { Q_UNUSED(proxy) } const QString viewId() { return tr("Desktop Icon View"); } //location const QString getDirectoryUri() { return "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); } QRect visualRect(const QModelIndex &index) const override; void scrollTo(const QModelIndex &index, ScrollHint hint) override; QModelIndex indexAt(const QPoint &point) const override; //selections const QStringList getSelections(); //children const QStringList getAllFileUris(); const int getAllDisplayFileCount(); void UpdateToEditUris(QStringList uris); ZoomLevel zoomLevel() const; void setEditFlag(bool edit); bool getEditFlag(); bool isRenaming(); void setRenaming(bool renaming); int updateBWList(); QString getBlackAndWhiteModel(); QSet getBWListInfo(); bool getBlackAndWhiteListExist(QString name); void clearAllIndexWidgets(const QStringList &uris = QStringList()); void setId(int id); bool isFull(); int radius() const; private: bool execSharedFileLink(const QString uri); Q_SIGNALS: void updateView(); void sig_fileCreated(const QString &uri); void clearOtherViewSelection(); void setZoomLevel(ZoomLevel level); public Q_SLOTS: //location void open(const QStringList &uris, bool newWindow) {} void setDirectoryUri(const QString &uri) {} void beginLocationChange() {} void stopLocationChange() {} void closeView(); //selections void setSelections(const QStringList &uris); void invertSelections(); void scrollToSelection(const QString &uri); //clipboard void setCutFiles(const QStringList &uris); Peony::DirectoryViewProxyIface *getProxy() { return nullptr; } void setSortType(int sortType); void setSortOrder(int sortOrder); //edit void editUri(const QString &uri); int getSortType(); int getSortOrder(); void editUris(const QStringList uris); void fileCreated(const QString &uri); void setDefaultZoomLevel(ZoomLevel level); void zoomIn(); void zoomOut(); /** * @brief layoutItems * 自动排列 * @param closest * @return * 返回自动排列的uri列表 */ QStringList layoutItems(bool closest = false); /** * @brief relayoutExsitingItemsAndUpdate * 设置自动排列后, * @param uris */ void relayoutExsitingItemsAndUpdate(const QStringList uris); void setShowHidden(); void showHiddenFile(); protected: QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; int horizontalOffset() const override; int verticalOffset() const override; bool isIndexHidden(const QModelIndex &index) const override; void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; QRegion visualRegionForSelection(const QItemSelection &selection) const override; QStyleOptionViewItem viewOptions() const override; void startDrag(Qt::DropActions supportedActions) override; void reset() override; void rowsInserted(const QModelIndex &parent, int start, int end) override; void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event); //void ensureItemPosByUri(const QString &uri); void dragEnterEvent(QDragEnterEvent *e) override; void dragMoveEvent(QDragMoveEvent *e) override; void dragLeaveEvent(QDragLeaveEvent *e) override; void dropEvent(QDropEvent *e) override; bool viewportEvent(QEvent *e) override; QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index, const QEvent *event) const override; bool dropWhenAotoArrange(QDropEvent *event); bool dragToOtherScreen(QDropEvent *event); void wheelEvent(QWheelEvent *e); void keyPressEvent(QKeyEvent *e); void keyReleaseEvent(QKeyEvent *e); void checkItemsOver(); static GAsyncReadyCallback queryZoomLevelAsyncCallback(GObject *obj, GAsyncResult *res, AdvancedDesktopIconView *p_this); private Q_SLOTS: void recalculateAvailableRowAndColumnCount(); void onEntered(const QModelIndex &index); public: int getViewAvailableRowCount(); int getViewAvailableColumnCount(); void setMargins(); /*! * \brief getIndexGridPos * 获取当前index所在的网格位置 * \param index * \param ok * 如果成功获取则设置为true,否则设置为false * \return * index所在的网格位置,如果不成功则返回(-1,-1) */ QPoint getIndexGridPos(const QModelIndex &index, bool *ok) const; /*! * \brief findNextEmptyGridPos * 获取下一个空网格所在的位置 * \return * */ QPoint findNextEmptyGridPos(const QPoint &startGridPos = QPoint()); bool isInvalidPoint(const QPoint &point); QPoint invalidPoint() const; /*! * \brief getGridPosFromMousePos * 根据当前鼠标事件传入的位置返回网格的位置 * \param mousePos * \return * 鼠标位置对应的网格位置 */ QPoint getGridPosFromMousePos(const QPoint &mousePos); /*! * \brief gridPosLesserThan * 从左上到右下比较两个网格位置的顺序 * \param leftPos * \param rightPos * \return */ bool gridPosLesserThan(const QPoint &leftPos, const QPoint &rightPos); void refresh(); void setFileMetaInfoPos(const QString &uri, const QPoint &pos); void relayoutExsitingItems(const QStringList &uris); void resolutionChange(); QPoint checkGridPos(const QPoint pos); bool checkEmptyPositon(); private: ZoomLevel m_zoom_level = Invalid; QSize m_gridSize = QSize(); int m_availableRowCount = 1; int m_availableColumnCount = 1; QRubberBand *m_rubberBand = nullptr; QPoint m_pressedPos = QPoint(-1,-1); QPoint m_dragPressPos; /*! * \brief m_itemPosMap * 当前视图中的文件uri和对应所在的网格位置 */ QHash m_itemPosHash; QStringList m_autoArrange; QHash m_resolutionItemPosHash; QStringList m_storageBox; // QVector m_itemStatus; QModelIndex m_last_index; QTimer m_edit_trigger_timer; QStringList m_new_files_to_be_selected; QStringList m_uris_to_edit;/* 新建文件/文件夹,可编辑文件名list */ QString m_edit_uri; /* 正在编辑的文件,信息更新不重置*/ // bool m_is_refreshing = false; bool m_real_do_edit = false; bool m_ctrl_or_shift_pressed = false; bool m_ctrl_key_pressed = false; bool m_shift_key_pressed = false; bool m_show_hidden; bool m_is_renaming = false; bool m_is_edit = false; bool m_initialized = false; bool m_isDragging = false; bool m_noSelectOnPress = false; Peony::AdvancedDesktopItemModel *m_model = nullptr; Peony::DesktopItemProxyModel *m_proxy_model = nullptr; QGSettings *m_panelSetting = nullptr; Peony::PeonyDbusService *m_peonyDbusSer = nullptr; int m_id = 0; QRect m_dropIndicatorRect; DropIndicatorPosition m_dropIndicatorPos = OnViewport; QPersistentModelIndex m_hoverIndex; QPoint m_margin; int m_radius = 6; }; #endif // ADVANCEDDESKTOPICONVIEW_H peony/peony-qt-desktop/desktop-item-model.cpp0000664000175000017500000011650715154271070020300 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktop-item-model.h" #include "file-enumerator.h" #include "file-info.h" #include "file-info-job.h" #include "file-info-manager.h" #include "file-watcher.h" #include "file-operation-manager.h" #include "file-move-operation.h" #include "file-trash-operation.h" #include "file-copy-operation.h" #include "file-operation-utils.h" #include "thumbnail-manager.h" #include "usershare-manager.h" #include "file-meta-info.h" #include "peony-desktop-application.h" #include "desktop-icon-view.h" #include "global-settings.h" #include "sound-effect.h" #ifdef KY_SDK_SOUND_EFFECTS #include "ksoundeffects.h" #endif #include "desktop-icon-view-delegate.h" #include "desktop-menu-plugin-manager.h" #include "emblem-provider.h" #include "tooltips-manager.h" #include #include #include #include #include #include #include using namespace Peony; #ifdef KY_SDK_SOUND_EFFECTS using namespace kdk; #endif DesktopItemModel::DesktopItemModel(QObject *parent) : QAbstractListModel(parent) { // do not redo layout new items while we start an operation with peony's api. connect(FileOperationManager::getInstance(), &FileOperationManager::operationStarted, this, [=](){ m_items_need_relayout.clear(); }); m_thumbnail_watcher = std::make_shared("thumbnail:///, this"); connect(m_thumbnail_watcher.get(), &FileWatcher::fileChanged, this, [=](const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { auto index = indexFromUri(uri); Q_EMIT this->dataChanged(index, index); } } }); m_trash_watcher = std::make_shared("trash:///", this); this->connect(m_trash_watcher.get(), &FileWatcher::fileCreated, [=]() { //qDebug()<<"trash changed"; auto trash = FileInfo::fromUri("trash:///"); auto job = new FileInfoJob(trash); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, [=]() { auto trashIndex = this->indexFromUri("trash:///"); this->dataChanged(trashIndex, trashIndex); Q_EMIT this->requestClearIndexWidget(); }); job->queryAsync(); }); this->connect(m_trash_watcher.get(), &FileWatcher::fileDeleted, [=]() { //qDebug()<<"trash changed"; auto trash = FileInfo::fromUri("trash:///"); auto job = new FileInfoJob(trash); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, [=]() { auto trashIndex = this->indexFromUri("trash:///"); this->dataChanged(trashIndex, trashIndex); Q_EMIT this->requestClearIndexWidget(); }); job->queryAsync(); }); // monitor desktop QString desktopFile = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); qWarning() << "desktopfile:" << desktopFile; m_desktop_watcher = std::make_shared("file://" + desktopFile, this); m_desktop_watcher->setMonitorChildrenChange(true); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileCreated, [=](const QString &uri) { qDebug()<<"desktop file created"<uri() == info->uri()) { exsited = true; break; } } if (!exsited) { if (!m_renaming_file_pos.first.isEmpty() && uri != m_renaming_file_pos.first && uri.contains(m_renaming_file_pos.first)) { return; } m_items_need_relayout.append(uri); m_items_need_relayout.removeOne(m_renaming_file_pos.first); m_items_need_relayout.removeOne(m_renaming_file_pos.first + ".desktop"); if (m_renaming_operation_info.get()) { m_items_need_relayout.removeOne(m_renaming_operation_info.get()->target()); } m_items_need_relayout.removeDuplicates(); auto job = new FileInfoJob(info); job->setAutoDelete(); job->querySync(); // locate new item ===== //task#74174 扩展模式下支持拖拽图标放置到扩展屏, 创建文件获取当前view auto view = ((PeonyDesktopApplication*)qApp)->getIconView(QCursor::pos()); //校验图标是否已经满了,如果满了寻找没有满的view if (view && view->isFull()) { Peony::DesktopIconView *notFullView = ((PeonyDesktopApplication*)qApp)->getNotFullView(); if (notFullView) { view = notFullView; } } auto itemRectHash = view->getCurrentItemRects(); auto grid = view->gridSize(); auto viewRect = view->viewport()->rect(); if (!view->m_show_hidden && info.get()->displayName().startsWith(".")) return; QRegion notEmptyRegion; for (auto rect : itemRectHash.values()) { notEmptyRegion += rect; } int isUpdateIconGeometry = false; if (!view->isRenaming()) { view->setFileMetaInfoPos(uri, QPoint(-1, -1)); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList restoreInfo; restoreInfo<<""; metaInfo->setMetaInfoStringList("metadata::peony-qt-desktop-restore-singlescreen-item-position", restoreInfo); } } else { m_items_need_relayout.removeOne(uri); view->setRenaming(false); isUpdateIconGeometry = true; } auto metaInfoPos = view->getFileMetaInfoPos(uri); QSize iconSize; if (itemRectHash.isEmpty()) { auto delegate = qobject_cast(view->itemDelegate()); iconSize = delegate->sizeHint(QStyleOptionViewItem(), QModelIndex()); } else { iconSize = itemRectHash.values().first().size(); } if (metaInfoPos.x() >= 0) { // check if overlapped, it might happened whild drag out and in desktop view. auto indexRect = QRect(metaInfoPos, iconSize); if (notEmptyRegion.intersects(indexRect)) { // move index to closest empty grid. auto next = indexRect; bool isEmptyPos = false; while (!isEmptyPos) { next.translate(0, grid.height()); if (next.bottom() > viewRect.bottom()) { int top = next.y(); while (true) { if (top < grid.height()) { break; } top-=grid.height(); } //put item to next column first row next.moveTo(next.x() + grid.width(), top); } if (notEmptyRegion.intersects(next)) continue; isEmptyPos = true; itemRectHash.insert(info->uri(), next); notEmptyRegion += next; // handle position locate in DesktopIconView::itemInserted(). view->setFileMetaInfoPos(info->uri(), next.topLeft()); } } else if (isUpdateIconGeometry){ FileInfo::fromUri(uri).get()->setProperty("iconGeometry", QRect(view->mapToGlobal(metaInfoPos), iconSize)); } this->beginInsertRows(QModelIndex(), m_files.count(), m_files.count()); //file changed, force create thubnail, link tobug#83108 ThumbnailManager::getInstance()->createThumbnail(info->uri(), m_thumbnail_watcher, true); m_files<insertRows(m_files.indexOf(info), 1); this->endInsertRows(); // end locate new item======= //this->endResetModel(); Q_EMIT this->requestUpdateItemPositions(); Q_EMIT this->requestLayoutNewItem(info->uri()); //task#74174 在当前view中创建文件 view->fileCreated(uri); return; } // aligin exsited rect int marginTop = notEmptyRegion.isEmpty()? view->getViewRect().top() : notEmptyRegion.boundingRect().top(); while (marginTop - grid.height() >= 0) { marginTop -= grid.height(); } int marginLeft = notEmptyRegion.boundingRect().left(); while (marginLeft - grid.width() >= 0) { marginLeft -= grid.width(); } auto indexRect = QRect(QPoint(marginLeft, marginTop), iconSize); if (notEmptyRegion.intersects(indexRect)) { // move index to closest empty grid. auto next = indexRect; bool isEmptyPos = false; while (!isEmptyPos) { next.translate(0, grid.height()); if (next.bottom() > viewRect.bottom()) { int top = next.y(); while (true) { if (top < grid.height()) { break; } top-=grid.height(); } //put item to next column first row next.moveTo(next.x() + grid.width(), top); } if (notEmptyRegion.intersects(next)) continue; isEmptyPos = true; itemRectHash.insert(info->uri(), next); notEmptyRegion += next; view->setFileMetaInfoPos(info->uri(), next.topLeft()); } } else { view->setFileMetaInfoPos(info->uri(), indexRect.topLeft()); } //this->beginResetModel(); this->beginInsertRows(QModelIndex(), m_files.count(), m_files.count()); //file changed, force create thubnail, link tobug#83108 ThumbnailManager::getInstance()->createThumbnail(info->uri(), m_thumbnail_watcher, true); m_files<insertRows(m_files.indexOf(info), 1); this->endInsertRows(); // end locate new item======= //this->endResetModel(); Q_EMIT this->requestUpdateItemPositions(); Q_EMIT this->requestLayoutNewItem(info->uri()); //task#74174 在当前view中创建文件 view->fileCreated(uri); } else{ //file content changed, need update fileinfo, fix bug#76908 auto job = new FileInfoJob(info); job->setAutoDelete(); job->querySync(); } }); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileDeleted, [=](const QString &uri) { m_items_need_relayout.removeOne(uri); m_destoryItems.removeOne(uri); std::shared_ptr info = FileInfo::fromUri(uri); Peony::DesktopIconView *view = nullptr; if (info.get()->isEmptyInfo()) { view = ((PeonyDesktopApplication*)qApp)->removeUri(uri); } else { view = getIconView(uri); } auto itemRectHash = view->getCurrentItemRects(); for (auto info : m_files) { if (info->uri() == uri) { //this->beginResetModel(); // continue fix #18155、#52228、#52231、#49442 // 注意有时不会走到view的aboutToRemoveRows中,所以需要在此调用relayoutAddedItem this->beginRemoveRows(QModelIndex(), m_files.indexOf(info), m_files.indexOf(info)); view->relayoutExsitingItems(m_items_need_relayout); m_files.removeOne(info); this->endRemoveRows(); //this->endResetModel(); Q_EMIT this->requestClearIndexWidget(QStringList()<requestUpdateItemPositions(); if (info->isDir()) { QString displayName = info->displayName(); if (UserShareInfoManager::getInstance()->getUsershareLists().contains(displayName)) { SharedDeleteInfoThread *thread = new SharedDeleteInfoThread(info->uri()); connect(thread, &SharedDeleteInfoThread::finished, thread, &SharedDeleteInfoThread::deleteLater); thread->start(); } } } } }); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileChanged, [=](const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { auto job = new FileInfoJob(info); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, this, [=]() { //file changed, force create thubnail, link tobug#83108 ThumbnailManager::getInstance()->createThumbnail(uri, m_thumbnail_watcher, true); this->dataChanged(indexFromUri(uri), indexFromUri(uri)); Q_EMIT this->requestClearIndexWidget(QStringList()<queryAsync(); this->dataChanged(indexFromUri(uri), indexFromUri(uri)); return; } } }); //comment these code to fix bug#149540, story-view-19425 //when system app uninstalled, delete link in desktop if exist // QString system_app_path = "file:///usr/share/applications/"; // m_system_app_watcher = std::make_shared(system_app_path, this); // m_system_app_watcher->setMonitorChildrenChange(true); // auto mInfo = FileInfo::fromUri(system_app_path); // qDebug() <<"system_app_path:" <isDir(); // this->connect(m_system_app_watcher.get(), &FileWatcher::fileDeleted, [=](const QString &uri) { // qDebug() << "m_system_app_watcher:" <uri().endsWith(fileName)) { // //fix bug#136661, desktop file may be auto deleted wrong // //desktop file be deleted and then created // QString absPath = uri; // absPath = absPath.replace("file://", ""); // QTimer::singleShot(100, this, [=](){ // if (! QFile::exists(absPath)){ // //this->beginResetModel(); // this->beginRemoveRows(QModelIndex(), m_files.indexOf(info), m_files.indexOf(info)); // m_files.removeOne(info); // this->endRemoveRows(); // //this->endResetModel(); // Q_EMIT this->requestClearIndexWidget(); // Q_EMIT this->requestUpdateItemPositions(); // //fix bug#148380, 148375 remove file not exist, deleted by app // if (QFile::exists(info->uri().replace("file://", ""))){ // QStringList list; // list.append(info->uri()); // //auto remove, link to task#10131 // FileOperationUtils::remove(list); // } // } // }); // } // } // } // }); // //when andriod app uninstalled, delete link in desktop if exist // QString homePath = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); // auto andriod_app_path = homePath + "/.local/share/applications/"; // auto app_info = FileInfo::fromUri(andriod_app_path); // qDebug() <<"andriod_app_path:" <isDir(); // m_andriod_app_watcher = std::make_shared(andriod_app_path, this); // m_andriod_app_watcher->setMonitorChildrenChange(true); // this->connect(m_andriod_app_watcher.get(), &FileWatcher::fileDeleted, [=](const QString &uri) { // if (uri.endsWith(".desktop")) // { // QString fileName = uri; // fileName = fileName.replace(andriod_app_path, ""); // qDebug() << "andriod_app_path:" <uri().endsWith(fileName)) { // //fix bug#136661,android desktop file be auto deleted wrong // //desktop file be deleted and then created // QString absPath = uri; // absPath = absPath.replace("file://", ""); // QTimer::singleShot(100, this, [=](){ // if (! QFile::exists(absPath)){ // //this->beginResetModel(); // this->beginRemoveRows(QModelIndex(), m_files.indexOf(info), m_files.indexOf(info)); // m_files.removeOne(info); // this->endRemoveRows(); // //this->endResetModel(); // Q_EMIT this->requestClearIndexWidget(); // Q_EMIT this->requestUpdateItemPositions(); // //fix bug#148380, 148375 remove file not exist, deleted by app // if (QFile::exists(info->uri().replace("file://", ""))){ // QStringList list; // list.append(info->uri()); // //auto remove, link to task#10131 // FileOperationUtils::remove(list); // } // } // }); // } // } // } // }); //handle standard dir changing. m_dir_manager =new UserdirManager(this); //refresh after standard dir changed. connect(m_dir_manager,&UserdirManager::desktopDirChanged,[=](){ refresh(); }); connect(m_dir_manager,&UserdirManager::thumbnailSetingChange,[=](){ refresh(); }); connect(FileOperationManager::getInstance(), &FileOperationManager::operationStarted, this, [=](std::shared_ptr info){ if (info.get()->m_type == FileOperationInfo::Rename) { m_renaming_operation_info = info; auto renamingUri = info.get()->m_src_uris.first(); if (!renamingUri.endsWith(".desktop")) { m_renaming_operation_info = nullptr; return; } m_renaming_file_pos.first = renamingUri; m_renaming_file_pos.second = getIconView(renamingUri)->getFileMetaInfoPos(renamingUri); } else { m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); m_renaming_operation_info = nullptr; } }); connect(FileOperationManager::getInstance(), &FileOperationManager::operationFinished, this, [=](std::shared_ptr info){ if (info.get()->m_type == FileOperationInfo::Rename) { if (!info.get()->m_has_error) { auto renamingUri = info.get()->target(); if (!renamingUri.endsWith(".desktop")) { m_renaming_operation_info = nullptr; m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); return; } auto view = getIconView(renamingUri); QPoint target_pos = view->getCurrentItemRects().value(renamingUri).topLeft(); //desktop文件重命名时,如果存在相同文件则不会重命名成功。由于该文件uri不会变,所以pos不变,无需更新pos if (target_pos.isNull() || (m_renaming_file_pos.second == target_pos)) { //desktop文件重命名成功 m_renaming_file_pos.first = renamingUri; m_items_need_relayout.removeOne(renamingUri); m_items_need_relayout.removeOne(renamingUri + ".desktop"); view->updateItemPosByUri(renamingUri, m_renaming_file_pos.second); view->setFileMetaInfoPos(renamingUri, m_renaming_file_pos.second); } else { //desktop文件(uri)重命名失败 QString &src_uri = info->m_src_uris.first(); QTimer::singleShot(100, view, [=]() { view->setSelections(QStringList() << src_uri); view->scrollToSelection(src_uri); view->setFocus(); }); } } else { // restore/relayout? } m_renaming_operation_info = nullptr; QTimer::singleShot(100, this, [=]{ m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); }); } else { m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); m_renaming_operation_info = nullptr; } }); auto settings = GlobalSettings::getInstance(); m_showFileExtension = settings->isExist(SHOW_FILE_EXTENSION)? settings->getValue(SHOW_FILE_EXTENSION).toBool(): true; connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (SHOW_FILE_EXTENSION == key) { m_showFileExtension= GlobalSettings::getInstance()->getValue(key).toBool(); beginResetModel(); endResetModel(); } }); connect(DesktopMenuPluginManager::getInstance(), &DesktopMenuPluginManager::pluginLoadFinished, this, [=](){ QTimer::singleShot(1000, this, [=]{ for (auto file : m_files) { EmblemProviderManager::getInstance()->queryAsync(file->uri()); } }); }); UserShareInfoManager::getInstance(); } DesktopItemModel::~DesktopItemModel() { } bool findProgram(const QString &program) { QFileInfo fi(program); if (!program.isEmpty() && fi.isExecutable()) { return true; } const QStringList paths = QFile::decodeName(qgetenv("PATH")).split(':'); for(const QString &dir : paths) { QFileInfo fi= QFileInfo(dir + QDir::separator() + program); if (fi.isExecutable()) { return true; } } return false; } void DesktopItemModel::refreshInternal() { m_items_need_relayout.clear(); ThumbnailManager::getInstance()->syncThumbnailPreferences(); // Empty thumbnail cache if thumbnails are disabled bool do_not_thumbnail = GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); if (do_not_thumbnail) { ThumbnailManager::getInstance()->clearThumbnail(); } beginResetModel(); //removeRows(0, m_files.count()); //m_trash_watcher->stopMonitor(); //m_desktop_watcher->stopMonitor(); for (auto info : m_files) { ThumbnailManager::getInstance()->releaseThumbnail(info->uri()); } m_files.clear(); m_enumerator = new FileEnumerator(this); connect(this, &DesktopItemModel::prepareRefresh, m_enumerator, &FileEnumerator::cancel, Qt::DirectConnection); m_enumerator->setAutoDelete(); QString desktopUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); m_enumerator->setEnumerateDirectory(desktopUri); m_enumerator->connect(m_enumerator, &FileEnumerator::enumerateFinished, this, &DesktopItemModel::onEnumerateFinished); m_enumerator->enumerateAsync(); endResetModel(); } int DesktopItemModel::rowCount(const QModelIndex &parent) const { // For list models only the root node (an invalid parent) should return the list's size. For all // other (valid) parents, rowCount() should return 0 so that it does not become a tree model. if (parent.isValid()) return 0; return m_files.count(); } QVariant DesktopItemModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); //qDebug()<<"data"<uri(); auto info = m_files.at(index.row()); switch (role) { case Qt::DisplayRole:{ QString displayName = info->displayName(); if (info->isDesktopFile()) { displayName = FileUtils::handleDesktopFileName(info->uri(), info->displayName()); return QVariant(displayName); } /* story#8359 【文件管理器】手动开启关闭文件拓展名 */ if(!m_showFileExtension){ if (info->isDir()) { return QVariant(displayName); } return QVariant(FileUtils::getBaseNameOfFile(displayName)); }else return QVariant(displayName); } case Qt::ToolTipRole: { /** * @task #346285: 【Tooltips specification】Change the desktop icon (including the management-desktop-application icon) tooltips display, * add supplementary text * * @author: Renyg * @date: 2024-09-25 */ return QVariant(TooltipsManagerInstance.generateTooltip(info.get())); } case Qt::DecorationRole: { return info->getIcon(); } case UriRole: return info->uri(); case IsLinkRole: return info->isSymbolLink(); } return QVariant(); } std::shared_ptr DesktopItemModel::getFileInfo(const QModelIndex &index) const { if (!index.isValid() || m_files.isEmpty() || index.row() >= m_files.length()) return nullptr; return m_files.at(index.row()); } void DesktopItemModel::onEnumerateFinished(bool successed) { if (!successed) { qWarning()<<"failed to enumerate desktop"; beginResetModel(); m_files.clear(); endResetModel(); return; } // check if there is info querying, if true, wait querying finished. while (!m_querying_files.isEmpty()) { qApp->processEvents(); } //beginResetModel(); if (m_files.count() > 0) { beginRemoveRows(QModelIndex(), 0, m_files.count() - 1); m_files.clear(); endRemoveRows(); } auto computer = FileInfo::fromUri("computer:///"); auto personal = FileInfo::fromPath(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); auto trash = FileInfo::fromUri("trash:///"); QList> infos; infos<getChildren(); m_querying_files = infos; m_files = infos; //qDebug()<endResetModel(); for (auto info : infos) { auto asyncJob = new FileInfoJob(info); connect(this, &DesktopItemModel::prepareRefresh, asyncJob, [=]{ asyncJob->cancel(); asyncJob->setProperty("isCancelled", true); }, Qt::DirectConnection); connect(asyncJob, &FileInfoJob::queryAsyncFinished, this, [=](bool successed){ m_querying_files.removeOne(info); if (!successed) { m_files.removeOne(info); } if (asyncJob->property("isCancelled").toBool()) { // quit loop to avoid invalid data inserted; return; } if (m_querying_files.isEmpty()) { if (!m_files.isEmpty()) { beginInsertRows(QModelIndex(), 0, m_files.count() - 1); endInsertRows(); for (auto info : m_files) { auto uri = info->uri(); auto view = getIconView(uri); auto pos = view->getFileMetaInfoPos(info->uri()); if (pos.x() >= 0) { view->updateItemPosByUri(info->uri(), pos); } else { view->ensureItemPosByUri(uri); } if (info->isDesktopFile()) { ThumbnailManager::getInstance()->updateDesktopFileThumbnail(info->uri(), m_thumbnail_watcher); } else { ThumbnailManager::getInstance()->createThumbnail(info->uri(), m_thumbnail_watcher); } } } //qDebug()<<"startMornitor"; m_trash_watcher->startMonitor(); qWarning() << "desktopfile:" << m_desktop_watcher->currentUri() << " >>>> " << QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); if (m_desktop_watcher->currentUri() != "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)) { m_desktop_watcher->stopMonitor(); m_desktop_watcher->forceChangeMonitorDirectory("file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); m_desktop_watcher->setMonitorChildrenChange(true); } m_desktop_watcher->startMonitor(); // m_system_app_watcher->startMonitor(); // m_andriod_app_watcher->startMonitor(); Q_EMIT refreshed(); asyncJob->deleteLater(); } }); asyncJob->queryAsync(); } } void DesktopItemModel::clearFloatItems() { m_items_need_relayout.clear(); } bool DesktopItemModel::acceptDropAction() const { return m_accept_drop_action; } void DesktopItemModel::setAcceptDropAction(bool acceptDropAction) { m_accept_drop_action = acceptDropAction; } const QModelIndex DesktopItemModel::indexFromUri(const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { return index(m_files.indexOf(info)); } } return QModelIndex(); } const QString DesktopItemModel::indexUri(const QModelIndex &index) { if (index.row() < 0 || index.row() >= m_files.count()) { return nullptr; } return m_files.at(index.row())->uri(); } bool DesktopItemModel::insertRows(int row, int count, const QModelIndex &parent) { beginInsertRows(parent, row, row + count); endInsertRows(); return true; } bool DesktopItemModel::insertRow(int row, const QModelIndex &parent) { beginInsertRows(parent, row, row); endInsertRows(); return true; } bool DesktopItemModel::removeRows(int row, int count, const QModelIndex &parent) { beginRemoveRows(parent, row, row + count); endRemoveRows(); return true; } bool DesktopItemModel::removeRow(int row, const QModelIndex &parent) { beginRemoveRows(parent, row, row); endRemoveRows(); return true; } Qt::ItemFlags DesktopItemModel::flags(const QModelIndex &index) const { auto uri = index.data(UriRole).toString(); auto info = FileInfo::fromUri(uri); if (index.isValid()) { Qt::ItemFlags flags = QAbstractItemModel::flags(index); flags |= Qt::ItemIsDragEnabled; flags |= Qt::ItemIsEditable; if (info->isDir()) { flags |= Qt::ItemIsDropEnabled; } return flags; } else { return Qt::ItemIsDropEnabled; } } QMimeData *DesktopItemModel::mimeData(const QModelIndexList &indexes) const { QMimeData* data = QAbstractItemModel::mimeData(indexes); //set urls data URLs correspond to the MIME type text/uri-list. QList urls; QStringList uris; for (auto index : indexes) { QUrl url = index.data(UriRole).toString(); if (!urls.contains(url)) urls<setUrls(urls); auto string = uris.join(" "); data->setData("peony-qt/encoded-uris", string.toUtf8()); data->setText(string); return data; } bool DesktopItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { if (!acceptDropAction()) return false; //qDebug()<isEmptyInfo()) { // note that this case nearly won't happened. // but there is a bug reported due to this. // link to task #48798. FileInfoJob j(info); j.querySync(); } if (!info->isDir() && ! destDirUri.startsWith("trash:///")) { return false; } //NOTE: //do not allow drop on it self. auto urls = data->urls(); if (urls.isEmpty()) return false; bool hasPeonyEncodedUris = false; if (data->hasFormat("peony-qt/encoded-uris")) { if (!data->data("peony-qt/encoded-uris").isEmpty()) { hasPeonyEncodedUris = true; } } QStringList srcUris; if (hasPeonyEncodedUris) { srcUris = QString(data->data("peony-qt/encoded-uris")).split(" "); for (QString uri : srcUris) { if (uri.startsWith("recent://")) srcUris.removeOne(uri); } } else { for (auto url : urls) { //can not drag file from recent if (url.url().startsWith("recent://")) return false; srcUris<hasFormat("peony-qt/is-search")) { bMoveFromSearchTab = QVariant(data->data("peony-qt/is-search")).toBool(); } bool b_trash_item = false; for(auto path : srcUris) { if (path.contains("trash:///")) { b_trash_item = true; break; } } //drag from trash to another place, return false //comment to fix can not drag to copy trash file,link to bug#117741 // if (b_trash_item && destDirUri != "trash:///") // return false; auto fileOpMgr = FileOperationManager::getInstance(); bool addHistory = true; bool canNotTrash = false; for (auto uri : srcUris) { if (uri.startsWith("filesafe:///")) { canNotTrash = true; break; } } if (destDirUri.startsWith("trash:///")) { // 如果是保护箱删除时,不会反馈删除弹窗,保护箱文件不影响 if(!(srcUris.first().startsWith("filesafe:///") && (QString(srcUris.first()).remove("filesafe:///").indexOf("/") == -1))) { //fix bug#91525, can trash file in U disk issue FileOperationUtils::trash(srcUris, true, bMoveFromSearchTab); // if(canNotTrash){ // FileOperationUtils::trash(srcUris, false); // }else { // FileTrashOperation *trashOp = new FileTrashOperation(srcUris); // fileOpMgr->startOperation(trashOp, addHistory); // } } } else { qDebug() << "DesktopItemModel dropMimeData:" <connect(op, &FileOperation::operationFinished, this, [=](){ //Peony::SoundEffect::getInstance()->copyOrMoveSucceedMusic(); //Task#152997, use sdk play sound if (op->hasError()) { return; } #ifdef KY_SDK_SOUND_EFFECTS kdk::KSoundEffects::playSound(SoundType::OPERATION_FILE); #endif }, Qt::BlockingQueuedConnection); } //NOTE: //we have to handle the dnd with file operation, so do not //use QAbstractModel::dropMimeData() here; return false; } Qt::DropActions DesktopItemModel::supportedDropActions() const { return Qt::MoveAction|Qt::CopyAction; return QAbstractItemModel::supportedDropActions(); } Qt::DropActions DesktopItemModel::supportedDragActions() const { return Qt::MoveAction; } void DesktopItemModel::refresh() { Q_EMIT prepareRefresh(); beginResetModel(); m_files.clear(); m_items_need_relayout.clear(); auto app = static_cast(qApp); app->clearViewCache(); endResetModel(); m_desktop_info = FileInfo::fromPath(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); auto infoJob = new FileInfoJob(m_desktop_info); infoJob->setAutoDelete(); connect(infoJob, &FileInfoJob::queryAsyncFinished, this, [=](bool successed){ if (successed) { refreshInternal(); } else { qWarning()<<"desktop model refreshs: can not query desktop info"<uri(); } }); connect(this, &DesktopItemModel::prepareRefresh, infoJob, &FileInfoJob::cancel, Qt::DirectConnection); infoJob->queryAsync(); } Peony::DesktopIconView *DesktopItemModel::getIconView(const QString &uri) { //获取当前屏幕的view auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { int id = metaInfo->getMetaInfoInt("peony-qt-desktop-id"); return ((PeonyDesktopApplication*)qApp)->getIconView(id); } return ((PeonyDesktopApplication*)qApp)->getIconView(0); } peony/peony-qt-desktop/desktop-icon-view-delegate.h0000664000175000017500000000501115154271070021344 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPICONVIEWDELEGATE_H #define DESKTOPICONVIEWDELEGATE_H #include #include class QPushButton; class AdvancedDesktopIconView; namespace Peony { class FileInfo; class DesktopIconViewDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit DesktopIconViewDelegate(QObject *parent = nullptr); ~DesktopIconViewDelegate() override; void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const override { return QStyledItemDelegate::initStyleOption(option, index); } AdvancedDesktopIconView *getView() const; //初始化option void initIndexOption(QStyleOptionViewItem *option, const QModelIndex &index) const; /** * @brief Retrieves the FileInfo object associated with a given model index * @param index The QModelIndex for which to retrieve the FileInfo * @return std::shared_ptr The FileInfo object, or nullptr if not found */ std::shared_ptr getFileInfo(const QModelIndex &index) const; protected: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; //edit QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; private Q_SLOT: void slot_finishEdit();/* 编辑完成 */ private: QPushButton *m_styled_button; }; } #endif // DESKTOPICONVIEWDELEGATE_H peony/peony-qt-desktop/desktop-background-manager.cpp0000664000175000017500000003151315154271070021764 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-desktop-application.h" #include "desktop-background-manager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include static DesktopBackgroundManager *global_instance = nullptr; #define BACKGROUND_MATE_SETTINGS "org.mate.background" #define BACKGROUND_SETTINGS "org.ukui.interface" DesktopBackgroundManager::DesktopBackgroundManager(QObject *parent) : QObject(parent) { m_animation = new QVariantAnimation(this); m_animation->setDuration(1000); m_animation->setStartValue(qreal(0)); m_animation->setEndValue(qreal(1)); m_timeLine = new QTimeLine(200, this); connect(m_timeLine, &QTimeLine::finished, this, &DesktopBackgroundManager::updateScreens); connect(m_animation, &QVariantAnimation::valueChanged, this, &DesktopBackgroundManager::updateScreens); connect(m_animation, &QVariantAnimation::finished, this, [=](){ m_backPixmap = m_frontPixmap; if (!m_pendingPixmap.isNull()) { m_frontPixmap = m_pendingPixmap; m_pendingPixmap = QPixmap(); m_animation->start(); } updateScreens(); QTimer::singleShot(200, this, [=](){ m_animationRunning = false; }); }); initGSettings(); } void DesktopBackgroundManager::initGSettings() { if (QGSettings::isSchemaInstalled(BACKGROUND_SETTINGS)) { m_backgroundSettings = new QGSettings(BACKGROUND_SETTINGS, QByteArray(), this); m_backgroundOption = m_backgroundSettings->get("pictureOptions").toString(); // g_autoptr (GSettings) settings = g_settings_new_with_path("org.mate.background", "/org/mate/desktop/background/"); g_autoptr (GSettings) settings = g_settings_new_with_path("org.ukui.interface", "/org/ukui/interface/"); if (settings) { bool writable = g_settings_is_writable(settings, "picture-filename"); m_shouldSyncAccountBackground = writable; } } else if (QGSettings::isSchemaInstalled(BACKGROUND_MATE_SETTINGS)){ m_backgroundSettings = new QGSettings(BACKGROUND_MATE_SETTINGS, QByteArray(), this); m_backgroundOption = m_backgroundSettings->get("pictureOptions").toString(); g_autoptr (GSettings) settings = g_settings_new_with_path("org.mate.background", "/org/mate/desktop/background/"); if (settings) { bool writable = g_settings_is_writable(settings, "picture-filename"); m_shouldSyncAccountBackground = writable; } } else { m_backgroundOption = "scaled"; } m_paintBackground = true; setBackground(); if (m_backgroundSettings) { connect(m_backgroundSettings, &QGSettings::changed, this, [=](const QString &key){ m_animationRunning = true; if (key == "pictureFilename") { m_current_bg_path = m_backgroundSettings->get("pictureFilename").toString(); m_shouldSyncAccountBackground = true; setAccountBackground(); } if (key == "pictureFilename" || key == "primaryColor" || key == "pictureOptions") { switchBackground(); } }); } } void DesktopBackgroundManager::updateScreens() { Q_EMIT screensUpdated(); } void DesktopBackgroundManager::initBackground() { if (QGSettings::isSchemaInstalled(BACKGROUND_SETTINGS)) { m_backgroundSettings = new QGSettings(BACKGROUND_SETTINGS, QByteArray(), this); } m_paintBackground = true; setBackground(); if (m_backgroundSettings) { connect(m_backgroundSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == "pictureFilename" || key == "primaryColor") { switchBackground(); } }); } } void DesktopBackgroundManager::setBackground() { QString defaultBg; auto accountBack = getAccountBackground(); if (accountBack != "" && QFile::exists(accountBack)) defaultBg = accountBack; //if default bg and account bg not exist, use color bg if (! QFile::exists(defaultBg)) { qWarning() << "default bg and account bg not exist"; switchBackground(); return; } m_frontPixmap = QPixmap(defaultBg); //ctyun项目反馈壁纸问题修复 //fix jpeg file change suffix name to png, set as wallpaper fail issue //fix bug#242528, can not read jpg wallpaper issue if (m_frontPixmap.isNull()){ QFile file(defaultBg); if (file.open(QIODevice::ReadOnly)){ m_frontPixmap.loadFromData(file.readAll()); file.close(); } } m_current_bg_path = defaultBg; if (defaultBg != accountBack) setAccountBackground(); m_animation->finished(); } /* * 1.为解决云桌面批量推送同名壁纸,重新设置壁纸不生效问题,增加强制更新接口; * 2.接口可以通过peony-qt-desktop -u 命令调用; * 3.接口目前只会使用gsettings设置的壁纸值做刷新,然后备份到个人壁纸数据; * 4.壁纸数据备份后,如果用户将壁纸文件本身删除,重新刷新也会使用备份的壁纸,不会丢失; */ void DesktopBackgroundManager::forceUpdateBackground() { if (!m_backgroundSettings){ qWarning() << "forceUpdateBackground failed, m_backgroundSettings not exist"; return; } m_backgroundOption = m_backgroundSettings->get("pictureOptions").toString(); auto path = m_backgroundSettings->get("pictureFilename").toString(); if (! QFile::exists(path)){ qWarning() << "forceUpdateBackground failed, pictureFilename not exist"; return; } if (m_animation->state() == QVariantAnimation::Running) { m_pendingPixmap = QPixmap(path); m_current_bg_path = path; } else { m_frontPixmap = QPixmap(path); //天翼云项目反馈壁纸问题修复 //fix jpeg file change suffix name to png, set as wallpaper fail issue if (m_frontPixmap.isNull()){ QFile file(path); if (file.open(QIODevice::ReadOnly)){ m_frontPixmap.loadFromData(file.readAll()); file.close(); } } if (m_backPixmap.isNull()) { m_backPixmap = m_frontPixmap; } m_current_bg_path = path; m_animation->start(); } updateScreens(); setAccountBackground(); } QString DesktopBackgroundManager::getAccountBackground() { if (!m_shouldSyncAccountBackground) { if (m_backgroundSettings) { return m_backgroundSettings->get("pictureFilename").toString(); } return nullptr; } uid_t uid = getuid(); QDBusInterface iface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts",QDBusConnection::systemBus()); QDBusReply userPath = iface.call("FindUserById", (qint64)uid); if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { QDBusInterface userIface("org.freedesktop.Accounts", userPath.value().path(), "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); QDBusReply backgroundReply = userIface.call("Get", "org.freedesktop.Accounts.User", "BackgroundFile"); if(backgroundReply.isValid()) return backgroundReply.value().variant().toString(); } return ""; } void DesktopBackgroundManager::setAccountBackground() { if (!m_shouldSyncAccountBackground) { return; } QDBusInterface * interface = new QDBusInterface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts", QDBusConnection::systemBus()); if (!interface->isValid()){ qCritical() << "Create /org/freedesktop/Accounts Client Interface Failed " << QDBusConnection::systemBus().lastError(); return; } QDBusReply reply = interface->call("FindUserByName", g_get_user_name()); QString userPath; if (reply.isValid()){ userPath = reply.value().path(); } else { qCritical() << "Call 'GetComputerInfo' Failed!" << reply.error().message(); return; } QDBusInterface * useriFace = new QDBusInterface("org.freedesktop.Accounts", userPath, "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); if (!useriFace->isValid()){ qCritical() << QString("Create %1 Client Interface Failed").arg(userPath) << QDBusConnection::systemBus().lastError(); return; } QDBusMessage msg = useriFace->call("SetBackgroundFile", m_current_bg_path); qDebug() << "setAccountBackground path:" <get("pictureOptions").toString(); auto path = m_backgroundSettings->get("pictureFilename").toString(); QString localPath = path; if (! QFile::exists(path)) path = getAccountBackground(); // try fix #124971 if (!localPath.isEmpty() && (path.isEmpty()||!QFile::exists(path))) { path = "/usr/share/backgrounds/ubuntukylin-default-settings.jpg"; } if (path.isEmpty()) { m_usePureColor = true; auto colorName = m_backgroundSettings->get("primaryColor").toString(); m_color = QColor(colorName); m_animation->stop(); m_backPixmap = QPixmap(); m_frontPixmap = QPixmap(); m_current_bg_path = ""; updateScreens(); } else { m_usePureColor = false; auto colorName = m_backgroundSettings->get("primaryColor").toString(); m_color = QColor(colorName); if (m_animation->state() == QVariantAnimation::Running) { m_pendingPixmap = QPixmap(path); m_current_bg_path = path; } else { m_frontPixmap = QPixmap(path); //ctyun项目反馈壁纸问题修复 //fix jpeg file change suffix name to png, set as wallpaper fail issue if (m_frontPixmap.isNull()){ QFile file(path); if (file.open(QIODevice::ReadOnly)){ m_frontPixmap.loadFromData(file.readAll()); file.close(); } } if (m_backPixmap.isNull()) { m_backPixmap = m_frontPixmap; } m_animation->start(); m_current_bg_path = path; } updateScreens(); } //if background picture changed, update it if (m_current_bg_path != getAccountBackground()) setAccountBackground(); } bool DesktopBackgroundManager::getPaintBackground() const { return m_paintBackground; } QColor DesktopBackgroundManager::getColor() const { return m_color; } bool DesktopBackgroundManager::getUsePureColor() const { return m_usePureColor; } QVariantAnimation *DesktopBackgroundManager::getAnimation() const { return m_animation; } QPixmap DesktopBackgroundManager::getFrontPixmap() const { return m_frontPixmap; } DesktopBackgroundManager *DesktopBackgroundManager::globalInstance() { if (!global_instance) { global_instance = new DesktopBackgroundManager; } return global_instance; } QPixmap DesktopBackgroundManager::getBackPixmap() const { return m_backPixmap; } const QString &DesktopBackgroundManager::getBackgroundOption() { return m_backgroundOption; } bool DesktopBackgroundManager::AnimationRunning() { return m_animationRunning; } peony/peony-qt-desktop/freedesktop-dbus-interfaces.xml0000664000175000017500000000266015154271070022174 0ustar fengfeng peony/peony-qt-desktop/peony-qt-desktop.pro0000664000175000017500000000702715154271106020032 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-10-28T14:12:53 # #------------------------------------------------- QT += core gui dbus concurrent quick core5compat greaterThan(QT_MAJOR_VERSION, 4): QT += widgets include(../common.pri) TARGET = peony-qt-desktop TEMPLATE = app QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized -Werror=unused-label PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/peony-extensions DEFINES += PLUGIN_INSTALL_DIRS='\\"$${PLUGIN_INSTALL_DIRS}\\"' DEFINES += QT_DEPRECATED_WARNINGS #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../libpeony-qt/libpeony-qt-header.pri) include(../3rd-parties/SingleApplication/singleapplication.pri) include(../3rd-parties/qtsingleapplication/qtsingleapplication.pri) include(qml-desktop/qml-desktop.pri) include(controls/controls.pri) DEFINES += QAPPLICATION_CLASS=QApplication CONFIG += qmltypes QML_IMPORT_NAME = org.ukui.desktop QML_IMPORT_MAJOR_VERSION = 1 PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 gsettings-qt6 libcanberra dconf KF6WindowSystem CONFIG += c++11 link_pkgconfig no_keywords lrelease contains(DEFINES, KY_SDK_KABASE) { PKGCONFIG += kysdk-kabase } contains(DEFINES, KY_SDK_WAYLANDHELPER) { PKGCONFIG += kysdk-waylandhelper PKGCONFIG += kysdk-ukuiwindowhelper } LIBS += -L$$PWD/../libpeony-qt/ -lpeony -lX11 -lukui-log4qt TRANSLATIONS += ../translations/peony-qt-desktop/peony-qt-desktop_zh_CN.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_tr.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_cs.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_de.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_es.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_fr.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_kk_KZ.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_ug_CN.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_ky_KG.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_bo_CN.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_mn.ts \ ../translations/peony-qt-desktop/peony-qt-desktop_zh_HK.ts SOURCES += \ advanced-desktop-item-model.cpp \ background-manager.cpp \ desktop-window-manager.cpp \ main.cpp \ peony-desktop-application.cpp \ fm-dbus-service.cpp \ desktop-menu.cpp \ desktop-menu-plugin-manager.cpp \ desktop-item-proxy-model.cpp \ peony-json-operation.cpp \ bw-list-info.cpp \ peony-dbus-service.cpp \ primary-manager.cpp \ screen-manager.cpp \ user-dir-manager.cpp HEADERS += \ advanced-desktop-item-model.h \ background-manager.h \ common.h \ desktop-window-manager.h \ peony-desktop-application.h \ fm-dbus-service.h \ desktop-menu.h \ desktop-menu-plugin-manager.h \ desktop-item-proxy-model.h \ peony-json-operation.h \ bw-list-info.h \ peony-dbus-service.h \ primary-manager.h \ screen-manager.h \ user-dir-manager.h target.path = /usr/bin !isEmpty(target.path): INSTALLS += target #QM_FILES_RESOURCE_PREFIX = ../translations/peony-qt-desktop QM_FILES_INSTALL_PATH = /usr/share/peony-qt-desktop desktop_data.path = /etc/xdg/autostart desktop_data.files += ../data/peony-desktop.desktop INSTALLS += desktop_data DISTFILES += RESOURCES += \ peony-qt-desktop-style.qrc \ qml.qrc peony/peony-qt-desktop/desktop-item-proxy-model.h0000664000175000017500000000636215154271106021121 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPITEMPROXYMODEL_H #define DESKTOPITEMPROXYMODEL_H #include #include "bw-list-info.h" #include "peony-json-operation.h" namespace Peony { class DesktopItemProxyModel : public QSortFilterProxyModel { Q_OBJECT public: enum SortType { FileName, ModifiedDate, FileType, FileSize, Other }; explicit DesktopItemProxyModel(QObject *parent = nullptr); ~DesktopItemProxyModel(); Q_INVOKABLE int count() { return rowCount(); } void setSortType(int type) { m_sort_type = type; } int getSortType() { return m_sort_type; } void setSortOrder(int sortOrder) { m_sort_order = sortOrder; } int getSortOrder() { return m_sort_order; } void setShowHidden(bool showHidden); int updateBlackAndWriteLists(); QString getBlackAndWhiteModel(); QSet getBWListInfo(); bool getBlackAndWhiteListExist(QString name); void updateFilter(); bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const; void setId(int id); Q_INVOKABLE int id(); QModelIndexList getAllFileIndexes(); void setDesktopUseAutoLayout(bool desktopUseAutoLayout); bool getDesktopUseAutoLayout() const; QStringList getSortedUris() const; void setSortedUris(const QStringList &sortedUris); void clearExpectedItemPosForCurrentView(); Q_SIGNALS: void showHiddenFile(); void requestSyncSortedUrisWithDelay(int msec = 1000); void datechange(int i, const QVariant &value, int role); void layoutUpdate(); void showStandardFile(); void viewUpdated(); void drop(const QStringList &selectedUris, Qt::DropAction action, int row, const QPoint &offPos); public Q_SLOTS: Q_INVOKABLE void setdata(int i, const QVariant &value, int role = Qt::EditRole); Q_INVOKABLE void updateIconPositions(const QStringList &mimeData, Qt::DropAction action, int row, const QPoint &offPos, bool onItem); Q_INVOKABLE void addFile(const QStringList &mimeData, Qt::DropAction action, int row, bool isSearch); Q_INVOKABLE void invalidateModel(); private: int m_sort_type = Other; bool m_show_hidden; int m_sort_order = 0; BWListInfo *m_bwListInfo; PeonyJsonOperation *m_jsonOp; int m_id = 0; bool m_desktopUseAutoLayout = false; QStringList m_sortedUris; }; } #endif // DESKTOPITEMPROXYMODEL_H peony/peony-qt-desktop/desktop-item-proxy-model.cpp0000664000175000017500000004232715154271106021455 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "common.h" #include "desktop-item-proxy-model.h" #include "file-info.h" #include "file-meta-info.h" #include "file-operation-utils.h" #include "global-settings.h" #include #include #include #include #include #include #include using namespace Peony; QLocale locale = QLocale(QLocale::system().name()); QCollator comparer = QCollator(locale); bool startWithChinese(const QString &displayName) { //NOTE: a newly created file might could not get display name soon. if (displayName.isEmpty()) { return false; } auto firstStrUnicode = displayName.at(0).unicode(); return (firstStrUnicode <=0x9FA5 && firstStrUnicode >= 0x4E00); } DesktopItemProxyModel::DesktopItemProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { //enable number sort, like 100 is after 99 comparer.setNumericMode(true); setSortCaseSensitivity(Qt::CaseInsensitive); setDynamicSortFilter(false); auto settings = GlobalSettings::getInstance(); m_show_hidden = settings->isExist(SHOW_HIDDEN_PREFERENCE)? settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(): false; connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (SHOW_HIDDEN_PREFERENCE == key) { bool showHidden = GlobalSettings::getInstance()->getValue(key).toBool(); if (m_show_hidden != showHidden) { m_show_hidden = showHidden; invalidateFilter(); Q_EMIT showHiddenFile(); } } else if (key == DISPLAY_STANDARD_ICONS || key == HOME_ICON_VISIBLE || key == TRASH_ICON_VISIBLE || key == COMPUTER_ICON_VISIBLE) { invalidateFilter(); Q_EMIT showStandardFile(); } else if (ALLOW_FILE_OP_PARALLEL == key) { bool isAllowFileOpParallel = GlobalSettings::getInstance()->getValue(key).toBool(); auto fileOpMgr = FileOperationManager::getInstance(); fileOpMgr->setAllowParallel(isAllowFileOpParallel); } }); qDebug() <<"DesktopItemProxyModel:" <isExist(SHOW_HIDDEN_PREFERENCE)<getValue(LAST_DESKTOP_SORT_ORDER).toInt(); m_sort_order = settings->getValue(DESKTOP_SORT_ORDER).toInt(); m_bwListInfo = new BWListInfo(); m_jsonOp = new PeonyJsonOperation(); QString jsonPath=QDir::homePath()+"/.config/peony-security-config.json"; m_jsonOp->setConfigFile(jsonPath); m_jsonOp->loadConfigFile(m_bwListInfo); } DesktopItemProxyModel::~DesktopItemProxyModel() { delete m_jsonOp; delete m_bwListInfo; } bool DesktopItemProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { if (!sourceModel()) return false; auto sourceIndex = sourceModel()->index(source_row, 0, source_parent); if (sourceIndex.data().toString().isEmpty()) return false; auto uri = sourceIndex.data(Qt::UserRole).toString(); auto info = FileInfo::fromUri(uri); if (!m_show_hidden) { auto metainfo = FileMetaInfo::fromUri(uri); if (metainfo->hasHiddenInfo()) { bool isHidden = metainfo->isHidden(); if (isHidden) { return false; } } else { bool isHidden = info->isHiddenFile(); if (isHidden) { return false; } } } //task#74174 通过id筛选出需要在该view中显示项 int id = sourceIndex.data(Qt::UserRole+3).toInt(); if (m_id != id) { return false; } //fix desktop show Desktop folder issue, bug#20293 if (QUrl(uri).path() == QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/Desktop" || QUrl(uri).path() == QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Desktop" + "/Desktop") { if (! QFile::exists(QUrl(uri).path())) return false; } // if (!GlobalSettings::getInstance()->getValue(DISPLAY_STANDARD_ICONS).toBool()) { // if (uri == "computer:///" // || uri == "trash:///" // || uri == ("file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation)) // || uri == QStandardPaths::writableLocation(QStandardPaths::HomeLocation)) // { // return false; // } // } //家目录图标显示隐藏,只要DISPLAY_STANDARD_ICONS 或者 HOME_ICON_VISIBLE 其中任意1个为false值即可 //但是如果改为隐藏后,需要显示,必须保证两个值都为true, 回收站和计算机图标为同样逻辑 bool display_standard_icons = GlobalSettings::getInstance()->getValue(DISPLAY_STANDARD_ICONS).toBool(); if (! GlobalSettings::getInstance()->getValue(HOME_ICON_VISIBLE).toBool() || ! display_standard_icons) { if (uri == ("file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation)) || uri == QStandardPaths::writableLocation(QStandardPaths::HomeLocation)) { return false; } } if (((! GlobalSettings::getInstance()->getValue(TRASH_ICON_VISIBLE).toBool() || ! display_standard_icons) && uri == "trash:///")) { return false; } if (((! GlobalSettings::getInstance()->getValue(COMPUTER_ICON_VISIBLE).toBool() || ! display_standard_icons) && uri == "computer:///")) { return false; } if (info->isDesktopFile() && nullptr != info->desktopName()){ qDebug() << "desktopName"<desktopName(); if (m_bwListInfo->isBlackListMode()){ return !m_bwListInfo->desktopNameExist(info->desktopName()); } else if (m_bwListInfo->isWriteListMode()){ return m_bwListInfo->desktopNameExist(info->desktopName()); } } return true; } bool DesktopItemProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const { //qDebug()<<"less than"; if (m_sort_type == Other) { return true; } auto leftUri = source_left.data(Qt::UserRole).toString(); auto leftInfo = FileInfo::fromUri(leftUri); //auto leftMetaInfo = FileMetaInfo::fromUri(leftUri); auto rightUri = source_right.data(Qt::UserRole).toString(); auto rightInfo = FileInfo::fromUri(rightUri); //auto rightMetaInfo = FileMetaInfo::fromUri(rightUri); //computer home and trash first if (source_left.row() < 3) { if (source_right.row() < source_left.row()) { return (sortOrder()==Qt::AscendingOrder)? false: true; } return (sortOrder()==Qt::AscendingOrder)? true: false; } if (source_right.row() < 3) { if (source_left.row() < source_right.row()) { return (sortOrder()==Qt::AscendingOrder)? true: false; } return (sortOrder()==Qt::AscendingOrder)? false: true; } //dir first if (leftInfo->isDir()) { if (rightInfo->isDir()) { //fix bug#89115, folders not sort by name if (m_sort_type != ModifiedDate){ if (leftInfo->isDir() && rightInfo->isDir()) { goto default_sort; } } } else { return (sortOrder()==Qt::AscendingOrder)? true: false; } } else { if (rightInfo->isDir()) { return (sortOrder()==Qt::AscendingOrder)? false: true; } } //qDebug()<<"sort in desktop"<displayName(), rightInfo->displayName())) { return FileOperationUtils::leftNameLesserThanRightName(leftInfo->displayName(), rightInfo->displayName()); } goto default_sort; } case ModifiedDate: { if (leftInfo->modifiedTime() == rightInfo->modifiedTime()) goto default_sort; return leftInfo->modifiedTime() > rightInfo->modifiedTime(); } case FileType: { if (leftInfo->fileType() == rightInfo->fileType()) goto default_sort; QString leftDisplayType = leftInfo->fileType(); QString rightDisplayType = rightInfo->fileType(); if (startWithChinese(leftDisplayType)) { if (!startWithChinese(rightDisplayType)) { return (sortOrder()==Qt::AscendingOrder)? true: false; } else { //chinese pinyin sort order is reversed compared with english. //return !QSortFilterProxyModel::lessThan(source_left, source_right); //fix bug#89115, chinese files not sort by name pinyin return comparer.compare(leftDisplayType, rightDisplayType) > 0; } } else { if (startWithChinese(rightDisplayType)) { return (sortOrder()==Qt::AscendingOrder)? false: true; } return comparer.compare(leftDisplayType, rightDisplayType) > 0; } } case FileSize: { if (leftInfo->size() == rightInfo->size()) goto default_sort; return leftInfo->size() > rightInfo->size(); } } default_sort: //when sort value is same, use name to sort, fix refresh change order issue //fix bug#99928, desktop sort not same with folder issue, and releated to bug#92525 QString leftDisplayName = leftInfo->displayName(); QString rightDisplayName = rightInfo->displayName(); if (startWithChinese(leftInfo->displayName())) { if (!startWithChinese(rightInfo->displayName())) { return (sortOrder()==Qt::AscendingOrder)? true: false; } else { //chinese pinyin sort order is reversed compared with english. //return !QSortFilterProxyModel::lessThan(source_left, source_right); //fix bug#89115, chinese files not sort by name pinyin return comparer.compare(leftInfo->displayName(), rightInfo->displayName()) > 0; } } else { if (startWithChinese(rightInfo->displayName())) { return (sortOrder()==Qt::AscendingOrder)? false: true; } return comparer.compare(leftDisplayName, rightDisplayName) > 0; } return QSortFilterProxyModel::lessThan(source_left, source_right); } void DesktopItemProxyModel::setShowHidden(bool showHidden) { GlobalSettings::getInstance()->setGSettingValue(SHOW_HIDDEN_PREFERENCE, showHidden); m_show_hidden = showHidden; invalidateFilter(); } int DesktopItemProxyModel::updateBlackAndWriteLists() { m_bwListInfo->clearBWlist(); m_jsonOp->loadConfigFile(m_bwListInfo); //重新过滤显示 invalidateFilter(); return 0; } void DesktopItemProxyModel::invalidateModel() { invalidateFilter(); Q_EMIT showHiddenFile(); } void DesktopItemProxyModel::setId(int id) { m_id = id; } int DesktopItemProxyModel::id() { return m_id; } QString DesktopItemProxyModel::getBlackAndWhiteModel() { return m_bwListInfo->getMode(); } bool DesktopItemProxyModel::getBlackAndWhiteListExist(QString name) { return m_bwListInfo->desktopNameExist(name); } QSet DesktopItemProxyModel::getBWListInfo() { return m_bwListInfo->getBWListInfo(); } void DesktopItemProxyModel::setDesktopUseAutoLayout(bool desktopUseAutoLayout) { m_desktopUseAutoLayout = desktopUseAutoLayout; } bool DesktopItemProxyModel::getDesktopUseAutoLayout() const { return m_desktopUseAutoLayout; } QStringList DesktopItemProxyModel::getSortedUris() const { return m_sortedUris; } void DesktopItemProxyModel::setSortedUris(const QStringList &sortedUris) { m_sortedUris = sortedUris; // Q_EMIT requestSyncSortedUrisWithDelay(); } void DesktopItemProxyModel::clearExpectedItemPosForCurrentView() { // note: 目前发现多次排序可能会导致behavior动效不生效,这里reset一下model保证排序动效正常 beginResetModel(); endResetModel(); for (int i = 0; i < rowCount(); i++) { auto modelIndex = index(i, 0); auto uri = modelIndex.data(Qt::UserRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); metaInfo->setMetaInfoStringList(RESTORE_ITEM_GRID_POS_ATTRIBUTE, QStringList()); } } void DesktopItemProxyModel::setdata(int i, const QVariant &value, int role) { sourceModel()->setData(index(i, 0), value, role); Q_EMIT datechange(i, value, role); } void DesktopItemProxyModel::updateIconPositions(const QStringList &mimeData, Qt::DropAction action, int row, const QPoint &offPos, bool onItem) { qDebug() << "drag to current position:"<isDir()|| mimeData.contains(uri)) { return; } qDebug() << "DesktopIconView move file to folder"; for (auto uuri : mimeData) { if ("trash:///" == uuri || "computer:///" == uuri) { return; } } // 将 QVariant 转换为 QMimeData QMimeData *data = new QMimeData(); QList urls; QStringList uris = mimeData; // 将 QVariantMap 转换为 QMimeData for (QString uri : mimeData) { QUrl url = uri; if (!urls.contains(url)) urls<setUrls(urls); auto string = uris.join(" "); data->setData("peony-qt/encoded-uris", string.toUtf8()); data->setText(string); QModelIndex modelindex = index(row, 0); bool sucess = sourceModel()->dropMimeData(data, action, -1, -1, modelindex); if (!sucess) { return; } } } Q_EMIT drop(mimeData, action, row, offPos); } void DesktopItemProxyModel::addFile(const QStringList &mimeData, Qt::DropAction action, int row, bool isSearch) { qDebug() << mimeData; // 将 QVariant 转换为 QMimeData QMimeData *data = new QMimeData(); QList urls; QStringList uris = mimeData; // 将 QVariantMap 转换为 QMimeData for (QString uri : mimeData) { // 适配ukui-menu拖拽 if (uri.startsWith("app://")) { uri.replace("app://", "file://"); auto destDirUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); FileOperationUtils::copyDesktopFile(QStringList() << uri, destDirUri, true); return; } QUrl url = uri; if (!urls.contains(url)) urls<setUrls(urls); auto string = uris.join(" "); data->setData("peony-qt/encoded-uris", string.toUtf8()); QVariant isSearchData = QVariant(isSearch); data->setData("peony-qt/is-search", isSearchData.toByteArray()); data->setText(string); qDebug() << "drag to current position:"<dropMimeData(data, action, -1, -1, modelindex); } QModelIndexList DesktopItemProxyModel::getAllFileIndexes() { QModelIndexList l; int i = 0; while (this->index(i, 0, QModelIndex()).isValid()) { auto index = this->index(i, 0, QModelIndex()); if (m_show_hidden) { l<index(i, 0, QModelIndex()).data(Qt::UserRole).toString(); disyplayName = FileUtils::getFileDisplayName(uri); } if (!disyplayName.startsWith(".")) { l<. * * Authors: Yue Lan * */ #ifndef DESKTOPBACKGROUNDWINDOW_H #define DESKTOPBACKGROUNDWINDOW_H #include #include #include "advanced-desktop-icon-view.h" #include "windowmanager/windowmanager.h" namespace KWayland { namespace Client { class PlasmaShellSurface; } } namespace Peony { class DesktopMenu; } class DesktopBackgroundWindow : public QMainWindow { Q_OBJECT public: explicit DesktopBackgroundWindow(QScreen *screen, int desktopWindowId, QWidget *parent = nullptr); ~DesktopBackgroundWindow() override; int id() const; QScreen *screen() const; AdvancedDesktopIconView *getIconView(); void setId(int id); void setWindowId(kdk::WindowId id); kdk::WindowId getWindowId(); bool event(QEvent *event) override; void invaidScreen(); Q_SIGNALS: void setDefaultZoomLevel(AdvancedDesktopIconView::ZoomLevel level); void setSortType(int sortType); void setSortOrder(int sortOrder); void updateWindow(const QRect &geometry); void markFilePos(QPoint pos); void clearOtherViewSelection(); public Q_SLOTS: void setWindowGeometry(const QRect &geometry); protected Q_SLOTS: void updateWindowGeometry(); protected: void paintEvent(QPaintEvent *event) override; QPoint getRelativePos(const QPoint &pos); /** * 图片填充方式 * @brief 从给定的图片中,截取一个与屏幕比例相同的矩形。(Rect,居中)。 * @param pixmap 图片 * @return */ QRect getSourceRect(const QPixmap &pixmap); QRect getSourceRect(const QPixmap &pixmap, const QRect &screenGeometery); QRect getDestRect(const QPixmap &pixmap); private: int m_id = -1; QScreen *m_screen = nullptr; QGSettings *m_panelSetting = nullptr; AdvancedDesktopIconView *m_desktopIconView = nullptr; KWayland::Client::PlasmaShellSurface *m_shellSurface = nullptr; Peony::DesktopMenu *m_menu = nullptr; kdk::WindowId m_windowId; }; #endif // DESKTOPBACKGROUNDWINDOW_H peony/peony-qt-desktop/desktop-menu.h0000664000175000017500000000512515154271106016646 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPMENU_H #define DESKTOPMENU_H #include #include "common.h" namespace Peony { class DirectoryViewIface; class DesktopMenu : public QMenu { Q_OBJECT public: explicit DesktopMenu(DirectoryViewIface *view, QWidget *parent = nullptr); explicit DesktopMenu(QString currentDirectory, QStringList selections, QWidget *parent = nullptr); QAction *exec(const QPoint &pos); const QStringList urisToEdit() { return m_uris_to_edit; } void showProperties(const QString &uri); void showProperties(const QStringList &uris); Q_SIGNALS: void setDefaultZoomLevel(ZoomLevel level); void setSortType(int sortType); void setSortOrder(int sortOrder); void markFilePos(QPoint pos); void invertSelections(); void editUri(const QString &uri); void editUris(const QStringList &uris); void refresh(); void paste(const QStringList &selectedUris); void changeOpacity(double opacity); protected: void fillActions(); const QList constructOpenOpActions(); const QList constructCreateTemplateActions(); const QList constructViewOpActions(); const QList constructFileOpActions(); const QList constructMenuPluginActions(); //directory view menu extension. const QList constructFilePropertiesActions(); const QList constructIsoMountActions(); const QList constructBackgroundMenuActions(); void openWindow(const QString &uri); void openWindow(const QStringList &uris); void gotoAboutComputer(); void gotoSetBackground(); void gotoSetResolution(); private: DirectoryViewIface *m_view; QString m_directory; QStringList m_selections; QStringList m_uris_to_edit; QPoint m_execPos; const int ELIDE_TEXT_LENGTH = 16; }; } #endif // DESKTOPMENU_H peony/peony-qt-desktop/desktop-menu-plugin-manager.h0000664000175000017500000000323315154271106021550 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPMENUPLUGINMANAGER_H #define DESKTOPMENUPLUGINMANAGER_H #include #include #include "menu-plugin-iface.h" namespace Peony { class DesktopMenuPluginManager : public QObject { Q_OBJECT public: static DesktopMenuPluginManager *getInstance(); bool isLoaded() { return m_is_loaded; } const QStringList getPluginIds(); QList getPlugins(); MenuPluginInterface *getPlugin(const QString &pluginId); QString getPluginName(const QString &pluginId); void registerPlugin(const QString &uri); public Q_SLOTS: void loadAsync(); Q_SIGNALS: void pluginLoadFinished(); private: explicit DesktopMenuPluginManager(QObject *parent = nullptr); ~DesktopMenuPluginManager(); QMap m_map; QMap m_nameMpa; bool m_is_loaded = false; }; } #endif // DESKTOPMENUPLUGINMANAGER_H peony/peony-qt-desktop/peony-desktop-application.h0000664000175000017500000000423415154271070021335 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * Authors: Meihong He * */ #ifndef PEONYDESKTOPAPPLICATION_H #define PEONYDESKTOPAPPLICATION_H #include "singleapplication.h" #include "qtsingleapplication.h" #include "volume-manager.h" #include #include class DesktopWindowManager; namespace Peony { class AdvancedDesktopItemModel; } using namespace Peony; class QTimeLine; class PeonyDesktopApplication : public QtSingleApplication { Q_OBJECT public: explicit PeonyDesktopApplication(int &argc, char *argv[], const QString &applicationName = "peony-qt-desktop"); static bool userGuideDaemonRunning(); static void showGuide(const QString &appName = ""); static void gotoSetBackground(); static void gotoSetResolution(); static qint64 peony_desktop_start_time; static Peony::AdvancedDesktopItemModel *getModel(); static DesktopWindowManager *getDesktopWindowManager(); // only used in model refresh. void clearViewCache(); Q_SIGNALS: void requestSetUKUIOutputEnable(bool enable); protected Q_SLOTS: void parseCmd(QString msg, bool isPrimary); public Q_SLOTS: void volumeRemovedProcess(const std::shared_ptr &volume); private: void setupDesktop(); void setupBgAndDesktop(); void clearIcons(const QStringList &args); void autoMountLocalDriver(); void monitoringVolumesChanges(); bool m_first_parse = true; }; #endif // PEONYDESKTOPAPPLICATION_H peony/peony-qt-desktop/user-dir-manager.cpp0000664000175000017500000001704215154271106017731 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "user-dir-manager.h" #include "file-operation-manager.h" #include "file-rename-operation.h" #include "global-settings.h" #include "file-info.h" #include "file-item.h" #include #include #include #include #include #include #include #include #include #include using namespace Peony; UserdirManager::UserdirManager(QObject *parent) : QObject(parent) { struct passwd *pwd; pwd=getpwuid(getuid()); auto userName = pwd->pw_name; m_user_name = QString(userName); m_settings = new QSettings("org.ukui", "peony-qt-preferences", this); m_allow_parallel = m_settings->value(ALLOW_FILE_OP_PARALLEL).toBool(); m_showTrashDialog = m_settings->value(SHOW_TRASH_DIALOG).toBool(); m_user_dir_watcher = new QFileSystemWatcher(this); m_user_path = g_get_home_dir(); QString path0 = QString(m_user_path +"/.config/user-dirs.dirs"); QString path1 = QString(m_user_path +"/.config/org.ukui/peony-qt-preferences.conf"); if(!QFile(path0).exists()) { QTimer *timer = new QTimer; connect(timer,&QTimer::timeout,[=](){ if(QFile(path0).exists()) { qWarning()<<"m_times............."<addPath(path0); timer->stop(); } else { if(--m_times==0) { timer->stop(); qWarning()<<"stop finding user-dirs.dirs"; } } }); timer->start(1000); } else { m_user_dir_watcher->addPath(path0); getUserdir(); } if(!QFile(path1).exists()) { GlobalSettings::getInstance(); } m_user_dir_watcher->addPath(path1); connect(m_user_dir_watcher, &QFileSystemWatcher::fileChanged, [=](const QString &uri){ //user-dirs.dirs if(uri == path0) { getUserdir(); Q_EMIT desktopDirChanged(); // moveFile(); } //peony-qt-preferences only thumbnail setting for now. else if(uri == path1) { m_settings = new QSettings("org.ukui", "peony-qt-preferences", this); if (m_allow_parallel != m_settings->value(ALLOW_FILE_OP_PARALLEL).toBool()) { m_allow_parallel = m_settings->value(ALLOW_FILE_OP_PARALLEL).toBool(); FileOperationManager::getInstance()->setAllowParallel(m_allow_parallel); } if(m_showTrashDialog != m_settings->value(SHOW_TRASH_DIALOG).toBool()) { m_showTrashDialog = m_settings->value(SHOW_TRASH_DIALOG).toBool(); GlobalSettings::getInstance()->setValue("showTrashDialog", m_showTrashDialog); GlobalSettings::getInstance()->forceSync("showTrashDialog"); } } m_user_dir_watcher->addPath(uri); }); if (GlobalSettings::getInstance()->isExist(FORBID_THUMBNAIL_IN_VIEW)) { m_do_not_thumbnail = GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (FORBID_THUMBNAIL_IN_VIEW == key) { if(m_do_not_thumbnail != GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()) { m_do_not_thumbnail = !m_do_not_thumbnail; Q_EMIT thumbnailSetingChange(); } } }); } } // read user-dirs.dirs for all XDG standard path. void UserdirManager::getUserdir() { if(!m_current_user_dir.isEmpty()) { m_last_user_dir.clear(); m_last_user_dir = m_current_user_dir; m_current_user_dir.clear(); } auto settings = new QSettings(m_user_path +"/.config/user-dirs.dirs",QSettings::IniFormat); //settings->setIniCodec(QTextCodec::codecForName("UTF-8")); m_current_user_dir.insert("XDG_DESKTOP_DIR",settings->value(QString("XDG_DESKTOP_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_DOWNLOAD_DIR",settings->value(QString("XDG_DOWNLOAD_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_TEMPLATES_DIR",settings->value(QString("XDG_TEMPLATES_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_PUBLICSHARE_DIR",settings->value(QString("XDG_PUBLICSHARE_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_DOCUMENTS_DIR",settings->value(QString("XDG_DOCUMENTS_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_MUSIC_DIR",settings->value(QString("XDG_MUSIC_DIR")).toString().replace("$HOME",m_user_path)+"/"); m_current_user_dir.insert("XDG_PICTURES_DIR",settings->value(QString("XDG_PICTURES_DIR")).toString().replace("$HOME",m_user_path) + "/"); m_current_user_dir.insert("XDG_VIDEOS_DIR",settings->value(QString("XDG_VIDEOS_DIR")).toString().replace("$HOME",m_user_path) + "/"); //XDG_TEMPLATES_DIR will be used by right click menu. GlobalSettings::getInstance()->setValue(TEMPLATES_DIR,m_current_user_dir.value("XDG_TEMPLATES_DIR")); //fix non Chinese desktop enviroment templates empty issue, bug#42484 //FIXME need system integration process //Comment to Fix bug#142431, English install bug // QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); // QString templateDir = homePath + "/模板/"; // GlobalSettings::getInstance()->setValue(TEMPLATES_DIR, templateDir); settings->deleteLater(); } //rename the old paths to overwrire new one. void UserdirManager::moveFile() { QMap::const_iterator i; auto fileOpMgr = FileOperationManager::getInstance(); for(i=m_current_user_dir.constBegin();i!=m_current_user_dir.constEnd();++i) { if(i.value()!=m_last_user_dir.value(i.key())) { //rename the old dir QDir *dir = new QDir(i.value()); auto fileName = dir->dirName(); QDir *lastDir = new QDir(m_last_user_dir.value(i.key())); if(lastDir->dirName() == QString(m_user_path)||lastDir->isEmpty()||!lastDir->exists()) continue; auto operation = new Peony::FileRenameOperation("file://"+m_last_user_dir.value(i.key()),fileName); operation->setAutoOverwrite(); fileOpMgr->startOperation(operation,false); if(i.key() == "XDG_DESKTOP_DIR") { QTimer::singleShot(500,[=](){ //refresh desktop Q_EMIT desktopDirChanged(); }); } } } } peony/peony-qt-desktop/desktop-menu-plugin-manager.cpp0000664000175000017500000001562715154271106022115 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktop-menu-plugin-manager.h" #include "style-plugin-iface.h" #include "global-settings.h" #include #include #include #include #include #include #include "vfs-plugin-iface.h" #include "vfs-plugin-manager.h" #include "emblem-plugin-iface.h" #include "properties-window-tab-page-plugin-iface.h" #include "properties-window.h" #include "file-watcher.h" #include "file-utils.h" using namespace Peony; static DesktopMenuPluginManager *global_instance = nullptr; static bool m_is_loading = false; static bool isLoad = false; DesktopMenuPluginManager::DesktopMenuPluginManager(QObject *parent) : QObject(parent) { m_is_loading = true; EmblemProviderManager::getInstance(); } DesktopMenuPluginManager::~DesktopMenuPluginManager() { for (auto plugin : m_map) { delete plugin; } m_map.clear(); } void DesktopMenuPluginManager::loadAsync() { if (isLoad) { return; } isLoad = true; qDebug()<<"test start"; QStringList pluginPaths = FileUtils::getPluginInstallPaths(); auto thread = QThread::create([=]() { Q_FOREACH(QString pluginPath, pluginPaths) { QDir pluginsDir(pluginPath); // if (COMMERCIAL_VERSION) // pluginsDir = QDir("/usr/lib/peony-qt-extensions"); pluginsDir.setFilter(QDir::Files); qDebug()<moveToThread(qApp->thread()); // StylePluginIface *splugin = dynamic_cast(plugin); // if (splugin) { // QApplication::setStyle(splugin->getStyle()); // continue; // } auto p = dynamic_cast(plugin); if (p) { VFSPluginManager::getInstance()->registerPlugin(p); continue; } auto emblemsPlugin = dynamic_cast(plugin); if (emblemsPlugin){ EmblemProviderManager::getInstance()->registerProvider(emblemsPlugin->create()); continue; } MenuPluginInterface *piface = dynamic_cast(plugin); if (!piface) continue; qDebug()<<"ok:" <name(); if (!m_map.value(piface->name())) { m_map.insert(piface->name(), piface); m_nameMpa.insert(piface->name(), pluginLoader.fileName()); } m_is_loaded = true; } } Q_EMIT pluginLoadFinished(); }); thread->start(QThread::IdlePriority); Q_FOREACH(QString pluginPath, pluginPaths) { auto pluginsDirWatcher = new FileWatcher(QString("file://%1").arg(pluginPath), this, true); pluginsDirWatcher->connect(pluginsDirWatcher, &FileWatcher::fileCreated, this, [=](const QString &uri){ registerPlugin(uri); }); pluginsDirWatcher->connect(pluginsDirWatcher, &FileWatcher::fileRenamed, this, [=](const QString &oldUri, const QString &newUri){ Q_UNUSED(oldUri); registerPlugin(newUri); }); pluginsDirWatcher->startMonitor(); } } DesktopMenuPluginManager *DesktopMenuPluginManager::getInstance() { if (!global_instance) { if (!m_is_loading) { m_is_loading = true; global_instance = new DesktopMenuPluginManager; } } return global_instance; } const QStringList DesktopMenuPluginManager::getPluginIds() { return m_map.keys(); } MenuPluginInterface *DesktopMenuPluginManager::getPlugin(const QString &pluginId) { return m_map.value(pluginId); } QString DesktopMenuPluginManager::getPluginName(const QString &pluginId) { return m_nameMpa.value(pluginId); } void DesktopMenuPluginManager::registerPlugin(const QString &uri) { QUrl url = uri; QPluginLoader pluginLoader(url.path()); if ("libpeony-filesafe-menu-plugin.so" == url.fileName()) return; qDebug()<(plugin); if (p) { VFSPluginManager::getInstance()->registerPlugin(p); return; } auto emblemsPlugin = dynamic_cast(plugin); if (emblemsPlugin){ EmblemProviderManager::getInstance()->registerProvider(emblemsPlugin->create()); return; } MenuPluginInterface *piface = dynamic_cast(plugin); if (!piface) return; qDebug()<<"ok:" <name(); if (!m_map.value(piface->name())) { m_map.insert(piface->name(), piface); m_nameMpa.insert(piface->name(), pluginLoader.fileName()); } } QList DesktopMenuPluginManager::getPlugins() { return m_map.values(); } peony/peony-qt-desktop/desktop-icon-view.h0000664000175000017500000002211115154271070017574 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPICONVIEW_H #define DESKTOPICONVIEW_H #include #include "directory-view-plugin-iface.h" #include "peony-dbus-service.h" #include #include #include class QLabel; class QGSettings; namespace Peony { class DesktopItemModel; class DesktopItemProxyModel; class PeonyDbusService; class DesktopIconView : public QListView, public DirectoryViewIface { friend class DesktopWindow; friend class DesktopIndexWidget; friend class DesktopIconViewDelegate; friend class DesktopItemModel; Q_OBJECT public: enum ZoomLevel { Invalid, Small, //icon: 24x24; grid: 64x64; hover rect: 60x60; font: system*0.8 Normal, //icon: 48x48; grid: 96x96; hover rect = 90x90; font: system Large, //icon: 64x64; grid: 115x135; hover rect = 105x118; font: system*1.2 Huge //icon: 96x96; grid: 140x170; hover rect = 120x140; font: system*1.4 }; Q_ENUM(ZoomLevel) enum Direction { All, Right, Bottom }; Q_ENUM(Direction) explicit DesktopIconView(QWidget *parent = nullptr); ~DesktopIconView(); bool eventFilter(QObject *obj, QEvent *e); void initShoutCut(); void initMenu(); void initDoubleClick(); void openFileByUri(QString uri); void restoreItemsPosByMetaInfo(); void bindModel(FileItemModel *sourceModel, FileItemProxyFilterSortModel *proxyModel) { Q_UNUSED(sourceModel) Q_UNUSED(proxyModel) } void setProxy(DirectoryViewProxyIface *proxy) { Q_UNUSED(proxy) } const QString viewId() { return tr("Desktop Icon View"); } //location const QString getDirectoryUri() { return "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); } void setId(int id) ; //selections const QStringList getSelections(); //children const QStringList getAllFileUris(); const int getAllDisplayFileCount(); int getSortType(); int getSortOrder(); QRect visualRect(const QModelIndex &index) const; QPoint offset(); QRect getViewRect(); const QFont getViewItemFont(QStyleOptionViewItem *item); int updateBWList(); QString getBlackAndWhiteModel(); QSet getBWListInfo(); bool getBlackAndWhiteListExist(QString name); void setRestoreInfo(QString &uri, QPoint &itemPos); void setAllRestoreInfo(); void getAllRestoreInfo(); void clearAllRestoreInfo(); void refreshResolutionChange(); void saveExtendItemInfo(); void resetExtendItemInfo(); void clearItemRect(); bool isFull(); void clearExtendItemPos(bool saveId = false); void UpdateToEditUris(QStringList uris); QRect getDataRect(const QModelIndex &index); // only used in model refresh. void clearCache(); void modifyGridSize(); void initViewport(); bool verifyBoundaries(const QRect &rect, Direction direction); int radius() const; void setMarginsBasedOnPosition(int position, int margins); QRect visualRectInRightToLeft(const QModelIndex &index); QModelIndexList getSelectedIndexes(); bool isDraggingToExternal(); bool isDisable_paint(); private: QRect getScreenArea(QScreen* screen); bool execSharedFileLink(const QString uri); Q_SIGNALS: void zoomLevelChanged(ZoomLevel level); void updateView(); void resetGridSize(const QSize &size); public Q_SLOTS: //location void open(const QStringList &uris, bool newWindow) {} void setDirectoryUri(const QString &uri) {} void beginLocationChange() {} void stopLocationChange() {} void closeView(); //selections void setSelections(const QStringList &uris); void invertSelections(); void scrollToSelection(const QString &uri); //clipboard void setCutFiles(const QStringList &uris); DirectoryViewProxyIface *getProxy() { return nullptr; } void setSortType(int sortType); void setSortOrder(int sortOrder); //edit void editUri(const QString &uri); void editUris(const QStringList uris); void scrollTo(const QModelIndex &index, ScrollHint hint) override; //zoom void setDefaultZoomLevel(ZoomLevel level); ZoomLevel zoomLevel() const; void zoomIn(); void zoomOut(); void clearAllIndexWidgets(const QStringList &uris = QStringList()); void refresh(); void saveAllItemPosistionInfos(); /*! * \brief saveItemPositionInfo * \param uri * \deprecated */ void saveItemPositionInfo(const QString &uri); void resetAllItemPositionInfos(); /*! * \brief resetItemPosistionInfo * \param uri * \deprecated */ void resetItemPosistionInfo(const QString &uri); /*! * \brief updateItemPosistions * \param uri * \deprecated */ void updateItemPosistions(const QString &uri = nullptr); QPoint getFileMetaInfoPos(const QString &uri); void setFileMetaInfoPos(const QString &uri, const QPoint &pos); /*! * \brief getCurrentItemRects * \return * \details used in both view and model. before we add/remove an item to * model, we should know current items layout. */ QMap getCurrentItemRects(); int removeItemRect(const QString &uri); void updateItemPosByUri(const QString &uri, const QPoint &pos); void ensureItemPosByUri(const QString &uri); void setShowHidden(); /** * @brief Rearrange the desktop icon position * @param screenSize: The value of the screen size is the resolution minus the height of the control panel */ void resolutionChange(); void setEditFlag(bool edit); bool getEditFlag(); void fileCreated(const QString &uri); protected: int verticalOffset() const override; int horizontalOffset() const override; void mousePressEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent *event); void dragEnterEvent(QDragEnterEvent *e); void dragMoveEvent(QDragMoveEvent *e); void dropEvent(QDropEvent *e); void startDrag(Qt::DropActions supportedActions); void wheelEvent(QWheelEvent *e); void keyPressEvent(QKeyEvent *e); void keyReleaseEvent(QKeyEvent *e); void focusOutEvent(QFocusEvent *e); void resizeEvent(QResizeEvent *e); void rowsInserted(const QModelIndex &parent, int start, int end) override; void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; bool isItemsOverlapped(); bool isRenaming(); void setRenaming(bool renaming); const QRect getBoundingRect(); void relayoutExsitingItems(const QStringList &uris); void checkItemsOver(); bool dragToOtherScreen(QDropEvent *e); QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index, const QEvent *event) const override; bool event(QEvent *e) override; void dragLeaveEvent(QDragLeaveEvent *e) override; public: QModelIndex& lastIndex() { return m_last_index; } private: ZoomLevel m_zoom_level = Invalid; QMargins m_panel_margin; QModelIndex m_last_index; QTimer m_edit_trigger_timer; DesktopItemModel *m_model = nullptr; DesktopItemProxyModel *m_proxy_model = nullptr; QStringList m_new_files_to_be_selected; QStringList m_uris_to_edit;/* 新建文件/文件夹,可编辑文件名list */ QString m_edit_uri; /* 正在编辑的文件,信息更新不重置*/ // bool m_is_refreshing = false; bool m_real_do_edit = false; bool m_ctrl_or_shift_pressed = false; bool m_ctrl_key_pressed = false; bool m_show_hidden; bool m_is_renaming = false; bool m_is_edit = false; bool m_initialized = false; QTimer m_refresh_timer; QModelIndexList m_drag_indexes; QMap m_screens; PeonyDbusService *m_peonyDbusSer; QMap m_item_rect_hash; // remember items postions before resolution changed. QMap m_resolution_item_rect; QPoint m_press_pos; int m_id = 0; QStringList m_storageBox; int m_radius = 6; QGSettings *m_panelSetting = nullptr; bool m_noSelectOnPress = false; bool m_mouse_pressed = false; bool m_needs_update = false; bool m_is_dragging_to_external = false; QRegion m_drag_region; bool m_disable_paint = false; }; } #endif // DESKTOPICONVIEW_H peony/peony-qt-desktop/desktopbackground.cpp0000664000175000017500000002453415154271106020304 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktopbackground.h" #include "peony-desktop-application.h" #include #include #include #include #include #include #include #include #include #include #include #define BACKGROUND_SETTINGS "org.mate.background" DesktopBackground::DesktopBackground(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_TranslucentBackground); setAttribute(Qt::WA_X11NetWmWindowTypeDesktop); m_animation = new QVariantAnimation(this); m_animation->setDuration(1000); m_animation->setStartValue(qreal(0)); m_animation->setEndValue(qreal(1)); m_timeLine = new QTimeLine(200, this); connect(m_timeLine, &QTimeLine::finished, this, &DesktopBackground::updateScreens); connect(m_animation, &QVariantAnimation::valueChanged, this, QOverload<>::of(&QWidget::update)); connect(m_animation, &QVariantAnimation::finished, this, [=](){ m_backPixmap = m_frontPixmap; if (!m_pendingPixmap.isNull()) { m_frontPixmap = m_pendingPixmap; m_pendingPixmap = QPixmap(); m_animation->start(); } update(); }); initGSettings(); connectScreensChangement(); updateScreens(); } void DesktopBackground::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); if (!m_paintBackground) return; QPainter p(this); if (m_usePureColor) { p.fillRect(rect(), m_color); return; } p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); if (m_animation->state() == QVariantAnimation::Running) { qreal opacity = m_animation->currentValue().toReal(); for (auto screen : qApp->screens()) { p.drawPixmap(screen->geometry(), m_backPixmap, m_backPixmap.rect()); p.save(); p.setOpacity(opacity); p.drawPixmap(screen->geometry(), m_frontPixmap, m_frontPixmap.rect()); p.restore(); } } else { for (auto screen : qApp->screens()) { p.drawPixmap(screen->geometry(), m_backPixmap, m_backPixmap.rect()); } } } void DesktopBackground::updateScreens() { QRegion screensRegion; for (auto screen : qApp->screens()) { screensRegion += screen->geometry(); } move(0, 0); screensRegion += rect(); auto screensSize = screensRegion.boundingRect().size(); QSize size = this->size(); int maxWidth = qMax(size.width(), screensSize.width()); int maxHeight = qMax(size.height(), screensSize.height()); int maxLength = qMax(maxWidth, maxHeight); setFixedSize(maxLength, maxLength); update(); auto app = static_cast(qApp); Q_EMIT app->requestSetUKUIOutputEnable(true); } void DesktopBackground::initGSettings() { // if (QGSettings::isSchemaInstalled("org.ukui.style")) // { // //font monitor // QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); // connect(fontSetting, &QGSettings::changed, this, [=](const QString &key){ // qDebug() << "fontSetting changed:" << key; // if (key == "systemFont" || key == "systemFontSize") // { // QFont font = this->font(); // for(auto widget : qApp->allWidgets()) // widget->setFont(font); // } // }); // } } void DesktopBackground::initBackground() { if (QGSettings::isSchemaInstalled(BACKGROUND_SETTINGS)) { m_backgroundSettings = new QGSettings(BACKGROUND_SETTINGS, QByteArray(), this); } m_paintBackground = true; setBackground(); if (m_backgroundSettings) { connect(m_backgroundSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == "pictureFilename" || key == "primaryColor") { switchBackground(); } }); } } void DesktopBackground::setBackground() { QString defaultBg; auto accountBack = getAccountBackground(); if (accountBack != "" && QFile::exists(accountBack)) defaultBg = accountBack; //if default bg and account bg not exist, use color bg if (! QFile::exists(defaultBg)) { qWarning() << "default bg and account bg not exist"; switchBackground(); return; } m_frontPixmap = QPixmap(defaultBg); m_current_bg_path = defaultBg; if (defaultBg != accountBack) setAccountBackground(); m_animation->finished(); } void DesktopBackground::switchBackground() { if (!m_backgroundSettings) return; auto path = m_backgroundSettings->get("pictureFilename").toString(); if (! QFile::exists(path)) path = getAccountBackground(); if (path.isEmpty()) { m_usePureColor = true; auto colorName = m_backgroundSettings->get("primaryColor").toString(); m_color = QColor(colorName); m_animation->stop(); m_backPixmap = QPixmap(); m_frontPixmap = QPixmap(); m_current_bg_path = ""; update(); } else { m_usePureColor = false; auto colorName = m_backgroundSettings->get("primaryColor").toString(); m_color = QColor(colorName); if (m_animation->state() == QVariantAnimation::Running) { m_pendingPixmap = QPixmap(path); m_current_bg_path = path; } else { m_frontPixmap = QPixmap(path); if (m_backPixmap.isNull()) { m_backPixmap = m_frontPixmap; } m_animation->start(); m_current_bg_path = path; } } //if background picture changed, update it if (m_current_bg_path != getAccountBackground()) setAccountBackground(); } QString DesktopBackground::getAccountBackground() { uid_t uid = getuid(); QDBusInterface iface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts",QDBusConnection::systemBus()); QDBusReply userPath = iface.call("FindUserById", (qint64)uid); if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { QDBusInterface userIface("org.freedesktop.Accounts", userPath.value().path(), "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); QDBusReply backgroundReply = userIface.call("Get", "org.freedesktop.Accounts.User", "BackgroundFile"); if(backgroundReply.isValid()) return backgroundReply.value().variant().toString(); } return ""; } void DesktopBackground::setAccountBackground() { QDBusInterface * interface = new QDBusInterface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts", QDBusConnection::systemBus()); if (!interface->isValid()){ qCritical() << "Create /org/freedesktop/Accounts Client Interface Failed " << QDBusConnection::systemBus().lastError(); return; } QDBusReply reply = interface->call("FindUserByName", g_get_user_name()); QString userPath; if (reply.isValid()){ userPath = reply.value().path(); } else { qCritical() << "Call 'GetComputerInfo' Failed!" << reply.error().message(); return; } QDBusInterface * useriFace = new QDBusInterface("org.freedesktop.Accounts", userPath, "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); if (!useriFace->isValid()){ qCritical() << QString("Create %1 Client Interface Failed").arg(userPath) << QDBusConnection::systemBus().lastError(); return; } QDBusMessage msg = useriFace->call("SetBackgroundFile", m_current_bg_path); qDebug() << "setAccountBackground path:" <manufacturer()<<"changed"; m_timeLine->setCurrentTime(0); if (m_timeLine->state() == QTimeLine::NotRunning) { m_timeLine->start(); } }); QObject::connect(screen, &QScreen::destroyed, this, [=]{ m_timeLine->setCurrentTime(0); if (m_timeLine->state() == QTimeLine::NotRunning) { m_timeLine->start(); } }); } QObject::connect(qApp, &QApplication::screenAdded, this, [=](QScreen *screen){ qDebug()<manufacturer()<<"changed"; m_timeLine->setCurrentTime(0); if (m_timeLine->state() == QTimeLine::NotRunning) { m_timeLine->start(); } QObject::connect(screen, &QScreen::geometryChanged, this, [=](){ qDebug()<manufacturer()<<"changed"; m_timeLine->setCurrentTime(0); if (m_timeLine->state() == QTimeLine::NotRunning) { m_timeLine->start(); } }); QObject::connect(screen, &QScreen::destroyed, this, [=]{ m_timeLine->setCurrentTime(0); if (m_timeLine->state() == QTimeLine::NotRunning) { m_timeLine->start(); } }); }); } peony/peony-qt-desktop/qml-desktop/0000775000175000017500000000000015167662247016335 5ustar fengfengpeony/peony-qt-desktop/qml-desktop/DesktopView.qml0000664000175000017500000016640215167662247021325 0ustar fengfeng// Main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import org.ukui.desktop 1.0 import org.ukui.quick.items 1.0 as UKUIQuickItems import org.ukui.quick.platform 1.0 import "." as ComponentsManager Rectangle { id : window objectName: "rootRectangle" anchors.fill: parent property int number: Screen.serialNumber visible: true color: "transparent" LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft LayoutMirroring.childrenInherit: true property int spaceId: -1 property bool acceptDrop: true property bool isDraging: false property bool ismultifilemode: false property bool isBoxSelection: false property point pressPos: Qt.point(0, 0) property bool sorting: false property bool initDesktop: false property bool hasInitAnima: false signal dropRequest(var urls) signal addItem(); BackgroundItem { id: backgroundItem anchors.fill: parent backImagePath: backgroundManager.backImagePath frontImagePath: backgroundManager.frontImagePath backImageSourceSize: backgroundManager.backImageSourceSize frontImageSourceSize: backgroundManager.frontImageSourceSize backgroundOption: backgroundManager.backgroundOption usePureColor: backgroundManager.usePureColor bgColor: backgroundManager.color screenGeometry: Qt.rect(Screen.virtualX, Screen.virtualY, Screen.width, Screen.height) } Connections { target: Qt.application function onScreensChanged() {backgroundItem.handleSpanned()} } SelectionModel { id: selectionModel targetView: desktopIconView function onClearAllStatus() { desktopIconView.closeEdit() } } ShortcutManager { id: shortcutManager } function layoutchange(){ window.isDraging = false window.sorting = true // for (var i = 0; i < desktopIconView.count; i++) { // var item = desktopIconView.itemAt(i); // if (item) { // desktopIconView.addItemPosition(item.uri, item.pos.x, item.pos.y); // var tmpX = desktopIconView.transtogridposx(item.pos.x*desktopIconView.gridWidth,desktopIconView.gridWidth) // var tmpY = desktopIconView.transtogridposy(item.pos.y*desktopIconView.gridHeight,desktopIconView.gridHeight) // var tmp = Qt.point(tmpX, tmpY) // // note: 这里不直接设置item的x和y,避免behavior的过渡效果失效 // //item.x = desktopIconView.transtogridposx(item.pos.x*desktopIconView.gridWidth,desktopIconView.gridWidth) // //item.y = desktopIconView.transtogridposy(item.pos.y*desktopIconView.gridHeight,desktopIconView.gridHeight) // } // item.startSortanima() // var uri = item.uri // desktopIconView.preitemsPos[item.uri] = Qt.point(item.pos.x, item.pos.y) // } } ListModel { id: dragitemModel } Item { id: dragIconView //anchors.fill: parent visible: false width: bounds.width height: bounds.height clip: true // 启用裁剪 z: 100 // 动态计算边界 property rect bounds: calculateContentBounds() property real offsetToBoundsTopLeftX: 0 property real offsetToBoundsTopLeftY: 0 Drag.supportedActions:Qt.MoveAction Drag.dragType: Drag.Automatic Drag.onDragStarted: { console.log("item drag start") isDraging = true } Drag.onDragFinished: { console.log("item drag finish======") isDraging = false } function calculateContentBounds() { var minX = 0, minY = 0; var maxX = 0, maxY = 0; if (dragitemModel.count > 0) { minX = dragitemModel.get(0).x minY = dragitemModel.get(0).y } for (var i = 0; i < dragitemModel.count; i++) { var item = dragitemModel.get(i); minX = Math.min(minX, item.x); minY = Math.min(minY, item.y); maxX = Math.max(maxX, item.x); maxY = Math.max(maxY, item.y); console.log("minX, minY, maxX - minX, maxY - minY", minX, minY, maxX - minX, maxY - minY,item.x,item.y,dragitemModel.count) } return Qt.rect(minX, minY, maxX - minX + desktopIconView.gridWidth , maxY - minY + desktopIconView.gridHeight ); } Repeater { model: dragitemModel delegate: Rectangle { id: deleitem x: model.x - parent.bounds.x y: model.y - parent.bounds.y width: desktopIconView.gridWidth - 10 height: desktopIconView.gridHeight - 10 color: "transparent" DelegateIcon { id: dragviewIconRect width: controller.iconSize.width height: controller.iconSize.height icon : controller.icon(model.uri) emblems: model.emblems emblemSize: controller.emblemSize uri: model.uri } DelegateText { id: dragdelegateText anchors.horizontalCenter: dragviewIconRect.horizontalCenter anchors.top: dragviewIconRect.bottom display: model.display editing: false // 是否处于编辑状态 } } } } //绘制网格虚线辅助 可注释 // Repeater { // model: Math.ceil(parent.height / desktopIconView.gridHeight) // delegate: Rectangle { // width: parent.width // height: 1 // y: index * desktopIconView.gridHeight // color: "transparent" // border.color: Qt.rgba(0.5, 0.5, 0.5, 0.3) // border.width: 1 // layer.enabled: true // //layer.effect: DashLineEffect {} // 需要自定义DashLineEffect // } // } // // 垂直虚线 // Repeater { // model: Math.ceil(parent.width / desktopIconView.gridWidth) // delegate: Rectangle { // width: 1 // height: parent.height // x: index * desktopIconView.gridWidth // color: "transparent" // border.color: Qt.rgba(0.5, 0.5, 0.5, 0.3) // border.width: 1 // layer.enabled: true // //.effect: DashLineEffect {} // } // } Item { id: contentArea anchors.fill: parent anchors.topMargin: globalSettings.panelMarginTop anchors.rightMargin: window.LayoutMirroring.enabled? globalSettings.panelMarginLeft : globalSettings.panelMarginRight anchors.bottomMargin: globalSettings.panelMarginBottom anchors.leftMargin: window.LayoutMirroring.enabled? globalSettings.panelMarginRight : globalSettings.panelMarginLeft // 关键:留出边框宽度 property string searchBuffer: "" property Timer searchResetTimer: Timer { interval: 1000 // 输入间隔超过1秒则清空搜索缓冲 onTriggered: contentArea.searchBuffer = "" } // 添加一个专门的容器来设置图标与桌面边缘的内边距 Item { // iconContainer start id: iconContainer anchors.fill: parent anchors.leftMargin: 10 anchors.topMargin: 5 anchors.rightMargin: 10 anchors.bottomMargin: 5 // 拖拽插入指示线 Rectangle { id: dropIndicator visible: false width: desktopIconView.gridWidth height: 4 color: "white" z: -10 } Repeater { id: desktopIconView model: myProxyModel property int gridWidth: controller.gridSize.width property int gridHeight: controller.gridSize.height property int currentEditIndex: -1 // 当前编辑项的索引 property int initDataCount: 0 property int currentScreentId: model.id() property bool autoArrange: globalSettings.useAutoLayout() property bool menuVisible: false property bool hasMultipleFilesInMenu: false //property bool initDesktop: false property var resolutionItemPos: [] property var itemsPos: [] property var urilist: [] property point delegateGlobalPos property alias isMultifileMode: window.ismultifilemode function transtogridposx(x,width){ var centerX = x + width/2; // 计算最近网格索引 var gridX = Math.round(centerX /gridWidth); gridX = Math.abs(centerX -gridWidth*(gridX-0.5))= item.x && x <= item.x + desktopIconView.gridWidth && y >= item.y && y <= item.y + desktopIconView.gridHeight) { console.log("获取索引", i, item.uri) return i // 返回匹配的索引 } } return -1 // 未找到匹配项 } function onUpdateDropIndicator(pos) { console.log("current mouse pos:",pos.x, pos.y) var hoverIndex = desktopIconView.indexAt(pos.x, pos.y) console.log("hover index:",hoverIndex) for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item) { item.dragHovered = false; } } if (hoverIndex >= 0) { var hoverItem = desktopIconView.itemAt(hoverIndex) hoverItem.dragHovered = true } if (desktopIconView.autoArrange === false) { return } if (hoverIndex >= 0) { var hoverItem = desktopIconView.itemAt(hoverIndex) hoverItem.dragHovered = true var localPos = hoverItem.mapFromItem(desktopIconView, pos.x, pos.y) if (localPos.y < hoverItem.height * 0.3) { dropIndicator.y = hoverItem.y dropIndicator.visible = true } else if (localPos.y > hoverItem.height * 0.7) { dropIndicator.y = hoverItem.y + hoverItem.height dropIndicator.visible = true } else { dropIndicator.visible = false return } dropIndicator.x = hoverItem.x } else { dropIndicator.visible = false } } delegate: Rectangle { id: dele // 使用 Binding 元素确保位置绑定 Binding { target: dele property: "x" value: window.LayoutMirroring.enabled? (iconContainer.width - (pos.x + 1)*desktopIconView.gridWidth): pos.x*desktopIconView.gridWidth when: true } Binding { target: dele property: "y" value: pos.y * desktopIconView.gridHeight when: true } z: selected? parent.z + 1 : parent.z width: desktopIconView.gridWidth - 5 height: viewIconRect.height + delegateText.height > desktopIconView.gridHeight - 5 ? viewIconRect.height + delegateText.height + 10 : desktopIconView.gridHeight - 5 radius: themeStyle.radius color: selected && !delegateText.editing ? themeStyle.highlight() : hovered && !delegateText.editing ? themeStyle.midlight() : "transparent" focus: true activeFocusOnTab: true layer.samples: 4 // 抗锯齿 property string uri: model.uri property string display: model.display property point pos: model.position property bool selected: false property bool hovered: gridViewDelegateMouseArea.containsMouse && gridViewDelegateMouseArea.reallyContainsMouse || dragHovered property bool dragHovered: false property alias delegateText: delegateText // 将子项暴露为属性 property alias pressPos1: gridViewDelegateMouseArea.pressPos1 property point delegateGlobalPos property bool isFromDesktopView: true property int itemIndex: index property int dragx: x property int dragtox: x property int dragy: y property int dragtoy: y property alias animItem: anim property alias animyItem: animy property alias xBehaviorObject: xTransBehavior property alias yBehaviorObject: yTransBehavior property var decoration: model ? model.decoration : "" property var emblems: model ? model.emblems : "" function startSortanima() { //animaresort.start() //animaresorty.start() } function startinitanima() { //initanim.start() } ToolTip { id: delegateToolTip // 此处绑定方法会导致ukui主题tooltip概率性偏移,需要用其它方式实现 //text: visible? model.tooltip: "" visible: hovered && !dragHovered delay: 200 closePolicy: Popup.CloseOnPressOutside // 接管底层渲染组件,强制使用富文本解析 contentItem: Text { text: delegateToolTip.text textFormat: Text.RichText // 强制解析 HTML/CSS wrapMode: Text.WrapAnywhere // 换行 width: Math.min(implicitWidth, 400) // 最大宽度 400 // 保持系统默认的字体和颜色风格 font: delegateToolTip.font color: delegateToolTip.palette.toolTipText } // 动态更新tooltip内容 onAboutToShow: { text = model.tooltip } } ParallelAnimation { id: initAnimation XAnimator { target: dele from: x - desktopIconView.gridWidth to: x duration: 300 easing.type: Easing.Bezier easing.bezierCurve: [0.25, 0.1, 0.38, 1] } OpacityAnimator { target: dele //property: "opacity" from: 0.0 to: 1.0 duration: 300 easing.type: Easing.Bezier easing.bezierCurve: [0.25, 0.1, 0.38, 1] } } Connections { target: window function onInitDesktopChanged() { //快速启动时防抖 桌面进程启动时先不走动画流程 if(windowManager.getQuickStartAvailable()){ dele.opacity = 0 }else{ initAnimation.start() hasInitAnima = true } } } Connections{ target: windowManager function onStartInitAnimaRequest() { if(!hasInitAnima){ initAnimation.start() } } } // ParallelAnimation { // id: initanim // NumberAnimation { // target: dele // property: "x" // from: dele.x - desktopIconView.gridWidth // to: dele.x // duration: 300 // easing.type: Easing.Bezier // easing.bezierCurve: [0.25, 0.1, 0.38, 1] // } // NumberAnimation { // target: dele // property: "opacity" // from: 0.0 // to: 1.0 // duration: 300 // easing.type: Easing.Bezier // easing.bezierCurve: [0.25, 0.1, 0.38, 1] // onStopped: { // desktopIconView.initDataCount = desktopIconView.initDataCount + 1 // desktopIconView.initDesktop = desktopIconView.initDataCount === desktopIconView.model.count() ? true : false // } // } // } // Component.onCompleted: { // if (false === desktopIconView.initDesktop) { // //initanim.start() // } // desktopIconView.addItemPosition(model.uri, model.position.x, model.position.y) // } Behavior on x { enabled: initDesktop && !isDraging id: xTransBehavior NumberAnimation { easing.type: Easing.Bezier; easing.bezierCurve: [0.25, 0.1, 0.38, 1]; duration: 300 onFinished: { window.sorting = false } } } Behavior on y { enabled: initDesktop && !isDraging id: yTransBehavior NumberAnimation { easing.type: Easing.Bezier; easing.bezierCurve: [0.25, 0.1, 0.38, 1]; duration: 300 } } NumberAnimation { id: anim target: dele property: "x" from: dragx to: dragtox duration: 180 easing.type: Easing.Bezier easing.bezierCurve: [0.25, 0.1, 0.38, 1] // 标准缓入缓出贝塞尔曲线 // 也可以使用预设的缓入缓出类型 // easing.type: Easing.InOutQuad } NumberAnimation { id: animy target: dele property: "y" from: dragy to: dragtoy duration: 180 easing.type: Easing.Bezier easing.bezierCurve: [0.25, 0.1, 0.38, 1] // 标准缓入缓出贝塞尔曲线 // 也可以使用预设的缓入缓出类型 // easing.type: Easing.InOutQuad } // NumberAnimation { // id: animaresort // target: dele // property: "x" // from:desktopIconView.transtogridposx(desktopIconView.preitemsPos[dele.uri].x*dele.width,dele.width) // to: dele.x // duration: 300 // easing.type: Easing.Bezier // easing.bezierCurve: [0.25, 0.1, 0.38, 1] // 标准缓入缓出贝塞尔曲线 // // 也可以使用预设的缓入缓出类型 // // easing.type: Easing.InOutQuad // onFinished: { // addItemPosition(dele.uri, dele.x, dele.y) // } // } // NumberAnimation { // id: animaresorty // target: dele // property: "y" // from: desktopIconView.transtogridposy(desktopIconView.preitemsPos[dele.uri].y*dele.height,dele.height) // to: dele.y // duration: 300 // easing.type: Easing.Bezier // easing.bezierCurve: [0.25, 0.1, 0.38, 1] // 标准缓入缓出贝塞尔曲线 // // 也可以使用预设的缓入缓出类型 // // easing.type: Easing.InOutQuad // } DelegateIcon { id: viewIconRect width: controller.iconSize.width height: controller.iconSize.height icon : model.decoration emblems: model.emblems emblemSize: controller.emblemSize uri: model.uri } DelegateText { id: delegateText anchors.horizontalCenter: viewIconRect.horizontalCenter anchors.top: viewIconRect.bottom display: dele.display // 显示的文本内容 editing: desktopIconView.currentEditIndex === index && desktopIconView.currentEditIndex !== -1 // 控制是否进入编辑状态 showFullText: !ismultifilemode && !isBoxSelection && !(desktopIconView.menuVisible && desktopIconView.hasMultipleFilesInMenu) selected: parent.selected isDir: model.isDir isSoftLink: model.softLink maxVisibleHeight: { var globalY = dele.y + viewIconRect.height; var maxHeight = contentArea.height - globalY - 20 return Math.max(0, maxHeight) } } Connections { target: delegateText function onEditFinish(selections, newText) { selectionModel.clearSelection(); controller.rename(selections, newText) desktopIconView.currentEditIndex = -1 } } MouseArea { id: gridViewDelegateMouseArea z: 8 acceptedButtons: Qt.LeftButton | Qt.RightButton anchors.fill: parent propagateComposedEvents: true hoverEnabled: true property bool reallyContainsMouse: false property point pressPos1: Qt.point(0, 0) property point releasepos: Qt.point(0, 0) property bool doubleClickHandled: false property Timer editTriggerTimer: Timer { id: editTriggerTimer interval: 300 onTriggered: { //console.info("doubleClickHandled: " + gridViewDelegateMouseArea.doubleClickHandled + " selected: " + dele.selected) if (!gridViewDelegateMouseArea.doubleClickHandled && dele.selected) { controller.editUris(selectionModel.getSelections()); } } } onEntered: { reallyContainsMouse = false } onExited: { reallyContainsMouse = false } onPositionChanged: { reallyContainsMouse = true } onPressed: (mouse) => { delegateToolTip.hide() doubleClickHandled = false console.log("mouse onPressed on delegate, boxselection:",isBoxSelection,dele.selected); controller.setClickedScreenId(desktopIconView.currentScreentId) if (mouseX < 0 || mouseX > width || mouseY < 0 || mouseY > height) { mouse.accepted = false return; } // Check mouse click permission if (mouse.button === Qt.LeftButton && !ManagerControl.checkMouseClickPermission(dele.uri, false)) { console.log("Left click disabled for item:", dele.uri); mouse.accepted = false; return; } var shiftKeyPressed = mouse.modifiers & Qt.ShiftModifier; var controlKeyPressed = mouse.modifiers & Qt.ControlModifier; if ( shiftKeyPressed || controlKeyPressed || (isBoxSelection && dele.selected)) { console.log("Ctrl or shift key is pressed!"); ismultifilemode = true if (shiftKeyPressed) { var startIndex = selectionModel.firstIndex(); selectionModel.selectBetween(startIndex, index) } } console.log("mouse onPressed ismultifilemode",ismultifilemode); if (mouse.button === Qt.RightButton) { // Check right-click menu permission if (!ManagerControl.checkRightMenuPermission(dele.uri)) { console.log("Right menu disabled for item:", dele.uri); mouse.accepted = false; return; } if (!ismultifilemode) { selectionModel.clearSelection() } desktopIconView.menuVisible = true; var globalPos = mapToGlobal(mouse.x, mouse.y); selectionModel.updateSelection(index, true) var selections = selectionModel.getSelections(); desktopIconView.hasMultipleFilesInMenu = selections.length > 1 ? true : false console.log("open menu", globalPos, selections, mouse.x, mouse.y) Qt.callLater(() => controller.showMenu(selections, globalPos)) mouse.accepted = true // 阻止事件继续传递 return } controller.closeMenu() console.log("closeMenu........") if (!ismultifilemode) { if (delegateText.editing) { console.log("editing........") mouse.accepted = false return } desktopIconView.closeEdit() if (dele.selected) { editTriggerTimer.start() } else { selectionModel.clearSelection() } } pressPos1 = Qt.point(mouseX, mouseY) var realBounds = dragIconView.calculateContentBounds() dragIconView.offsetToBoundsTopLeftX = dele.x dragIconView.offsetToBoundsTopLeftY = dele.y if (controlKeyPressed && dele.selected) { dele.selected = false; } else { selectionModel.updateSelection(index, true) } desktopIconView.menuVisible = false; } onReleased: { console.log("mouse released"); isBoxSelection = false; var shiftKeyPressed = mouse.modifiers & Qt.ShiftModifier; var controlKeyPressed = mouse.modifiers & Qt.ControlModifier; if (!(shiftKeyPressed || controlKeyPressed) && desktopIconView.currentEditIndex === -1 && !doubleClickHandled) { ismultifilemode = false if (!desktopIconView.menuVisible) { selectionModel.selectCurrent(index) } } } onClicked: { console.log("mouse onClicked"); mouse.accepted = true } onDoubleClicked: { // Check double-click permission if (!ManagerControl.checkMouseClickPermission(dele.uri, true)) { console.log("Double click disabled for item:", dele.uri); mouse.accepted = false; return; } doubleClickHandled = true editTriggerTimer.stop() var item = desktopIconView.itemAt(index) controller.openFileByUri(item.uri); console.log("on double clicked", item.uri) mouse.accepted = true selectionModel.clearSelection() } drag.target: dragIconView drag.onActiveChanged: { console.log("mouse area drag active", drag.active) if (drag.active) { desktopIconView.closeEdit() // hotspot的计算要在bounds更新之后 dragIconView.Drag.source = dele dele.delegateGlobalPos = mapToItem(desktopIconView, 0, 0) dragIconView.Drag.mimeData = { "text/uri-list": selectionModel.getSelections() .map(uri => uri.trim()) // 去除每个URI两端的空格 .filter(uri => uri !== "") // 过滤空URI .join("\r\n"), "peony-qt/encoded-uris": selectionModel.getSelections() .filter(uri => uri.trim() !== "") .join(" "), "peony-qt/pos-list": selectionModel.getSelectionsPositions() .map(point => `${point.x},${point.y}`) // 将QPoint转为"x,y"格式 .join(" "), // 用空格分隔多个坐标 "text/ukui_desktop": true, "text/plain":selectionModel.getSelections() .map(uri => uri.trim()) // 去除每个URI两端的空格 .filter(uri => uri !== "").join(" "), "application/x-qabstractitemmodeldatalist": selectionModel.getSelections() .map(uri => uri.trim()) .filter(uri => uri !== "") .map(uri => ({ "0": { "text/uri-list": uri } })) .join(","), "peony-qt/iconContainerWidth": iconContainer.width }; // grabToImage不会立即返回所以在回调中处理 var items = selectionModel.getSelectedItems() dragitemModel.clear() for(var i = 0;i < items.length; i++){ dragitemModel.append(items[i]) } // 设置hotSpot为鼠标在按下相对于选中(bounds)左上角区域的位置 dragIconView.Drag.hotSpot.x = gridViewDelegateMouseArea.pressPos1.x + dragIconView.offsetToBoundsTopLeftX - dragIconView.bounds.x dragIconView.Drag.hotSpot.y = gridViewDelegateMouseArea.pressPos1.y + dragIconView.offsetToBoundsTopLeftY - dragIconView.bounds.y dragIconView.grabToImage(function(result) { dragIconView.Drag.imageSource = result.url dragIconView.Drag.active = true }) } else { dragIconView.Drag.active = false dragIconView.x = 0 dragIconView.y = 0 pressPos1 = Qt.point(0, 0) dragIconView.offsetToBoundsTopLeftX = 0 dragIconView.offsetToBoundsTopLeftY = 0 console.log("更新当前视图") desktopIconView.model.invalidateModel() } } } } Component.onCompleted: { // 监听变化 globalSettings.onValueChanged.connect(function(key, value) { console.log("Setting changed:", key, "=", value) if (key === "desktopUseAutoLayout") { autoArrange = globalSettings.useAutoLayout(); } }) } } } // iconContainer end //框选矩形 Rectangle { id: selectionRect visible: false color: "lightblue" opacity: 0.3 border.color: "blue" border.width: 1 z: 999 } // 框选功能的 MouseArea MouseArea { anchors.fill: parent z:-1 // 初始化选择框 acceptedButtons: Qt.LeftButton | Qt.RightButton // 明确接受右键 onPressed: (mouse) => { console.log("mouse onPressed on desktop area"); controller.setClickedScreenId(desktopIconView.currentScreentId) var shiftKeyPressed = mouse.modifiers & Qt.ShiftModifier; var controlKeyPressed = mouse.modifiers & Qt.ControlModifier; if (shiftKeyPressed || controlKeyPressed) { console.log("Ctrl or Shift key is pressed!"); ismultifilemode = true } else { var index = desktopIconView.indexAt(mouseX, mouseY) var item = desktopIconView.itemAt(index) if (item) { if (!(mouseX >= item.x && mouseX <= item.x + item.width && mouseY >= item.y && mouseY <= item.y + item.height)) { index = -1 } } if (index === -1) { selectionModel.clearSelection(); } } console.log("drop to current index:", index) if (mouse.button === Qt.LeftButton) { pressPos = Qt.point(mouseX, mouseY) selectionRect.x = mouseX selectionRect.y = mouseY selectionRect.width = 0 selectionRect.height = 0 selectionRect.visible = true desktopIconView.closeEdit() controller.closeMenu() } /*else if (mouse.button === Qt.RightButton) { selectionRect.visible = false selectionRect.width = 0 selectionRect.height = 0 var pos = mapToGlobal(mouse.x, mouse.y) var selections = selectionModel.getSelections(); controller.showMenu(selections, pos) mouse.accepted = true }*/ } onClicked: { console.log("mouse onClicked on desktop area"); if (mouse.button === Qt.RightButton) { desktopIconView.closeEdit() if (selectionRect.width == 0 || selectionRect.height == 0) { selectionModel.clearSelection() } var i = desktopIconView.indexAt(mouse.x, mouse.y) if (i !== -1) { selectionModel.updateSelection(i, true) } // Check right-click menu permission var selections = selectionModel.getSelections(); if (selections.length === 0) { // Desktop background right-click if (!ManagerControl.checkBackgroundMenuPermission()) { console.log("Background menu disabled by management control"); mouse.accepted = false; return; } } else { // Desktop file right-click - check each selected item for (var j = 0; j < selections.length; j++) { if (!ManagerControl.checkRightMenuPermission(selections[j])) { console.log("Right menu disabled for item:", selections[j]); mouse.accepted = false; return; } } } pressPos = Qt.point(-1, -1) selectionRect.visible = false selectionRect.width = 0 selectionRect.height = 0 desktopIconView.menuVisible = true; var pos = mapToGlobal(mouse.x, mouse.y) var selections = selectionModel.getSelections(); desktopIconView.hasMultipleFilesInMenu = selections.length > 1 ? true : false Qt.callLater(() => controller.showMenu(selections, pos)) isBoxSelection = false; mouse.accepted = true return } } // 实时更新选择框尺寸 onPositionChanged: { console.log("mouse onPositionChanged on desktop area"); desktopIconView.menuVisible = false; if (mouse.button === Qt.RightButton) { desktopIconView.closeEdit() isBoxSelection = false; pressPos = Qt.point(-1, -1) selectionRect.visible = false selectionRect.width = 0 selectionRect.height = 0 mouse.accepted = true return } if (pressPos.x === -1 && pressPos.y === -1) { mouse.accepted = true return } const newX = Math.min(mouseX, pressPos.x) const newY = Math.min(mouseY, pressPos.y) const newWidth = Math.abs(mouseX - pressPos.x) const newHeight = Math.abs(mouseY - pressPos.y) selectionRect.x = newX selectionRect.y = newY selectionRect.width = newWidth selectionRect.height = newHeight for (var i = 0; i < desktopIconView.count; i++) { const item = desktopIconView.itemAt(i) if (item && item.visible) { const itemRect = Qt.rect(item.x + iconContainer.anchors.leftMargin, item.y + iconContainer.anchors.topMargin, item.width,item.height) // 检测相交 var tmpSelectionRect = Qt.rect(selectionRect.x, selectionRect.y, selectionRect.width, selectionRect.height); const isSelected = rectanglesIntersect(itemRect, tmpSelectionRect) item.selected = isSelected if (isSelected) isBoxSelection = true selectionModel.updateSelection(i, isSelected) } } } function rectanglesIntersect(rectA, rectB) { return (rectA.x < rectB.x + rectB.width && rectA.x + rectA.width > rectB.x && rectA.y < rectB.y + rectB.height && rectA.y + rectA.height > rectB.y) } // 鼠标释放时校验选中项 onReleased: { console.log("mouse onReleased on desktop area"); desktopIconView.menuVisible = false; if (mouse.button === Qt.RightButton) { desktopIconView.closeEdit() selectionRect.visible = false selectionRect.width = 0 selectionRect.height = 0 pressPos = Qt.point(-1, -1) mouse.accepted = true return } // 遍历所有Repeater项 if (selectionRect.width == 0 || selectionRect.height == 0) { isBoxSelection = false; return } for (var i = 0; i < desktopIconView.count; i++) { const item = desktopIconView.itemAt(i) if (item && item.visible) { const itemRect = Qt.rect(item.x + iconContainer.anchors.leftMargin, item.y + iconContainer.anchors.topMargin, item.width,item.height) // 检测相交 var tmpSelectionRect = Qt.rect(selectionRect.x, selectionRect.y, selectionRect.width, selectionRect.height); const isSelected = rectanglesIntersect(itemRect, tmpSelectionRect) if (isSelected) isBoxSelection = true item.selected = isSelected || (ismultifilemode && item.selected) selectionModel.updateSelection(i, item.selected) } } selectionRect.visible = false selectionRect.width = 0 selectionRect.height = 0 } } DropArea { anchors.fill: parent visible: true onEntered: { var hasUriList = drag.formats.indexOf("text/uri-list") >= 0; var hasUrl = drag.formats.indexOf("url") >= 0; if (!acceptDrop || (!hasUriList && !hasUrl)) { drag.accepted = false; // 拒绝非 URI 类型或指定格式的数据 return; } } onExited: { dropIndicator.visible = false; } onPositionChanged: (mouse) => { drag.acceptedAction = (drag.modifiers & Qt.ControlModifier) ? Qt.CopyAction : Qt.MoveAction; var currentPos = Qt.point(mouse.x, mouse.y) desktopIconView.onUpdateDropIndicator(currentPos) } onDropped: { // 1. 解析拖拽文件路径 var srcUris = [] // 优先尝试读取peony自定义格式 var peonyUriData = drop.getDataAsString("peony-qt/encoded-uris") if (peonyUriData && peonyUriData.length > 0) { var uris = peonyUriData.split(" ") for (var i = 0; i < uris.length; i++) { if (!uris[i].startsWith("recent://")) { srcUris.push(uris[i]) } } } else { // 回退到标准uri-list格式 var uriString = drop.getDataAsString("text/uri-list"); var uris = uriString.split(/\r?\n/) .map(uri => uri.trim()) .filter(uri => uri !== ""); // 尝试从url格式获取单个文件路径 if (uris.length === 0) { var appUrl = drop.getDataAsString("url") if (appUrl && appUrl.length > 0) { uris = [appUrl] } } } var y = drop.y if (dropIndicator.visible && y < dropIndicator.y) { y = y + desktopIconView.gridHeight } var index = desktopIconView.indexAt(drop.x, y) console.log("drop to current index:", index) if (!(drag.source && drag.source.isFromDesktopView)) { console.log("其他应用拖拽", uris, desktopIconView.count) dropIndicator.visible = false var peonyIsSearch = drop.getDataAsString("peony-qt/is-search") desktopIconView.model.addFile(uris, drop.proposedAction, index, peonyIsSearch); return; } // 2. 计算热区点的全局坐标(delegate初始位置 + 热区偏移) var hotspotGlobalX = drop.source.delegateGlobalPos.x + drop.source.pressPos1.x var hotspotGlobalY = drop.source.delegateGlobalPos.y + drop.source.pressPos1.y // 3. 计算释放点相对于热区的偏移(网格单位) var viewlocalePos = Qt.point(drop.x - iconContainer.anchors.leftMargin, drop.y - iconContainer.anchors.topMargin); var localeXInLayout = LayoutMirroring.enabled? iconContainer.width - viewlocalePos.x : viewlocalePos.x var sourceXInLayout = hotspotGlobalX var iconContainerWidth = iconContainer.width; if (LayoutMirroring.enabled) { iconContainerWidth = drop.getDataAsString("peony-qt/iconContainerWidth"); if (iconContainerWidth) { iconContainerWidth = parseInt(iconContainerWidth); sourceXInLayout = iconContainerWidth - hotspotGlobalX } } var offGridX = Math.floor(localeXInLayout / desktopIconView.gridWidth) - Math.floor(sourceXInLayout / desktopIconView.gridWidth); var offGridY = Math.floor(viewlocalePos.y / desktopIconView.gridHeight) - Math.floor(hotspotGlobalY / desktopIconView.gridHeight); console.log("drop parameter", drop.x, drop.y, localeXInLayout,sourceXInLayout, offGridX, offGridY,drop.source.delegateGlobalPos,drop.source.pressPos1) console.log("drop parameter1", dragIconView.Drag.hotSpot.x,dragIconView.Drag.hotSpot.y, viewlocalePos,hotspotGlobalX, hotspotGlobalY) var dragSource = drag.source if (drag.source && drag.source.isFromDesktopView) { var onItem = globalSettings.useAutoLayout() && -1 !== index? !dropIndicator.visible : -1 !== index dropIndicator.visible = false // drop事件从c++更新图标网格时,需要屏蔽x和y默认的behavior,使用拖拽动效 window.isDraging = true desktopIconView.model.updateIconPositions(uris, drop.proposedAction, index, Qt.point(offGridX, offGridY), onItem); window.isDraging = false } var offx = viewlocalePos.x - hotspotGlobalX; var offy = viewlocalePos.y - hotspotGlobalY; var posString = drop.getDataAsString("peony-qt/pos-list"); var points = posString.split(" ") .map(pointStr => { var xy = pointStr.split(","); return xy.length === 2 ? Qt.point(parseInt(xy[0]), parseInt(xy[1])) : null; }) .filter(point => point !== null); points.forEach((pt, index) => { console.log(`Item ${index}: (${pt.x}, ${pt.y})`); }); for (var i = 0; i < desktopIconView.count; i++) { const item = desktopIconView.itemAt(i) if (!(item && item.visible)) { continue; } item.dragHovered = false; if (uris.includes(item.uri)) { var j = uris.indexOf(item.uri) if (j === -1) { continue } item.visible = false var tmpDragX = points[j].x*desktopIconView.gridWidth + offx item.dragx = LayoutMirroring.enabled? (iconContainerWidth - tmpDragX - desktopIconView.gridWidth + offx*2): tmpDragX item.dragy= points[j].y*desktopIconView.gridHeight + offy console.log("anim start pos", j, item.dragx, item.dragy, offx, offy, item.x, item.y) var gridposx = desktopIconView.transtogridposx(item.pos.x*desktopIconView.gridWidth,desktopIconView.gridWidth) var gridposy = desktopIconView.transtogridposy(item.pos.y*desktopIconView.gridHeight,desktopIconView.gridHeight) item.dragtox = LayoutMirroring.enabled? (iconContainer.width - gridposx - desktopIconView.gridWidth): gridposx item.dragtoy = gridposy console.log("anim end pos", item.dragtox, item.dragtoy) item.animItem.start() item.animyItem.start() item.visible = true } } drop.source.pressPos1.x = 0 drop.source.pressPos1.y = 0 selectionModel.clearSelection(); } } Connections { target: myProxyModel function onViewUpdated() { if (!initDesktop) { initDesktop = true } } } Connections{ target: myProxyModel function onLayoutUpdate() { console.log("model layout updated") layoutchange() } } Connections{ target: controller function onClickedScreenIdChanged(screenId) { if (screenId !== desktopIconView.currentScreentId) { selectionModel.clearSelection(); } console.log("Click on screen", screenId); } function onEdit (uri) { for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item && item.uri === uri && item.delegateText) { console.log("Editing item at index:", i); desktopIconView.currentEditIndex = i; item.delegateText.selectedUris = selectionModel.getSelections(); if (!item.delegateText.selectedUris.includes(uri)) { item.delegateText.selectedUris.push(uri) } item.delegateText.forceActiveFocus(); } } } function onChangeOpacity(opacity) { for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item) { if (item.selected) { item.opacity = opacity } else { item.opacity = 1 } } } } function onSelectedUrisChanged (uriList) { for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item) { if (uriList.includes(item.uri)) { selectionModel.updateSelection(i, true) } else { selectionModel.updateSelection(i, false) } } } } } function selectFirstItemStartingWith(prefix) { for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item && item.display && item.display.toLowerCase().startsWith(prefix)) { selectionModel.selectCurrent(i); // 选中该项 return; } } } Keys.onPressed: (event) => { var itemIndex switch(event.key) { case Qt.Key_Home: selectionModel.selectHome(); event.accepted = true; break; case Qt.Key_End: selectionModel.selectEnd(); event.accepted = true; break; case Qt.Key_Up: selectionModel.selectPrevious(); event.accepted = true; break; case Qt.Key_Down: selectionModel.selectNext(); event.accepted = true; break; case Qt.Key_Left: selectionModel.selectLeft(); event.accepted = true; break; case Qt.Key_Right: selectionModel.selectRight(); event.accepted = true; break; case Qt.Key_Enter: case Qt.Key_Return: var uris = selectionModel.getSelections() controller.openFileByUri(uris); event.accepted = true; break; default: if (event.text.length > 0) { var letter = event.text; // 获取输入的字母 searchBuffer += letter.toLowerCase(); searchResetTimer.start(); // 启动计时器,超时后清空 buffer selectFirstItemStartingWith(searchBuffer); event.accepted = true; } } } } } peony/peony-qt-desktop/qml-desktop/BackgroundItem.qml0000664000175000017500000001125215154271106021731 0ustar fengfengimport QtQuick 2.15 Item { id: root //外部属性 property string frontImagePath: "" property string backImagePath: "" property size frontImageSourceSize: Qt.size(0, 0) property size backImageSourceSize: Qt.size(0, 0) property string backgroundOption: "scaled" property bool usePureColor: false property string bgColor: "black" property rect screenGeometry: Qt.rect(0, 0, 0, 0) //内部属性 property real animationDuration: 1000 property rect sourceRect: Qt.rect(0, 0, 0, 0) ParallelAnimation { id: animation NumberAnimation { target: backImage property: "opacity" from: 1 to: 0 duration: animationDuration easing.type: Easing.InOutQuad } NumberAnimation { target: frontImage property: "opacity" from: 0 to: 1 duration: animationDuration easing.type: Easing.InOutQuad } } Image { id: backImage anchors.fill: parent source: backImagePath sourceSize: backImageSourceSize fillMode: getFillMode(backgroundOption) opacity: 0 visible: !root.usePureColor } Image { id: frontImage anchors.fill: parent source: frontImagePath sourceSize: frontImageSourceSize fillMode: getFillMode(backgroundOption) opacity: 1 visible: !root.usePureColor } Rectangle { id: colorBackground anchors.fill: parent color: root.bgColor visible: root.usePureColor } Connections { target: backgroundManager function onForceUpdated() { backImage.cache = false frontImage.cache = false backImage.cache = true frontImage.cache = true } } //获取填充模式 function getFillMode(option) { switch(option.toLowerCase()) { case "stretched": return Image.Stretch; case "scaled": return Image.PreserveAspectCrop; case "centered": return Image.Pad; case "wallpaper": return Image.Tile; case "zoom": return Image.PreserveAspectFit; case "spanned": return handleSpanned(); default: return Image.PreserveAspectCrop; } } //处理跨区 function handleSpanned() { if (backgroundOption != "spanned") return Image.Stretch var rect = backgroundManager.calculateSpannedSourceRect(screenGeometry, frontImagePath) backImage.sourceClipRect = rect frontImage.sourceClipRect = rect console.log("handleSpanned rect", rect) return Image.Stretch } //更新对齐 function updateImageAlignment() { if (backgroundOption == "wallpaper") { backImage.horizontalAlignment = Image.AlignLeft backImage.verticalAlignment = Image.AlignTop frontImage.horizontalAlignment = Image.AlignLeft frontImage.verticalAlignment = Image.AlignTop } else { backImage.horizontalAlignment = Image.AlignHCenter backImage.verticalAlignment = Image.AlignVCenter frontImage.horizontalAlignment = Image.AlignHCenter frontImage.verticalAlignment = Image.AlignVCenter } } //更换纯色显示 function updateBackground() { if (usePureColor) { backImage.visible = false frontImage.visible = false colorBackground.visible = true } else { backImage.visible = true frontImage.visible = true colorBackground.visible = false } } //清除切换跨区后sourceClipRect属性 function updateImageSourceClipRect() { if (backgroundOption != "spanned") { backImage.sourceClipRect = undefined frontImage.sourceClipRect = undefined } } onFrontImagePathChanged: { console.log("onFrontImagePathChanged", backImage.status, frontImage.status) if (backImage.status == Image.Ready && frontImage.status == Image.Ready) { animation.restart() } updateImageAlignment() } onScreenGeometryChanged: { handleSpanned() } Component.onCompleted: { updateBackground() } onUsePureColorChanged: { updateBackground() } onBackgroundOptionChanged: { console.log("onBackgroundOptionChanged", backgroundOption) frontImage.fillMode = getFillMode(backgroundOption) backImage.fillMode = getFillMode(backgroundOption) updateImageAlignment() updateImageSourceClipRect() } } peony/peony-qt-desktop/qml-desktop/EventBus.qml0000664000175000017500000000062215154271070020565 0ustar fengfeng// EventBus.qml pragma Singleton // 声明为单例 import QtQuick 2.15 QtObject { property int currentScreenId: 0 // 定义一个信号 signal focusChanged(int screenId) // 触发信号的函数 function setCurrentScreenId(screenId) { if (currentScreenId !== screenId) { currentScreenId = screenId focusChanged(currentScreenId) } } } peony/peony-qt-desktop/qml-desktop/SelectionModel.qml0000664000175000017500000002252015154271106021741 0ustar fengfengimport QtQuick 2.0 QtObject { property var selectedItems: [] property var targetView: null signal clearAllStatus() function getSelectionCount() { var count = 0 for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i) if (item && item.selected) { count++ } } return count } function getSelectedItems() { getSelections() return selectedItems } function gridPosLesserThan(leftPos, rightPos) { if (leftPos.x < rightPos.x) return true; if (leftPos.x > rightPos.x) return false; if (leftPos.y < rightPos.y) return true; return false; } // 全选函数 function selectAll() { targetView.isMultifileMode = true for (var i = 0; i < targetView.count; i++) { updateSelection(i, true) } } // 反选函数 function invertSelections() { targetView.isMultifileMode = true selectedItems = []; for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (!item) return; // 更新选中状态 item.selected = !item.selected; if (item.selected) { // 如果未包含则添加(避免重复) if (selectedItems.indexOf(item) === -1) { selectedItems.push(item); } } } } function getSelections() { var uriList = [] selectedItems = [] for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i) if (!item) return if (item.selected) { selectedItems.push(item) uriList.push(item.uri) } } console.log("get selected uris", uriList) return uriList } function getSelectionsPositions() { if (selectedItems.length <= 0) return var posList = [] selectedItems = [] for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i) if (!item) return if (item.selected) { console.log("处理选中项:", item.pos) selectedItems.push(item) posList.push(item.pos) } } console.log("get selected pos", posList) return posList } // 清空选中状态 function clearSelection() { if (selectedItems.length <= 0) return for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (item) { item.selected = false; } } selectedItems = []; clearAllStatus(); } // 更新选中状态 function updateSelection(index, selected) { var item = targetView.itemAt(index); if (!item) return; // 更新选中状态 item.selected = selected; // 更新选中项数组 if (selected) { // 如果未包含则添加(避免重复) if (selectedItems.indexOf(item) === -1) { selectedItems.push(item); } } else { // ✅ 找到 item 在 selectedItems 中的位置再删除 const selectedIndex = selectedItems.indexOf(item); if (selectedIndex !== -1) { selectedItems.splice(selectedIndex, 1); } } } // 仅仅选中当前项 function selectCurrent(index) { if (index < 0 || targetView.count === 0) { return } var item = targetView.itemAt(index); if (!item) return; clearSelection() // 更新选中状态 item.selected = true; selectedItems.push(item); console.log("select current uri:", item.uri,item.selected) } function selectHome() { if (targetView.count === 0) return var homePos = Qt.point(0, 0); var homeIndex = -1; for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (item) { if (!gridPosLesserThan(homePos, item.pos)) { homeIndex = item.itemIndex; homePos = item.pos; } } } console.log("select home:", homePos) selectCurrent(homeIndex) } function selectEnd() { if (targetView.count === 0) return var endPos = Qt.point(-1,-1); var endIndex = -1; for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (item) { if (gridPosLesserThan(endPos, item.pos)) { endIndex = item.itemIndex; endPos = item.pos; } } } console.log("select end:", endPos) selectCurrent(endIndex) } function selectPrevious() { var index = selectionModel.firstIndex(); if (index < 0) { selectCurrent(0); return } var item = targetView.itemAt(index); if (!item) return; if (selectedItems.length <= 0) { selectCurrent(0); } else { var y = item.pos.y - 1; var upIndex = indexByPos(item.pos.x, y) selectCurrent(upIndex) } } function selectNext() { var index = selectionModel.firstIndex(); if (index < 0) { selectCurrent(0); return } var item = targetView.itemAt(index); if (!item) return; if (selectedItems.length <= 0) { selectCurrent(0); } else { var y = item.pos.y + 1; var nextIndex = indexByPos(item.pos.x, y) selectCurrent(nextIndex) } } function selectLeft() { var index = selectionModel.firstIndex(); if (index < 0) { selectCurrent(0); return } var item = targetView.itemAt(index); if (!item) return; if (selectedItems.length <= 0) { selectCurrent(0); } else { var x = item.pos.x - 1; var LeftIndex = indexByPos(x, item.pos.y) selectCurrent(LeftIndex) } } function selectRight() { var index = selectionModel.firstIndex(); if (index < 0) { selectCurrent(0); return } var item = targetView.itemAt(index); if (!item) return; if (selectedItems.length <= 0) { selectCurrent(0); } else { var x = item.pos.x + 1; var rightIndex = indexByPos(x, item.pos.y) selectCurrent(rightIndex) } } //选中两个项之间的所有项 function selectBetween(startIndex, endIndex) { var startItem = targetView.itemAt(startIndex); var endItem = targetView.itemAt(endIndex); if (startItem && endItem) { selectedItems = [startItem] var startPos = startItem.pos var endPos = endItem.pos if (!gridPosLesserThan(startPos, endPos)) { let tmp = endPos endPos = startPos startPos = tmp } var startCol = startPos.x var endCol = endPos.x var startRow = startPos.y var endRow = endPos.y console.log("start pos and end pos when shift is pressed :", startCol, endCol, startRow, endRow); for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (item) { var isSelected = (item.pos.x > startCol && item.pos.x < endCol) || (endCol === startCol && item.pos.x === startCol && item.pos.y >= startRow && item.pos.y <= endRow) || ((startCol !== endCol) && ((item.pos.x === startCol && item.pos.y >= startRow) || (item.pos.x === endCol && item.pos.y <= endRow))) if (isSelected) { // 如果未包含则添加(避免重复) if (selectedItems.indexOf(item) === -1) { selectedItems.push(item); } } // 更新选中状态 item.selected = isSelected; } } } } function firstIndex() { if (selectedItems.length === 0) return -1; // 方法1:直接取第一个元素 const firstItem = selectedItems[0]; if (firstItem) { var viewItem = targetView.itemAt(firstItem.itemIndex) if (firstItem.uri === viewItem.uri) { console.log("First item index:", firstItem.itemIndex, firstItem.pos); return firstItem.itemIndex; } else { selectedItems = [] } } return -1; } function indexByPos(x, y) { for (var i = 0; i < targetView.count; i++) { var item = targetView.itemAt(i); if (item && item.pos.x === x && item.pos.y === y) { return i; } } return -1; } } peony/peony-qt-desktop/qml-desktop/ShortcutManager.qml0000664000175000017500000000762615154271106022153 0ustar fengfengimport QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 Item { id: shortCutManger // 复制 Shortcut { sequences: [StandardKey.Copy] onActivated: { controller.fileCopy(selectionModel.getSelections()) } } // 剪切 Shortcut { sequence: "Ctrl+X" onActivated: controller.fileCut(selectionModel.getSelections()) } // 粘贴 Shortcut { sequences: [StandardKey.Paste] onActivated: controller.filePaste(selectionModel.getSelections()) } // 撤销 Shortcut { sequences: [StandardKey.Undo] onActivated: controller.undo() } // 重做 Shortcut { sequences: [StandardKey.Redo] onActivated: controller.redo() } // 放大 Shortcut { sequences: [StandardKey.ZoomIn] onActivated: controller.zoomIn() } // 缩小 Shortcut { sequences: [StandardKey.ZoomOut] onActivated: controller.zoomOut() } // 全选 Shortcut { sequence: StandardKey.SelectAll onActivated: { if (!controller.enableShortcutKeys()) { return } selectionModel.selectAll(); } } // Delete 键(带Shift修饰) Shortcut { sequence: "Shift+Delete" onActivated: { console.log("press Shift+Delete") controller.remove(selectionModel.getSelections()) } } // Ctrl+D Shortcut { sequences: ["Ctrl+D", "Delete"] context: Qt.WindowShortcut onActivated: { controller.deleteToTrash(selectionModel.getSelections()) } } // 多键组合(Alt+Enter/Alt+Return) Shortcut { sequences: ["Alt+Enter", "Alt+Return"] context: Qt.WindowShortcut onActivated: controller.showProperties(selectionModel.getSelections()) } // 三键组合(Ctrl+Shift+N) Shortcut { sequence: "Ctrl+Shift+N" context: Qt.WindowShortcut onActivated: controller.newFolder() } // F1 Shortcut { sequence: "F1" onActivated: { console.log("press F1") controller.help() } } // F5 Shortcut { sequences: ["F5", "Ctrl+R"] onActivated: controller.refresh() } // Esc Shortcut { sequence: "Escape" onActivated: { controller.changeOpacity(1) controller.clearClipboard() } } // 混合组合示例(Alt+E 和 F2) Shortcut { sequences: ["Alt+E", "F2"] onActivated: { controller.editUris(selectionModel.getSelections()); } } // 混合组合 Shortcut { sequences: ["Ctrl+H"] onActivated: controller.setShowHidden() } Shortcut { sequences: ["Ctrl+Shift+L"] onActivated: selectionModel.invertSelections() } Shortcut { sequences: ["Ctrl+0"] onActivated: controller.recoverNormalLevel() } Connections { target: controller function onSelectAll(){ selectionModel.invertSelections(); } } // 信号 signal customShortcutTriggered(string sequence) signal changeOpacity(int opacity) // 动态注册快捷键 function registerShortcut(sequence, callback) { Qt.createQmlObject(` import QtQuick 2.15 Shortcut { sequence: "${sequence}" onActivated: { parent.customShortcutTriggered("${sequence}") if (typeof ${callback} === "function") { ${callback}() } } } `, root) } // 批量注册快捷键 function registerShortcuts(shortcutMap) { for (var seq in shortcutMap) { registerShortcut(seq, shortcutMap[seq]) } } } peony/peony-qt-desktop/qml-desktop/DesktopIconViewDelegate.qml0000664000175000017500000002057515154271070023553 0ustar fengfengimport QtQuick 2.15 Rectangle { id: DesktopIconViewDelegate width: 120 height: 120 radius: 6 property string uri: model.display property point pos: model.position Item { id: viewIconRect anchors.top: parent.top anchors.topMargin: 10 anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter width: 64 height: 64 x: pos.x*width y: pos.y*height Text { text: uri; anchors.horizontalCenter: viewIconRect.horizontalCenter anchors.top: viewIconRect.bottom anchors.topMargin: 5 width: parent.width - 8 wrapMode: Text.WrapAnywhere elide: Text.ElideRight horizontalAlignment: Text.AlignHCenter maximumLineCount: 2 } // ThemeIcon { // source: model.decoration // anchors.fill: parent // } // ThemeIcon { // source: "emblem-personal-symbolic" // width: 16 // height: 16 // anchors.horizontalCenter: parent.right // anchors.verticalCenter: parent.bottom // } } } // delegate: Rectangle { // x: pos.x*width // y: pos.y*height // width: 120 // height: 120 // radius: 6 // property string uri: model.display // property point pos: model.position // Item { // id: viewIconRect // anchors.top: parent.top // anchors.topMargin: 10 // anchors.horizontalCenter: parent.horizontalCenter // anchors.verticalCenter: parent.verticalCenter // width: 64 // height: 64 //// ThemeIcon { //// source: model.decoration //// anchors.fill: parent //// } //// ThemeIcon { //// source: "emblem-personal-symbolic" //// width: 16 //// height: 16 //// anchors.horizontalCenter: parent.right //// anchors.verticalCenter: parent.bottom //// } // } //// Image { source: "file:///usr/share/icons/ukui-icon-theme-default/24x24/apps/accessories-calculator.png" } // Text { // text: uri; // anchors.horizontalCenter: viewIconRect.horizontalCenter // anchors.top: viewIconRect.bottom // anchors.topMargin: 5 // width: parent.width - 8 // wrapMode: Text.WrapAnywhere // elide: Text.ElideRight // horizontalAlignment: Text.AlignHCenter // maximumLineCount: 2 // } //// TextField { //// id: textField //// text: uri //// anchors.horizontalCenter: viewIconRect.horizontalCenter //// anchors.top: viewIconRect.bottom //// anchors.topMargin: 5 //// width: parent.width - 8 //// inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase //// selectByMouse: true //// visible: isEditing // 当处于编辑状态时显示 //// onEditingFinished: { //// isEditing = false // 编辑完成后隐藏 TextField //// // 更新模型数据 //// //myProxyModel.setProperty(index, "uri", textField.text) //// } //// } //// onClicked: { //// realDoEdit = true; //// if (editTriggerTimer.running) { //// var remainingTime = editTriggerTimer.interval - editTriggerTimer.remainingTime(); //// var doubleClickInterval = Qt.styleHints.mouseDoubleClickInterval(); //// if (remainingTime < (3000 - doubleClickInterval) && remainingTime > 0) { //// editTriggerTimer.triggered.connect(onEditTriggerTimeout); //// } else if (remainingTime >= (3000 - doubleClickInterval)) { //// // 模拟双击事件(注意:QML 中没有直接的双击事件,但可以通过这种方式模拟) //// // 这里应该调用一个处理双击的函数,但由于 QML 没有直接的对应项,所以留空或替换为实际逻辑 //// // mouseDoubleClickEvent(mouse); // 这个函数在 QML 中不存在,需要自定义处理 //// } else { //// realDoEdit = false; //// editTriggerTimer.stop(); //// } //// } else { //// editTriggerTimer.start(); //// editTriggerTimer.triggered.connect(onEditTriggerTimeout); //// } //// // 创建编辑器 //// createEditor(index); //// } //// onDoubleClicked: { //// // 处理双击事件(如果需要的话) //// // 注意:QML 中的 MouseArea 有 onDoubleClicked 信号,但上面的逻辑是为了模拟在 C++ 中处理单击和双击的方式 //// } // // 支持手动拖拽修改位置 // MouseArea { // anchors.fill: parent // drag.target: parent // onReleased: { // //clearOtherSelectState() //// // 拖拽后更新模型中的坐标 //// customModel.setProperty(index, "x", parent.x) // } // } // } // } // 框选矩形 // Rectangle { // id: selectionRect // visible: false // color: "lightblue" // opacity: 0.3 // border.color: "blue" // border.width: 1 // } // 框选功能的 MouseArea // MouseArea { // anchors.fill: parent // onPressed: { // // 记录框选起始点 // selectionRect.x = mouseX; // selectionRect.y = mouseY; // selectionRect.width = 0; // selectionRect.height = 0; // selectionRect.visible = true; // } // onPositionChanged: { // // 更新框选矩形的大小 // selectionRect.width = mouseX - selectionRect.x; // selectionRect.height = mouseY - selectionRect.y; // } // onReleased: { // // 框选结束,检测矩形框内的子项 // selectionRect.visible = false; // var selectionRectGeometry = Qt.rect( // Math.min(selectionRect.x, selectionRect.x + selectionRect.width), // Math.min(selectionRect.y, selectionRect.y + selectionRect.height), // Math.abs(selectionRect.width), // Math.abs(selectionRect.height) // ); // // 遍历所有子项,检测是否在框选矩形内 // var ll = repeater.children.length // for (var i = 0; i < repeater.children.length; i++) { // var child = repeater.children[i]; // if (child.x >= selectionRectGeometry.x && // child.y >= selectionRectGeometry.y && // child.x + child.width <= selectionRectGeometry.x + selectionRectGeometry.width && // child.y + child.height <= selectionRectGeometry.y + selectionRectGeometry.height) { // child.selected = true; // 选中子项 // } else { // child.selected = false; // 取消选中 // } // } // } // } peony/peony-qt-desktop/qml-desktop/platformwindow.h0000664000175000017500000000645215167662247021571 0ustar fengfeng#ifndef PLATFORMWINDOW_H #define PLATFORMWINDOW_H #include #include "peony-dbus-service.h" class UkuiWindowHelper; namespace Peony { class DesktopItemProxyModel; class AdvancedDesktopItemModel; } class PlatformWindow : public QQuickView { Q_OBJECT public: explicit PlatformWindow(int id, QScreen* screen, QWindow *parent = nullptr); bool event(QEvent *event) override; void rowsInserted(const QModelIndex &parent, int first, int last); bool isFull(); void ajustIconsOnScreenSize(); bool isInvalidPoint(const QPoint &point); QPoint invalidPoint() const; void relayoutExsitingItems(const QStringList &uris); void setFileMetaInfoPos(const QString &uri, const QPoint &pos); const QStringList getAllFileUris(); /*! * \brief findNextEmptyGridPos * 获取下一个空网格所在的位置 * \return * */ QPoint findNextEmptyGridPos(const QPoint &startGridPos = QPoint()); /*! * \brief getGridPosFromMousePos * 根据当前鼠标事件传入的位置返回网格的位置 * \param mousePos * \return * 鼠标位置对应的网格位置 */ QPoint getGridPosFromMousePos(const QPoint &mousePos); /*! * \brief gridPosLesserThan * 从左上到右下比较两个网格位置的顺序 * \param leftPos * \param rightPos * \return */ bool gridPosLesserThan(const QPoint &leftPos, const QPoint &rightPos); void checkItemsOver(); QPoint checkGridPos(const QPoint pos); void setSortType(int sortType); void setSortOrder(int sortOrder); void setId(int id); int id(); int dataCount() const; bool checkEmptyPositon(); QScreen *bindScreen() { return m_screen; } QScreen *destoryScreen() { return m_screen = nullptr; } Q_SIGNALS: void viewUpdated(); public Q_SLOTS: void updateWindowGeometry(); void reloadData(); void loadData(); void invalidate(); void updateView(); /** * @brief layoutItems * 自动排列 * @param closest * @return * 返回自动排列的uri列表 */ QStringList layoutItems(bool closest = false); /** * @brief relayoutExsitingItemsAndUpdate * 设置自动排列后, * @param uris */ void relayoutExsitingItemsAndUpdate(const QStringList uris, bool forceUpdate = true); void showHiddenFile(); void showStandardFile(); bool fileRemoved(const QString &uri); bool filesRemoved(const QStringList &uris); bool idChanged(int id, int oldId, const QStringList &uris); void drop(const QStringList &selectedUris, Qt::DropAction action, int insertRow, const QPoint &pos); bool dragFromOtherScreen(QStringList selectedUris, int insertRow, const QPoint &offPos); private: bool m_initData = false; Peony::DesktopItemProxyModel *m_proxyModel = nullptr; Peony::AdvancedDesktopItemModel *m_model = nullptr; int m_availableColumnCount; int m_availableRowCount; QSize m_gridSize; QMargins m_margins; QHash m_resolutionItemPosHash; QHash m_itemPosHash; QStringList m_autoArrange; QStringList m_storageBox; QScreen *m_screen = nullptr; #ifdef KY_SDK_WAYLANDHELPER UkuiWindowHelper *m_wmHelper = nullptr; #endif }; #endif // PLATFORMWINDOW_H peony/peony-qt-desktop/qml-desktop/platformwindow.cpp0000664000175000017500000011455415167662247022127 0ustar fengfeng#include "platformwindow.h" #include #include //#include #include #include #include #include "global-settings.h" #include "common.h" #include "file-action-controler.h" #include "global-settings-adapter.h" #include "peony-desktop-application.h" #include "desktop-item-proxy-model.h" #include "advanced-desktop-item-model.h" #include "file-info.h" #include "file-utils.h" #include "background-manager.h" #include "windowmanager/windowmanager.h" #include "screen-manager.h" #include "theme-style.h" #include "desktop-window-manager.h" #ifdef KY_SDK_WAYLANDHELPER #include #endif #include #include #include #include #include #include #include using namespace Peony; static bool iconSizeLessThan (const QPair& p1, const QPair& p2) { if (p1.first.x() > p2.first.x()) return false; if (p1.first.x() < p2.first.x()) return true; if ((p1.first.x() == p2.first.x())) return p1.first.y() < p2.first.y(); return true; } PlatformWindow::PlatformWindow(int id, QScreen* screen, QWindow *parent) : QQuickView(parent) { setScreen(screen); setColor(Qt::transparent); setFlags(flags() | Qt::Window | Qt::FramelessWindowHint); #ifdef KY_SDK_WAYLANDHELPER m_wmHelper = new UkuiWindowHelper(this); m_wmHelper->setWindowRole(UkuiWindowHelper::WindowRole::Desktop); m_wmHelper->setSkipSwitcher(true); m_wmHelper->setSkipTaskBar(true); #endif qInfo() << "create new window on "<name()<geometry() <geometry()); m_model = PeonyDesktopApplication::getModel(); m_proxyModel = new DesktopItemProxyModel(m_model); m_proxyModel->setSourceModel(m_model); m_proxyModel->setId(id); connect(m_proxyModel, &DesktopItemProxyModel::rowsInserted, this, &PlatformWindow::rowsInserted); connect(m_model, &AdvancedDesktopItemModel::sig_fileRemoved, this, &PlatformWindow::fileRemoved); connect(m_model, &AdvancedDesktopItemModel::refreshed, this, &PlatformWindow::reloadData); connect(m_model, &AdvancedDesktopItemModel::idChanged, this, &PlatformWindow::idChanged); connect(m_model, &AdvancedDesktopItemModel::invalidateFilterRequest, m_proxyModel, &DesktopItemProxyModel::invalidateModel); connect(m_proxyModel, &DesktopItemProxyModel::datechange, m_model, &Peony::AdvancedDesktopItemModel::setdata); connect(m_proxyModel, &DesktopItemProxyModel::showHiddenFile, this, &PlatformWindow::showHiddenFile); connect(m_proxyModel, &DesktopItemProxyModel::showStandardFile, this, &PlatformWindow::showStandardFile); connect(m_proxyModel, &DesktopItemProxyModel::drop, this, &PlatformWindow::drop); connect(this, &PlatformWindow::viewUpdated, m_proxyModel, &DesktopItemProxyModel::viewUpdated); FileActionController *controller = FileActionController::getInstance(); GlobalSettingsAdapter *settingsAdapter = GlobalSettingsAdapter::getInstance(); DesktopWindowManager *windowManager = DesktopWindowManager::getInstance(); rootContext()->setContextProperty("mymodel", m_model); rootContext()->setContextProperty("myProxyModel", m_proxyModel); rootContext()->setContextProperty("controller", controller); rootContext()->setContextProperty("globalSettings", settingsAdapter); rootContext()->setContextProperty("backgroundManager", BackgroundManager::globalInstance()); rootContext()->setContextProperty("themeStyle", ThemeStyle::instance()); rootContext()->setContextProperty("windowManager", windowManager); m_gridSize = controller->getGridSize(); QMargins margins = GlobalSettingsAdapter::getInstance()->panelMargins(); QRect rect = screen->geometry(); m_availableColumnCount = (rect.width() - margins.left() - margins.right()) / m_gridSize.width(); m_availableRowCount = (rect.height() - margins.top() - margins.bottom()) / m_gridSize.height(); QObject::connect(controller, &FileActionController::gridSizeChanged, this, [=](){ m_gridSize = controller->getGridSize(); ajustIconsOnScreenSize(); checkItemsOver(); }); connect(m_model, &AdvancedDesktopItemModel::refreshed, controller, &FileActionController::finishRefresh); connect(this, &QQuickView::statusChanged, this, [=](QQuickView::Status status) { if (status == QQuickView::Ready) { qDebug() << "QML loaded, setting final geometry"<geometry(); setGeometry(screen->geometry()); if (rootObject()) { rootObject()->setState("Show"); } } }); connect(GlobalSettingsAdapter::getInstance(), &GlobalSettingsAdapter::valueChanged, this, [=](const QString &key){ if (key == DESKTOP_USE_AUTO_LAYOUT) { bool desktopAutoLayout = GlobalSettingsAdapter::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); if (desktopAutoLayout) { m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_resolutionItemPosHash.clear(); auto sortedUris = layoutItems(); } } }); connect(GlobalSettingsAdapter::getInstance(), &GlobalSettingsAdapter::panelMarginsChanged, this, [=](){ ajustIconsOnScreenSize(); checkItemsOver(); }); const QUrl url(QStringLiteral("qrc:/qml-desktop/DesktopView.qml")); setSource(url); setResizeMode(QQuickView::SizeRootObjectToView); qDebug() << "gridSize:"<type() == QEvent::PlatformSurface) { auto e = static_cast(event); switch (e->surfaceEventType()) { case QPlatformSurfaceEvent::SurfaceCreated: { if (KWindowSystem::isPlatformX11()) { KX11Extras::setType(winId(), NET::Desktop); KX11Extras::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::SkipSwitcher); } break; } default: break; } } return QQuickView::event(event); } void PlatformWindow::rowsInserted(const QModelIndex &parent, int first, int last) { QString firstEditUri; QStringList& editUris = FileActionController::getInstance()->urisToEdit(); if (editUris.isEmpty()) { return; } firstEditUri = Peony::FileUtils::urlDecode(editUris.first()); for (int row = first; row <= last; ++row) { QModelIndex proxyIndex = m_proxyModel->index(row, 0, parent); QModelIndex sourceIndex = m_proxyModel->mapToSource(proxyIndex); QString uri = m_model->data(sourceIndex, UriRole).toString(); qDebug() << "Inserted item (source):" << uri; QString infoUri = Peony::FileUtils::urlDecode(uri); qDebug() << "fileCreated editUri:"<edit(uri); }); editUris.clear(); } } } void PlatformWindow::updateWindowGeometry() { if (!m_screen) { qWarning() << "PlatformaWindow Screen is null."; return; } qDebug() << "displayMode:"<displayMode(); if (ScreenManager::getInstance()->displayMode() == ScreenManager::Mirror && m_proxyModel->id() != 0) { qDebug() << "geometry of screen when Mirror "<geometry()<geometry(); //镜像下也需要更新位置,切换扩展或者单屏下可能不会有geometry信号变化 this->setGeometry(m_screen->geometry()); this->ajustIconsOnScreenSize(); lower(); #ifndef KY_SDK_WAYLANDHELPER ScreenManager::getInstance()->getWindowById(0)->raise(); #else ScreenManager::getInstance()->getWindowById(0)->requestActivate(); #endif return; } if (m_proxyModel->id() == 0) { #ifndef KY_SDK_WAYLANDHELPER raise(); #else this->requestActivate(); #endif } qDebug() << "geometry: "<geometry(); this->setGeometry(m_screen->geometry()); this->ajustIconsOnScreenSize(); this->requestUpdate(); if (ScreenManager::getInstance()->displayMode() == ScreenManager::Extend) { this->requestActivate(); } } //void PlatformWindow::resizeEvent(QResizeEvent *ev) //{ // if (!this->screen()) { // qWarning() << "PlatformaWindow Screen is null."; // return; // } // qWarning() << "resize: "<screen()->geometry()<screen()<id(); // this->setGeometry(this->screen()->geometry()); // this->ajustIconsOnScreenSize(); // this->requestUpdate(); // QQuickView::resizeEvent(ev); //} void PlatformWindow::updateView() { m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_resolutionItemPosHash.clear(); m_proxyModel->updateFilter(); this->ajustIconsOnScreenSize(); this->checkItemsOver(); Q_EMIT viewUpdated(); } void PlatformWindow::ajustIconsOnScreenSize() { QMargins margins = GlobalSettingsAdapter::getInstance()->panelMargins(); QRect rect = this->geometry(); m_availableColumnCount = (rect.width() - margins.left() - margins.right()) / m_gridSize.width(); m_availableRowCount = (rect.height() - margins.top() - margins.bottom()) / m_gridSize.height(); qInfo()<<"ajust Icons pos, current geometry is "<geometry()<<" row, col"<useAutoLayout()) { if (m_autoArrange.count() != m_proxyModel->rowCount()) { layoutItems(); } else { relayoutExsitingItemsAndUpdate(m_autoArrange); } return; } QStringList needChanged; for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); m_itemPosHash.insert(uri, pos); if (isInvalidPoint(pos)) { needChanged.append(uri); if (!m_resolutionItemPosHash.contains(uri)) { // remember item position before resolution changed. m_resolutionItemPosHash.insert(uri, pos); } } } qInfo()<<"need changed item"<rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); QPoint pos = m_itemPosHash.value(uri); int id = index.data(ScreenIdRole).toInt(); m_proxyModel->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); if (m_resolutionItemPosHash.contains(uri)) { QPoint reolutionItemPos = m_resolutionItemPosHash.value(uri); QStringList exceptedPos; exceptedPos<setData(index, exceptedPos, ExceptedPositionRole); } } } void PlatformWindow::relayoutExsitingItems(const QStringList &uris) { if (uris.isEmpty() || m_itemPosHash.isEmpty()) { return; } for (auto uri : uris) { m_itemPosHash.remove(uri); } auto allFileUris = getAllFileUris(); QPoint startPos = QPoint(); int i = 0; for (; i < uris.count(); i++) { QString uri = uris[i]; if (!allFileUris.contains(uri)) continue; startPos = findNextEmptyGridPos(startPos); if (isInvalidPoint(startPos)) { break; } setFileMetaInfoPos(uri, startPos); m_storageBox.removeOne(uri); } for(; i < uris.count(); i++) { QString uri = uris[i]; setFileMetaInfoPos(uri, QPoint(0, 0)); if (!m_storageBox.contains(uri)) { m_storageBox.append(uri); } } } const QStringList PlatformWindow::getAllFileUris() { QStringList uris; for (int i = 0; i < m_proxyModel->rowCount(); i++) { auto index = m_proxyModel->index(i, 0); uris<devicePixelRatio(), m_gridSize*qApp->devicePixelRatio()); FileInfo::fromUri(uri).get()->setProperty("iconGeometry", rect); } QPoint PlatformWindow::findNextEmptyGridPos(const QPoint &startGridPos) { for (int column = 0; column < m_availableColumnCount; column++) { for (int row = 0; row < m_availableRowCount; row++) { QPoint pos = QPoint(column, row); if (gridPosLesserThan(pos, startGridPos)) continue; if (m_itemPosHash.keys(pos).isEmpty()) return pos; } } return invalidPoint(); } bool PlatformWindow::isInvalidPoint(const QPoint &point) { return point.x() < 0 || point.x() >= m_availableColumnCount || point.y() < 0 || point.y() >= m_availableRowCount; } QPoint PlatformWindow::invalidPoint() const { return QPoint(-1, -1); } QPoint PlatformWindow::getGridPosFromMousePos(const QPoint &mousePos) { int x = mousePos.x()/m_gridSize.width(); // if (layoutDirection() == Qt::RightToLeft) { // int vewportX = viewport()->rect().topRight().x(); // x = (vewportX - mousePos.x())/m_gridSize.width(); // } return QPoint(x, mousePos.y()/m_gridSize.height()); } bool PlatformWindow::gridPosLesserThan(const QPoint &leftPos, const QPoint &rightPos) { if (leftPos.x() < rightPos.x()) return true; if (leftPos.x() > rightPos.x()) return false; if (leftPos.y() < rightPos.y()) return true; return false; } void PlatformWindow::checkItemsOver() { QStringList primaryItem, extendItem; QStringList needRelayoutItems; for (int i = 0; i < m_proxyModel->rowCount(); i++) { QModelIndex index = m_proxyModel->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); auto overUris = m_itemPosHash.keys(pos); if (overUris.count() > 1) { auto extendPos = index.data(ExtendScreenPositionRole).toStringList(); if (3 == extendPos.count() && 0 != extendPos[2].toInt()) { extendItem.append(uri); } else { primaryItem.append(uri); } } } primaryItem<rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); auto pos = m_itemPosHash.value(uri); m_proxyModel->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } } bool PlatformWindow::isFull() { //bug#123045 主屏桌面空间不足,新建的文件未放置到扩展屏桌面上 qDebug() << "colNum:" <rowCount(); for (int column = 0; column < m_availableColumnCount; column++) { for (int row = 0; row < m_availableRowCount; row++) { QPoint pos = QPoint(column, row); if (m_itemPosHash.keys(pos).isEmpty()) return false; } } return true; } QPoint PlatformWindow::checkGridPos(const QPoint pos) { if (!isInvalidPoint(pos)) { return pos; } int col = pos.x() >= m_availableColumnCount ? m_availableColumnCount-1 : pos.x(); int row = pos.y() >= m_availableRowCount ? m_availableRowCount-1 : pos.y(); QPoint newPos = findNextEmptyGridPos(QPoint(col, row)); return newPos; } void PlatformWindow::loadData() { reloadData(); } void PlatformWindow::setSortOrder(int sortOrder) { m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_resolutionItemPosHash.clear(); m_proxyModel->setSortOrder(sortOrder); m_proxyModel->sort(0, Qt::SortOrder(sortOrder)); // 排序需要清空restore pos信息 m_proxyModel->clearExpectedItemPosForCurrentView(); for (int i = 0; i < m_proxyModel->rowCount(); i++) { auto index = m_proxyModel->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); int col = i/m_availableRowCount; int row = i%m_availableRowCount; if (col >= m_availableColumnCount) { row = 0; col = 0; m_storageBox.append(uri); } QPoint pos(col, row); m_proxyModel->setData(index,pos,PositionRole); m_autoArrange.append(uri); setFileMetaInfoPos(uri, pos); } Q_EMIT m_proxyModel->layoutUpdate(); } void PlatformWindow::setSortType(int sortType) { m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_resolutionItemPosHash.clear(); m_proxyModel->setSortType(sortType); m_proxyModel->sort(1); m_proxyModel->sort(0, Qt::SortOrder(m_proxyModel->getSortOrder())); // 排序需要清空restore pos信息 m_proxyModel->clearExpectedItemPosForCurrentView(); for (int i = 0; i < m_proxyModel->rowCount(); i++) { auto index = m_proxyModel->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); int col = i/m_availableRowCount; int row = i%m_availableRowCount; if (col >= m_availableColumnCount) { row = 0; col = 0; m_storageBox.append(uri); } QPoint pos(col, row); m_proxyModel->setData(index,pos,PositionRole); m_autoArrange.append(uri); setFileMetaInfoPos(uri, pos); } Q_EMIT m_proxyModel->layoutUpdate(); } void PlatformWindow::setId(int id) { m_proxyModel->setId(id); m_proxyModel->invalidate(); } int PlatformWindow::id() { return m_proxyModel->id(); } int PlatformWindow::dataCount() const { return m_proxyModel->rowCount(); } void PlatformWindow::invalidate() { return m_proxyModel->invalidate(); } QStringList PlatformWindow::layoutItems(bool closest) { if (!closest) { QHash extendMap; QHash primaryItemMap; QList> newPosition; QStringList overItem; for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); auto extendPos = index.data(ExtendScreenPositionRole).toStringList(); if (3 == extendPos.count() && 0 != extendPos[2].toInt()) { extendMap.insert(uri, pos); } else { if (primaryItemMap.keys(pos).empty()) { newPosition << QPair(pos, uri); primaryItemMap.insert(uri, pos); } else { overItem.append(uri); } } } for (QString uri : extendMap.keys()) { QPoint pos = extendMap.value(uri); if (primaryItemMap.keys(pos).isEmpty()) { newPosition << QPair(pos, uri); } else { overItem.append(uri); } } if (!newPosition.isEmpty()) { std::stable_sort(newPosition.begin(), newPosition.end(), iconSizeLessThan); QStringList sortedUris; for (auto pair : newPosition) { if (m_storageBox.contains(pair.second)) { overItem.prepend(pair.second); } else { sortedUris.append(pair.second); } } sortedUris << overItem; sortedUris.removeDuplicates(); qDebug() <<"--------------------layoutItems" <invalidate(); for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); if(!uris.contains(uri)) { qDebug() << "uri does exist:" <setData(index, pos, PositionRole); } qDebug() << "PlatformWindow::relayoutExsitingItemsAndUpdat---------" <useAutoLayout()) { if (m_autoArrange.count() != m_proxyModel->rowCount()) { layoutItems(); } return; } // 非自动布局模式下,优先保留现有位置信息 QHash oldItemPosHash = m_itemPosHash; m_itemPosHash.clear(); m_autoArrange.clear(); QStringList needChanged; // 首先处理现有的图标位置,保持它们的位置优先 for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); QPoint metaPos = index.data(PositionRole).toPoint(); if (oldItemPosHash.contains(uri)) { m_itemPosHash.insert(uri, metaPos); } else { //新增隐藏图标与现有图标冲突,重排隐藏图标 if (isInvalidPoint(metaPos) || !oldItemPosHash.keys(metaPos).isEmpty() ) { needChanged.append(uri); } else { m_itemPosHash.remove(uri); setFileMetaInfoPos(uri, metaPos); } } } qInfo()<<"need changed item"<indexFromUri(uri); QPoint pos = m_itemPosHash.value(uri); m_model->setData(index, pos, PositionRole); } return; } void PlatformWindow::showStandardFile() { if (GlobalSettingsAdapter::getInstance()->useAutoLayout()) { if (m_autoArrange.count() != m_proxyModel->rowCount()) { layoutItems(); return; } return; } ajustIconsOnScreenSize(); checkItemsOver(); return; } bool PlatformWindow::fileRemoved(const QString &uri) { qDebug() << "file removed"<useAutoLayout() && isExist) { relayoutExsitingItemsAndUpdate(m_autoArrange, false); return true; } //重叠的重新分位置 if (m_storageBox.isEmpty()) return false; if (inBox) return true; QString relayoutUri = m_storageBox.takeLast(); if (!m_itemPosHash.contains(relayoutUri)) { return false; } QModelIndex index = m_model->indexFromUri(relayoutUri); m_model->setData(index, emptyPos, PositionRole); setFileMetaInfoPos(relayoutUri, emptyPos); return true; } bool PlatformWindow::filesRemoved(const QStringList &uris) { qDebug() << "files removed"< emptyPosList; for (QString uri : uris) { isExist = m_autoArrange.contains(uri)? true : isExist; bool inBox = m_storageBox.removeOne(uri); if (!inBox) { QPoint pos = m_itemPosHash.value(uri); emptyPosList.append(pos); } m_itemPosHash.remove(uri); m_resolutionItemPosHash.remove(uri); m_autoArrange.removeOne(uri); } if (GlobalSettingsAdapter::getInstance()->useAutoLayout() && isExist) { relayoutExsitingItemsAndUpdate(m_autoArrange, false); return isExist; } for (QPoint emptyPos : emptyPosList) { //重叠的重新分位置 if (m_storageBox.isEmpty()) return true; QString relayoutUri = m_storageBox.takeLast(); if (!m_itemPosHash.contains(relayoutUri)) { return false; } QModelIndex index = m_model->indexFromUri(relayoutUri); m_model->setData(index, emptyPos, PositionRole); setFileMetaInfoPos(relayoutUri, emptyPos); } return isExist; } bool PlatformWindow::idChanged(int id, int oldId, const QStringList &uris) { qDebug()<<"file created "<< id << " uri:" <id()<id()) { if (-1 == id ) { //移除oldId的屏幕,更新oldId的图标缓存 m_proxyModel->invalidate(); filesRemoved(uris); return true; } } if (id != m_proxyModel->id() || uris.isEmpty()) { return false; } // m_proxyModel->invalidate(); bool forceUpdate = oldId != id ? true : false; for (auto uri : uris) { if (uri.isEmpty()) continue; auto index = m_model->indexFromUri(uri); QPoint metaPos = m_model->data(index,PositionRole).toPoint(); if (GlobalSettingsAdapter::getInstance()->useAutoLayout()) { if (!m_autoArrange.contains(uri)) { //自动排序下重命名导致出现重叠现象 if (isInvalidPoint(metaPos)) { m_autoArrange.append(uri); } else { int i = metaPos.x() * m_availableRowCount + metaPos.y(); m_autoArrange.insert(i, uri); } relayoutExsitingItemsAndUpdate(m_autoArrange, forceUpdate); return true; } return false; } if (isInvalidPoint(metaPos) || !m_itemPosHash.keys(metaPos).isEmpty() ) { QPoint emptypos = findNextEmptyGridPos(); if (emptypos.x() < 0) { qWarning()<<"no empty pos"; //如果没有空位则后面的item不排序 emptypos = QPoint(0, 0); if (!m_storageBox.contains(uri)) m_storageBox.append(uri); } metaPos = emptypos; m_model->setData(index, metaPos, PositionRole); setFileMetaInfoPos(uri, metaPos); } else { m_itemPosHash.remove(uri); setFileMetaInfoPos(uri, metaPos); } m_model->setData(index, m_proxyModel->id(), ScreenIdRole); } if (forceUpdate) m_proxyModel->invalidate(); return true; } void PlatformWindow::drop(const QStringList &selectedUris, Qt::DropAction action, int insertRow, const QPoint &offPos) { bool isExist = getAllFileUris().contains(selectedUris.first()); if (isExist) { if (GlobalSettingsAdapter::getInstance()->useAutoLayout()) { if (m_autoArrange.empty()) { qCritical()<<"sort list is empty"<index(insertRow, 0, QModelIndex()); QString currentHoverUri = index.data(UriRole).toString(); int insertedPos = destSortedUris.indexOf(currentHoverUri); qDebug()<<"insert pos: "<= 0 && insertedPos <= destSortedUris.size()) { destSortedUris.reserve(destSortedUris.size() + draggedUris.size()); for (const QString &uri : draggedUris) { destSortedUris.insert(insertedPos++, uri); } } else if (insertedPos < 0){ destSortedUris = m_autoArrange; } else { destSortedUris += draggedUris; } } destSortedUris.removeAll(QString()); destSortedUris.removeDuplicates(); qDebug()<<"relayout: "< relayoutIndexes; for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); if (selectedUris.contains(uri)) { QPoint pos = index.data(PositionRole).toPoint(); if (!isInvalidPoint(pos)) { qDebug() << " 拖拽:" <setData(index, pos, PositionRole); } } for (QString uri : relayoutIndexes.keys()) { auto index = relayoutIndexes.value(uri); QPoint dropedGridPos = index.data(PositionRole).toPoint(); if (!isInvalidPoint(dropedGridPos) && m_itemPosHash.keys(dropedGridPos+offPos).isEmpty()) { dropedGridPos += offPos; } QPoint pos = findNextEmptyGridPos(dropedGridPos); if (!isInvalidPoint(pos)) { setFileMetaInfoPos(uri, pos); m_proxyModel->setData(index, pos, PositionRole); } } } } else { dragFromOtherScreen(selectedUris, insertRow, offPos); } } bool PlatformWindow::dragFromOtherScreen(QStringList selectedUris, int insertRow, const QPoint &offPos) { int oldId = 0; if (GlobalSettingsAdapter::getInstance()->useAutoLayout()) { qDebug() << "跨屏 自动排序 拖拽:" <rowCount(); row++) { auto index = m_model->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); if (selectedUris.contains(uri)) { oldId = m_model->data(index, ScreenIdRole).toInt(); m_model->setData(index, m_proxyModel->id(), ScreenIdRole); } } QStringList destSortedUris = m_autoArrange; if (-1 == insertRow) { destSortedUris.append(selectedUris); } else { auto index = m_proxyModel->index(insertRow, 0, QModelIndex()); QString currentHoverUri = index.data(UriRole).toString(); int insertedPos = destSortedUris.indexOf(currentHoverUri); qDebug()<<"insert pos: "<= 0 && insertedPos <= destSortedUris.size()) { destSortedUris.reserve(destSortedUris.size() + selectedUris.size()); for (const QString &uri : selectedUris) { destSortedUris.insert(insertedPos++, uri); } } } destSortedUris.removeDuplicates(); relayoutExsitingItemsAndUpdate(destSortedUris); Q_EMIT m_model->idChanged(-1, oldId, selectedUris); return true; } else { qDebug() << "跨屏 非自动排序 拖拽:" < relayoutIndexes; for (int row = 0; row < m_model->rowCount(); row++) { auto index = m_model->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); if (selectedUris.contains(uri)) { oldId = m_model->data(index, ScreenIdRole).toInt(); QPoint pos = index.data(PositionRole).toPoint(); qDebug() << " 拖拽:" <setData(index, pos, PositionRole); m_model->setData(index, m_proxyModel->id(), ScreenIdRole); } } for (QString uri : relayoutIndexes.keys()) { auto index = relayoutIndexes.value(uri); QPoint dropedGridPos = index.data(PositionRole).toPoint(); qDebug() <<"重排当前文件:"<setData(index, pos, PositionRole); m_model->setData(index, m_proxyModel->id(), ScreenIdRole); } } m_proxyModel->invalidate(); Q_EMIT m_model->idChanged(-1, oldId, selectedUris); return true; } return false; } void PlatformWindow::reloadData() { m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); if (GlobalSettingsAdapter::getInstance()->useAutoLayout()) { layoutItems(); return ; } for (int row = 0; row < m_proxyModel->rowCount(); row++) { auto index = m_proxyModel->index(row, 0, QModelIndex()); QString uri = index.data(UriRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); setFileMetaInfoPos(uri, pos); } checkItemsOver(); } bool PlatformWindow::checkEmptyPositon() { if (m_autoArrange.isEmpty()) return false; for (int col = 0; col < m_availableColumnCount; col++) { for (int row = 0; row < m_availableRowCount; row++) { if (col * m_availableRowCount + row + 1 > m_autoArrange.count()) { return false; } if (m_itemPosHash.keys(QPoint(col, row)).isEmpty()) { return true; } } } return false; } peony/peony-qt-desktop/qml-desktop/DelegateText.qml0000664000175000017500000002552515167662247021440 0ustar fengfengimport QtQuick 2.15 import QtQuick.Controls 2.15 import Qt5Compat.GraphicalEffects Item { id: root width: parent.width height: editing && editLoader.active && editLoader.item ? Math.min(editLoader.item.textEdit.implicitHeight, maxVisibleHeight) : textItem.height // 公共属性 property var selectedUris: [] property string display: "" // 显示的文本内容 property bool editing: false // 是否处于编辑状态 property bool selected: false // 是否处于选中状态 property bool isDir: false // 是否处于目录 property bool isSoftLink: false // 是否是软连接 property bool showFullText: false property string lastValidText: root.display property int maxBytes: 255 property int maxVisibleHeight: 0 signal editFinish(var selectedUris, string newText) Label { id: textItem text: root.display color: "white" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: 5 width: parent.width - 8 wrapMode: Text.WrapAnywhere elide: Text.ElideRight maximumLineCount: selected && showFullText ? 0 : 2 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignTop Text { id: labelText visible: false width: textItem.width font: textItem.font text: textItem.text wrapMode: textItem.wrapMode maximumLineCount: selected && showFullText ? 0 : 2 } height: Math.min(labelText.paintedHeight, root.maxVisibleHeight > 0 ? root.maxVisibleHeight : labelText.paintedHeight) visible: !root.editing onTruncatedChanged: { if (model && model.uri) { controller.updateFileElideStatus(model.uri, truncated) } } } // DropShadow { // anchors.fill: textItem // source: textItem // horizontalOffset: 1 // verticalOffset: 2 // radius: 3 // samples: radius*2 // color: "#ff000000" // visible: !root.editing // } // 编辑状态 Loader { id: editLoader active: false // 初始不加载 anchors.fill: parent sourceComponent:ScrollView { id: scrollView width: parent.width height: Math.min( textEdit.implicitHeight, maxVisibleHeight > 0 ? maxVisibleHeight : textEdit.implicitHeight // 限制最大高度 ) visible: root.editing ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ScrollBar.vertical.policy: ScrollBar.AlwaysOff property alias textEdit: textEdit // 暴露 TextArea 到外部 TextArea { id: textEdit text: root.display width: root.width topPadding: 3 bottomPadding: 3 leftPadding: 5 rightPadding: 5 wrapMode: Text.WrapAnywhere height: implicitHeight horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter property var transparent: false // 只在编辑状态显示 visible: root.editing focus: root.editing property int lastCursor: 0 property bool isPaste: false Keys.onPressed: (event) => { if ((event.modifiers & Qt.ControlModifier) && event.key === Qt.Key_V) { Qt.callLater(() => { isPaste = true }) } } onTextChanged: { const currentBytes = getUtf8Length(text) if (currentBytes > maxBytes) { const cursor = cursorPosition let prevText = lastValidText if (isPaste && maxBytes !== getUtf8Length(prevText)) { const newText = truncateUtf8WithExtension(text, maxBytes) let inputLength = text.length - newText.length text = newText inputLength += text.length - prevText.length Qt.callLater(() => { textEdit.cursorPosition = Math.max(0, Math.min(cursor - inputLength, text.length)) }) lastValidText = newText isPaste = false } else { let inputLength = text.length - prevText.length text = prevText Qt.callLater(() => { textEdit.cursorPosition = Math.max(0, Math.min(cursor - inputLength, text.length)) }) } } else { lastValidText = text } } // 按回车完成编辑 Keys.onReturnPressed: { updateFileName() } // 点击外部完成编辑 onActiveFocusChanged: { if (!activeFocus && root.editing) { updateFileName() } } // UTF-8 字节计算函数 function getUtf8Length(str) { return unescape(encodeURIComponent(str)).length } // 按需截断,保留扩展名 function truncateUtf8WithExtension(str, maxBytes) { let name = str let ext = "" const doubleExts = [".tar.gz", ".tar.xz", ".tar.bz2", ".tar.zst", ".tar.lz"] for (let i = 0; i < doubleExts.length; i++) { if (str.endsWith(doubleExts[i])) { ext = doubleExts[i] name = str.slice(0, -ext.length) break } } if (ext === "") { const lastDot = str.lastIndexOf(".") if (lastDot > 0 && !str.startsWith(".")) { ext = str.slice(lastDot) name = str.slice(0, lastDot) } } const extUtf8Len = getUtf8Length(ext) const nameMaxBytes = maxBytes - extUtf8Len if (nameMaxBytes <= 0) return ext.slice(0, maxBytes) const utf8 = unescape(encodeURIComponent(name)) let truncated = utf8.slice(0, nameMaxBytes) let safeName = "" while (truncated.length > 0) { try { safeName = decodeURIComponent(escape(truncated)) break } catch (e) { truncated = truncated.slice(0, -1) } } return safeName + ext } function getSuffixStartIndex(str) { // 处理 .tar.gz 这类情况优先 const doubleExts = [".tar.gz", ".tar.xz", ".tar.bz2", ".tar.zst", ".tar.lz"] for (let ext of doubleExts) { if (str.endsWith(ext)) { return str.length - ext.length } } const lastDot = str.lastIndexOf(".") if (lastDot > 0 && !str.startsWith(".")) { return lastDot } return str.length // 无后缀情况 } function selectText() { var chars = Array.from(text); // 正确处理多字节字符 var dotIndices = []; var isDesktopFile = text.endsWith(".desktop"); if (!isDesktopFile && !isSoftLink && !isDir && text.includes(".") && !text.startsWith(".")) { // 收集所有点号位置(从后向前) for (var i = chars.length - 1; i >= 0; i--) { if (chars[i] === '.') { dotIndices.push(i); if (dotIndices.length >= 2) break; // 只需要最后两个点号 } } } // 判断是否为双重扩展名(如.tar.gz) var isDoubleExtension = false; if (dotIndices.length >= 2) { var middleExt = text.substring(dotIndices[1], dotIndices[0]); isDoubleExtension = middleExt === ".tar" || middleExt === ".zip"; } // 计算选中结束位置 var selectEnd = dotIndices.length > 0 ? (isDoubleExtension && dotIndices.length >= 2 ? dotIndices[1] // 对于.tar.gz选中到第一个点号前 : dotIndices[0]) // 普通扩展名选中到最后一个点号前 : text.length; // 无扩展名选中全部 // 转换为基于代码单元的位置(兼容QML的select方法) var prefix = chars.slice(0, selectEnd).join(''); var codeUnitEnd = prefix.length; // 执行选中并定位光标 select(0, codeUnitEnd); } Component.onCompleted: { textEdit.text = root.display forceActiveFocus() selectText() } } } } // 当编辑状态改变时,动态加载/卸载编辑控件 onEditingChanged: { editLoader.active = root.editing } function forceActiveFocus() { console.log("edit ", root.display) root.editing = true } // 外部可通过此方法触发焦点 function updateFileName() { if (root.editing && editLoader.active && editLoader.item) { let edit = editLoader.item.textEdit if (edit) { const newName = edit.text if (newName === "." || newName === ".." || newName === "") { edit.text = root.display return } if (newName !== root.display) { editFinish(selectedUris, newName) } console.log("new file name", newName) } } root.editing = false } } peony/peony-qt-desktop/qml-desktop/qml-desktop.pri0000664000175000017500000000042015154271070021267 0ustar fengfengQML_IMPORT_NAME = org.ukui.tablet QML_IMPORT_MAJOR_VERSION = 1 INCLUDEPATH += $$PWD \ HEADERS += \ $$PWD/platformwindow.h SOURCES += \ $$PWD/platformwindow.cpp DISTFILES += \ $$PWD/DelegateIcon.qml \ $$PWD/DelegateText.qml \ $$PWD/DesktopView.qml peony/peony-qt-desktop/qml-desktop/DelegateIcon.qml0000664000175000017500000000364615154271106021366 0ustar fengfeng//DelegateIcon.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import org.ukui.desktop 1.0 import org.ukui.quick.items 1.0 import org.ukui.quick.platform 1.0 Item { id: viewIconRect anchors.top: parent.top anchors.topMargin: 5 anchors.horizontalCenter: parent.horizontalCenter property int emblemSize : 16 property var icon property var emblems property string uri Icon { id: itemIcon anchors.fill: parent source: icon Binding { target: itemIcon.proxy property: "appId" value: controller.getAppId(uri) when: isValidDesktopApp(uri) // 调用校验函数 } } // 右下角 Icon { source: emblems && emblems[0] ? emblems[0] : "" width: emblemSize; height: emblemSize visible: emblems && emblems[0] ? true : false anchors.right: parent.right anchors.bottom: parent.bottom anchors.margins: 2 } // 左下角 Icon { source: emblems && emblems[1] ? emblems[1] : "" width: emblemSize; height: emblemSize visible: emblems && emblems[1] ? true : false anchors.left: parent.left anchors.bottom: parent.bottom anchors.margins: 2 } // 右上角 Icon { source: emblems && emblems[2] ? emblems[2] : "" width: emblemSize; height: emblemSize visible: emblems && emblems[2] ? true : false anchors.right: parent.right anchors.top: parent.top anchors.margins: 2 } // 左上角 Icon { source: emblems && emblems[3] ? emblems[3] : "" width: emblemSize; height: emblemSize visible: emblems && emblems[3] ? true : false anchors.left: parent.left anchors.top: parent.top anchors.margins: 2 } function isValidDesktopApp(uri) { return uri.endsWith(".desktop") } } peony/peony-qt-desktop/qml-desktop/autoArrangeControler.js0000664000175000017500000000434615154271070023024 0ustar fengfeng // 自动排序函数 function arrangeIcons(desktopIconView, availableRowCount, availableColumnCount) { if (!desktopIconView || typeof desktopIconView.count === "undefined") { console.error("无效的 desktopIconView 参数"); return; } var allItems = []; for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item) { allItems.push({ uri: item.uri, pos: item.pos }); } } var sortedItems = sortItemsByGrid(allItems) for (var i = 0; i < desktopIconView.count; i++) { var item = desktopIconView.itemAt(i); if (item) { var index = sortedItems.findIndex(sortedItems => sortedItems.uri === item.uri); if (index !== -1) { console.log("找到", item.uri, ",位置:", allItems[index].pos, ",索引:", index); var newX = Math.floor(index/availableRowCount) var newY = index%availableColumnCount item.pos.x = newX; item.pos.y = newY; item.x = newX*desktopIconView.gridWidth item.y = newY*desktopIconView.gridheight console.log("update position", item.uri, item.pos); } else { console.log("未找到", item.uri); } } } } function sortItemsByGrid(items) { // 按 y (行) 升序,再按 x (列) 升序 items.sort(function(a, b) { if (a.pos.y !== b.pos.y) { return a.pos.y - b.pos.y; // 先按 y 排序 } else { return a.pos.x - b.pos.x; // 同一行再按 x 排序 } }); return items; } //function arrangeIcons() { // var columns = Math.floor(desktopIconView.width / (80 + 10)) // 每列图标数 // for (var i = 0; i < model.count; ++i) { // var column = i % columns // var row = Math.floor(i / columns) // model.setProperty(i, "x", column * (80 + 10)) // model.setProperty(i, "y", row * (80 + 10)) // } //} //function getIndexByUri(uri) { // for (var i = 0; i < desktopIconView.count; i++) { // if (desktopIconView.itemAt(i).uri === uri) return i; // } // return -1; //} peony/peony-qt-desktop/desktop-window-manager.h0000664000175000017500000000603015154271106020615 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #ifndef DESKTOPWINDOWMANAGER_H #define DESKTOPWINDOWMANAGER_H #include #include #include #include #include #include class DesktopBackgroundWindow; class AdvancedDesktopIconView; class FileActionController; class GlobalSettingsAdapter; class BackgroundManager; class QPoint; class QQuickView; namespace Peony { class AdvancedDesktopItemModel; class DesktopItemProxyModel; class PeonyDbusService; } class DesktopWindowManager : public QObject { Q_OBJECT public: explicit DesktopWindowManager(QObject *parent = nullptr); ~DesktopWindowManager(); static DesktopWindowManager *getInstance(); QPoint postion(const QString &uri); QMap getAllItemPos(const QStringList &uris); void createIdAndPos(int *id, QPoint *pos); void markCreateFilePos(const QPoint &pos); void initializeWithScreens(); public Q_SLOTS: void addQmlDesktop(QScreen *screen); void switchDisplayMode(); void singleScreenMode(); void multiscreenMode(); void relocateIconView(); void initModelFinish(); void raiseWid(); void layoutViewItems(); void clearAllRestoreInfo(); void fileCreated(int id, const QString &uri); void setInfoPos(const QString &uri); Q_INVOKABLE void startInitAnima(); Q_INVOKABLE bool getLockState(); Q_INVOKABLE bool getQuickStartAvailable(); private: void registerCppTypeToQml(); void initializeWindowView(QQuickView *window); void setupWindowConnections(QQuickView* window); void initPeonyDbusService(); Q_SIGNALS: void emitFinish(); void setSortType(int sortType); void setSortOrder(int sortOrder); void modeChanged(); void startInitAnimaRequest(); private: Peony::AdvancedDesktopItemModel *m_model = nullptr; QDBusInterface *m_dbusInterface = nullptr; QPoint m_markMousePressPos = QPoint(-1, -1); int m_markMousePressId = 0; bool m_initMetaInfo = false; bool m_desktopAutoLayout = false; Peony::PeonyDbusService *m_peonyDbusService = nullptr; QTimeLine *m_layoutTimeLine = nullptr; QTimeLine *m_modeTimeLine = nullptr; bool hasUnlockAnima = false; bool isQuickStartAvailable = false; }; #define DESKTOP_MANAGER DesktopWindowManager::getInstance() #endif // DESKTOPWINDOWMANAGER_H peony/peony-qt-desktop/advanced-desktop-item-model.h0000664000175000017500000001102315154271106021473 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #ifndef DESKTOPITEMMODEL_H #define DESKTOPITEMMODEL_H #include #include #include #include #include #include #include #include "user-dir-manager.h" //#include "desktop-icon-view.h" class AdvancedDesktopIconView; namespace Peony { class FileEnumerator; class FileInfo; class FileWatcher; class FileOperationInfo; class AdvancedDesktopIconItem : public QStandardItem { public: explicit AdvancedDesktopIconItem(const QString &text); explicit AdvancedDesktopIconItem(const QString &text, bool fileCreate); void setData(const QVariant &value, int role = Qt::UserRole + 1) override; }; struct IconData { int screenId; QPoint position; QModelIndex modelIndex; QString uri; bool operator<(const IconData &other) const { if (screenId == other.screenId) { if (position.x() == other.position.x()) { return position.y() < other.position.y(); } return position.x() < other.position.x(); } return screenId < other.screenId; } }; class AdvancedDesktopItemModel : public QStandardItemModel { Q_OBJECT public: explicit AdvancedDesktopItemModel(QObject *parent = nullptr); ~AdvancedDesktopItemModel() override; QHash roleNames() const override; const QModelIndex indexFromUri(const QString &uri); QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant getEmblems(const QModelIndex &index) const; Qt::ItemFlags flags(const QModelIndex &index) const override; QMimeData *mimeData(const QModelIndexList& indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; void updateMetaInfo(QStandardItem *item); void getAllRestoreInfo(); void saveExtendItemInfo(); void resetExtendItemInfo(); void clearExtendItemPos(bool saveId = false); void saveExtendItemInfo(int id); std::shared_ptr getFileInfo(const QModelIndex& index) const; void updateTooltips(const QString& uri); Q_SIGNALS: void requestClearIndexWidget(const QStringList &uris = QStringList()); void refreshed(); void prepareRefresh(); void emitFinish(); void sig_relayoutItems(); void sig_fileRemoved(const QString &uri); void sig_fileCreated(int id, const QString &uri); void selectUri(const QString &uri); void idChanged(int id, int oldId, const QStringList &uris); void invalidateFilterRequest(); void setInfoPos(const QString &uri); public Q_SLOTS: void refresh(); void setdata(int i, const QVariant &value, int role = Qt::EditRole); protected Q_SLOTS: void onEnumerateFinished(bool successed); void fileCreated(const QString &uri); void pendingQuery(const QString &uri); private: FileEnumerator *m_enumerator; QList> m_files; QList> m_querying_files; std::shared_ptr m_trash_watcher; std::shared_ptr m_desktop_watcher; std::shared_ptr m_thumbnail_watcher; //just handle the thumbnail created. QStringList m_items_need_relayout; UserdirManager * m_dir_manager; std::shared_ptr m_desktop_info; std::shared_ptr m_renaming_operation_info; QPair m_renaming_file_pos; bool m_showFileExtension = true; QSet m_pending_query_uris; QTimer *m_pending_query_timer = nullptr; mutable QSet m_pendingTooltips; private: void refreshInternal(); QVariant getTooltipForIndex(const QModelIndex &index) const; void setupTooltipConnections(); }; } #endif // DESKTOPITEMMODEL_H peony/peony-qt-desktop/desktop-index-widget.h0000664000175000017500000000335415154271070020274 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPINDEXWIDGET_H #define DESKTOPINDEXWIDGET_H #include #include #include class QTextEdit; namespace Peony { class DesktopIconViewDelegate; class DesktopIndexWidget : public QWidget { Q_OBJECT public: explicit DesktopIndexWidget(DesktopIconViewDelegate *delegate, const QStyleOptionViewItem &option, const QModelIndex &index, QWidget *parent = nullptr); ~DesktopIndexWidget(); bool eventFilter(QObject *watched, QEvent *event) override; protected: void paintEvent(QPaintEvent *e); void mousePressEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void updateItem(); private: QStyleOptionViewItem m_option; QModelIndex m_index; const DesktopIconViewDelegate *m_delegate; bool b_elide_text = false; const int ELIDE_TEXT_LENGTH = 40; }; } #endif // DESKTOPINDEXWIDGET_H peony/peony-qt-desktop/desktop-background-manager.h0000664000175000017500000000435215154271070021432 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DESKTOPBACKGROUNDMANAGER_H #define DESKTOPBACKGROUNDMANAGER_H #include #include class QGSettings; class QVariantAnimation; class QTimeLine; class DesktopBackgroundManager : public QObject { friend class DesktopWindow; Q_OBJECT public: static DesktopBackgroundManager *globalInstance(); QPixmap getBackPixmap() const; QPixmap getFrontPixmap() const; QVariantAnimation *getAnimation() const; bool getUsePureColor() const; QColor getColor() const; bool getPaintBackground() const; const QString &getBackgroundOption(); void forceUpdateBackground(); bool AnimationRunning(); Q_SIGNALS: void screensUpdated(); private: explicit DesktopBackgroundManager(QObject *parent = nullptr); void initGSettings(); void updateScreens(); void initBackground(); void setBackground(); QString getAccountBackground(); void setAccountBackground(); protected: void switchBackground(); QPixmap m_backPixmap; QPixmap m_frontPixmap; QPixmap m_pendingPixmap; QGSettings *m_backgroundSettings = nullptr; QVariantAnimation *m_animation = nullptr; bool m_usePureColor = false; QColor m_color = Qt::black; bool m_paintBackground = false; QTimeLine *m_timeLine = nullptr; QString m_current_bg_path; QString m_backgroundOption; bool m_shouldSyncAccountBackground = true; bool m_animationRunning = false; }; #endif // DESKTOPBACKGROUNDMANAGER_H peony/peony-qt-desktop/desktop-icon-view.cpp0000664000175000017500000034474515154271070020153 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-desktop-application.h" #include "desktop-icon-view.h" #include "icon-view-style.h" #include "desktop-icon-view-delegate.h" #include "desktop-item-model.h" #include "desktop-item-proxy-model.h" #include "file-operation-manager.h" #include "file-move-operation.h" #include "file-copy-operation.h" #include "file-trash-operation.h" #include "clipboard-utils.h" #include "properties-window.h" #include "file-utils.h" #include "file-operation-utils.h" #include "desktop-menu.h" #include "file-item-model.h" #include "file-info-job.h" #include "file-launch-manager.h" #include "file-launch-action.h" #include #include #include "desktop-index-widget.h" #include "file-meta-info.h" #include "global-settings.h" #include "audio-play-manager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Peony; #define MINGRIDSIZE 64 #define MAXGRIDSIZE 200 #define ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-item-position" #define PANEL_SETTINGS "org.ukui.panel.settings" #define UKUI_STYLE_SETTINGS "org.ukui.style" #define RESTORE_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-item-position" #define RESTORE_EXTEND_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-extend-item-position" #define RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE "metadata::peony-qt-desktop-restore-singlescreen-item-position" static bool iconSizeLessThan (const QPair &p1, const QPair &p2); static bool posLessThan(const int& p1, const int& p2); static bool refreshing = false; static bool g_isHighVersion = false; //static bool g_initialized = false; int getGreatestCommonDivisor(QList &position) { std::stable_sort(position.begin(), position.end(), posLessThan); QList spacingList; for (int i = 0; i < position.size() - 1; i++) { int spacing = position[i+1] - position[i]; if (spacing < MINGRIDSIZE && 0 < spacing) { if(0 < spacingList.count()) { spacingList.pop_back(); } i++; continue; } if (!spacingList.contains(spacing) && 0 != spacing) { spacingList.append(spacing); } } int gridWidth = spacingList.size() > 0 ? spacingList[0] : 0; for (int i = 0; i < spacingList.size() - 1; i++) { int num1 = spacingList[i]; int num2 = spacingList[i+1]; int temp = 0; if (num1 < num2) { temp = num1; num1 = num2; num2 = temp; } while(num2 != 0) { temp = num1%num2; num1 = num2; num2 = temp; } if (num1 > MINGRIDSIZE && num1 < gridWidth) { gridWidth = num1; } } return gridWidth; } DesktopIconView::DesktopIconView(QWidget *parent) : QListView(parent) { //m_refresh_timer.setInterval(500); //m_refresh_timer.setSingleShot(true); QString localeName = QLocale::system().name(); if (localeName.contains("ug") || localeName.contains("kk") || localeName.contains("ky")) { setLayoutDirection(Qt::RightToLeft); } setAttribute(Qt::WA_AlwaysStackOnTop); installEventFilter(this); initShoutCut(); //initMenu(); initDoubleClick(); connect(qApp, &QApplication::paletteChanged, this, [=]() { viewport()->update(); }); auto globalSettings = Peony::GlobalSettings::getInstance(); QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { m_radius = 0; } else { m_radius = 6; } connect(globalSettings, &GlobalSettings::valueChanged, this, [=](const QString &key){ if (key == "widgetThemeName") { QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { m_radius = 0; } else { m_radius = 6; } viewport()->update(); } }); m_edit_trigger_timer.setSingleShot(true); m_edit_trigger_timer.setInterval(3000); m_last_index = QModelIndex(); setAttribute(Qt::WA_TranslucentBackground); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //fix rubberband style. setStyle(DirectoryView::IconViewStyle::getStyle()); setItemDelegate(new DesktopIconViewDelegate(this)); setDefaultDropAction(Qt::MoveAction); setSelectionMode(QListView::ExtendedSelection); setEditTriggers(QListView::NoEditTriggers); setViewMode(QListView::IconMode); setMovement(QListView::Snap); setFlow(QListView::TopToBottom); setResizeMode(QListView::Adjust); setWordWrap(true); setDragDropMode(QListView::DragDrop); setSelectionMode(QListView::ExtendedSelection); auto zoomLevel = this->zoomLevel(); setDefaultZoomLevel(zoomLevel); //task#74174 修改model为全局的 m_model = PeonyDesktopApplication::getModel(); m_proxy_model = new DesktopItemProxyModel(m_model); m_proxy_model->setSourceModel(m_model); m_proxy_model->setId(m_id); QString version = qVersion(); if (version >= QString("5.14.0")) { g_isHighVersion = true; } else { g_isHighVersion = false; } qDebug() << "qt version: " << version << g_isHighVersion; connect(m_model, &QAbstractItemModel::rowsRemoved, this, [=](){ for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } }); connect(m_proxy_model, &QAbstractItemModel::rowsRemoved, this, [=](){ auto itemsNeedRelayout = m_model->m_items_need_relayout; if (!itemsNeedRelayout.isEmpty()) { this->relayoutExsitingItems(itemsNeedRelayout); } for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } }); //task#74174 扩展模式下支持拖拽图标放置到扩展屏,拖拽后需要通过设置的id重新过滤 connect(this, &DesktopIconView::updateView, this, [=]() { m_proxy_model->invalidateModel(); for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) { updateItemPosByUri(uri, pos); } else { ensureItemPosByUri(uri); } } checkItemsOver(); }); connect(m_model, &DesktopItemModel::refreshed, this, [=]() { this->setCursor(QCursor(Qt::ArrowCursor)); refreshing = false; // check if there are items overlapped. QTimer::singleShot(150, this, [=](){ initViewport(); checkItemsOver(); // check icon is out of screen auto geo = viewport()->rect(); if (geo.width() != 0 && geo.height() != 0) { for (auto rec : m_item_rect_hash.values()) { if (!geo.contains(rec)) { resolutionChange(); break; } } } auto app = static_cast(qApp); Q_EMIT app->emitFinish(); qInfo()<<"desktop finish"; }); return; }); connect(m_model, &DesktopItemModel::refreshFilter, this, [=]() { m_proxy_model->setShowHidden(GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool()); QTimer::singleShot(100, this, [=]() { resetAllItemPositionInfos(); refresh(); }); }); connect(m_model, &DesktopItemModel::requestClearIndexWidget, this, &DesktopIconView::clearAllIndexWidgets); connect(m_proxy_model, &QSortFilterProxyModel::layoutChanged, this, [=]() { //qDebug()<<"layout changed=========================\n\n\n\n\n"; if (m_proxy_model->getSortType() == DesktopItemProxyModel::Other) { return; } if (m_proxy_model->sortColumn() != 0) { return; } //qDebug()<<"save===================================="; QTimer::singleShot(100, this, [=]() { //this->saveAllItemPosistionInfos(); }); }); connect(m_proxy_model, &DesktopItemProxyModel::showHiddenFile, this, [=]() { // QTimer::singleShot(100, this, [=]() { // resetAllItemPositionInfos(); // refresh(); // }); //fix#181595 桌面图标设置隐藏后排序 Q_EMIT updateView(); }); connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (SHOW_HIDDEN_PREFERENCE == key) { m_show_hidden= GlobalSettings::getInstance()->getValue(key).toBool(); } }); connect(this, &QListView::iconSizeChanged, this, [=]() { //qDebug()<<"save============="; this->setSortType(GlobalSettings::getInstance()->getValue(LAST_DESKTOP_SORT_ORDER).toInt()); QTimer::singleShot(100, this, [=]() { bool isFull = false; auto geo = viewport()->rect(); this->saveAllItemPosistionInfos(); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); m_item_rect_hash.insert(index.data(Qt::UserRole).toString(), visualRectInRightToLeft(index)); updateItemPosByUri(index.data(Qt::UserRole).toString(), visualRectInRightToLeft(index).topLeft()); if (geo.width() != 0 && geo.height() != 0) { QRect itemRect = visualRectInRightToLeft(index); if (verifyBoundaries(itemRect, Direction::All)) { isFull = true; } } } if (isFull) resolutionChange(); }); }); setModel(m_proxy_model); //m_proxy_model->sort(0); m_peonyDbusSer = new PeonyDbusService(this); m_peonyDbusSer->DbusServerRegister(); setMouseTracking(true);//追踪鼠标 connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString &key) { if (key == DISPLAY_STANDARD_ICONS || key == HOME_ICON_VISIBLE || key == TRASH_ICON_VISIBLE || key == COMPUTER_ICON_VISIBLE) { //this->refresh(); m_proxy_model->invalidate(); this->resolutionChange(); if (isItemsOverlapped()) { // refresh again? this->refresh(); QStringList needRelayoutItems; QRegion notEmptyRegion; for (auto value : m_item_rect_hash.values()) { auto keys = m_item_rect_hash.keys(value); if (keys.count() > 1) { keys.pop_front(); for (auto key : keys) { needRelayoutItems.append(key); m_item_rect_hash.remove(key); } } notEmptyRegion += value; } int gridWidth = gridSize().width(); int gridHeight = gridSize().height(); // aligin exsited rect int marginTop = notEmptyRegion.boundingRect().top(); while (marginTop - gridHeight > 0) { marginTop -= gridHeight; } int marginLeft = notEmptyRegion.boundingRect().left(); while (marginLeft - gridWidth > 0) { marginLeft -= gridWidth; } marginLeft = marginLeft < 0? 0: marginLeft; marginTop = marginTop < 0? 0: marginTop; int posX = marginLeft; int posY = marginTop; for (auto item : needRelayoutItems) { QRect itemRect = QRect(posX, posY, gridWidth, gridHeight); while (notEmptyRegion.contains(itemRect.center())) { if (posY + 2*gridHeight > this->viewport()->height()) { posY = marginTop; posX += gridWidth; } else { posY += gridHeight; } if (this->viewport()->geometry().contains(itemRect.topLeft())) { itemRect.moveTo(posX, posY); } else { itemRect.moveTo(0, 0); } } notEmptyRegion += itemRect; m_item_rect_hash.insert(item, itemRect); } for (auto uri : m_item_rect_hash.keys()) { auto rect = m_item_rect_hash.value(uri); updateItemPosByUri(uri, rect.topLeft()); setFileMetaInfoPos(uri, rect.topLeft()); } this->saveAllItemPosistionInfos(); } } }); //fix task bar overlap with desktop icon and can drag move issue //bug #27811,33188 if (QGSettings::isSchemaInstalled(PANEL_SETTINGS)) { //panel monitor if (!m_panelSetting) m_panelSetting = new QGSettings(PANEL_SETTINGS, QByteArray(), this); int position = m_panelSetting->get("panelposition").toInt(); int margins = m_panelSetting->get("panelsize").toInt(); connect(m_panelSetting, &QGSettings::changed, this, [=](const QString &key){ if (key == "panelposition" || key == "panelsize") { int position = m_panelSetting->get("panelposition").toInt(); int margins = m_panelSetting->get("panelsize").toInt(); setMarginsBasedOnPosition(position, margins); if (m_initialized) resolutionChange(); } }); setMarginsBasedOnPosition(position, margins); } // try fixing #63358 if (QGSettings::isSchemaInstalled(UKUI_STYLE_SETTINGS)) { auto styleSettings = new QGSettings(UKUI_STYLE_SETTINGS, QByteArray(), this); connect(styleSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == "iconThemeName") { QTimer::singleShot(1000, viewport(), [=]{ viewport()->update(); }); } }); } } void DesktopIconView::setMarginsBasedOnPosition(int position, int margins) { switch (position) { case 1: { setViewportMargins(0, margins, 0, 0); m_panel_margin = QMargins(0, margins, 0, 0); break; } case 2: { setViewportMargins(margins, 0, 0, 0); m_panel_margin = QMargins(margins, 0, 0, 0); break; } case 3: { setViewportMargins(0, 0, margins, 0); m_panel_margin = QMargins(0, 0, margins, 0); break; } default: { setViewportMargins(0, 0, 0, margins); m_panel_margin = QMargins(0, 0, 0, margins); break; } } } void DesktopIconView::setId(int id) { m_proxy_model->setId(id); m_id = id ; } DesktopIconView::~DesktopIconView() { delete m_peonyDbusSer; //saveAllItemPosistionInfos(); } bool DesktopIconView::eventFilter(QObject *obj, QEvent *e) { //fixme: //comment to fix change night style refresh desktop issue if (e->type() == QEvent::StyleChange || e->type() == QEvent::ApplicationFontChange || e->type() == QEvent::FontChange) { auto type = e->type(); if (m_proxy_model) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } QTimer::singleShot(0, this, [=]{ for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } }); } } return false; } static bool meetSpecialConditions(const QStringList& selectedUris) { /* The desktop home directory, computer, and trash do not allow operations such as copying, cutting, * deleting, renaming, moving, or using shortcut keys for corresponding operations.add by 2021/06/17 */ static QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (selectedUris.contains("computer:///") ||selectedUris.contains("trash:///") ||selectedUris.contains(homeUri)){ return true; } return false; } void DesktopIconView::initShoutCut() { QAction *copyAction = new QAction(this); copyAction->setShortcut(QKeySequence::Copy); connect(copyAction, &QAction::triggered, [=]() { auto selectedUris = this->getSelections(); if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)){ ClipboardUtils::setClipboardFiles(selectedUris, false); this->viewport()->update(); } }); addAction(copyAction); QAction *cutAction = new QAction(this); cutAction->setShortcut(QKeySequence::Cut); connect(cutAction, &QAction::triggered, [=]() { auto selectedUris = this->getSelections(); if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)) { ClipboardUtils::setClipboardFiles(selectedUris, true); //this->update(); this->viewport()->update(); } }); addAction(cutAction); QAction *pasteAction = new QAction(this); pasteAction->setShortcut(QKeySequence::Paste); connect(pasteAction, &QAction::triggered, [=]() { if (qApp->clipboard()->mimeData()->hasFormat ("uos/remote-copy")) { auto op = ClipboardUtils::pasteClipboardFiles(this->getDirectoryUri()); if (!op) { viewport()->update(); } } else { //auto clipUris = ClipboardUtils::getClipboardFilesUris(); if (ClipboardUtils::getInstance()->isClipboardHasFiles() && !meetSpecialConditions(this->getSelections())) { auto op = ClipboardUtils::pasteClipboardFiles(this->getDirectoryUri()); if (!op) { viewport()->update(); } } } }); addAction(pasteAction); //add CTRL+D for delete operation auto trashAction = new QAction(this); trashAction->setShortcuts(QList()<setShortcut(QKeySequence::Undo); connect(undoAction, &QAction::triggered, [=]() { // do not relayout item with undo. setRenaming(true); FileOperationManager::getInstance()->undo(); }); addAction(undoAction); QAction *redoAction = new QAction(this); redoAction->setShortcut(QKeySequence::Redo); connect(redoAction, &QAction::triggered, [=]() { // do not relayout item with redo. setRenaming(true); FileOperationManager::getInstance()->redo(); }); addAction(redoAction); QAction *zoomInAction = new QAction(this); zoomInAction->setShortcut(QKeySequence::ZoomIn); connect(zoomInAction, &QAction::triggered, [=]() { this->zoomIn(); }); addAction(zoomInAction); QAction *zoomOutAction = new QAction(this); zoomOutAction->setShortcut(QKeySequence::ZoomOut); connect(zoomOutAction, &QAction::triggered, [=]() { this->zoomOut(); }); addAction(zoomOutAction); QAction *renameAction = new QAction(this); renameAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_E)); connect(renameAction, &QAction::triggered, [=]() { auto selections = this->getSelections(); if (selections.count() == 1 && !meetSpecialConditions(selections)) { this->editUri(selections.first()); } }); addAction(renameAction); QAction *removeAction = new QAction(this); removeAction->setShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete)); connect(removeAction, &QAction::triggered, [=]() { auto selectedUris = this->getSelections(); if (!meetSpecialConditions(selectedUris)){ qDebug() << "delete" << selectedUris; clearAllIndexWidgets(); FileOperationUtils::executeRemoveActionWithDialog(selectedUris); } }); addAction(removeAction); QAction *helpAction = new QAction(this); helpAction->setShortcut(Qt::Key_F1); connect(helpAction, &QAction::triggered, this, [=]() { PeonyDesktopApplication::showGuide(); }); addAction(helpAction); auto propertiesWindowAction = new QAction(this); propertiesWindowAction->setShortcuts(QList()<getSelections().count() > 0) { menu.showProperties(this->getSelections()); } else { QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); menu.showProperties(desktopPath); } }); addAction(propertiesWindowAction); auto newFolderAction = new QAction(this); newFolderAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_N)); connect(newFolderAction, &QAction::triggered, this, [=]() { CreateTemplateOperation op(this->getDirectoryUri(), CreateTemplateOperation::EmptyFolder, tr("New Folder")); op.run(); auto targetUri = op.target(); QTimer::singleShot(500, this, [=]() { this->scrollToSelection(targetUri); }); }); addAction(newFolderAction); QAction *refreshWinAction = new QAction(this); refreshWinAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); connect(refreshWinAction, &QAction::triggered, [=]() { this->refresh(); }); addAction(refreshWinAction); QAction *reverseSelectAction = new QAction(this); reverseSelectAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L)); connect(reverseSelectAction, &QAction::triggered, [=]() { this->invertSelections(); }); addAction(reverseSelectAction); QAction *normalIconAction = new QAction(this); normalIconAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); connect(normalIconAction, &QAction::triggered, [=]() { if (this->zoomLevel() == DesktopIconView::Normal) return; this->setDefaultZoomLevel(DesktopIconView::Normal); }); addAction(normalIconAction); auto refreshAction = new QAction(this); refreshAction->setShortcut(Qt::Key_F5); connect(refreshAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshAction); QAction *editAction = new QAction(this); editAction->setShortcuts(QList()<getSelections(); if (selections.count() == 1) { this->editUri(selections.first()); } else if (selections.count() > 1) { this->editUris(selections); } }); addAction(editAction); auto settings = GlobalSettings::getInstance(); m_show_hidden = settings->isExist(SHOW_HIDDEN_PREFERENCE)? settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(): false; //show hidden action QAction *showHiddenAction = new QAction(this); showHiddenAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_H)); addAction(showHiddenAction); connect(showHiddenAction, &QAction::triggered, this, [=]() { this->setShowHidden(); }); auto cancelAction = new QAction(this); cancelAction->setShortcut(Qt::Key_Escape); connect(cancelAction, &QAction::triggered, [=]() { if (Peony::ClipboardUtils::isClipboardHasFiles()) { Peony::ClipboardUtils::clearClipboard(); this->update(); } }); addAction(cancelAction); } void DesktopIconView::initMenu() { return; setContextMenuPolicy(Qt::CustomContextMenu); // menu connect(this, &QListView::customContextMenuRequested, this, [=](const QPoint &pos) { // FIXME: use other menu qDebug() << "menu request in desktop icon view"; if (!this->indexAt(pos).isValid()) { this->clearSelection(); } else { this->clearSelection(); this->selectionModel()->select(this->indexAt(pos), QItemSelectionModel::Select); } QTimer::singleShot(1, [=]() { DesktopMenu menu(this); if (this->getSelections().isEmpty()) { auto action = menu.addAction(tr("Set Background")); connect(action, &QAction::triggered, [=]() { //go to control center set background PeonyDesktopApplication::gotoSetBackground(); }); } menu.exec(QCursor::pos()); auto urisToEdit = menu.urisToEdit(); if (urisToEdit.count() == 1) { QTimer::singleShot( 100, this, [=]() { this->editUri(urisToEdit.first()); }); } }); }, Qt::UniqueConnection); } void DesktopIconView::setShowHidden() { m_show_hidden = !GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool(); m_proxy_model->setShowHidden(m_show_hidden); //fix show hidden file desktop icons overlapped issue //QTimer::singleShot(100, this, [=]() { //resetAllItemPositionInfos(); //refresh(); //}); //fix#181595 桌面图标设置隐藏后排序 Q_EMIT updateView(); } void DesktopIconView::resolutionChange() { qInfo()<<"start resolutionChange()"; QSize screenSize = this->viewport()->size(); // do not relayout items while screen size is empty. if (screenSize.isEmpty()) { qWarning()<<"screen size is not available"; return; } if (m_item_rect_hash.isEmpty()) { return; } float iconWidth = 0; float iconHeigth = 0; // icon size QSize icon = gridSize(); iconWidth = icon.width(); iconHeigth = icon.height(); QRect screenRect = QRect(0, 0, screenSize.width(), screenSize.height()); qInfo()<<"screen rect:"<> newPosition; for (auto i = m_item_rect_hash.constBegin(); i != m_item_rect_hash.constEnd(); ++i) { newPosition << QPair(i.value(), i.key()); } // not get current size if (iconWidth == 0 || iconHeigth == 0) { qDebug() << "Unable to get icon size, need to get it another way!"; return; } // qDebug() << "icon width: " << iconWidth << " icon heigth: " << iconHeigth; // qDebug() << "width:" << screenSize.width() << " height:" << screenSize.height(); std::stable_sort(newPosition.begin(), newPosition.end(), iconSizeLessThan); //m_item_rect_hash.clear(); // only reset items over viewport. QRegion notEmptyRegion; QList> needChanged; QSize size; for (auto pair : newPosition) { QRect itemRect = pair.first; //itemRect.moveTo(itemRect.topLeft() + offset()); if (verifyBoundaries(itemRect, Direction::All)) { needChanged.append(pair); if (!m_resolution_item_rect.contains(pair.second)) { // remember item position before resolution changed. m_resolution_item_rect.insert(pair.second, m_item_rect_hash.value(pair.second)); //m_item_rect_hash.remove(pair.second); } } else { QModelIndex srcIndex = m_model->indexFromUri(pair.second); QModelIndex index = m_proxy_model->mapFromSource(srcIndex); QRect rect = getDataRect(index); rect.moveTo(m_item_rect_hash.value(pair.second).topLeft()); size = rect.size(); notEmptyRegion += rect; } } qInfo()<<"need changed item"<= 0) { marginTop -= iconHeigth; } int marginLeft = notEmptyRegion.boundingRect().left(); while (marginLeft - iconWidth >= 0) { marginLeft -= iconWidth; } marginTop = marginTop <= 0? offset().y(): marginTop; marginLeft = marginLeft < 0? 0: marginLeft; if (!needChanged.isEmpty()) { qInfo()<<"屏幕过小,有元素超过屏幕范围"; int posX = marginLeft; int posY = marginTop; for (int i = 0; i < needChanged.count(); i++) { QSize iconSize = m_item_rect_hash.value(needChanged.at(i).second).size(); while (notEmptyRegion.intersects(QRect(posX, posY, iconWidth, iconHeigth))) { QRect tmpRect = QRect(QPoint(posX, posY+iconHeigth), iconSize); if (verifyBoundaries(tmpRect, Direction::Bottom)) { posY = marginTop; posX += iconWidth; } else { posY += iconHeigth; } } QRect newRect = QRect(QPoint(posX, posY), iconSize); if (verifyBoundaries(newRect, Direction::Right)) { newRect.moveTo(0, 0); } m_item_rect_hash.insert(needChanged.at(i).second, newRect); newRect.setSize(size); notEmptyRegion += newRect; } } else { qInfo()<<"没有元素超过屏幕范围"; QStringList itemNeedBeRelayout; qInfo()<<"尝试恢复超过屏幕范围的元素" < destoryItemMap; for (auto uri : m_resolution_item_rect.keys()) { m_storageBox.removeOne(uri); auto originalRect = m_resolution_item_rect.value(uri); //优先恢复主屏的图标 if (m_model->m_destoryItems.contains(uri)) { destoryItemMap.insert(uri, originalRect); continue; } //QRect itemRect = originalRect; if (!verifyBoundaries(originalRect, Direction::All)) { m_item_rect_hash.insert(uri, originalRect); m_resolution_item_rect.remove(uri); } else { m_item_rect_hash.remove(uri); itemNeedBeRelayout< screenSize.height()) { // posY = marginTop; // posX += iconWidth; // } else { // posY += iconHeigth; // } // } // QRect newRect = QRect(QPoint(posX, posY), gridSize()); // if (posX + iconWidth > screenSize.width()) { // newRect.moveTo(0, 0); // } // notEmptyRegion += newRect; // m_item_rect_hash.insert(needChanged.at(i).second, newRect); // } // // try restore items which's positions changed by resolution changed. // QStringList needRelayoutItems2; // for (auto uri : m_resolution_item_rect.keys()) { // auto rect = m_resolution_item_rect.value(uri); // if (screenRect.contains(rect)) { // m_item_rect_hash.insert(uri, rect); // } else { // // need be relayout. // needRelayoutItems2<saveAllItemPosistionInfos(); } void DesktopIconView::openFileByUri(QString uri) { auto info = FileInfo::fromUri(uri); auto job = new FileInfoJob(info); job->setAutoDelete(); job->connect(job, &FileInfoJob::queryAsyncFinished, [=]() { if ((info->isDir() || info->isVolume() || info->isVirtual())) { QDir dir(info->filePath()); if (! dir.exists()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); auto result = QMessageBox::question(nullptr, tr("Open Link failed"), tr("File not exist, do you want to delete the link file?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (result == QMessageBox::Yes) { qDebug() << "Delete unused symbollink in desktop."; QStringList selections; selections.push_back(uri); FileOperationUtils::trash(selections, true); } return; } if (! info->uri().startsWith("trash://") && ! info->uri().startsWith("computer://") && ! info->canExecute()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); QMessageBox::critical(nullptr, tr("Open failed"), tr("Open directory failed, you have no permission!")); return; } #ifdef USE_QPROCESS_LAUNCH_DIR #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; QUrl url = uri; p.setProgram("peony"); p.setArguments(QStringList() << url.toEncoded() <<"%U&"); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); QRect rect = info.get()->property("iconGeometry").toRect(); #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY if (rect.isValid()) data.setIconGeometry(rect); #endif data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()<lauchFileAsync(); action->deleteLater(); #endif } else { if (!(info->isDesktopFile() && execSharedFileLink(uri))) { FileLaunchManager::openAsync(uri, false, false); } } this->clearSelection(); }); job->queryAsync(); } void DesktopIconView::initDoubleClick() { connect(this, &QListView::activated, this, [=](const QModelIndex &index) { qDebug() << "double click" << index.data(FileItemModel::UriRole); auto uri = index.data(FileItemModel::UriRole).toString(); openFileByUri(uri); }, Qt::UniqueConnection); } void DesktopIconView::saveAllItemPosistionInfos() { //qDebug()<<"======================save"; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); auto indexRect = visualRectInRightToLeft(index); QStringList topLeft; topLeft<setMetaInfoStringList(ITEM_POS_ATTRIBUTE, topLeft); QRect rect(mapToGlobal(indexRect.topLeft())*qApp->devicePixelRatio(), indexRect.size()*qApp->devicePixelRatio()); FileInfo::fromUri(index.data(Qt::UserRole).toString()).get()->setProperty("iconGeometry", rect); } } //qDebug()<<"======================save finished"; } void DesktopIconView::saveItemPositionInfo(const QString &uri) { return; } void DesktopIconView::resetAllItemPositionInfos() { if (!m_proxy_model) return; clearAllRestoreInfo(); m_item_rect_hash.clear(); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); auto indexRect = visualRectInRightToLeft(index); QStringList topLeft; topLeft<setMetaInfoStringList(ITEM_POS_ATTRIBUTE, tmp); FileInfo::fromUri(index.data(Qt::UserRole).toString()).get()->setProperty("iconGeometry", QVariant()); } } } void DesktopIconView::resetItemPosistionInfo(const QString &uri) { return; } void DesktopIconView::updateItemPosistions(const QString &uri) { return; } QPoint DesktopIconView::getFileMetaInfoPos(const QString &uri) { auto value = m_item_rect_hash.value(uri); if (!value.isEmpty()) return value.topLeft(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { auto list = metaInfo->getMetaInfoStringList(ITEM_POS_ATTRIBUTE); if (!list.isEmpty()) { if (list.count() == 2) { int top = list.first().toInt(); int left = list.at(1).toInt(); if (top >= 0 && left >= 0) { QPoint p(left, top); return p; } } } } return QPoint(-1, -1); } void DesktopIconView::setFileMetaInfoPos(const QString &uri, const QPoint &pos) { auto delegate = qobject_cast(itemDelegate()); QSize iconSize = delegate->sizeHint(QStyleOptionViewItem(), QModelIndex()); m_item_rect_hash.remove(uri); m_item_rect_hash.insert(uri, QRect(pos, iconSize)); QRect rect(mapToGlobal(pos)*qApp->devicePixelRatio(), iconSize*qApp->devicePixelRatio()); FileInfo::fromUri(uri).get()->setProperty("iconGeometry", rect); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList topLeft; topLeft<setMetaInfoStringList(ITEM_POS_ATTRIBUTE, topLeft); metaInfo->setMetaInfoInt("peony-qt-desktop-id", m_id); } } QMap DesktopIconView::getCurrentItemRects() { return m_item_rect_hash; } int DesktopIconView::removeItemRect(const QString &uri) { return m_item_rect_hash.remove(uri); } void DesktopIconView::updateItemPosByUri(const QString &uri, const QPoint &pos) { auto delegate = qobject_cast(itemDelegate()); QSize iconSize = delegate->sizeHint(QStyleOptionViewItem(), QModelIndex()); auto srcIndex = m_model->indexFromUri(uri); auto index = m_proxy_model->mapFromSource(srcIndex); if (index.isValid()) { setPositionForIndex(pos, index); m_item_rect_hash.remove(uri); m_item_rect_hash.insert(uri, QRect(pos, iconSize)); QRect rect(mapToGlobal(pos)*qApp->devicePixelRatio(), iconSize*qApp->devicePixelRatio()); FileInfo::fromUri(uri).get()->setProperty("iconGeometry", rect); //qDebug()<<"DesktopIconView::updateItemPosByUri"<indexFromUri(uri); auto index = m_proxy_model->mapFromSource(srcIndex); auto rect = visualRectInRightToLeft(index); if (index.isValid()) { m_item_rect_hash.remove(uri); m_item_rect_hash.insert(uri, rect); setFileMetaInfoPos(uri, rect.topLeft()); } } const QStringList DesktopIconView::getSelections() { QStringList uris; auto indexes = selectionModel()->selection().indexes(); for (auto index : indexes) { uris<rowCount(); i++) { auto index = m_proxy_model->index(i, 0); uris<rowCount(); return 0; } void DesktopIconView::setSelections(const QStringList &uris) { clearSelection(); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); if (uris.contains(index.data(Qt::UserRole).toString())) { selectionModel()->select(index, QItemSelectionModel::Select); } } } void DesktopIconView::invertSelections() { QItemSelectionModel *selectionModel = this->selectionModel(); const QItemSelection currentSelection = selectionModel->selection(); this->selectAll(); selectionModel->select(currentSelection, QItemSelectionModel::Deselect); clearAllIndexWidgets(); } void DesktopIconView::scrollToSelection(const QString &uri) { } int DesktopIconView::getSortType() { return m_proxy_model->getSortType(); } void DesktopIconView::setSortType(int sortType) { clearAllRestoreInfo(); m_item_rect_hash.clear(); //resetAllItemPositionInfos(); m_proxy_model->setSortType(sortType); m_proxy_model->sort(1); m_proxy_model->sort(0, m_proxy_model->sortOrder()); saveAllItemPosistionInfos(); bool isFull = false; auto geo = viewport()->rect(); if (geo.width() != 0 && geo.height() != 0) { for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); m_item_rect_hash.insert(index.data(Qt::UserRole).toString(), visualRectInRightToLeft(index)); updateItemPosByUri(index.data(Qt::UserRole).toString(), visualRectInRightToLeft(index).topLeft()); QRect itemRect = visualRectInRightToLeft(index); //itemRect.moveTo(itemRect.topLeft()+offset()); if (verifyBoundaries(itemRect, Direction::All)) { isFull = true; } } if (isFull) { resolutionChange(); } } } int DesktopIconView::getSortOrder() { return m_proxy_model->sortOrder(); } void DesktopIconView::setSortOrder(int sortOrder) { m_proxy_model->sort(0, Qt::SortOrder(sortOrder)); } void DesktopIconView::editUri(const QString &uri) { clearAllIndexWidgets(); qDebug() << "editUri clearAllIndexWidgets"; auto origin = FileUtils::getOriginalUri(uri); QTimer::singleShot(100, this, [=]() { auto index = m_proxy_model->mapFromSource(m_model->indexFromUri(origin)); edit(index); qDebug() << "editUri index:"<mapFromSource(m_model->indexFromUri(origin))); }); } void DesktopIconView::UpdateToEditUris(QStringList uris) { m_uris_to_edit = uris; } void DesktopIconView::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint) { return; } void DesktopIconView::setCutFiles(const QStringList &uris) { ClipboardUtils::setClipboardFiles(uris, true); this->viewport()->update(); } void DesktopIconView::closeView() { deleteLater(); } void DesktopIconView::wheelEvent(QWheelEvent *e) { if (QApplication::keyboardModifiers() == Qt::ControlModifier) { if (e->delta() > 0) { zoomIn(); } else { zoomOut(); } } } void DesktopIconView::keyPressEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Home: { auto boundingRect = getBoundingRect(); QRect homeRect = QRect(boundingRect.topLeft(), this->gridSize()); while (!indexAt(homeRect.center()).isValid()) { homeRect.translate(0, gridSize().height()); } auto homeIndex = indexAt(homeRect.center()); selectionModel()->select(homeIndex, QItemSelectionModel::SelectCurrent); break; } case Qt::Key_End: { auto boundingRect = getBoundingRect(); QRect endRect = QRect(boundingRect.bottomRight(), this->gridSize()); endRect.translate(-gridSize().width(), -gridSize().height()); while (!indexAt(endRect.center()).isValid()) { endRect.translate(0, -gridSize().height()); } auto endIndex = indexAt(endRect.center()); selectionModel()->select(endIndex, QItemSelectionModel::SelectCurrent); break; } case Qt::Key_Up: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto up = center - QPoint(0, gridSize().height()); auto upIndex = indexAt(up); if (upIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(upIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), upIndex, this); setIndexWidget(upIndex, indexWidget); indexWidget->move(visualRect(upIndex).topLeft()); if (g_isHighVersion) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } } } } return; } case Qt::Key_Down: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto down = center + QPoint(0, gridSize().height()); auto downIndex = indexAt(down); if (downIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(downIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), downIndex, this); setIndexWidget(downIndex, indexWidget); indexWidget->move(visualRect(downIndex).topLeft()); if (g_isHighVersion) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } } } } return; } case Qt::Key_Left: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto left = center - QPoint(gridSize().width(), 0); auto leftIndex = indexAt(left); if (leftIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(leftIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), leftIndex, this); setIndexWidget(leftIndex, indexWidget); indexWidget->move(visualRect(leftIndex).topLeft()); if (g_isHighVersion) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } } } } return; } case Qt::Key_Right: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto right = center + QPoint(gridSize().width(), 0); auto rightIndex = indexAt(right); if (rightIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(rightIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), rightIndex, this); setIndexWidget(rightIndex, indexWidget); if (g_isHighVersion) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } } } } return; } case Qt::Key_Shift: case Qt::Key_Control: m_ctrl_or_shift_pressed = true; m_ctrl_key_pressed = true; break; case Qt::Key_Enter: case Qt::Key_Return: { auto selections = this->getSelections(); if (selections.count() >= 1) { QStringList files; QStringList dirs; for (auto uri : selections) { auto info = Peony::FileInfo::fromUri(uri); if (info->isDir() || info->isVolume()) { dirs<m_items_need_relayout); QListView::rowsInserted(parent, start, end); for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) { updateItemPosByUri(uri, pos); } } // try fix item overrlapped sometimes, link to #58739 //task#74174 扩展模式下支持拖拽图标放置到扩展屏,当扩展屏没有时会崩溃 if (start == end && m_item_rect_hash.count() > 1) { auto index = model()->index(start, 0); auto uri = index.data(Qt::UserRole).toString(); auto itemRectHash = m_item_rect_hash; itemRectHash.remove(uri); QRegion notEmptyRegion; QSize itemRectSize = m_item_rect_hash.first().size(); for (auto rect : itemRectHash.values()) { notEmptyRegion += rect; } auto itemRect = QRect(m_item_rect_hash.value(uri).topLeft(), itemRectSize); if (notEmptyRegion.intersects(itemRect)) { // handle overlapped qWarning()<<"unexpected overrlapped happened"; qDebug()<<"check item rect hash"<m_renaming_file_pos.first || uri == m_model->m_renaming_file_pos.first + ".desktop") { updateItemPosByUri(uri, m_model->m_renaming_file_pos.second); } else if (m_model->m_renaming_operation_info.get()) { if (m_model->m_renaming_operation_info.get()->target() == uri) { updateItemPosByUri(uri, m_model->m_renaming_file_pos.second); } } } clearAllIndexWidgets(); } void DesktopIconView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { for (int row = start; row <= end; row++) { auto uri = model()->index(row, 0).data(Qt::UserRole).toString(); m_item_rect_hash.remove(uri); m_resolution_item_rect.remove(uri); m_storageBox.removeOne(uri); // QPoint itemPos(-1, -1); // setRestoreInfo(uri, itemPos); } qDebug() << "[DesktopIconView::rowsAboutToBeRemove] need relayout:" << m_model->m_items_need_relayout; relayoutExsitingItems(m_model->m_items_need_relayout); QListView::rowsAboutToBeRemoved(parent, start, end); // QTimer::singleShot(1, this, [=](){ // for (auto uri : getAllFileUris()) { // auto pos = getFileMetaInfoPos(uri); // if (pos.x() >= 0) // updateItemPosByUri(uri, pos); // } // }); clearAllIndexWidgets(); } bool DesktopIconView::isItemsOverlapped() { QList itemRects; if (model()) { for (int i = 0; i < model()->rowCount(); i++) { auto index = model()->index(i, 0); auto rect = visualRectInRightToLeft(index); if (itemRects.contains(rect)) return true; itemRects<rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QRect indexRect = visualRectInRightToLeft(index); itemsRegion += indexRect; } return itemsRegion.boundingRect(); } void DesktopIconView::relayoutExsitingItems(const QStringList &uris) { if (uris.isEmpty() || m_item_rect_hash.isEmpty()) { return; } auto allFileUris = getAllFileUris(); auto ensuredItemRectHash = m_item_rect_hash; for (auto uri : uris) { ensuredItemRectHash.remove(uri); } QRegion notEmptyRegion; QSize size = m_item_rect_hash.values().first().size(); for (auto uri : ensuredItemRectHash.keys()) { QModelIndex srcIndex = m_model->indexFromUri(uri); QModelIndex index = m_proxy_model->mapFromSource(srcIndex); QRect rect = getDataRect(index); rect.moveTo(m_item_rect_hash.value(uri).topLeft()); size = rect.size(); notEmptyRegion += rect; } auto grid = this->gridSize(); auto viewRect = this->viewport()->rect(); // aligin exsited rect int marginTop = notEmptyRegion.isEmpty()? offset().y() : notEmptyRegion.boundingRect().top(); while (marginTop - grid.height() >= 0) { marginTop -= grid.height(); } int marginLeft = notEmptyRegion.boundingRect().left(); while (marginLeft - grid.width() >= 0) { marginLeft -= grid.width(); } marginLeft = marginLeft < 0? 0: marginLeft; marginTop = marginTop <= 0? offset().y(): marginTop; for (auto uri : uris) { if (!allFileUris.contains(uri)) continue; auto indexRect = QRect(QPoint(marginLeft, marginTop), size); if (notEmptyRegion.intersects(indexRect)) { // move index to closest empty grid. auto next = indexRect; bool isEmptyPos = false; while (!isEmptyPos) { next.translate(0, grid.height()); if (verifyBoundaries(next, Direction::Bottom)) { int top = next.y(); while (true) { if (top < grid.height()) { break; } top-=grid.height(); } //put item to next column first row next.moveTo(next.x() + grid.width(), top); //如果满了,就放到(0,0) 位置 if (verifyBoundaries(next, Direction::Right)) { if (!m_storageBox.contains(uri)) { m_storageBox.append(uri); } next.moveTo(0, 0); isEmptyPos = true; next.setSize(m_item_rect_hash.values().first().size()); m_item_rect_hash.insert(uri, next); setFileMetaInfoPos(uri, next.topLeft()); qDebug() << "满屏 " << uri << " point:" < destoryItemMap; for (int i = 0; i < model()->rowCount(); i++) { QModelIndex index = model()->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); QRect rect = getDataRect(index); dataSize = rect.size(); if (m_model->m_destoryItems.contains(uri)) { destoryItemMap.insert(uri, rect); continue; } if (!viewport()->rect().contains(rect)) { needRelayoutItems.append(uri); m_resolution_item_rect.insert(uri, rect); continue; } if (notEmptyRegion.intersects(rect)) { needRelayoutItems.append(uri); } else { notEmptyRegion += rect; } } for (auto uri : destoryItemMap.keys()) { auto rect = destoryItemMap.value(uri); if (notEmptyRegion.intersects(rect) || !viewport()->rect().contains(rect)) { needRelayoutItems.append(uri); } else { notEmptyRegion += rect; } } } if (0 == needRelayoutItems.size()) { return; } int gridWidth = gridSize().width(); int gridHeight = gridSize().height(); // aligin exsited rect int marginTop = notEmptyRegion.boundingRect().top(); while (marginTop - gridHeight >= 0) { marginTop -= gridHeight; } int marginLeft = notEmptyRegion.boundingRect().left(); while (marginLeft - gridWidth >= 0) { marginLeft -= gridWidth; } marginLeft = marginLeft < 0? 0: marginLeft; marginTop = marginTop <= 0? offset().y(): marginTop; int posX = marginLeft; int posY = marginTop; qDebug()<<"need relayout items:"<sizeHint(viewOptions(), QModelIndex())); break; case Large: setIconSize(QSize(64, 64)); setGridSize(QSize(15, 15) + itemDelegate()->sizeHint(viewOptions(), QModelIndex())); break; case Huge: setIconSize(QSize(96, 96)); setGridSize(QSize(20, 20) + itemDelegate()->sizeHint(viewOptions(), QModelIndex())); break; default: m_zoom_level = Normal; setIconSize(QSize(48, 48)); setGridSize(QSize(10, 10) + itemDelegate()->sizeHint(viewOptions(), QModelIndex())); break; } clearAllIndexWidgets(); auto metaInfo = FileMetaInfo::fromUri("computer:///"); if (metaInfo) { qDebug()<<"set zoom level"<setMetaInfoInt("peony-qt-desktop-zoom-level", int(m_zoom_level)); } resetAllItemPositionInfos(); if (m_model) { m_model->clearFloatItems(); } auto settings = Peony::GlobalSettings::getInstance(); if (m_initialized && settings) { settings->setValue(DEFAULT_GRID_SIZE, gridSize()); } } DesktopIconView::ZoomLevel DesktopIconView::zoomLevel() const { //FIXME: if (m_zoom_level != Invalid) return m_zoom_level; auto metaInfo = FileMetaInfo::fromUri("computer:///"); if (metaInfo) { auto i = metaInfo->getMetaInfoInt("peony-qt-desktop-zoom-level"); return ZoomLevel(i); } GFile *computer = g_file_new_for_uri("computer:///"); GFileInfo *info = g_file_query_info(computer, "metadata::peony-qt-desktop-zoom-level", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); char* zoom_level = g_file_info_get_attribute_as_string(info, "metadata::peony-qt-desktop-zoom-level"); if (!zoom_level) { //qDebug()<<"======================no zoom level meta info\n\n\n"; g_object_unref(info); g_object_unref(computer); return Normal; } g_object_unref(info); g_object_unref(computer); QString zoomLevel = zoom_level; g_free(zoom_level); //qDebug()<= 0) { updateItemPosByUri(uri, pos); } } } void DesktopIconView::mousePressEvent(QMouseEvent *e) { m_press_pos = e->pos(); // bug extend selection bug m_real_do_edit = false; if (e->modifiers() & Qt::ControlModifier) m_ctrl_key_pressed = true; else { m_ctrl_key_pressed = false; if (! (e->modifiers() & Qt::ShiftModifier)) m_ctrl_or_shift_pressed = false; } auto index = indexAt(e->pos()); if (!m_ctrl_or_shift_pressed) { if (!index.isValid()) { clearAllIndexWidgets(); clearSelection(); } else { m_last_index = index; //fix rename state has no menuRequest issue, bug#44107 if (! m_is_edit) { clearAllIndexWidgets(); //force to recreate new DesktopIndexWidget, to fix not show name issue if (indexWidget(m_last_index)) setIndexWidget(m_last_index, nullptr); auto indexWidget = new DesktopIndexWidget(qobject_cast(itemDelegate()), viewOptions(), m_last_index); setIndexWidget(m_last_index, indexWidget); indexWidget->move(visualRect(m_last_index).topLeft()); } if (g_isHighVersion) { for (auto uri : getAllFileUris()) { auto pos = getFileMetaInfoPos(uri); if (pos.x() >= 0) updateItemPosByUri(uri, pos); } } } } //qDebug()<button() != Qt::LeftButton) { // fix #115384, context menu key issue if (e->button() == Qt::RightButton) { auto index = indexAt(e->pos()); if (!selectedIndexes().contains(index)) { selectionModel()->select(index, QItemSelectionModel::SelectCurrent); } } return; } if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier && selectedIndexes().contains(index)) { m_noSelectOnPress = true; } else { m_noSelectOnPress = false; } QListView::mousePressEvent(e); } void DesktopIconView::mouseReleaseEvent(QMouseEvent *e) { QListView::mouseReleaseEvent(e); m_noSelectOnPress = false; this->viewport()->update(viewport()->rect()); } void DesktopIconView::mouseMoveEvent(QMouseEvent *e) { QModelIndex itemIndex = indexAt(e->pos()); if (!itemIndex.isValid()) { if (QToolTip::isVisible()) { QToolTip::hideText(); } } // fix #220390 if (state() == QListView::DragSelectingState) { auto rubberbandRect = QRect(m_press_pos, e->pos()); rubberbandRect = rubberbandRect.normalized(); rubberbandRect.adjust(-5, -5, 5, 5); viewport()->update(rubberbandRect); } QListView::mouseMoveEvent(e); } void DesktopIconView::mouseDoubleClickEvent(QMouseEvent *event) { QListView::mouseDoubleClickEvent(event); m_real_do_edit = false; } void DesktopIconView::dragEnterEvent(QDragEnterEvent *e) { //qDebug() << "DesktopIconView::dragEnterEvent"; m_real_do_edit = false; auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; //qDebug()<<"drag enter event" <mimeData()->hasUrls()) { if (FileUtils::containsStandardPath(e->mimeData()->urls())) { e->ignore(); return; } e->setDropAction(action); e->accept(); //e->acceptProposedAction(); } if (e->source() == this) { m_drag_indexes = selectedIndexes(); } else { //task#74174 扩展模式下支持拖拽图标放置到扩展屏,获取选中项 //fix bug#165132, do nothing when in rename status auto view = qobject_cast(e->source()); if (view) { m_drag_indexes = view->selectedIndexes(); } } } void DesktopIconView::dragMoveEvent(QDragMoveEvent *e) { //qDebug() << "DesktopIconView::dragMoveEvent"; m_real_do_edit = false; if (e->keyboardModifiers() & Qt::ControlModifier) m_ctrl_key_pressed = true; else m_ctrl_key_pressed = false; auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; if (this == e->source() && !m_is_dragging_to_external) { auto index = indexAt(e->pos()); if (index.isValid() && index != m_last_index) { QHoverEvent he(QHoverEvent::HoverMove, e->posF(), e->posF()); viewportEvent(&he); } else { QHoverEvent he(QHoverEvent::HoverLeave, e->posF(), e->posF()); viewportEvent(&he); } } e->setDropAction(action); if (e->isAccepted()) return; //qDebug()<<"drag move event" <source()) { e->accept(); return QListView::dragMoveEvent(e); } e->accept(); } void DesktopIconView::dropEvent(QDropEvent *e) { // fix #122768, dirty region issues. this->viewport()->update(m_drag_region); m_model->clearFloatItems(); m_real_do_edit = false; //qDebug()<<"drop event"; /*! \todo fix the bug that move drop action can not move the desktop item to correct position. i use copy action to avoid this bug, but the drop indicator is incorrect. */ m_edit_trigger_timer.stop(); if (e->keyboardModifiers() & Qt::ControlModifier) { m_ctrl_key_pressed = true; } else { m_ctrl_key_pressed = false; } auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; if (e->keyboardModifiers() & Qt::ShiftModifier) { action = Qt::TargetMoveAction; } qDebug() << "DesktopIconView dropEvent" <pos()); if (index.isValid() || m_ctrl_key_pressed) { qDebug() <<"DesktopIconView index copyAction:"; auto urls = e->mimeData()->urls(); QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QStringList uris; for (auto url : urls) { if (url.toString() == "computer:///") uris << "computer:///"; else uris << url.path(); } //fix can drag copy home folder issue, link to bug#64824 if (uris.contains(homePath) || uris.contains("computer:///")) return; } if (this == e->source() && !m_ctrl_key_pressed) { qDebug() <<"DesktopIconView index:" <indexUri(m_proxy_model->mapToSource(index)); auto info = FileInfo::fromUri(index.data(Qt::UserRole).toString()); if (!info->isDir()||e->mimeData()->urls().contains(uri)) { return; } bmoved = true; } if (bmoved) { //move file to desktop folder qDebug() << "DesktopIconView move file to folder"; for (auto uuri : e->mimeData()->urls()) { if ("trash:///" == uuri.toDisplayString() || "computer:///" == uuri.toDisplayString()) { return; } } m_model->dropMimeData(e->mimeData(), action, -1, -1, this->indexAt(e->pos())); } else { // do not trigger file operation, link to: #66345 m_model->setAcceptDropAction(false); QListView::dropEvent(e); m_model->setAcceptDropAction(true); } QRegion dirtyRegion; QHash currentIndexesRects; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto tmp = m_proxy_model->index(i, 0); QRect rect = getDataRect(tmp); currentIndexesRects.insert(tmp, rect); if (!m_drag_indexes.contains(tmp)) { dirtyRegion += rect; } } //fixme: handle overlapping. if (!m_drag_indexes.isEmpty()) { // remove info from resolution item rect map. for (auto index : m_drag_indexes) { m_resolution_item_rect.remove(index.data(Qt::UserRole).toString()); m_model->m_destoryItems.removeOne(index.data(Qt::UserRole).toString()); QPoint itemPos(-1, -1); QString uri = index.data(Qt::UserRole).toString(); setRestoreInfo(uri, itemPos); } QModelIndexList overlappedIndexes; QModelIndexList unoverlappedIndexes = m_drag_indexes; for (auto index : unoverlappedIndexes) { QRect visualRect = getDataRect(index); if (dirtyRegion.intersects(visualRect)) { unoverlappedIndexes.removeOne(index); overlappedIndexes.append(index); } } for (auto index : unoverlappedIndexes) { // save pos QTimer::singleShot(1, this, [=]() { setFileMetaInfoPos(index.data(Qt::UserRole).toString(), visualRectInRightToLeft(index).topLeft()); }); } auto grid = this->gridSize(); auto viewRect = this->viewport()->rect(); QRegion notEmptyRegion; for (auto rect : currentIndexesRects) { notEmptyRegion += rect; } for (auto dragedIndex : overlappedIndexes) { auto indexRect = visualRectInRightToLeft(dragedIndex); auto dataRect = getDataRect(dragedIndex); if (notEmptyRegion.intersects(dataRect)) { // move index to closest empty grid. auto next = indexRect; bool isEmptyPos = false; while (!isEmptyPos) { next.translate(0, grid.height()); if (verifyBoundaries(next, Direction::Bottom)) { int top = next.y(); while (true) { if (top < gridSize().height()) { break; } top-=gridSize().height(); } //put item to next column first column next.moveTo(next.x() + grid.width(), top); //如果满了,就放到(0,0) 位置 if (verifyBoundaries(next, Direction::Right)) { next.moveTo(0, 0); isEmptyPos = true; setPositionForIndex(next.topLeft(), dragedIndex); setFileMetaInfoPos(dragedIndex.data(Qt::UserRole).toString(), next.topLeft()); qDebug() << "满屏 " << dragedIndex.data(Qt::UserRole).toString() << " point:" <viewport()->rect().contains(*existedRect)) { next = *existedRect; break; } else if (existedRect == notEmptyRegion.end() - 1 && next == QRect(0, 0, 0, 0)) { next = *existedRect; next.moveTo(0, 0); } } while (next.translated(-grid.width(), 0).x() >= 0) { next.translate(-grid.width(), 0); } while (next.translated(0, -grid.height()).top() >= 0) { next.translate(0, -grid.height()); } QRect dataRect = getDataRect(index); next.setSize(dataRect.size()); while (notEmptyRegion.intersects(next)) { next.translate(0, grid.height()); if (verifyBoundaries(next, Direction::Bottom)) { int top = next.y(); while (true) { if (top < gridSize().height()) { break; } top-=gridSize().height(); } //put item to next column first column top = top > 0 ? top : offset().y(); next.moveTo(next.x() + grid.width(), top); //如果满了,就放到(0,0) 位置 if (verifyBoundaries(next, Direction::Right)) { next.moveTo(0, 0); qDebug() << "满屏 " << index.data(Qt::UserRole).toString() << " point:" <mimeData()->urls(); for (auto url : urls) { // if (url.path() == QStandardPaths::writableLocation(QStandardPaths::HomeLocation)) // continue; saveItemPositionInfo(url.toDisplayString()); } return; } //task#74174 扩展模式下支持拖拽图标放置到扩展屏,拖拽释放后进行设置过滤器,proxyModel刷新 if (!m_ctrl_key_pressed && dragToOtherScreen(e)) return; m_model->dropMimeData(e->mimeData(), action, -1, -1, this->indexAt(e->pos())); //FIXME: save item position } void DesktopIconView::startDrag(Qt::DropActions supportedActions) { qDebug() << "startDrag"; auto indexes = selectedIndexes(); if (indexes.count() > 0) { auto pos = m_press_pos; qreal scale = 1.0; QWidget *window = this->window(); if (window) { auto windowHandle = window->windowHandle(); if (windowHandle) { scale = windowHandle->devicePixelRatio(); } } m_is_dragging_to_external = true; auto drag = new QDrag(this); drag->setMimeData(model()->mimeData(indexes)); connect(drag, &QDrag::targetChanged, this, [this, drag]() { if (!drag->target()) { qDebug() << "DesktopIconView::startDrag QDrag::targetChanged target"; m_disable_paint = true; } }); m_drag_region = QRegion(); QRegion rect; QHash indexRectHash; for (auto index : indexes) { auto _rect = visualRect(index); rect += _rect; indexRectHash.insert(index, _rect); } QRect realRect = rect.boundingRect(); // fix #78263, text displayment is not completed. //realRect.adjust(-5, -5, 5, 5); realRect.adjust(-15, -15, 15, 15); m_drag_region = realRect; QPixmap pixmap(realRect.size() * scale); pixmap.fill(Qt::transparent); pixmap.setDevicePixelRatio(scale); QPainter painter(&pixmap); // try fixing #190315, text shadow displayment issue while compositing not running. bool shouldDrawBackground = !QX11Info::isCompositingManagerRunning(); for (auto index : indexes) { painter.save(); painter.translate(indexRectHash.value(index).topLeft() - rect.boundingRect().topLeft()); if (shouldDrawBackground) { painter.setPen(qApp->palette().highlight().color()); painter.setBrush(qApp->palette().highlight()); painter.drawRoundedRect(QRect(0, 0, this->gridSize().width(), this->gridSize().height()).adjusted(1, 1, -1, -1), 6, 6); } QStyleOptionViewItem opt = viewOptions(); auto viewItemDelegate = static_cast(itemDelegate()); viewItemDelegate->initIndexOption(&opt, index); opt.rect.setSize(visualRect(index).size()); itemDelegate()->paint(&painter, opt, index); painter.restore(); } drag->setPixmap(pixmap); drag->setHotSpot(pos - rect.boundingRect().topLeft() - QPoint(viewportMargins().left(), viewportMargins().top())); drag->setDragCursor(QPixmap(), m_ctrl_key_pressed? Qt::CopyAction: Qt::MoveAction); drag->exec(m_ctrl_key_pressed? Qt::CopyAction: Qt::MoveAction); m_is_dragging_to_external = false; m_disable_paint = false; m_drag_region = QRegion(); } else { return QListView::startDrag(Qt::MoveAction|Qt::CopyAction); } } const QFont DesktopIconView::getViewItemFont(QStyleOptionViewItem *item) { return item->font; // auto font = item->font; // if (font.pixelSize() <= 0) { // font = QApplication::font(); // } // switch (zoomLevel()) { // case DesktopIconView::Small: // font.setPixelSize(int(font.pixelSize() * 0.8)); // break; // case DesktopIconView::Large: // font.setPixelSize(int(font.pixelSize() * 1.2)); // break; // case DesktopIconView::Huge: // font.setPixelSize(int(font.pixelSize() * 1.4)); // break; // default: // break; // } // return font; } void DesktopIconView::clearAllIndexWidgets(const QStringList &uris) { if (!model()) return; //fix bug#164160, when edit new file, infoUpdate call clearAllIndexWidgets issue if (m_is_edit && uris.length()>0 && m_edit_uri == uris.first()) return; if(uris.length()>0 ) qDebug() << "clearAllIndexWidgets uris:"<index(row, 0); while (index.isValid()) { if (uris.isEmpty() || uris.contains(index.data(Qt::UserRole).toString())) { auto widget = indexWidget(index); if (widget) { qDebug() << " Clearing widget "<< "row:" << row << "widget geometry:" << widget->geometry(); updateRegion += widget->geometry(); // 记录需要更新的区域 widget->hide(); needUpdate = true; } setIndexWidget(index, nullptr); qDebug() << "clearAllIndexWidgets setIndexWidget"<index(row, 0); } // avoid dirty region out of index visual rect. // link to: #77272. if (needUpdate) { qDebug() << " Updating viewport region:" << updateRegion.boundingRect(); viewport()->update(updateRegion); } } void DesktopIconView::refresh() { this->setCursor(QCursor(Qt::WaitCursor)); // if (m_refresh_timer.isActive()) // return; //fix refresh clear copy files issue, link to bug#109247 if (Peony::ClipboardUtils::isDesktopFilesBeCut()) Peony::ClipboardUtils::clearClipboard();/* Refresh clear cut status */ if (!m_model) return; if (refreshing) return; refreshing = true; m_model->refresh(); //m_refresh_timer.start(); } QRect DesktopIconView::visualRect(const QModelIndex &index) const { auto rect = QListView::visualRect(index); QPoint p(10, 5); switch (zoomLevel()) { case Small: p *= 0.8; break; case Large: p *= 1.2; break; case Huge: p *= 1.4; break; default: break; } rect.moveTo(rect.topLeft() + p); auto size = itemDelegate()->sizeHint(QStyleOptionViewItem(), index); rect.setSize(size); return rect; } QPoint DesktopIconView::offset() { QSize interval = (gridSize() - itemDelegate()->sizeHint(viewOptions(), QModelIndex()))/2; if (interval.isEmpty()) { return QPoint(0, 0); } QPoint p(interval.width(), interval.height()); return p; } QRect DesktopIconView::getViewRect() { QRect rect = viewport()->rect(); QPoint p(10, 5); switch (zoomLevel()) { case Small: p *= 0.8; break; case Large: p *= 1.2; break; case Huge: p *= 1.4; break; default: break; } rect.moveTo(rect.topLeft() + p); return rect; } int DesktopIconView::updateBWList() { m_proxy_model->updateBlackAndWriteLists(); /* * 重新按照既定规则排序,这样可以避免出现空缺和图标重叠的情况 */ // int sortType = GlobalSettings::getInstance()->getValue(LAST_DESKTOP_SORT_ORDER).toInt(); // setSortType(sortType); //不可重新排序,会丢失位置,只做检查调整空缺和重叠情况,相关bug#161875 resolutionChange(); return 0; } QString DesktopIconView::getBlackAndWhiteModel() { return m_proxy_model->getBlackAndWhiteModel(); } QSet DesktopIconView::getBWListInfo() { return m_proxy_model->getBWListInfo(); } bool DesktopIconView::getBlackAndWhiteListExist(QString name) { return m_proxy_model->getBlackAndWhiteListExist(name); } void DesktopIconView::setRestoreInfo(QString &uri, QPoint &itemPos) { //bug#108126 根据url重新记录要恢复的元素的位置 auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList restoreInfo; // restoreInfo<setMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE, restoreInfo); } } void DesktopIconView::setAllRestoreInfo() { //bug#108126 超出屏幕的元素记录到metInfo,以便以后恢复 for (auto uri : m_resolution_item_rect.keys()) { auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { auto rect = m_resolution_item_rect.value(uri); QStringList restoreInfo; restoreInfo<setMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE, restoreInfo); } } } void DesktopIconView::getAllRestoreInfo() { //bug#108126 一开始加载将上一次超出屏幕的元素恢复 for (auto uri : m_item_rect_hash.keys()) { auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList restoreInfo = metaInfo->getMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE); if (restoreInfo.count() == 3) { int top = restoreInfo.at(0).toInt(); int left = restoreInfo.at(1).toInt(); int id = restoreInfo.at(2).toInt(); if (id == m_id && top >= 0 && left >= 0) { QPoint topLeft(top, left); updateItemPosByUri(uri, topLeft); setFileMetaInfoPos(uri, topLeft); QStringList resetInfo; resetInfo<<""; metaInfo->setMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE, resetInfo); } } } } } void DesktopIconView::clearAllRestoreInfo() { //bug#108126 超出屏幕的元素记录清空 for (auto uri : m_resolution_item_rect.keys()) { auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { auto rect = m_resolution_item_rect.value(uri); QStringList restoreInfo; restoreInfo<<""; metaInfo->setMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE, restoreInfo); } } m_resolution_item_rect.clear(); } void DesktopIconView::clearCache() { m_item_rect_hash.clear(); m_resolution_item_rect.clear(); } bool DesktopIconView::execSharedFileLink(const QString uri) { auto info = FileInfo::fromUri(uri); if (info->isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } if (uri.endsWith(".desktop")) { GKeyFile* key_file = g_key_file_new(); QUrl url = uri; QString desktopfp = url.path(); g_key_file_load_from_file(key_file, desktopfp.toUtf8().constData(), G_KEY_FILE_KEEP_COMMENTS, nullptr); GError* error = NULL; if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-Peony-CMD", nullptr)) { if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, nullptr)) { g_autofree char* val = g_key_file_get_value(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, &error); if (error) { qWarning() << "get desktop file:" << uri << " name error:" << error->code << " -- " << error->message; g_error_free(error); error = nullptr; } else { #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; p.setProgram("peony"); QString str = val; str = str.replace("peony ",""); p.setArguments(QStringList() << str); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY QRect rect = info.get()->property("iconGeometry").toRect(); if (rect.isValid()) { data.setIconGeometry(rect); } #endif data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()<state(); if (this->state() & QAbstractItemView::EditingState) return; if (! this->m_uris_to_edit.isEmpty()) return; qDebug() << "fileCreated setSelections"<setSelections(m_new_files_to_be_selected); m_new_files_to_be_selected.clear(); }); } else { if (!m_new_files_to_be_selected.contains(uri)) { m_new_files_to_be_selected<rect(); if (geo.width() != 0 && geo.height() != 0) { QModelIndex index = m_proxy_model->mapToSource(m_model->indexFromUri(uri)); if (index.isValid()) { QRect indexRect = visualRectInRightToLeft(index); if (verifyBoundaries(indexRect, Direction::All)) { resolutionChange(); } } else { qWarning()<<"file is created but not valid in proxy model now"; } } /* 新建文件/文件夹,可编辑文件名,copy时不能编辑 */ //fix bug#164160, use same way as mainwindow if(this->m_uris_to_edit.isEmpty()) return; QString editUri = Peony::FileUtils::urlDecode(this->m_uris_to_edit.first()); QString infoUri = Peony::FileUtils::urlDecode(uri); qDebug() << "fileCreated editUri:"<editUri(uri); m_edit_uri = uri; }); } this->m_uris_to_edit.clear(); } bool DesktopIconView::dragToOtherScreen(QDropEvent *e) { auto view = static_cast(e->source()); if (this != e->source() && view) { bool bDropToOtherScreen = false; for (QModelIndex index : m_drag_indexes) { auto metaInfo = FileMetaInfo::fromUri(index.data(Qt::UserRole).toString()); if (metaInfo) { int id = metaInfo->getMetaInfoInt("peony-qt-desktop-id"); if (m_id != id) { metaInfo->setMetaInfoInt("peony-qt-desktop-id", m_id); bDropToOtherScreen =true; } } } if (bDropToOtherScreen) { QRegion notEmptyRegion; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto tmp = m_proxy_model->index(i, 0); QRect rect = getDataRect(tmp); notEmptyRegion += rect; } auto grid = this->gridSize(); QRect viewRect = getViewRect(); QPoint startPos = view->visualRect(m_drag_indexes[0]).topLeft(); for (QModelIndex index : m_drag_indexes) { bool isOverRect = false; QRect dataRect = view->getDataRect(index); QRect rect = view->visualRect(index); QPoint relativePos = QPoint(rect.topLeft().x() - startPos.x(),rect.topLeft().y() - startPos.y()); QPoint currentPos = e->pos() + relativePos; int x = currentPos.x()/grid.width()*grid.width(); int y = currentPos.y()/grid.height()*grid.height()+viewRect.topLeft().y(); rect.moveTo(QPoint(x,y)); dataRect.moveTo(QPoint(x,y)); if (verifyBoundaries(rect, Direction::All)) { if (isFull()) { rect.moveTo(0, 0); setFileMetaInfoPos(index.data(Qt::UserRole).toString(), rect.topLeft()); continue; } else { rect.moveTo(0, viewRect.topLeft().y()); isOverRect = true; } } if (notEmptyRegion.contains(dataRect)) { auto next = rect; bool isEmptyPos = false; while (!isEmptyPos) { next.translate(0, grid.height()); if (verifyBoundaries(next, Direction::Bottom)) { int top = next.y(); while (true) { if (top < gridSize().height()) { break; } top-=gridSize().height(); } //put item to next column first column next.moveTo(next.x() + grid.width(), top); if (verifyBoundaries(next, Direction::Right)) { if (isFull() || isOverRect) { next.moveTo(0, 0); isEmptyPos = true; setFileMetaInfoPos(index.data(Qt::UserRole).toString(), next.topLeft()); continue; } else { next.moveTo(0, top); isOverRect = true; } } } if (notEmptyRegion.contains(next.center())) { continue; } isEmptyPos = true; setFileMetaInfoPos(index.data(Qt::UserRole).toString(), next.topLeft()); notEmptyRegion += next; } } else{ if (layoutDirection() == Qt::RightToLeft) { int vewportX = viewport()->rect().topRight().x(); int x = vewportX - rect.topRight().x() ; rect = QRect(x, rect.y(), rect.width(), rect.height()); } setFileMetaInfoPos(index.data(Qt::UserRole).toString(), rect.topLeft()); notEmptyRegion += rect; } } Q_EMIT updateView(); Q_EMIT view->updateView(); return bDropToOtherScreen; } } return false; } QItemSelectionModel::SelectionFlags DesktopIconView::selectionCommand(const QModelIndex &index, const QEvent *event) const { if (!event) return QListView::selectionCommand(index, event); if (event->type() == QEvent::MouseButtonPress) { auto e = static_cast(event); if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier && selectedIndexes().contains(index)) { return QItemSelectionModel::NoUpdate; } } else if (event->type() == QEvent::MouseButtonRelease) { auto e = static_cast(event); if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier) { QItemSelectionModel::SelectionFlags flags; if (m_noSelectOnPress) { flags = QItemSelectionModel::Deselect; } return flags; } } return QListView::selectionCommand(index, event); } bool DesktopIconView::event(QEvent *e) { switch (e->type()) { case QEvent::Paint: { qDebug() << "DesktopIconView: Paint"; break; } case QEvent::Leave: { if (m_is_dragging_to_external && m_disable_paint) { qDebug() << "DesktopIconView::event Leave m_disable_paint = true"; return true; } qDebug() << "DesktopIconView::event Leave"; break; } case QEvent::UpdateRequest: { if (m_is_dragging_to_external && m_disable_paint) { qDebug() << " DesktopIconView: UpdateRequest m_disable_paint"; return true; } qDebug() << "DesktopIconView: UpdateRequest"; break; } case QEvent::DragLeave: { if (m_is_dragging_to_external) { qDebug() << "DesktopIconView::event DragLeave m_disable_paint = true"; m_disable_paint = true; return true; } qDebug() << "DesktopIconView::event DragLeave"; break; } default: break; } return QListView::event(e); } void DesktopIconView::dragLeaveEvent(QDragLeaveEvent *e) { if (m_is_dragging_to_external) { qDebug() << "dragLeaveEvent m_disable_paint = true"; m_disable_paint = true; } QListView::dragLeaveEvent(e); } int DesktopIconView::radius() const { return m_radius; } void DesktopIconView::saveExtendItemInfo() { if (!m_proxy_model) return; //task#74174 扩展屏的元素记录到metInfo,以便以后恢复 for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); auto indexRect = visualRectInRightToLeft(index); QStringList topLeft; topLeft<m_destoryItems.append(uri); } auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { qDebug() << "uri:"<getMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE); if (extendPos.count() == 3) { continue; } QStringList pos = metaInfo->getMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE); if (pos.count() == 2) { metaInfo->setMetaInfoStringList(ITEM_POS_ATTRIBUTE, pos); QStringList tmp; tmp<<""; metaInfo->setMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE, tmp); } metaInfo->setMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE, topLeft); metaInfo->setMetaInfoInt("peony-qt-desktop-id", 0); } } } bool DesktopIconView::isFull() { //bug#123045 主屏桌面空间不足,新建的文件未放置到扩展屏桌面上 int colNum = viewport()->width()/gridSize().width(); int rowNum = viewport()->height()/gridSize().height(); if (m_proxy_model->rowCount() > 1) { auto index = m_proxy_model->index(0, 0); auto indexRect = visualRectInRightToLeft(index); auto left = viewport()->width() - colNum * gridSize().width() - offset().x(); if (left >= indexRect.width()) { colNum++; } auto bottom = viewport()->height() - rowNum * gridSize().height() - offset().y() - getViewRect().y(); if (bottom >= indexRect.height()) { rowNum++; } } qDebug() << "colNum:" <rowCount(); if (colNum * rowNum <= m_proxy_model->rowCount()) { return true; } return false; } void DesktopIconView::resetExtendItemInfo() { if (!m_model) return; //bug#108126 一开始加载将上一次超出屏幕的元素恢复 for (int i = 0; i < m_model->rowCount(); i++) { auto index = m_model->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); m_model->m_destoryItems.removeOne(uri); if (metaInfo) { QStringList list = metaInfo->getMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE); QStringList pos = metaInfo->getMetaInfoStringList(ITEM_POS_ATTRIBUTE); if (list.count() == 3) { QString id = list.takeLast(); qDebug() << "[DesktopIconView::resetExtendItemInfo] uri:"<setMetaInfoStringList(ITEM_POS_ATTRIBUTE, list); metaInfo->setMetaInfoInt("peony-qt-desktop-id", m_id); QStringList tmp; tmp<<""; metaInfo->setMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE, tmp); qDebug() << "[DesktopIconView::resetExtendItemInfo] need relayout:"<m_items_need_relayout; } QStringList screenlist = metaInfo->getMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE); if (screenlist.count() != 2) { metaInfo->setMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE, pos); } } } } void DesktopIconView::clearItemRect() { m_resolution_item_rect.clear(); m_item_rect_hash.clear(); m_storageBox.clear(); } void DesktopIconView::clearExtendItemPos(bool saveId) { if (!m_proxy_model) return; //重置扩展屏和单屏坐标 qDebug() << "primary screen id:" << m_id ; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList tmp; tmp<<""; metaInfo->setMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_POS_ATTRIBUTE, tmp); if (saveId) { metaInfo->setMetaInfoStringList(RESTORE_ITEM_POS_ATTRIBUTE, tmp); QStringList extendPos = metaInfo->getMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE); if (extendPos.count() == 3) { tmp.clear(); tmp<<"-1"<<"-1"<setMetaInfoStringList(RESTORE_EXTEND_ITEM_POS_ATTRIBUTE, tmp); } } } QRect DesktopIconView::getDataRect(const QModelIndex &index) { DesktopIconViewDelegate *delegate = qobject_cast(itemDelegate()); QStyleOptionViewItem opt = viewOptions(); delegate->initStyleOption(&opt, index); opt.rect = visualRectInRightToLeft(index); QWidget *widget = indexWidget(index); QFont font = qApp->font(); auto fm = QFontMetrics(font); int lineSpacing = fm.lineSpacing(); int textHeight = lineSpacing + 5; QRect iconRect = style()->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, widget); QRect rect = opt.rect; rect.setHeight(iconRect.height() + textHeight); return rect; } void DesktopIconView::modifyGridSize() { auto settings = Peony::GlobalSettings::getInstance(); if (settings) { QSize sizeFromConfig = settings->getValue(DEFAULT_GRID_SIZE).toSize(); if (!sizeFromConfig.isEmpty() && sizeFromConfig.width() > MINGRIDSIZE && sizeFromConfig.width() < MAXGRIDSIZE && sizeFromConfig.height() > MINGRIDSIZE && sizeFromConfig.height() < MAXGRIDSIZE) { setGridSize(sizeFromConfig); return; } } if (0 == m_item_rect_hash.size()) { return; } QList positionX; QList positionY; for (auto i = m_item_rect_hash.constBegin(); i != m_item_rect_hash.constEnd(); ++i) { QRect itemRect = i.value(); positionX << itemRect.x(); positionY << itemRect.y(); } int gridWidth = getGreatestCommonDivisor(positionX); int gridHeight = getGreatestCommonDivisor(positionY); QSize size = QSize(gridWidth,gridHeight); if (gridWidth < MINGRIDSIZE || gridHeight < MINGRIDSIZE || gridWidth > MAXGRIDSIZE || gridHeight > MAXGRIDSIZE ) { //重新排序 setDefaultZoomLevel(zoomLevel()); Q_EMIT updateView(); if (settings) { settings->setValue(DEFAULT_GRID_SIZE, gridSize()); } return ; } if (settings) { settings->setValue(DEFAULT_GRID_SIZE, size); } Q_EMIT resetGridSize(size); } bool DesktopIconView::verifyBoundaries(const QRect &rect, Direction direction) { QRect dataRect = rect; if (!m_item_rect_hash.isEmpty() && m_item_rect_hash.first().size().isValid()) { QSize size = gridSize().height() > m_item_rect_hash.first().size().height() ? m_item_rect_hash.first().size() : gridSize(); dataRect.setSize(size); } dataRect.moveTo(dataRect.topLeft() + getViewRect().topLeft()); if (Direction::Bottom != direction) { if (dataRect.right() > this->viewport()->rect().right()) { return true; } } if (Direction::Right != direction){ if (dataRect.bottom() > this->viewport()->rect().bottom()) { return true; } } if (!this->viewport()->rect().contains(dataRect)) { return true; } return false; } void DesktopIconView::initViewport() { if (!m_initialized) { qInfo()<<"desktop icon view model inited"; if (!QGSettings::isSchemaInstalled(PANEL_SETTINGS)) { m_initialized = true; return; } //panel if (!m_panelSetting) m_panelSetting = new QGSettings(PANEL_SETTINGS, QByteArray(), this); int position = m_panelSetting->get("panelposition").toInt(); int margins = m_panelSetting->get("panelsize").toInt(); setMarginsBasedOnPosition(position, margins); getAllRestoreInfo(); modifyGridSize(); resolutionChange(); setAllRestoreInfo(); m_initialized = true; } } QRect DesktopIconView::visualRectInRightToLeft(const QModelIndex &index) { QRect rect = QListView::visualRect(index); if (layoutDirection() == Qt::RightToLeft) { int vewportX = viewport()->rect().topRight().x(); int x = vewportX - rect.topRight().x() ; rect = QRect(x, rect.y(), rect.width(), rect.height()); } return rect; } QModelIndexList DesktopIconView::getSelectedIndexes() { return this->selectedIndexes(); } bool DesktopIconView::isDraggingToExternal() { return m_is_dragging_to_external; } bool DesktopIconView::isDisable_paint() { return m_disable_paint; } static bool iconSizeLessThan (const QPair& p1, const QPair& p2) { if (p1.first.x() > p2.first.x()) return false; if (p1.first.x() < p2.first.x()) return true; if ((p1.first.x() == p2.first.x())) return p1.first.y() < p2.first.y(); return true; } static bool posLessThan (const int& p1, const int& p2) { if (p1 > p2) { return false; } return true; } peony/peony-qt-desktop/bw-list-info.h0000664000175000017500000000310515154271106016541 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #ifndef BWLISTINFO_H #define BWLISTINFO_H #include #include #include namespace Peony { #define BW_LIST_NORMAL "normal" #define BW_LIST_BLACK "blacklist" #define BW_LIST_WHITE "whitelist" class BWListInfo:public QObject { Q_OBJECT public: explicit BWListInfo(QObject *parent = nullptr); ~BWListInfo(); public: void setBWListModel(QString model); int addBWListElement(QString desktopName); int delBWListElement(QString desktopName); int clearBWlist(); bool desktopNameExist(QString desktop); bool isBlackListMode(); bool isWriteListMode(); bool isNormalMode(); QString getMode(){return m_workModel;} QSet getBWListInfo() {return m_bwListInfo;} private: QSet m_bwListInfo; QString m_workModel; }; } #endif // BWLISTINFO_H peony/peony-qt-desktop/desktopbackgroundwindow.cpp0000664000175000017500000005332115154271070021530 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2023, KylinSoft Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktopbackgroundwindow.h" #include "desktop-background-manager.h" #include "peony-desktop-application.h" #include "desktop-menu.h" #include #include #include #include #include #include #include "plasma-shell-manager.h" #include #include #include static QTimeLine *gTimeLine = nullptr; static bool startup = false; DesktopBackgroundWindow::DesktopBackgroundWindow(QScreen *screen, int desktopWindowId, QWidget *parent) : QMainWindow(parent) { if (!gTimeLine) { gTimeLine = new QTimeLine(100); } connect(gTimeLine, &QTimeLine::finished, this, &DesktopBackgroundWindow::updateWindowGeometry); QString title = QString("desktop%1").arg(desktopWindowId); setWindowTitle(title); setAttribute(Qt::WA_X11NetWmWindowTypeDesktop); setAttribute(Qt::WA_TranslucentBackground); setWindowFlags(Qt::Window|Qt::FramelessWindowHint); KWindowSystem::setType(this->winId(), NET::Desktop); KWindowSystem::setState(this->winId(), NET::SkipTaskbar|NET::SkipPager|NET::SkipSwitcher); setContextMenuPolicy(Qt::CustomContextMenu); m_screen = screen; m_desktopIconView = new AdvancedDesktopIconView(this); m_desktopIconView->setId(desktopWindowId); m_id = desktopWindowId; move(screen->geometry().topLeft()); setFixedSize(screen->geometry().size()); setContentsMargins(0, 0, 0, 0); m_desktopIconView->resize(screen->geometry().size()); setCentralWidget(m_desktopIconView); connect(screen, &QScreen::geometryChanged, this, QOverload::of(&DesktopBackgroundWindow::updateWindow)); auto manager = DesktopBackgroundManager::globalInstance(); connect(manager, &DesktopBackgroundManager::screensUpdated, this, QOverload<>::of(&DesktopBackgroundWindow::update)); if (QGSettings::isSchemaInstalled("org.ukui.panel.settings")) { m_panelSetting = new QGSettings("org.ukui.panel.settings", QByteArray(), this); } connect(this, &QWidget::customContextMenuRequested, this, [=](const QPoint &pos){ QPoint relativePos = getRelativePos(pos); qInfo()<indexAt(relativePos); // if (!index.isValid()) { // PeonyDesktopApplication::getIconView()->clearSelection(); // } else { // if (!PeonyDesktopApplication::getIconView()->selectionModel()->selection().indexes().contains(index)) { // PeonyDesktopApplication::getIconView()->clearSelection(); // PeonyDesktopApplication::getIconView()->selectionModel()->select(index, QItemSelectionModel::Select); // } // } QTimer::singleShot(1, [=]() { //task#74174 扩展屏设置菜单 if (m_menu) { delete m_menu; m_menu = nullptr; } m_menu = new DesktopMenu(m_desktopIconView, this); connect(m_menu, &DesktopMenu::setDefaultZoomLevel, this, &DesktopBackgroundWindow::setDefaultZoomLevel); connect(m_menu, &DesktopMenu::setSortType, this, &DesktopBackgroundWindow::setSortType); connect(m_menu, &DesktopMenu::setSortOrder, this, &DesktopBackgroundWindow::setSortOrder); connect(m_menu, &DesktopMenu::markFilePos, this, [=](){ markFilePos(relativePos); }); if (m_desktopIconView->getSelections().isEmpty()) { auto action = m_menu->addAction(QObject::tr("Set Background")); connect(action, &QAction::triggered, [=]() { //go to control center set background PeonyDesktopApplication::gotoSetBackground(); }); auto action1 = m_menu->addAction(QObject::tr("Display Settings")); connect(action1, &QAction::triggered, [=]() { //go to control center set resolution ratio PeonyDesktopApplication::gotoSetResolution(); }); } // for (auto screen : qApp->screens()) { // if (screen->geometry().contains(relativePos)); // //menu.windowHandle()->setScreen(screen); // } /* 菜单执行弹出操作时停止更新,超过1s或者结束菜单都启用更新; 解决:点击鼠标右键,右键菜单会闪烁(偶现) */ // if (manager->AnimationRunning()) { // //动画过程立刻更新界面 // setUpdatesEnabled(true); // repaint(); // m_menu->exec(mapToGlobal(pos)); // } else { // setUpdatesEnabled(false); // QTimer::singleShot(1000, this, [=](){ // if(!updatesEnabled()){ // setUpdatesEnabled(true); // } // }); //fix bug#250273,right menu not show complete issue QScreen *screen=qApp->primaryScreen(); QRect geometry = screen->availableGeometry(); m_menu->setMaximumHeight(geometry.height()); m_menu->exec(mapToGlobal(pos)); // setUpdatesEnabled(true);//end // } auto urisToEdit = m_menu->urisToEdit(); m_desktopIconView->UpdateToEditUris(urisToEdit); // if (urisToEdit.count() >= 1) { // QTimer::singleShot( // 100, this, [=]() { // m_desktopIconView->editUri(urisToEdit.first()); // qDebug() << "editUri count >=1:"<getPaintBackground()) return; if (!m_screen) return; QPainter p(this); if (manager->getUsePureColor()) { p.fillRect(this->rect(), manager->getColor()); } else { p.save(); p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); auto animation = manager->getAnimation(); QPixmap frontPixmap = manager->getFrontPixmap(); if (animation->state() == QVariantAnimation::Running) { auto opacity = animation->currentValue().toReal(); QPixmap backPixmap = manager->getBackPixmap(); if (manager->getBackgroundOption() == "centered") { //居中 p.drawPixmap((m_screen->size().width() - backPixmap.rect().width()) / 2, (m_screen->size().height() - backPixmap.rect().height()) / 2, backPixmap); p.setOpacity(opacity); p.drawPixmap((m_screen->size().width() - frontPixmap.rect().width()) / 2, (m_screen->size().height() - frontPixmap.rect().height()) / 2, frontPixmap); } else if (manager->getBackgroundOption() == "stretched") { //拉伸 p.drawPixmap(this->rect(), backPixmap, backPixmap.rect()); p.setOpacity(opacity); p.drawPixmap(this->rect(), frontPixmap, frontPixmap.rect()); } else if (manager->getBackgroundOption() == "scaled") { //填充 p.drawPixmap(this->rect(), backPixmap, getSourceRect(backPixmap)); p.setOpacity(opacity); p.drawPixmap(this->rect(), frontPixmap, getSourceRect(frontPixmap)); } else if (manager->getBackgroundOption() == "wallpaper") { //平铺 int drawedWidth = 0; int drawedHeight = 0; while (1) { drawedWidth = 0; while (1) { p.drawPixmap(drawedWidth, drawedHeight, backPixmap); drawedWidth += backPixmap.width(); if (drawedWidth >= m_screen->size().width()) { break; } } drawedHeight += backPixmap.height(); if (drawedHeight >= m_screen->size().height()) { break; } } p.setOpacity(opacity); drawedWidth = 0; drawedHeight = 0; while (1) { drawedWidth = 0; while (1) { p.drawPixmap(drawedWidth, drawedHeight, frontPixmap); drawedWidth += frontPixmap.width(); if (drawedWidth >= m_screen->size().width()) { break; } } drawedHeight += frontPixmap.height(); if (drawedHeight >= m_screen->size().height()) { break; } } } else if (manager->getBackgroundOption() == "zoom") { //适应 p.drawPixmap(getDestRect(backPixmap), backPixmap, backPixmap.rect()); p.setOpacity(opacity); p.drawPixmap(getDestRect(frontPixmap), frontPixmap, frontPixmap.rect()); } else if (manager->getBackgroundOption() == "spanned") { //跨区 p.drawPixmap(this->rect(), backPixmap, getSourceRect(backPixmap, m_screen->geometry())); p.setOpacity(opacity); p.drawPixmap(this->rect(), frontPixmap, getSourceRect(frontPixmap, m_screen->geometry())); } else { p.drawPixmap(rect().adjusted(0, 0, -1, -1), backPixmap, backPixmap.rect()); p.setOpacity(opacity); p.drawPixmap(rect().adjusted(0, 0, -1, -1), frontPixmap, frontPixmap.rect()); } } else { if (manager->getBackgroundOption() == "centered") { p.drawPixmap((m_screen->size().width() - frontPixmap.rect().width()) / 2, (m_screen->size().height() - frontPixmap.rect().height()) / 2, frontPixmap); } else if (manager->getBackgroundOption() == "stretched") { p.drawPixmap(this->rect(), frontPixmap, frontPixmap.rect()); } else if (manager->getBackgroundOption() == "scaled") { p.drawPixmap(this->rect(), frontPixmap, getSourceRect(frontPixmap)); } else if (manager->getBackgroundOption() == "wallpaper") { int drawedWidth = 0; int drawedHeight = 0; while (1) { drawedWidth = 0; while (1) { p.drawPixmap(drawedWidth, drawedHeight, frontPixmap); drawedWidth += frontPixmap.width(); if (drawedWidth >= m_screen->size().width()) { break; } } drawedHeight += frontPixmap.height(); if (drawedHeight >= m_screen->size().height()) { break; } } } else if (manager->getBackgroundOption() == "zoom") { p.drawPixmap(getDestRect(frontPixmap), frontPixmap, frontPixmap.rect()); } else if (manager->getBackgroundOption() == "spanned") { p.drawPixmap(this->rect(), frontPixmap, getSourceRect(frontPixmap, m_screen->geometry())); } else { p.drawPixmap(rect().adjusted(0, 0, -1, -1), frontPixmap, frontPixmap.rect()); } } p.restore(); } if (!startup) { startup = true; QTimer::singleShot(1000, []{ if (QX11Info::isPlatformX11()) { XSetWindowBackground(QX11Info::display(), QX11Info::appRootWindow(), 0); XSync(QX11Info::display(), false); } }); } } QScreen *DesktopBackgroundWindow::screen() const { return m_screen; } void DesktopBackgroundWindow::invaidScreen() { m_screen = nullptr; } bool DesktopBackgroundWindow::event(QEvent *event) { if (event->type() == QEvent::PlatformSurface) { auto e = static_cast(event); switch (e->surfaceEventType()) { case QPlatformSurfaceEvent::SurfaceCreated: { m_shellSurface = PlasmaShellManager::getInstance()->createSurface(this->windowHandle()); if (m_shellSurface) { m_shellSurface->setRole(KWayland::Client::PlasmaShellSurface::Role::Desktop); m_shellSurface->setSkipSwitcher(true); m_shellSurface->setSkipTaskbar(true); // wayland中构造函数的move只能在这里生效 if (m_screen) { m_shellSurface->setPosition(m_screen->geometry().topLeft()); } } break; } case QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed: { if (m_shellSurface) { m_shellSurface->deleteLater(); m_shellSurface = nullptr; } break; } default: break; } } switch (event->type()) { case QEvent::Paint: { qDebug() << "DesktopBackgroundWindow Paint"; break; } case QEvent::UpdateRequest: if (false/*m_desktopIconView->isDraggingToExternal() && m_desktopIconView->isDisable_paint()*/) { //qDebug() << "DesktopBackgroundWindow UpdateRequest isDisable_paint(): " << m_desktopIconView->isDisable_paint() << "UpdateRequest inner"; return true; } qDebug() << "DesktopBackgroundWindow UpdateRequest"; break; case QEvent::Leave: if (false/*m_desktopIconView->isDraggingToExternal() && m_desktopIconView->isDisable_paint()*/) { qDebug() << "DesktopBackgroundWindow Leave inner"; return true; } qDebug() << "DesktopBackgroundWindow Leave"; break; default: break; } return QMainWindow::event(event); } void DesktopBackgroundWindow::setWindowGeometry(const QRect &geometry) { qInfo()<<"bg window geometry changed"<name()<geometry(); if (gTimeLine->state() != QTimeLine::Running) { gTimeLine->start(); } else { gTimeLine->setCurrentTime(0); } } void DesktopBackgroundWindow::updateWindowGeometry() { if (!m_screen) { return; } auto geometry = m_screen->geometry(); move(geometry.topLeft()); if (m_shellSurface) { m_shellSurface->setPosition(geometry.topLeft()); } setFixedSize(geometry.size()); qInfo()<<"bg window geometry changed slot"<name()<primaryScreen()) { qInfo()<<"has center widget, raise window"; KWindowSystem::raiseWindow(this->winId()); kdk::WindowManager::activateWindow(m_windowId); } else { qCritical()<<"raise a window which not in primary screen, but has central widget"; } } update(); } int DesktopBackgroundWindow::id() const { return m_id; } void DesktopBackgroundWindow::setId(int id) { m_id = id; m_desktopIconView->setId(id); } void DesktopBackgroundWindow::setWindowId(kdk::WindowId windowId) { m_windowId = windowId; } kdk::WindowId DesktopBackgroundWindow::getWindowId() { return m_windowId; } //获取iconview中图标的相对位置 QPoint DesktopBackgroundWindow::getRelativePos(const QPoint &pos) { if (!m_screen) { return pos; } QPoint relativePos = pos; if (m_screen == QApplication::primaryScreen()) { if (m_panelSetting) { int position = m_panelSetting->get("panelposition").toInt(); int offset = m_panelSetting->get("panelsize").toInt(); switch (position) { case 1: { relativePos -= QPoint(0, offset); break; } case 2: { relativePos -= QPoint(offset, 0); break; } case 3: { break; } default: { break; } } } } return relativePos; } QRect DesktopBackgroundWindow::getSourceRect(const QPixmap &pixmap) { qreal screenScale = qreal(this->rect().width()) / qreal(this->rect().height()); qreal width = pixmap.width(); qreal height = pixmap.height(); if ((width / height) == screenScale) { return pixmap.rect(); } bool isShortX = (width <= height); if (isShortX) { screenScale = qreal(this->rect().height()) / qreal(this->rect().width()); } qreal shortEdge = isShortX ? width : height; qreal longEdge = isShortX ? height : width; while (shortEdge > 1) { qint32 temp = qFloor(shortEdge * screenScale); if (temp <= longEdge) { longEdge = temp; break; } qint32 spacing = qRound(shortEdge / 20); if (spacing <= 0) { spacing = 1; } shortEdge -= spacing; } QSize sourceSize = pixmap.size(); if (shortEdge > 1 && longEdge > 1) { sourceSize.setWidth(isShortX ? shortEdge : longEdge); sourceSize.setHeight(isShortX ? longEdge : shortEdge); } qint32 offsetX = 0; qint32 offsetY = 0; if (pixmap.width() > sourceSize.width()) { offsetX = (pixmap.width() - sourceSize.width()) / 2; } if (pixmap.height() > sourceSize.height()) { offsetY = (pixmap.height() - sourceSize.height()) / 2; } QPoint offsetPoint = pixmap.rect().topLeft(); offsetPoint += QPoint(offsetX, offsetY); return QRect(offsetPoint, sourceSize); } QRect DesktopBackgroundWindow::getSourceRect(const QPixmap &pixmap, const QRect &screenGeometry) { QRegion region; for (auto screen : qApp->screens()) { region += screen->geometry(); } QRect virtualGeometry = region.boundingRect().translated(0, 0); qreal pixWidth = pixmap.width(); qreal pixHeight = pixmap.height(); QSize sourceSize = pixmap.size(); sourceSize.setWidth(screenGeometry.width() * 1.0 / virtualGeometry.width() * pixWidth); sourceSize.setHeight(screenGeometry.height() * 1.0 / virtualGeometry.height() * pixHeight); qint32 offsetX = 0; qint32 offsetY = 0; if (screenGeometry.x() > 0) { offsetX = (screenGeometry.x() * 1.0 / virtualGeometry.width() * pixWidth); } if (screenGeometry.y() > 0) { offsetY = (screenGeometry.y() * 1.0 / virtualGeometry.height() * pixHeight); } QPoint offsetPoint = pixmap.rect().topLeft(); offsetPoint += QPoint(offsetX, offsetY); return QRect(offsetPoint, sourceSize); } QRect DesktopBackgroundWindow::getDestRect(const QPixmap &pixmap) { qreal screenScale = qreal(this->rect().width()) / qreal(this->rect().height()); qreal pixmapScale = qreal(pixmap.width() / pixmap.height()); qreal width = pixmap.width(); qreal height = pixmap.height(); if (pixmapScale == screenScale) { return this->rect(); } qreal scaleWidth = this->rect().width() / width; qreal scaleHeight = this->rect().height() / height; qreal realPixmapWidth = 0; qreal realPixmapHeight = 0; if(pixmapScale < screenScale){ //图片比例小于屏幕比例时,按照图片和屏幕高度比进行缩放 realPixmapWidth = width * scaleHeight; realPixmapHeight = this->rect().height(); }else{ //图片比例大于屏幕比例时,按照图片与屏幕宽度比进行缩放 realPixmapWidth = this->rect().width(); realPixmapHeight = height * scaleWidth; } QSize sourceSize = this->size(); qint32 offsetX = 0; qint32 offsetY = 0; if (this->rect().width() == realPixmapWidth) { offsetY = (this->rect().height() - realPixmapHeight) / 2; sourceSize.setHeight(realPixmapHeight); } else if (this->rect().height() == realPixmapHeight) { offsetX = (this->rect().width() - realPixmapWidth) / 2; sourceSize.setWidth(realPixmapWidth); } // 规避xcb下闪线的问题 sourceSize = sourceSize - QSize(1, 1); qDebug() << "=========getDestRect sourceSize:" << sourceSize; QPoint offsetPoint = this->rect().topLeft(); offsetPoint += QPoint(offsetX, offsetY); return QRect(offsetPoint, sourceSize); } AdvancedDesktopIconView *DesktopBackgroundWindow::getIconView() { return m_desktopIconView; } peony/peony-qt-desktop/peony-json-operation.h0000664000175000017500000000316015154271070020327 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #ifndef PEONYJSONOPERATION_H #define PEONYJSONOPERATION_H #include #include #include #include #include #include #include #include #include namespace Peony { class BWListInfo; class PeonyJsonOperation:public QObject { Q_OBJECT public: explicit PeonyJsonOperation(QObject *parent=nullptr); ~PeonyJsonOperation(); public: void setConfigFile(QString configFile); int loadConfigFile(BWListInfo *bwListInfo); void releaseConfigFile(); private: int getBWListInfo(QJsonDocument &jsonDoc, BWListInfo *bwListInfo); int bwPkgInfoParse(QJsonValue &bwPkgValue, BWListInfo *bwListInfo); int entryInfoParse(QJsonValue &entryInfoValue, BWListInfo *bwListInfo); QString m_configFile; }; } #endif // PEONYJSONOPERATION_H peony/peony-qt-desktop/desktop-icon-view-delegate.cpp0000664000175000017500000005160515154271070021711 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "desktop-icon-view-delegate.h" #include "advanced-desktop-icon-view.h" #include "desktop-item-proxy-model.h" #include "advanced-desktop-item-model.h" #include "icon-view-editor.h" #include "file-operation-manager.h" #include "file-rename-operation.h" #include "file-batch-rename-operation.h" #include "file-utils.h" #include "icon-view-delegate.h" #include "clipboard-utils.h" #include "emblem-provider.h" #include #include #include #include #include #include #include #include //qt's global function extern void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed); using namespace Peony; using namespace Peony::DirectoryView; DesktopIconViewDelegate::DesktopIconViewDelegate(QObject *parent) : QStyledItemDelegate(parent) { m_styled_button = new QPushButton; } DesktopIconViewDelegate::~DesktopIconViewDelegate() { m_styled_button->deleteLater(); } void DesktopIconViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { painter->save(); auto view = qobject_cast(parent()); auto info = getFileInfo(index); if (!info) { painter->restore(); return; } auto style = option.widget->style(); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.font = qApp->font(); opt.fontMetrics = qApp->fontMetrics(); if (view->state() == AdvancedDesktopIconView::DraggingState) { if (auto widget = view->indexWidget(index)) { view->setIndexWidget(index, nullptr); } if (view->selectionModel()->selection().contains(index)) { painter->setOpacity(0.8); } } else if (opt.state.testFlag(QStyle::State_Selected)) { if (view->indexWidget(index)) { opt.text = nullptr; } } bool bCutFile = false; auto clipedUris = ClipboardUtils::getInstance()->getCutFileUris(); if (!clipedUris.isEmpty()){ if (clipedUris.contains(index.data(AdvancedDesktopIconView::UriRole).toString())) { painter->setOpacity(0.5); bCutFile = true; qDebug()<<"cut item in desktop"<indexWidget(index)) { //painter->setClipRect(opt.rect); int radius = view->radius(); painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); if (opt.state.testFlag(QStyle::State_MouseOver) && !opt.state.testFlag(QStyle::State_Selected)) { QColor color = m_styled_button->palette().highlight().color(); color.setAlpha(255*0.3);//half transparent //painter->fillRect(opt.rect, color); color.setAlpha(255*0.5); painter->setPen(color.darker(100)); painter->setBrush(color); painter->drawRoundedRect(opt.rect.adjusted(1, 1, -1, -1), radius, radius); } if (opt.state.testFlag(QStyle::State_Selected)) { QColor color = m_styled_button->palette().highlight().color(); color.setAlpha(255*0.7);//half transparent //painter->fillRect(opt.rect, color); color.setAlpha(255*0.8); painter->setPen(color); painter->setBrush(color); painter->drawRoundedRect(opt.rect.adjusted(1, 1, -1, -1), radius, radius); } painter->restore(); } //fix bug#46785, select one file cut has no effect issue if (bCutFile && !getView()->getEditFlag())/* Rename is index is not set to nullptr,link to bug#61119.modified by 2021/06/22 */ view->setIndexWidget(index, nullptr); auto iconSizeExpected = view->iconSize(); auto iconRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, opt.widget); int y_delta = iconSizeExpected.height() - iconRect.height(); opt.rect.translate(0, y_delta); int maxTextHight = opt.rect.height() - iconSizeExpected.height() + 10; if (maxTextHight < 0) { maxTextHight = 0; } //paint icon item auto color = QColor(230, 230, 230); opt.palette.setColor(QPalette::Text, color); color.setRgb(240, 240, 240); opt.palette.setColor(QPalette::HighlightedText, color); auto text = opt.text; opt.text = nullptr; auto state = opt.state; if((opt.state & QStyle::State_Enabled) && (opt.state & QStyle::State_Selected)) { opt.state &= ~QStyle::State_Selected; opt.state &= ~QStyle::State_MouseOver; } else if (opt.state.testFlag(QStyle::State_MouseOver)){ opt.state &= ~QStyle::State_MouseOver; } painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); painter->restore(); opt.state = state; opt.text = text; opt.font = qApp->font(); opt.fontMetrics = qApp->fontMetrics(); painter->save(); //painter->translate(visualRect.topLeft()); painter->translate(opt.rect.topLeft()); painter->translate(0, -y_delta); //paint text shadow painter->save(); painter->translate(1, 1 + iconSizeExpected.height() + 5); int maxLineCount = 2; auto expectedSize = IconViewTextHelper::getTextSizeForIndex(opt, index, 2); if(option.fontMetrics.height()*2 > view->viewport()->height() - option.rect.y() - iconSizeExpected.height() - 5) { maxLineCount = 1; } QPixmap pixmap(expectedSize); pixmap.fill(Qt::transparent); QPainter shadowPainter(&pixmap); QColor shadow = Qt::black; shadowPainter.setPen(shadow); IconViewTextHelper::paintText(&shadowPainter, opt, index, maxTextHight, 0, maxLineCount, false, shadow, info); shadowPainter.end(); QImage shadowImage(expectedSize + QSize(4, 4), QImage::Format_ARGB32_Premultiplied); shadowImage.fill(Qt::transparent); shadowPainter.begin(&shadowImage); shadowPainter.drawPixmap(2, 2, pixmap); qt_blurImage(shadowImage, 8, false, false); for (int x = 0; x < shadowImage.width(); x++) { for (int y = 0; y < shadowImage.height(); y++) { auto color = shadowImage.pixelColor(x, y); if (color.alpha() > 0) { color.setAlphaF(qMin(color.alphaF() * 1.5, 1.0)); shadowImage.setPixelColor(x, y, color); } } } shadowPainter.end(); painter->translate(-2, -2); painter->drawImage(0, 0, shadowImage); //painter->setFont(opt.font); // painter->setPen(shadow); // IconViewTextHelper::paintText(painter, // opt, // index, // maxTextHight, // 0, // 2, // false); painter->restore(); //paint text painter->save(); painter->translate(0, 0 + iconSizeExpected.height() + 5); //painter->setFont(opt.font); painter->setFont(qApp->font()); QColor textColor = Qt::white; textColor.setAlphaF(0.9); painter->setPen(textColor); IconViewTextHelper::paintText(painter, opt, index, maxTextHight, 0, maxLineCount, false, Qt::transparent, info); painter->restore(); painter->restore(); QList emblemPoses = {4, 3, 2, 1}; //bottom right, bottom left, top right, top left QRect emblemRect = iconRect; int emblemsSize = 16; switch (view->zoomLevel()) { case AdvancedDesktopIconView::Small: { emblemsSize = 8; break; } case AdvancedDesktopIconView::Normal: { break; } case AdvancedDesktopIconView::Large: { emblemsSize = 24; break; } case AdvancedDesktopIconView::Huge: { emblemsSize = 32; break; } default: { break; } } auto rect = opt.rect; int topLeftX = emblemRect.x()-emblemsSize/2+3 < rect.x()? rect.x() : emblemRect.x()-emblemsSize/2+3; int topLeftY = emblemRect.y()-emblemsSize/2 < rect.y() - y_delta/2? rect.y() - y_delta/2 : emblemRect.y()-emblemsSize/2; int bottomRightX = emblemRect.right()-emblemsSize/2 <= topLeftX + emblemsSize? topLeftX + emblemsSize + 5 : emblemRect.right()-emblemsSize/2 ; int bottomRightY = emblemRect.bottom()-emblemsSize <= topLeftY + emblemsSize? topLeftY + emblemsSize + 5 : emblemRect.bottom()-emblemsSize; //paint link icon and locker icon QString uri = index.data(AdvancedDesktopIconView::UriRole).toString(); FileInfo* file = FileInfo::fromUri(uri).get(); if ((uri != "computer:///") && (uri != "trash:///")) { auto linkRect = QRect(QPoint(topLeftX, topLeftY), QSize(emblemsSize, emblemsSize)); /** * @bug #262561: [File Manager] PDF desktop shortcut files with deleted source files * do not display the same icon on the desktop folder as on the desktop. * * If the source file of a symbolic link is deleted, an “X” icon will be displayed in the upper left corner. * * @author: Renyg * @date: 2024-09-11 */ if (! file->canRead() || !file->isExistTargetOfSymlink()) { emblemPoses.removeOne(1); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-unreadable"); painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(painter, linkRect, Qt::AlignCenter); painter->restore(); } else if(! file->canWrite()/* && ! file->canExecute()*/) { //只读图标对应可读不可写情况,与可执行权限无关,link to bug#99998 emblemPoses.removeOne(1); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-readonly"); painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(painter, linkRect, Qt::AlignCenter); painter->restore(); } } if (index.data(Qt::UserRole + 1).toBool()) { emblemPoses.removeOne(3); //Adjust link emblem to topLeft.link story#8354 auto linkRect = QRect(QPoint(topLeftX, bottomRightY), QSize(emblemsSize, emblemsSize)); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-link-symbolic"); painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(painter, linkRect, Qt::AlignCenter); painter->restore(); } // paint extension emblems, FIXME: adjust layout, and implemet on indexwidget, other view. auto extensionsEmblems = EmblemProviderManager::getInstance()->getAllEmblemsForUri(file->uri()); for (auto extensionsEmblem : extensionsEmblems) { if (emblemPoses.isEmpty()) { break; } QIcon icon = QIcon::fromTheme(extensionsEmblem); if (!icon.isNull()) { int pos = emblemPoses.takeFirst(); painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); switch (pos) { case 1: { icon.paint(painter, topLeftX, topLeftY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 2: { icon.paint(painter, bottomRightX, topLeftY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 3: { icon.paint(painter, topLeftX, bottomRightY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 4: { icon.paint(painter, bottomRightX, bottomRightY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } default: break; } painter->restore(); } } /* qDebug()<visualRect(index); qDebug()<rectForIndex(index); qDebug()<subElementRect(QStyle::SE_ItemViewItemText, &opt, opt.widget); */ painter->restore(); //return QStyledItemDelegate::paint(painter, option, index); } QWidget *DesktopIconViewDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { auto edit = new IconViewEditor(parent); auto font = option.font; auto view = qobject_cast(this->parent()); edit->setFont(font); edit->setContentsMargins(0, 0, 0, 0); edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); edit->setMinimumSize(option.rect.width(), 54); edit->blockSignals(true); auto displayString = index.data(Qt::DisplayRole).toString(); auto uri = index.data(Qt::UserRole).toString(); auto info = FileInfo::fromUri(uri); auto displayName = info->displayName(); auto suffix = displayName.remove(displayString); auto fsType = FileUtils::getFsTypeFromFile(uri); if (info->isDesktopFile()) { suffix = ".desktop"; } if (fsType.contains("ext")) { edit->setMaxLengthLimit(255 - suffix.toLocal8Bit().length()); } else if (fsType.contains("ntfs")) { edit->setLimitBytes(false); edit->setMaxLengthLimit(255 - suffix.length()); } edit->setText(displayString); edit->blockSignals(false); edit->setAlignment(Qt::AlignCenter); //NOTE: if we directly call this method, there will be //nothing happen. add a very short delay will ensure that //the edit be resized. QTimer::singleShot(1, edit, [=]() { edit->minimalAdjust(); }); getView()->setEditFlag(true); connect(edit, &IconViewEditor::returnPressed, this, &DesktopIconViewDelegate::slot_finishEdit); auto editDestroyConn = connect(edit, &IconViewEditor::destroyed, getView(), [=](){ getView()->setEditFlag(false); }); connect(getView(), &AdvancedDesktopIconView::destroyed, edit, [=](){ disconnect(editDestroyConn); }); return edit; } void DesktopIconViewDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { IconViewEditor *edit = qobject_cast(editor); if (!edit) return; auto cursor = edit->textCursor(); cursor.setPosition(0, QTextCursor::MoveAnchor); cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); bool isDir = FileUtils::getFileIsFolder(index.data(Qt::UserRole).toString()); bool isDesktopFile = index.data(Qt::UserRole).toString().endsWith(".desktop"); bool isSoftLink = FileUtils::getFileIsSymbolicLink(index.data(Qt::UserRole).toString()); if (!isDesktopFile && !isSoftLink && !isDir && edit->toPlainText().contains(".") && !edit->toPlainText().startsWith(".")) { int n = 1; if(index.data(Qt::DisplayRole).toString().contains(".tar.")) //ex xxx.tar.gz xxx.tar.bz2 n = 2; while(n){ cursor.movePosition(QTextCursor::WordLeft, QTextCursor::KeepAnchor, 1); cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, 1); --n; } } //qDebug()<setTextCursor(cursor); } void DesktopIconViewDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyledItemDelegate::updateEditorGeometry(editor, option, index); auto edit = qobject_cast(editor); if (!edit) return; auto opt = option; auto iconExpectedSize = getView()->iconSize(); //auto iconRect = opt.widget->style()->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, opt.widget); //auto y_delta = iconExpectedSize.height() - iconRect.height(); //edit->move(opt.rect.x(), opt.rect.y() + y_delta + 10); edit->move(opt.rect.x(), opt.rect.y() + iconExpectedSize.height() + 5); edit->resize(edit->size().width(), edit->document()->size().height() + 10); } void DesktopIconViewDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { IconViewEditor *edit = qobject_cast(editor); if (!edit) return; auto newName = edit->toPlainText(); auto oldName = index.data(Qt::DisplayRole).toString(); if (newName.isNull()) return; //process special name . or .. or only space if (newName == "." || newName == ".." || newName.trimmed() == "") newName = ""; //comment new name != suffix check to fix feedback issue if (newName.length() >0 && newName != oldName/* && newName != suffix*/) { if (getView()->getSelections().count() > 1) { auto fileOpMgr = FileOperationManager::getInstance(); QStringList lists = getView()->getSelections(); auto renameOp = new FileBatchRenameOperation(lists, newName); getView()->setRenaming(true); //select file when rename finished connect(renameOp, &FileBatchRenameOperation::operationFinished, getView(), [=](){ auto info = renameOp->getOperationInfo().get(); auto uri = info->target(); QTimer::singleShot(100, getView(), [=](){ getView()->setSelections(QStringList()<scrollToSelection(uri); getView()->setFocus(); }); }, Qt::BlockingQueuedConnection); fileOpMgr->startOperation(renameOp, true); } else { auto fileOpMgr = FileOperationManager::getInstance(); auto renameOp = new FileRenameOperation(index.data(AdvancedDesktopIconView::UriRole).toString(), newName); getView()->setRenaming(true); //select file when rename finished connect(renameOp, &FileRenameOperation::operationFinished, getView(), [=](){ auto info = renameOp->getOperationInfo().get(); auto uri = info->target(); QTimer::singleShot(100, getView(), [=](){ getView()->setSelections(QStringList()<scrollToSelection(uri); getView()->setFocus(); }); }, Qt::BlockingQueuedConnection); fileOpMgr->startOperation(renameOp, true); } } else if (newName == oldName) { //create new file, should select the file or folder getView()->selectionModel()->select(index, QItemSelectionModel::Select); getView()->setFocus(); } } void DesktopIconViewDelegate::slot_finishEdit() { auto edit = qobject_cast(sender()); commitData(edit); closeEditor(edit, QAbstractItemDelegate::SubmitModelCache); if(edit){ delete edit; edit = nullptr; } getView()->setEditFlag(false); } AdvancedDesktopIconView *DesktopIconViewDelegate::getView() const { auto view = qobject_cast(parent()); return view; } void DesktopIconViewDelegate::initIndexOption(QStyleOptionViewItem *option, const QModelIndex &index) const { return initStyleOption(option, index); } std::shared_ptr DesktopIconViewDelegate::getFileInfo(const QModelIndex &index) const { // Get the associated view auto view = getView(); if (!view) { return nullptr; } // Cast the model to DesktopItemProxyModel auto proxyModel = qobject_cast(view->model()); if (!proxyModel) { return nullptr; } // Get the source model (AdvancedDesktopItemModel) auto originalModel = qobject_cast(proxyModel->sourceModel()); if (!originalModel) { return nullptr; } // Map the proxy index to the source index QModelIndex sourceIndex = proxyModel->mapToSource(index); // Retrieve and return the FileInfo from the original model auto info = originalModel->getFileInfo(sourceIndex); if (!info) { return nullptr; } return info; } peony/peony-qt-desktop/background-manager.cpp0000664000175000017500000005572715154271106020332 0ustar fengfeng/* * Copyright (C) 2025, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Wenjie Xiang * */ #include "background-manager.h" #include "screen-manager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "file-utils.h" static BackgroundManager *global_instance = nullptr; BackgroundManager::BackgroundManager(QObject *parent) : QObject{parent} { m_delayedUpdateTimer = new QTimer(this); m_delayedUpdateTimer->setSingleShot(true); m_delayedUpdateTimer->setInterval(50); connect(m_delayedUpdateTimer, &QTimer::timeout, this, &BackgroundManager::onDelayedUpdateSourceSizes); initGSettings(); initBackground(); initScreenMonitoring(); } BackgroundManager *BackgroundManager::globalInstance() { if (!global_instance) { global_instance = new BackgroundManager; } return global_instance; } QString BackgroundManager::getBackImagePath() const { if (m_backImagePath.isEmpty()) { return ""; } QString encodedPath = Peony::FileUtils::urlEncode(m_backImagePath); if (!encodedPath.startsWith("file://")) { encodedPath = "file://" + encodedPath; } return encodedPath; } QString BackgroundManager::getFrontImagePath() const { if (m_frontImagePath.isEmpty()) { return ""; } QString encodedPath = Peony::FileUtils::urlEncode(m_frontImagePath); if (!encodedPath.startsWith("file://")) { encodedPath = "file://" + encodedPath; } return encodedPath; } QString BackgroundManager::getBackgroundOption() const { return m_backgroundOption; } void BackgroundManager::setBackgroundOption(const QString &backgroundOption) { if (m_backgroundOption != backgroundOption) { m_backgroundOption = backgroundOption; Q_EMIT backgroundOptionChanged(); } } QString BackgroundManager::getAccountBackground() const { if (!m_shouldSyncAccountBackground) { if (m_backgroundSettings) { return m_backgroundSettings->get(PICTUREFILENAME).toString(); } return ""; } uid_t uid = getuid(); QDBusInterface iface(ACCOUNT_SETTINGS, ACCOUNT_PATH, ACCOUNT_SETTINGS, QDBusConnection::systemBus()); QDBusReply userPath = iface.call("FindUserById", (qint64)uid); if(!userPath.isValid()) qWarning() << "Get UserPath error:" << userPath.error(); else { QDBusInterface userIface(ACCOUNT_SETTINGS, userPath.value().path(), "org.freedesktop.DBus.Properties", QDBusConnection::systemBus()); QDBusReply backgroundReply = userIface.call("Get", "org.freedesktop.Accounts.User", "BackgroundFile"); if(backgroundReply.isValid()) return backgroundReply.value().variant().toString(); } return ""; } void BackgroundManager::setAccountBackground(const QString &backgroundPath) { if (!m_shouldSyncAccountBackground) { return; } QDBusInterface * interface = new QDBusInterface(ACCOUNT_SETTINGS, ACCOUNT_PATH, ACCOUNT_SETTINGS, QDBusConnection::systemBus()); if (!interface->isValid()){ qCritical() << "Create /org/freedesktop/Accounts Client Interface Failed " << QDBusConnection::systemBus().lastError(); return; } QDBusReply reply = interface->call("FindUserByName", g_get_user_name()); QString userPath; if (reply.isValid()){ userPath = reply.value().path(); } else { qCritical() << "Call 'GetComputerInfo' Failed!" << reply.error().message(); return; } QDBusInterface *useriFace = new QDBusInterface(ACCOUNT_SETTINGS, userPath, "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); if (!useriFace->isValid()){ qCritical() << QString("Create %1 Client Interface Failed").arg(userPath) << QDBusConnection::systemBus().lastError(); return; } QDBusMessage msg = useriFace->call("SetBackgroundFile", backgroundPath); qDebug() << "setAccountBackground path:" << backgroundPath; if (!msg.errorMessage().isEmpty()) { qDebug() << "update user background file error: " << msg.errorMessage(); } else { Q_EMIT accountBackgroundChanged(); } //saveBlurBackground QProcess p; p.startDetached("/usr/bin/save-blurBackground"); } bool BackgroundManager::getUsePureColor() const { return m_usePureColor; } void BackgroundManager::setUsePureColor(const bool usePureColor) { if (m_usePureColor != usePureColor) { m_usePureColor = usePureColor; Q_EMIT usePureColorChanged(); } } QColor BackgroundManager::getColor() const { return m_color; } void BackgroundManager::setColor(const QColor &color) { if (m_color != color) { m_color = color; Q_EMIT colorChanged(); } } QSize BackgroundManager::getFrontImageSourceSize() const { return m_frontImageSourceSize; } QSize BackgroundManager::getBackImageSourceSize() const { return m_backImageSourceSize; } QRect BackgroundManager::calculateSpannedSourceRect(const QRect &screenGeometry, const QString &imagePath) const { QImageReader reader(imagePath); QRegion region; for (auto screen : qApp->screens()) { region += screen->geometry(); } QRect virtualGeometry = region.boundingRect().translated(0, 0); qreal pixWidth = reader.size().width(); qreal pixHeight = reader.size().height(); QSize sourceSize = reader.size(); sourceSize.setWidth(screenGeometry.width() * 1.0 / virtualGeometry.width() * pixWidth); sourceSize.setHeight(screenGeometry.height() * 1.0 / virtualGeometry.height() * pixHeight); qint32 offsetX = 0; qint32 offsetY = 0; if (screenGeometry.x() > 0) { offsetX = (screenGeometry.x() * 1.0 / virtualGeometry.width() * pixWidth); } if (screenGeometry.y() > 0) { offsetY = (screenGeometry.y() * 1.0 / virtualGeometry.height() * pixHeight); } QPoint offsetPoint(0, 0); offsetPoint += QPoint(offsetX, offsetY); return QRect(offsetPoint, sourceSize); } QSize BackgroundManager::calculateOptimalSourceSize(const QString &imagePath) const { if (imagePath.isEmpty()) { return QSize(); } QSize cachedSize = getCachedOptimalSourceSize(imagePath); if (cachedSize.isValid()) { return cachedSize; } // Normalize the path to handle file:// prefix QString normalizedPath = normalizeImagePath(imagePath); QImageReader reader(normalizedPath); QSize originalSize = reader.size(); if (!originalSize.isValid()) { qWarning() << "Failed to get image size for:" << normalizedPath; return QSize(); } // Get current maximum screen dimensions with DPI scaling QSize currentMaxScreenSize = maxScreenSize(); // Calculate optimal target size using the sophisticated algorithm QSize targetSize = calculateWallpaperTargetSize(originalSize, currentMaxScreenSize); // If calculation failed, fallback to original size if (!targetSize.isValid()) { targetSize = originalSize; } else if (isLeftGreaterThanRightSize(targetSize, originalSize)) { qDebug() << "Target size" << targetSize << "has larger area than original size" << originalSize << "- using original size to prevent quality loss"; targetSize = originalSize; } // Cache the result QFileInfo fileInfo(normalizedPath); if (fileInfo.exists()) { SourceSizeInfo cacheInfo; cacheInfo.size = targetSize; cacheInfo.lastModified = fileInfo.lastModified().toSecsSinceEpoch(); cacheInfo.maxScreenSize = currentMaxScreenSize; cacheInfo.originalImageSize = originalSize; m_sourceSizeCache[imagePath] = cacheInfo; } return targetSize; } void BackgroundManager::forceUpdateBackground() { switchBackground(); Q_EMIT forceUpdated(); } void BackgroundManager::initGSettings() { if (QGSettings::isSchemaInstalled(BACKGROUND_MATE_SETTINGS)) { m_backgroundSettings = new QGSettings(BACKGROUND_MATE_SETTINGS, QByteArray(), this); m_backgroundOption = m_backgroundSettings->get(PICTUREOPTIONS).toString(); g_autoptr (GSettings) settings = g_settings_new_with_path(BACKGROUND_MATE_SETTINGS, BACKGROUND_MATE_PATH); if (settings) { bool writable = g_settings_is_writable(settings, PICTURE_FILENAME); m_shouldSyncAccountBackground = writable; } } else if (QGSettings::isSchemaInstalled(BACKGROUND_SETTINGS)){ m_backgroundSettings = new QGSettings(BACKGROUND_SETTINGS, QByteArray(), this); m_backgroundOption = m_backgroundSettings->get(PICTUREOPTIONS).toString(); g_autoptr (GSettings) settings = g_settings_new_with_path(BACKGROUND_SETTINGS, BACKGROUND_PATH); if (settings) { bool writable = g_settings_is_writable(settings, PICTURE_FILENAME); m_shouldSyncAccountBackground = writable; } } else { m_backgroundOption = "scaled"; } if (m_backgroundSettings) { connect(m_backgroundSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == PICTUREFILENAME) { m_shouldSyncAccountBackground = true; setAccountBackground(m_backgroundSettings->get(PICTUREFILENAME).toString()); } if (key == PICTUREFILENAME || key == PRIMARYCOLOR || key == PICTUREOPTIONS) { switchBackground(); } }); } } void BackgroundManager::initBackground() { QString defaultBg; auto accountBack = getAccountBackground(); if (accountBack != "" && QFile::exists(accountBack)) defaultBg = accountBack; if (!QFile::exists(defaultBg)) { qWarning() << "default bg and account bg not exist"; switchBackground(); return; } m_frontImagePath = defaultBg; m_backImagePath = m_frontImagePath; // 在初始化阶段立即更新sourceSize,避免延迟更新导致qml端因为sourcesize延迟改变而reload image // scheduleUpdateSourceSizes(); updateSourceSizes(); if (defaultBg != accountBack) { setAccountBackground(defaultBg); } } void BackgroundManager::switchBackground() { if (!m_backgroundSettings) return; setBackgroundOption(m_backgroundSettings->get(PICTUREOPTIONS).toString()); auto path = m_backgroundSettings->get(PICTUREFILENAME).toString(); QString localPath = path; if (!QFile::exists(path)) path = getAccountBackground(); // try fix #124971 if (!localPath.isEmpty() && (path.isEmpty() || !QFile::exists(path))) { path = DEFAULTBACKGROUND; } if (path.isEmpty()) { setUsePureColor(true); setColor(QColor(m_backgroundSettings->get(PRIMARYCOLOR).toString())); updateImagePaths("", ""); } else { setUsePureColor(false); setColor(QColor(m_backgroundSettings->get(PRIMARYCOLOR).toString())); if (m_backImagePath.isEmpty() && m_frontImagePath.isEmpty()) { updateImagePaths(path, path); } else { updateImagePaths(m_frontImagePath, path); // front image and back image exchanged } scheduleUpdateSourceSizes(); qDebug() << __func__ << __LINE__ << m_backImagePath << m_frontImagePath; if (path != getAccountBackground()) { setAccountBackground(path); } } } QSize BackgroundManager::maxScreenSize() const { QSize maxSize; for (QScreen* screen : qApp->screens()) { // Consider device pixel ratio for high DPI screens QSize size = screen->size() * screen->devicePixelRatio(); if (isLeftGreaterThanRightSize(size, maxSize)) { maxSize = size; } } return maxSize; } QSize BackgroundManager::calculateWallpaperTargetSize(const QSize &originalSize, const QSize &screenSize) const { // Invalid size check if (!originalSize.isValid() || !screenSize.isValid()) { qWarning() << "Invalid size detected:" << "Original:" << originalSize << "Screen:" << screenSize; return QSize(); } // Calculate aspect ratios const qreal sourceRatio = static_cast(originalSize.width()) / originalSize.height(); const qreal screenRatio = static_cast(screenSize.width()) / screenSize.height(); // Maximum allowed scale multiplier to prevent excessive memory usage const qreal MAX_SCALE_MULTIPLIER = 1.5; QSize targetSize; if (sourceRatio >= screenRatio) { // Image is wider than screen (relative to aspect ratios) // Use screen height as base and calculate width to maintain aspect ratio int targetHeight = screenSize.height(); int baseWidth = targetHeight * sourceRatio; // Limit maximum width to prevent excessive scaling int maxAllowedWidth = screenSize.width() * MAX_SCALE_MULTIPLIER; int targetWidth = qMin(baseWidth, maxAllowedWidth); // If width was limited, adjust height to maintain aspect ratio if (targetWidth < baseWidth) { targetHeight = targetWidth / sourceRatio; } targetSize = QSize(targetWidth, targetHeight); } else { // Image is taller than screen (relative to aspect ratios) // Use screen width as base and calculate height to maintain aspect ratio int targetWidth = screenSize.width(); int baseHeight = targetWidth / sourceRatio; // Limit maximum height to prevent excessive scaling int maxAllowedHeight = screenSize.height() * MAX_SCALE_MULTIPLIER; int targetHeight = qMin(baseHeight, maxAllowedHeight); // If height was limited, adjust width to maintain aspect ratio if (targetHeight < baseHeight) { targetWidth = targetHeight * sourceRatio; } targetSize = QSize(targetWidth, targetHeight); } // Verify if aspect ratio is maintained qreal targetRatio = static_cast(targetSize.width()) / targetSize.height(); qreal ratioDiff = qAbs(targetRatio - sourceRatio); // Allow for a small floating-point error (0.01) if (ratioDiff > 0.01) { qWarning() << "Aspect ratio mismatch detected:" << "Source:" << sourceRatio << "Target:" << targetRatio; // Force aspect ratio correction targetSize.setWidth(targetSize.height() * sourceRatio); } return targetSize; } bool BackgroundManager::isLeftGreaterThanRightSize(const QSize &left, const QSize &right) const { if (!right.isValid()) { return left.isValid(); } if (!left.isValid()) { return false; } // Compare by total area return (left.width() * left.height()) > (right.width() * right.height()); } QString BackgroundManager::normalizeImagePath(const QString &imagePath) const { if (imagePath.isEmpty()) { return QString(); } QString normalizedPath = imagePath; // Remove file:// prefix if present if (normalizedPath.startsWith("file://")) { normalizedPath = normalizedPath.mid(7); // Remove "file://" } return normalizedPath; } void BackgroundManager::updateSourceSizes() { // 屏幕尺寸改变和壁纸尺寸改变都需要更新sourceSize // note: 更新sourceSize目前是做延迟,避免更新sourceSize以后image reload导致阻塞桌面窗口setGeometry流程, // 这里可能需要使用异步加载image的方式实现,即在c++端异步获取对应sourceSize的图片缓存,然后设置到qml中, // 现有的sourceSize更新机制需要废弃 if (!shouldUpdateForScreenChange() && m_frontImagePath == m_backImagePath) { return; } QSize newFrontSize = calculateOptimalSourceSize(m_frontImagePath); QSize newBackSize = calculateOptimalSourceSize(m_backImagePath); if (m_frontImageSourceSize != newFrontSize) { m_frontImageSourceSize = newFrontSize; Q_EMIT frontImageSourceSizeChanged(); } if (m_backImageSourceSize != newBackSize) { m_backImageSourceSize = newBackSize; Q_EMIT backImageSourceSizeChanged(); } } void BackgroundManager::scheduleUpdateSourceSizes() { if (m_delayedUpdateTimer) { m_delayedUpdateTimer->start(); } } void BackgroundManager::initScreenMonitoring() { ScreenManager* screenManager = ScreenManager::getInstance(); connect(screenManager, &ScreenManager::screenAdded, this, [this](QScreen *screen, int id) { Q_UNUSED(id) qDebug() << "Screen added (via ScreenManager):" << (screen ? screen->name() : "unknown"); scheduleUpdateSourceSizes(); if (screen) { connectScreenDpiSignals(screen); } }); connect(screenManager, &ScreenManager::screenRemoved, this, [this](QScreen *screen, int id) { Q_UNUSED(screen) Q_UNUSED(id) qDebug() << "Screen removed (via ScreenManager)"; scheduleUpdateSourceSizes(); }); connect(screenManager, &ScreenManager::displayModeChanged, this, [this]() { qDebug() << "Display mode changed, scheduling update with delay"; scheduleUpdateSourceSizes(); //Q_EMIT forceUpdated(); }); for (QScreen* screen : qApp->screens()) { connectScreenDpiSignals(screen); } } void BackgroundManager::connectScreenDpiSignals(QScreen *screen) { if (!screen) { qWarning() << "Cannot connect DPI signals to null screen"; return; } // Check if screen is valid and has a name (avoid connecting to invalid screens) if (screen->name().isEmpty()) { qWarning() << "Cannot connect DPI signals to screen with empty name"; return; } connect(screen, &QScreen::logicalDotsPerInchChanged, this, [this, screen](qreal dpi) { qDebug() << "Screen DPI changed for" << screen->name() << "to:" << dpi; scheduleUpdateSourceSizes(); }); qDebug() << "Connected DPI signals for screen:" << screen->name(); } void BackgroundManager::updateImagePaths(const QString &newBackPath, const QString &newFrontPath) { QString oldBackImagePath = m_backImagePath; QString oldFrontImagePath = m_frontImagePath; m_backImagePath = newBackPath; m_frontImagePath = newFrontPath; if (oldBackImagePath != m_backImagePath) { Q_EMIT backImagePathChanged(); } if (oldFrontImagePath != m_frontImagePath) { Q_EMIT frontImagePathChanged(); } } QSize BackgroundManager::getCachedOptimalSourceSize(const QString &imagePath) const { if (imagePath.isEmpty()) { return QSize(); } // Check cache first auto it = m_sourceSizeCache.find(imagePath); if (it != m_sourceSizeCache.end()) { const SourceSizeInfo& cacheInfo = it.value(); // Verify cache validity QString normalizedPath = normalizeImagePath(imagePath); QFileInfo fileInfo(normalizedPath); if (fileInfo.exists()) { qint64 currentModified = fileInfo.lastModified().toSecsSinceEpoch(); QSize currentMaxScreenSize = maxScreenSize(); // Check if only screen size changed (file unchanged) if (cacheInfo.lastModified == currentModified && cacheInfo.maxScreenSize != currentMaxScreenSize && cacheInfo.originalImageSize.isValid()) { QSize targetSize = calculateWallpaperTargetSize(cacheInfo.originalImageSize, currentMaxScreenSize); if (!targetSize.isValid()) { targetSize = cacheInfo.originalImageSize; } else if (isLeftGreaterThanRightSize(targetSize, cacheInfo.originalImageSize)) { targetSize = cacheInfo.originalImageSize; } // Update cache with new result SourceSizeInfo newCacheInfo = cacheInfo; newCacheInfo.size = targetSize; newCacheInfo.maxScreenSize = currentMaxScreenSize; m_sourceSizeCache[imagePath] = newCacheInfo; qDebug() << "Using cached original size and recalculating for screen change:" << imagePath << "Original:" << cacheInfo.originalImageSize << "Target:" << targetSize; return targetSize; } // Cache is fully valid if (cacheInfo.lastModified == currentModified && cacheInfo.maxScreenSize == currentMaxScreenSize) { qDebug() << "Using fully cached optimal source size for:" << imagePath << "Size:" << cacheInfo.size; return cacheInfo.size; } else { qDebug() << "Cache invalid for:" << imagePath << "Modified:" << (cacheInfo.lastModified != currentModified) << "Screen size changed:" << (cacheInfo.maxScreenSize != currentMaxScreenSize); } } // Remove invalid cache entry m_sourceSizeCache.erase(it); } return QSize(); // No valid cache found } void BackgroundManager::clearSourceSizeCache() { if (!m_sourceSizeCache.isEmpty()) { qDebug() << "Clearing source size cache (" << m_sourceSizeCache.size() << " entries)"; m_sourceSizeCache.clear(); } } bool BackgroundManager::shouldUpdateForScreenChange() const { QSize currentMaxScreenSize = maxScreenSize(); // If this is the first time or max screen size changed, we need to update if (!m_lastMaxScreenSize.isValid() || m_lastMaxScreenSize != currentMaxScreenSize) { qDebug() << "Max screen size changed from" << m_lastMaxScreenSize << "to" << currentMaxScreenSize; m_lastMaxScreenSize = currentMaxScreenSize; return true; } qDebug() << "Max screen size unchanged:" << currentMaxScreenSize; return false; } void BackgroundManager::onDelayedUpdateSourceSizes() { qDebug() << "Delayed updateSourceSizes triggered after 50ms"; updateSourceSizes(); } peony/peony-qt-desktop/peony-dbus-service.cpp0000664000175000017500000000506215154271106020311 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: renpeijia * */ #include "peony-dbus-service.h" #include #include #include using namespace Peony; PeonyDbusService::PeonyDbusService(QObject *parent) : QObject(parent) { } PeonyDbusService::~PeonyDbusService() { } void PeonyDbusService::DbusServerRegister() { QDBusConnection::sessionBus().unregisterService("org.ukui.peony"); QDBusConnection::sessionBus().registerService("org.ukui.peony"); QDBusConnection::sessionBus().registerObject("/org/ukui/peony", this, QDBusConnection :: ExportAllSlots | QDBusConnection::ExportAllSignals); } QString PeonyDbusService::GetSecurityConfigPath() { QString jsonPath=QDir::homePath()+"/.config/peony-security-config.json"; return jsonPath; } int PeonyDbusService::ReloadSecurityConfig() { // m_desktopIconView->updateBWList(); Q_EMIT black_and_white_update(); return 0; } void PeonyDbusService::receiveSrcAndDestUrisOfCopy(const QStringList& sourceUris, const QStringList& destUris) { Q_EMIT sendSrcAndDestUrisOfCopyDspsFiles(sourceUris, destUris); } QString PeonyDbusService::getBlackAndWhiteModel() { // if (!m_desktopIconView) return ""; // return m_desktopIconView->getBlackAndWhiteModel(); } bool PeonyDbusService::getBlackAndWhiteListExist(QString name) { // if (!m_desktopIconView) return false; // return m_desktopIconView->getBlackAndWhiteListExist(name); } QStringList PeonyDbusService::getBWListInfo() { QSet info; // if (!m_desktopIconView) // return info.toList(); // info = m_desktopIconView->getBWListInfo(); // qDebug() << "getBWListInfo in service:"<. * * Authors: Yue Lan * */ #ifndef DESKTOPBACKGROUND_H #define DESKTOPBACKGROUND_H #include class QGSettings; class QVariantAnimation; class QTimeLine; class DesktopBackground : public QWidget { Q_OBJECT public: explicit DesktopBackground(QWidget *parent = nullptr); void paintEvent(QPaintEvent *e); void updateScreens(); void initBackground(); void setBackground(); QString getAccountBackground(); void setAccountBackground(); void initGSettings(); protected: void switchBackground(); void connectScreensChangement(); private: QPixmap m_frontPixmap; QPixmap m_backPixmap; QPixmap m_pendingPixmap; QGSettings *m_backgroundSettings = nullptr; QVariantAnimation *m_animation = nullptr; bool m_usePureColor = false; QColor m_color = Qt::black; bool m_paintBackground = false; QTimeLine *m_timeLine = nullptr; QString m_current_bg_path; }; #endif // DESKTOPBACKGROUND_H peony/peony-qt-desktop/advanced-desktop-item-model.cpp0000664000175000017500000013127215154271106022037 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2024, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #include "advanced-desktop-item-model.h" #include "file-enumerator.h" #include "file-info.h" #include "file-info-job.h" #include "file-info-manager.h" #include "file-watcher.h" #include "file-operation-manager.h" #include "file-move-operation.h" #include "file-trash-operation.h" #include "file-copy-operation.h" #include "file-operation-utils.h" #include "thumbnail-manager.h" #include "usershare-manager.h" #include "file-meta-info.h" #include "peony-desktop-application.h" #include "global-settings.h" #include "sound-effect.h" #ifdef KY_SDK_SOUND_EFFECTS #include "ksoundeffects.h" #endif #include "desktop-menu-plugin-manager.h" #include "emblem-provider.h" #include "desktop-window-manager.h" #include "tooltips-manager.h" #include #include #include #include #include #include #include #include "common.h" using namespace Peony; #ifdef KY_SDK_SOUND_EFFECTS using namespace kdk; #endif static bool initMetaInfo = false; AdvancedDesktopIconItem::AdvancedDesktopIconItem(const QString &text) : QStandardItem(text) { setData(text, UriRole); auto metaInfo = FileMetaInfo::fromUri(text); if (metaInfo) { QStringList strPos = metaInfo->getMetaInfoStringListV1(ITEM_GRID_POS_ATTRIBUTE); qDebug() << "[AdvancedDesktopIconItem::AdvancedDesktopIconItem]"<= 0 && strPos[1].toInt() >= 0) { QPoint pos(strPos[0].toInt(), strPos[1].toInt()); setData(pos, PositionRole); int id = metaInfo->getMetaInfoInt(SCREEN_ID); setData(id, ScreenIdRole); } else { int id = 0; QPoint currentPos; setData(id, ScreenIdRole); setData(currentPos, PositionRole); } QStringList value = metaInfo->getMetaInfoStringList(RESTORE_ITEM_GRID_POS_ATTRIBUTE); setData(value, ExceptedPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_EXTEND_ITEM_GRID_POS_ATTRIBUTE); setData(value, ExtendScreenPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_GRID_POS_ATTRIBUTE); setData(value, SinglesSreenPositionRole); } } AdvancedDesktopIconItem::AdvancedDesktopIconItem(const QString &text, bool fileCreate) : QStandardItem(text) { setData(text, UriRole); auto metaInfo = FileMetaInfo::fromUri(text); if (metaInfo) { qDebug() << "[AdvancedDesktopIconItem::AdvancedDesktopIconItem]"<getMetaInfoStringListV1(ITEM_GRID_POS_ATTRIBUTE); int currentId = metaInfo->getMetaInfoInt(SCREEN_ID); bool isRenaming = qApp->property("rename").toBool(); auto info = FileInfo::fromUri(text); qDebug() << "[AdvancedDesktopIconItem::AdvancedDesktopIconItem]"<= 0 && strPos[1].toInt() >= 0) { QPoint pos(strPos[0].toInt(), strPos[1].toInt()); setData(pos, PositionRole); setData(currentId, ScreenIdRole); QStringList value = metaInfo->getMetaInfoStringList(RESTORE_ITEM_GRID_POS_ATTRIBUTE); setData(value, ExceptedPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_EXTEND_ITEM_GRID_POS_ATTRIBUTE); setData(value, ExtendScreenPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_GRID_POS_ATTRIBUTE); setData(value, SinglesSreenPositionRole); } else { int id = 0; QPoint currentPos = QPoint(-1, -1); if (info->property("createId").isValid() && info->property("createPos").isValid()) { id = info->property("createId").toInt(); currentPos = info->property("createPos").toPoint(); } setData(id, ScreenIdRole); setData(currentPos, PositionRole); QStringList value(""); setData(value, ExceptedPositionRole); setData(value, ExtendScreenPositionRole); setData(value, SinglesSreenPositionRole); } info->setProperty("createId", QVariant()); info->setProperty("createPos", QVariant()); } } QHash AdvancedDesktopItemModel::roleNames() const { QHash roles; roles[ScreenIdRole] = "screenId"; roles[UriRole] = "uri"; // 映射 UriRole 到 "uri" roles[PositionRole] = "position"; // 映射 PositionRole 到 "position" roles[Qt::DecorationRole] = "decoration"; // 映射 Qt::DecorationRole 到 "decoration" roles[Qt::DisplayRole] = "display"; // 映射 Qt::DisplayRole 到 "display" roles[Qt::ToolTipRole] = "tooltip"; // 映射 Qt::DisplayRole 到 "display" roles[emblemRole] = "emblems"; // 映射 Qt::UserRole + 9 到 "emblems" roles[IsDirRole] = "isDir"; // 映射 Qt::UserRole + 9 到 "isDir" roles[SoftLinkRole] = "softLink"; // 映射 Qt::UserRole + 10 到 "softLink" return roles; } void AdvancedDesktopIconItem::setData(const QVariant &value, int role) { switch(role){ case ScreenIdRole:{ QString uri = data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { int id = value.toInt(); metaInfo->setMetaInfoInt(SCREEN_ID, id); } break; } case PositionRole:{ QString uri = data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QPoint pos = value.toPoint(); QStringList itemPos; itemPos<setMetaInfoStringListV1(ITEM_GRID_POS_ATTRIBUTE, itemPos); } break; } case ExceptedPositionRole:{ QString uri = data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList restorePos = value.toStringList(); metaInfo->setMetaInfoStringList(RESTORE_ITEM_GRID_POS_ATTRIBUTE, restorePos); } break; } case SinglesSreenPositionRole:{ QString uri = data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList singlesScreenPos = value.toStringList(); metaInfo->setMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_GRID_POS_ATTRIBUTE, singlesScreenPos); } break; } case ExtendScreenPositionRole:{ QString uri = data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { QStringList extendScreenPos = value.toStringList(); metaInfo->setMetaInfoStringList(RESTORE_EXTEND_ITEM_GRID_POS_ATTRIBUTE, extendScreenPos); } } } QStandardItem::setData(value, role); } AdvancedDesktopItemModel::AdvancedDesktopItemModel(QObject *parent) : QStandardItemModel(parent) { ThumbnailManager::getInstance()->setBlocked(true); setupTooltipConnections(); // do not redo layout new items while we start an operation with peony's api. connect(FileOperationManager::getInstance(), &FileOperationManager::operationStarted, this, [=](){ m_items_need_relayout.clear(); }); m_thumbnail_watcher = std::make_shared("thumbnail:///, this"); connect(m_thumbnail_watcher.get(), &FileWatcher::fileChanged, this, [=](const QString &uri) { auto index = indexFromUri(uri); if (index.isValid()) Q_EMIT this->dataChanged(index, index); }); m_trash_watcher = std::make_shared("trash:///", this); this->connect(m_trash_watcher.get(), &FileWatcher::fileCreated, [=](const QString &uri) { //qDebug()<<"trash changed"; auto trash = FileInfo::fromUri("trash:///"); auto job = new FileInfoJob(trash); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, [=]() { auto trashIndex = this->indexFromUri("trash:///"); this->dataChanged(trashIndex, trashIndex); Q_EMIT this->requestClearIndexWidget(QStringList()<queryAsync(); }); this->connect(m_trash_watcher.get(), &FileWatcher::fileDeleted, [=](const QString &uri) { //qDebug()<<"trash changed"; auto trash = FileInfo::fromUri("trash:///"); auto job = new FileInfoJob(trash); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, [=]() { auto trashIndex = this->indexFromUri("trash:///"); this->dataChanged(trashIndex, trashIndex); Q_EMIT this->requestClearIndexWidget(QStringList()<queryAsync(); }); // monitor desktop QString desktopFile = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); qWarning() << "desktopfile:" << desktopFile; m_desktop_watcher = std::make_shared("file://" + desktopFile, this); m_desktop_watcher->setMonitorChildrenChange(true); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileCreated, this, &AdvancedDesktopItemModel::fileCreated); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileDeleted, [=](const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { int row = m_files.indexOf(info); removeRow(row, QModelIndex()); qDebug() <<"AdvancedDesktopIconView::rowsAboutToBeRemoved" <isDir()) { QString displayName = info->displayName(); if (UserShareInfoManager::getInstance()->getUsershareLists().contains(displayName)) { SharedDeleteInfoThread *thread = new SharedDeleteInfoThread(info->uri()); connect(thread, &SharedDeleteInfoThread::finished, thread, &SharedDeleteInfoThread::deleteLater); thread->start(); } } } } //fix bug#329662, deleted file not update thumbnail issue ThumbnailManager::getInstance()->releaseThumbnail(uri); }); m_desktop_watcher->connect(m_desktop_watcher.get(), &FileWatcher::fileChanged, [=](const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { auto job = new FileInfoJob(info); job->setAutoDelete(); connect(job, &FileInfoJob::infoUpdated, this, [=]() { auto metainfo = FileMetaInfo::fromUri(info->uri()); if (metainfo->hasHiddenInfo()) { qDebug() << "hidden file info queryed" << info->uri(); Q_EMIT invalidateFilterRequest(); } //file changed, force create thubnail, link tobug#83108 ThumbnailManager::getInstance()->createThumbnail(uri, m_thumbnail_watcher, true); this->dataChanged(indexFromUri(uri), indexFromUri(uri)); Q_EMIT this->requestClearIndexWidget(QStringList()<isSymbolLink() && !info->canRead()) { this->pendingQuery(uri); } }); job->queryAsync(); this->dataChanged(indexFromUri(uri), indexFromUri(uri)); return; } } }); //handle standard dir changing. m_dir_manager =new UserdirManager(this); //refresh after standard dir changed. connect(m_dir_manager,&UserdirManager::desktopDirChanged,[=](){ refresh(); }); connect(m_dir_manager,&UserdirManager::thumbnailSetingChange,[=](){ refresh(); }); connect(FileOperationManager::getInstance(), &FileOperationManager::operationStarted, this, [=](std::shared_ptr info){ if (info.get()->m_type == FileOperationInfo::Rename) { m_renaming_operation_info = info; auto renamingUri = info.get()->m_src_uris.first(); if (!renamingUri.endsWith(".desktop")) { m_renaming_operation_info = nullptr; return; } m_renaming_file_pos.first = renamingUri; m_renaming_file_pos.second = indexFromUri(renamingUri).data(PositionRole).toPoint(); } else { m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); m_renaming_operation_info = nullptr; } }); connect(FileOperationManager::getInstance(), &FileOperationManager::operationFinished, this, [=](std::shared_ptr info){ if (info.get()->m_type == FileOperationInfo::Rename) { if (!info.get()->m_has_error) { auto renamingUri = info.get()->target(); if (!renamingUri.endsWith(".desktop")) { m_renaming_operation_info = nullptr; m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); return; } QPoint target_pos = indexFromUri(renamingUri).data(PositionRole).toPoint(); //desktop文件重命名时,如果存在相同文件则不会重命名成功。由于该文件uri不会变,所以pos不变,无需更新pos if (target_pos.isNull() || (m_renaming_file_pos.second == target_pos)) { //desktop文件重命名成功 m_renaming_file_pos.first = renamingUri; m_items_need_relayout.removeOne(renamingUri); m_items_need_relayout.removeOne(renamingUri + ".desktop"); auto index = indexFromUri(renamingUri); setData(index, m_renaming_file_pos.second, PositionRole); } else { //desktop文件(uri)重命名失败 QString &src_uri = info->m_src_uris.first(); Q_EMIT selectUri(src_uri); } } else { // restore/relayout? } m_renaming_operation_info = nullptr; QTimer::singleShot(100, this, [=]{ m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); }); } else { m_renaming_file_pos.first = nullptr; m_renaming_file_pos.second = QPoint(); m_renaming_operation_info = nullptr; } }); auto settings = GlobalSettings::getInstance(); m_showFileExtension = settings->isExist(SHOW_FILE_EXTENSION)? settings->getValue(SHOW_FILE_EXTENSION).toBool(): true; connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (SHOW_FILE_EXTENSION == key) { m_showFileExtension= GlobalSettings::getInstance()->getValue(key).toBool(); beginResetModel(); endResetModel(); } }); connect(DesktopMenuPluginManager::getInstance(), &DesktopMenuPluginManager::pluginLoadFinished, this, [=](){ QTimer::singleShot(1000, this, [=]{ for (auto file : m_files) { EmblemProviderManager::getInstance()->queryAsync(file->uri()); } }); }); UserShareInfoManager::getInstance(); connect(EmblemProviderManager::getInstance(), &EmblemProviderManager::requestUpdateFile, this, [=](const QString &uri){ auto index = indexFromUri(uri); if (index.isValid()) Q_EMIT this->dataChanged(index, index); }); } AdvancedDesktopItemModel::~AdvancedDesktopItemModel() { } bool findProgram(const QString &program) { QFileInfo fi(program); if (!program.isEmpty() && fi.isExecutable()) { return true; } const QStringList paths = QFile::decodeName(qgetenv("PATH")).split(':'); for(const QString &dir : paths) { QFileInfo fi= QFileInfo(dir + QDir::separator() + program); if (fi.isExecutable()) { return true; } } return false; } void AdvancedDesktopItemModel::refreshInternal() { m_items_need_relayout.clear(); ThumbnailManager::getInstance()->syncThumbnailPreferences(); beginResetModel(); for (auto info : m_files) { ThumbnailManager::getInstance()->releaseThumbnail(info->uri()); } m_files.clear(); m_enumerator = new FileEnumerator(this); connect(this, &AdvancedDesktopItemModel::prepareRefresh, m_enumerator, &FileEnumerator::cancel, Qt::DirectConnection); m_enumerator->setAutoDelete(); QString desktopUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); m_enumerator->setEnumerateDirectory(desktopUri); m_enumerator->connect(m_enumerator, &FileEnumerator::enumerateFinished, this, &AdvancedDesktopItemModel::onEnumerateFinished); m_enumerator->enumerateAsync(); endResetModel(); } QVariant AdvancedDesktopItemModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); //qDebug()<<"data"<uri(); auto info = m_files.at(index.row()); switch (role) { case Qt::DisplayRole:{ QString displayName = info->displayName(); if (info->isDesktopFile()) { displayName = FileUtils::handleDesktopFileName(info->uri(), info->displayName()); return QVariant(displayName); } /* story#8359 【文件管理器】手动开启关闭文件拓展名 */ if(!m_showFileExtension){ if (info->isDir()) { return QVariant(displayName); } return QVariant(FileUtils::getBaseNameOfFile(displayName)); }else return QVariant(displayName); } case Qt::ToolTipRole: { /** * @task #346285: 【Tooltips specification】Change the desktop icon (including the management-desktop-application icon) tooltips display, * add supplementary text * * @author: Renyg * @date: 2024-09-25 */ return getTooltipForIndex(index); } case Qt::DecorationRole: { return info->getIcon(); } case UriRole: return info->uri(); case IsLinkRole: return info->isSymbolLink(); case emblemRole: { return getEmblems(index); } case IsDirRole: { //是否是目录 return FileUtils::getFileIsFolder(index.data(Qt::UserRole).toString()); } case SoftLinkRole: { //是否是软连接 return FileUtils::getFileIsSymbolicLink(index.data(Qt::UserRole).toString()); } default: QStandardItem *item = itemFromIndex(index); return item ? item->data(role) : QVariant(); } return QVariant(); } QVariant AdvancedDesktopItemModel::getEmblems(const QModelIndex &index) const { QList emblemPoses = {4, 3, 2, 1}; //bottom right, bottom left, top right, top left QStringList emblemNames = {"", "", "", ""}; QString uri = index.data(UriRole).toString(); FileInfo* file = FileInfo::fromUri(uri).get(); if ((uri != "computer:///") && (uri != "trash:///")) { if (! file->canRead() || !file->isExistTargetOfSymlink()) { emblemPoses.removeOne(1); emblemNames[3] = "emblem-unreadable"; } else if(! file->canWrite()/* && ! file->canExecute()*/) { //只读图标对应可读不可写情况,与可执行权限无关,link to bug#99998 emblemPoses.removeOne(1); emblemNames[3] = "emblem-readonly"; } } if (index.data(IsLinkRole).toBool()) { emblemPoses.removeOne(3); emblemNames[1] = "emblem-link-symbolic"; } // paint extension emblems, FIXME: adjust layout, and implemet on indexwidget, other view. auto extensionsEmblems = EmblemProviderManager::getInstance()->getAllEmblemsForUri(file->uri()); for (auto extensionsEmblem : extensionsEmblems) { if (emblemPoses.isEmpty()) { break; } QIcon icon = QIcon::fromTheme(extensionsEmblem); if (!icon.isNull()) { int pos = emblemPoses.takeFirst(); switch (pos) { case 1: { emblemNames[3] = extensionsEmblem; break; } case 2: { emblemNames[2] = extensionsEmblem; break; } case 3: { emblemNames[1] = extensionsEmblem; break; } case 4: { emblemNames[0] = extensionsEmblem; break; } default: break; } } } return emblemNames; } std::shared_ptr AdvancedDesktopItemModel::getFileInfo(const QModelIndex &index) const { if (!index.isValid() || m_files.isEmpty() || index.row() >= m_files.length()) return nullptr; return m_files.at(index.row()); } void AdvancedDesktopItemModel::onEnumerateFinished(bool successed) { if (!successed) { qWarning()<<"failed to enumerate desktop"; beginResetModel(); m_files.clear(); endResetModel(); return; } // check if there is info querying, if true, wait querying finished. while (!m_querying_files.isEmpty()) { qApp->processEvents(); } if (m_files.count() > 0) { beginRemoveRows(QModelIndex(), 0, m_files.count() - 1); m_files.clear(); endRemoveRows(); } auto computer = FileInfo::fromUri("computer:///"); auto personal = FileInfo::fromPath(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); auto trash = FileInfo::fromUri("trash:///"); QList> infos; infos<getChildren(); m_querying_files = infos; m_files = infos; for (auto info : infos) { auto asyncJob = new FileInfoJob(info); connect(this, &AdvancedDesktopItemModel::prepareRefresh, asyncJob, [=]{ asyncJob->cancel(); asyncJob->setProperty("isCancelled", true); }, Qt::DirectConnection); connect(asyncJob, &FileInfoJob::queryAsyncFinished, this, [=](bool successed){ m_querying_files.removeOne(info); if (!successed) { m_files.removeOne(info); } if (asyncJob->property("isCancelled").toBool()) { // quit loop to avoid invalid data inserted; return; } // task #355895 // 初始化时无法获取软链接源文件信息,进入轮询 if (info->isSymbolLink() && !info->canRead()) { this->pendingQuery(info->uri()); } if (m_querying_files.isEmpty()) { for (auto info : m_files) { auto uri = info->uri(); auto item = new AdvancedDesktopIconItem(info->uri()); appendRow(item); if (info->isDesktopFile()) { ThumbnailManager::getInstance()->updateDesktopFileThumbnail(info->uri(), m_thumbnail_watcher); } else { ThumbnailManager::getInstance()->createThumbnail(info->uri(), m_thumbnail_watcher); } } //qDebug()<<"startMornitor"; m_trash_watcher->startMonitor(); qWarning() << "desktopfile:" << m_desktop_watcher->currentUri() << " >>>> " << QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); if (m_desktop_watcher->currentUri() != "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)) { m_desktop_watcher->stopMonitor(); m_desktop_watcher->forceChangeMonitorDirectory("file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); m_desktop_watcher->setMonitorChildrenChange(true); } m_desktop_watcher->startMonitor(); if (!initMetaInfo) { getAllRestoreInfo(); initMetaInfo = true; Q_EMIT emitFinish(); ThumbnailManager::getInstance()->setBlocked(false); QTimer::singleShot(500, this, [=]{ for (auto file : m_files) { ThumbnailManager::getInstance()->createThumbnail(file->uri(), m_thumbnail_watcher); } }); } else { Q_EMIT refreshed(); } asyncJob->deleteLater(); } }); asyncJob->queryAsync(); } } const QModelIndex AdvancedDesktopItemModel::indexFromUri(const QString &uri) { for (auto info : m_files) { if (info->uri() == uri) { return index(m_files.indexOf(info), 0); } } return QModelIndex(); } Qt::ItemFlags AdvancedDesktopItemModel::flags(const QModelIndex &index) const { auto uri = index.data(UriRole).toString(); auto info = FileInfo::fromUri(uri); if (index.isValid()) { Qt::ItemFlags flags = QAbstractItemModel::flags(index); flags |= Qt::ItemIsDragEnabled; flags |= Qt::ItemIsEditable; if (info->isDir()) { flags |= Qt::ItemIsDropEnabled; } return flags; } else { return Qt::ItemIsDropEnabled; } } QMimeData *AdvancedDesktopItemModel::mimeData(const QModelIndexList &indexes) const { QMimeData* data = QAbstractItemModel::mimeData(indexes); //set urls data URLs correspond to the MIME type text/uri-list. QList urls; QStringList uris; for (auto index : indexes) { QUrl url = index.data(UriRole).toString(); if (!urls.contains(url)) urls<setUrls(urls); auto string = uris.join(" "); data->setData("peony-qt/encoded-uris", string.toUtf8()); data->setText(string); return data; } bool AdvancedDesktopItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { Q_UNUSED(row) Q_UNUSED(column) //qDebug()<isEmptyInfo()) { // note that this case nearly won't happened. // but there is a bug reported due to this. // link to task #48798. FileInfoJob j(info); j.querySync(); } if (!info->isDir() && ! destDirUri.startsWith("trash:///")) { return false; } //NOTE: //do not allow drop on it self. auto urls = data->urls(); if (urls.isEmpty()) return false; bool hasPeonyEncodedUris = false; if (data->hasFormat("peony-qt/encoded-uris")) { if (!data->data("peony-qt/encoded-uris").isEmpty()) { hasPeonyEncodedUris = true; } } bool bIDMMoveToOther = false; QStringList srcUris; if (hasPeonyEncodedUris) { srcUris = QString(data->data("peony-qt/encoded-uris")).split(" "); for (QString uri : srcUris) { if (uri.startsWith("recent://")) { srcUris.removeOne(uri); } if (uri.startsWith("idm://")) { bIDMMoveToOther = true; srcUris.removeOne(uri); QString tempUri = uri.split('/', Qt::SkipEmptyParts).last(); QString realUri = "file://" + QUrl::fromPercentEncoding(tempUri.toUtf8()); srcUris.append(realUri); } } } else { for (auto url : urls) { //can not drag file from recent if (url.url().startsWith("recent://")) return false; srcUris<hasFormat("peony-qt/is-search")) { bMoveFromSearchTab = QVariant(data->data("peony-qt/is-search")).toBool(); } bool b_trash_item = false; for(auto path : srcUris) { if (path.contains("trash:///")) { b_trash_item = true; break; } } //drag from trash to another place, return false //comment to fix can not drag to copy trash file,link to bug#117741 // if (b_trash_item && destDirUri != "trash:///") // return false; auto fileOpMgr = FileOperationManager::getInstance(); bool addHistory = true; bool canNotTrash = false; for (auto uri : srcUris) { if (uri.startsWith("filesafe:///")) { canNotTrash = true; break; } } if (destDirUri.startsWith("trash:///")) { // 如果是保护箱删除时,不会反馈删除弹窗,保护箱文件不影响 if(!(srcUris.first().startsWith("filesafe:///") && (QString(srcUris.first()).remove("filesafe:///").indexOf("/") == -1))) { //fix bug#91525, can trash file in U disk issue FileOperationUtils::trash(srcUris, true, bMoveFromSearchTab); // if(canNotTrash){ // FileOperationUtils::trash(srcUris, false); // }else { // FileTrashOperation *trashOp = new FileTrashOperation(srcUris); // fileOpMgr->startOperation(trashOp, addHistory); // } } } else { qDebug() << "DesktopItemModel dropMimeData:" <connect(op, &FileOperation::operationFinished, this, [=](){ //Peony::SoundEffect::getInstance()->copyOrMoveSucceedMusic(); //Task#152997, use sdk play sound if (op->hasError()) { return; } #ifdef KY_SDK_SOUND_EFFECTS kdk::KSoundEffects::playSound(SoundType::OPERATION_FILE); #endif }, Qt::BlockingQueuedConnection); } //NOTE: //we have to handle the dnd with file operation, so do not //use QAbstractModel::dropMimeData() here; return false; } void AdvancedDesktopItemModel::refresh() { Q_EMIT prepareRefresh(); beginResetModel(); m_files.clear(); m_items_need_relayout.clear(); clear(); endResetModel(); m_desktop_info = FileInfo::fromPath(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); auto infoJob = new FileInfoJob(m_desktop_info); infoJob->setAutoDelete(); connect(infoJob, &FileInfoJob::queryAsyncFinished, this, [=](bool successed){ if (successed) { refreshInternal(); } else { qWarning()<<"desktop model refreshs: can not query desktop info"<uri(); } }); connect(this, &AdvancedDesktopItemModel::prepareRefresh, infoJob, &FileInfoJob::cancel, Qt::DirectConnection); infoJob->queryAsync(); } void AdvancedDesktopItemModel::setdata(int i, const QVariant &value, int role) { QModelIndex modelindex = index(i, 0); AdvancedDesktopIconItem* item = static_cast(itemFromIndex(modelindex)) ; item->setData(value, role); } void AdvancedDesktopItemModel::updateMetaInfo(QStandardItem *item) { //获取当前屏幕的view QString uri = item->data(UriRole).toString(); auto metaInfo = FileMetaInfo::fromUri(uri); if (metaInfo) { int id = metaInfo->getMetaInfoInt(SCREEN_ID); item->setData(id, ScreenIdRole); QStringList strPos = metaInfo->getMetaInfoStringListV1(ITEM_GRID_POS_ATTRIBUTE); if (2 == strPos.count() && strPos[0].toInt() >= 0 && strPos[1].toInt() >= 0) { QPoint pos(strPos[0].toInt(), strPos[1].toInt()); item->setData(pos, PositionRole); } QStringList value = metaInfo->getMetaInfoStringList(RESTORE_ITEM_GRID_POS_ATTRIBUTE); item->setData(value, ExceptedPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_EXTEND_ITEM_GRID_POS_ATTRIBUTE); item->setData(value, ExtendScreenPositionRole); value = metaInfo->getMetaInfoStringList(RESTORE_SINGLESCREEN_ITEM_GRID_POS_ATTRIBUTE); item->setData(value, SinglesSreenPositionRole); } } void AdvancedDesktopItemModel::getAllRestoreInfo() { for (int row = 0; row < rowCount(); row++) { QModelIndex modelIndex = index(row, 0); auto uri = modelIndex.data(UriRole).toString(); int currentId = modelIndex.data(ScreenIdRole).toInt(); QVariant tmp = modelIndex.data(ExceptedPositionRole); QStringList extendPos = tmp.toStringList(); if (3 == extendPos.count()) { int col = extendPos.at(0).toInt(); int row = extendPos.at(1).toInt(); int id = extendPos.takeAt(2).toInt(); if (id == currentId && col >= 0 && row >= 0) { QVariant value(extendPos); QPoint pos(col, row); setData(modelIndex, QStringList(""), ExceptedPositionRole); setData(modelIndex, pos, PositionRole); } } } } void AdvancedDesktopItemModel::saveExtendItemInfo() { bool desktopAutoLayout = GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); QVector iconDataList; //task#74174 扩展屏的元素记录到metInfo,以便以后恢复 for (int i = 0; i < rowCount(); i++) { QModelIndex modelIndex = index(i, 0); //QMap roleData = itemData(modelIndex); auto position = modelIndex.data(PositionRole).toPoint(); int currentId = modelIndex.data(ScreenIdRole).toInt(); QStringList extendPos = modelIndex.data(ExtendScreenPositionRole).toStringList(); //恢复单屏下的图标 if (desktopAutoLayout) { QString uri = modelIndex.data(UriRole).toString(); iconDataList.append({currentId, position, modelIndex, uri}); } else { QStringList pos = modelIndex.data(SinglesSreenPositionRole).toStringList(); if (pos.count() == 2) { setData(modelIndex, QPoint(pos[0].toInt(), pos[1].toInt()), PositionRole); setData(modelIndex, QStringList(), SinglesSreenPositionRole); } } //如果不存在扩展屏坐标,则保存当前坐标到扩展屏坐标 if (extendPos.count() != 3) { QStringList topLeft; topLeft< roleData = itemData(modelIndex); QVariant value = modelIndex.data(UriRole); QPoint currentPos = modelIndex.data(PositionRole).toPoint(); value = modelIndex.data(ExtendScreenPositionRole); QStringList extendPos = value.toStringList(); if (3 == extendPos.count()) { int col = extendPos.at(0).toInt(); int row = extendPos.at(1).toInt(); int id = extendPos.takeAt(2).toInt(); if (col >= 0 && row >= 0) { QPoint pos(col, row); setData(modelIndex, pos, PositionRole); setData(modelIndex, id, ScreenIdRole); setData(modelIndex, QStringList(""), ExtendScreenPositionRole); } } value = modelIndex.data(SinglesSreenPositionRole); QStringList screenlist = value.toStringList(); if (screenlist.count() != 2) { QStringList tmp; tmp< roleData = itemData(modelIndex); QStringList tmp(""); setData(modelIndex, tmp, SinglesSreenPositionRole); if (saveId) { setData(modelIndex, tmp, ExceptedPositionRole); QStringList extendPos = modelIndex.data(ExceptedPositionRole).toStringList(); if (extendPos.count() == 3) { tmp.clear(); tmp<<"-1"<<"-1"<uri() == info->uri()) { exsited = true; break; } } if (!exsited) { if (!m_renaming_file_pos.first.isEmpty() && uri != m_renaming_file_pos.first && uri.contains(m_renaming_file_pos.first)) { return; } m_items_need_relayout.append(uri); m_items_need_relayout.removeOne(m_renaming_file_pos.first); m_items_need_relayout.removeOne(m_renaming_file_pos.first + ".desktop"); if (m_renaming_operation_info.get()) { m_items_need_relayout.removeOne(m_renaming_operation_info.get()->target()); } m_items_need_relayout.removeDuplicates(); auto job = new FileInfoJob(info); job->setAutoDelete(); job->querySync(); // locate new item ===== //task#74174 扩展模式下支持拖拽图标放置到扩展屏, 创建文件获取当前view //file changed, force create thubnail, link tobug#83108 ThumbnailManager::getInstance()->createThumbnail(info->uri(), m_thumbnail_watcher, true); m_files<uri()); AdvancedDesktopIconItem *item = new AdvancedDesktopIconItem(info->uri(), true); this->appendRow(item); int id = item->data(ScreenIdRole).toInt(); Q_EMIT sig_fileCreated(id, uri); } else{ //file content changed, need update fileinfo, fix bug#76908 auto job = new FileInfoJob(info); job->setAutoDelete(); job->querySync(); } } void AdvancedDesktopItemModel::pendingQuery(const QString &uri) { // task: #355895 // note: 指向外部分区的软链接在桌面初始化时可能查询不到链接的源文件, // 这可能是因为外部分区挂载比桌面拉起慢导致的,这里增加一个pending机制 if (!m_pending_query_timer) { m_pending_query_timer = new QTimer(this); m_pending_query_timer->setInterval(1000); connect(m_pending_query_timer, &QTimer::timeout, this, [=]{ for (auto uri : m_pending_query_uris) { // 使用现有文件改变流程触发更新 m_desktop_watcher->fileChanged(uri); } m_pending_query_uris.clear(); }); } m_pending_query_uris.insert(uri); m_pending_query_timer->start(); } void AdvancedDesktopItemModel::saveExtendItemInfo(int id) { //task#74174 销毁时保存扩展屏元素的坐标点 for (int row = 0; row < rowCount(); row++) { QModelIndex modelIndex = index(row, 0); int currentId = modelIndex.data(ScreenIdRole).toInt(); if(currentId != id) { continue; } //QMap roleData = itemData(modelIndex); auto uri = modelIndex.data(UriRole).toString(); QVariant tmp = modelIndex.data(ExceptedPositionRole); QStringList extendPos = tmp.toStringList(); if (3 != extendPos.count() && currentId != extendPos[2].toInt()) { QPoint pos = modelIndex.data(PositionRole).toPoint(); QStringList topLeft; topLeft<uri(); if (TooltipsManagerInstance.isTimeConsumingFile(info.get())) { if (TooltipsManagerInstance.hasValidMetadataCache(uri)) { return QVariant(TooltipsManagerInstance.generateTooltip(info.get())); } if (!m_pendingTooltips.contains(uri)) { m_pendingTooltips.insert(uri); QMetaObject::invokeMethod(&TooltipsManagerInstance, "loadMetadataAsync", Qt::QueuedConnection, Q_ARG(QString, uri)); } return QVariant(TooltipsManagerInstance.generateTooltip(info.get())); } return QVariant(TooltipsManagerInstance.generateTooltip(info.get())); } void AdvancedDesktopItemModel::updateTooltips(const QString &uri) { auto index = indexFromUri(uri); if (index.isValid()) { Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); } } peony/peony-qt-desktop/qml.qrc0000664000175000017500000000055315154271106015362 0ustar fengfeng qml-desktop/DesktopView.qml qml-desktop/SelectionModel.qml qml-desktop/ShortcutManager.qml qml-desktop/BackgroundItem.qml qml-desktop/DelegateText.qml qml-desktop/DelegateIcon.qml peony/peony-qt-desktop/fm-dbus-service.h0000664000175000017500000000314115154271070017222 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef FMDBUSSERVICE_H #define FMDBUSSERVICE_H #include namespace Peony { class FMDBusService : public QObject { Q_OBJECT //Do not modify this row. Q_CLASSINFO("D-Bus Interface", "org.freedesktop.FileManager1") public: explicit FMDBusService(QObject *parent = nullptr); Q_SCRIPTABLE void ShowFolders(const QStringList& uriList, const QString& startUpId); Q_SCRIPTABLE void ShowItems(const QStringList& uriList, const QString& startUpId); Q_SCRIPTABLE void ShowItemProperties(const QStringList& uriList, const QString& startUpId); Q_SIGNALS: void showFolderRequest(const QStringList& uriList, const QString& startUpId); void showItemsRequest(const QStringList& uriList, const QString& startUpId); void showItemPropertiesRequest(const QStringList& uriList, const QString& startUpId); }; } #endif // FMDBUSSERVICE_H peony/peony-qt-desktop/screen-manager.cpp0000664000175000017500000002764715154271106017472 0ustar fengfeng#include "screen-manager.h" #include #include #include ScreenManager* ScreenManager::m_instance = nullptr; ScreenManager* ScreenManager::getInstance() { if (!m_instance) { m_instance = new ScreenManager(); qAddPostRoutine([](){ delete m_instance; m_instance = nullptr; }); } return m_instance; } ScreenManager::ScreenManager(QObject *parent) : QObject(parent), m_displayMode(Unknown), m_lastScreenId(0) { connect(qApp, &QGuiApplication::screenAdded, this, &ScreenManager::handleScreenAdded); connect(qApp, &QGuiApplication::screenRemoved, this, &ScreenManager::handleScreenRemoved); connect(qApp, &QGuiApplication::primaryScreenChanged, this, &ScreenManager::handlePrimaryScreenChanged); initScreens(); } ScreenManager::~ScreenManager() { } void ScreenManager::initScreens() { m_screenIds.clear(); m_screens.clear(); for (QScreen* screen : QGuiApplication::screens()) { if (screen == QGuiApplication::primaryScreen()) { // 确保主屏幕ID为0 m_screenIds[screen] = 0; m_screens[0] = screen; } else { // 分配自增ID int id = generateScreenId(); m_screenIds[screen] = id; m_screens[id] = screen; } connect(screen, &QScreen::geometryChanged, this, [=](const QRect &geometry) { handleScreenGeometryChanged(screen, geometry); }); qDebug() << "init screen "<name()<geometry()<name(); } updateDisplayMode(); updateVirtualDesktopGeometry(); } int ScreenManager::generateScreenId() { // 找到一个未使用的ID m_lastScreenId = 0; while (m_screens.contains(m_lastScreenId)) { m_lastScreenId++; } return m_lastScreenId; } bool ScreenManager::updateDisplayMode() { DisplayMode oldMode = m_displayMode; if (screenCount() == 1) { m_displayMode = Single; } else { // 检查所有屏幕是否有相同的几何形状(镜像) bool allSameGeometry = true; QRect firstGeometry = m_screens.value(0)->geometry(); for (auto it = m_screens.begin(); it != m_screens.end(); ++it) { qDebug()<<"DisplayMode get screen Geometry"<geometry(); if (it.value()->geometry() != firstGeometry) { allSameGeometry = false; break; } } m_displayMode = allSameGeometry ? Mirror : Extend; } qDebug()<<"update mode: oldmode"<geometry(); } m_virtualDesktopGeometry = region.boundingRect(); if (oldGeometry != m_virtualDesktopGeometry) { Q_EMIT virtualDesktopGeometryChanged(); } } QScreen* ScreenManager::primaryScreen() const { return QGuiApplication::primaryScreen(); } bool ScreenManager::isPrimaryScreen(QScreen *screen) const { return primaryScreen() == screen; } QList ScreenManager::allScreens() const { return QGuiApplication::screens(); } int ScreenManager::screenCount() const { return QGuiApplication::screens().count(); } int ScreenManager::displayMode() const { return m_displayMode; } QRect ScreenManager::virtualDesktopGeometry() const { return m_virtualDesktopGeometry; } QVariantMap ScreenManager::getScreenInfo(int screenId) const { QVariantMap info; QScreen* screen = getScreenById(screenId); if (!screen) return info; info["id"] = screenId; info["name"] = screen->name(); info["geometry"] = screen->geometry(); info["availableGeometry"] = screen->availableGeometry(); info["size"] = screen->size(); info["physicalSize"] = screen->physicalSize(); info["logicalDotsPerInch"] = screen->logicalDotsPerInch(); info["physicalDotsPerInch"] = screen->physicalDotsPerInch(); info["refreshRate"] = screen->refreshRate(); info["isPrimary"] = (screen == primaryScreen()); return info; } QScreen* ScreenManager::getScreenById(int screenId) const { return m_screens.value(screenId, nullptr); } int ScreenManager::getScreenId(QScreen* screen) const { return m_screenIds.value(screen, -1); } int ScreenManager::getPrimaryScreenId() const { return m_screenIds.value(primaryScreen(), 0); } QRect ScreenManager::getScreenGeometry(int screenId) const { QScreen* screen = getScreenById(screenId); return screen ? screen->geometry() : QRect(); } QPoint ScreenManager::getScreenPosition(int screenId) const { QScreen* screen = getScreenById(screenId); return screen ? screen->geometry().topLeft() : QPoint(); } QSize ScreenManager::getScreenSize(int screenId) const { QScreen* screen = getScreenById(screenId); return screen ? screen->size() : QSize(); } qreal ScreenManager::getScreenScaleFactor(int screenId) const { QScreen* screen = getScreenById(screenId); return screen ? screen->devicePixelRatio() : 1.0; } int ScreenManager::getScreenIdAt(const QPoint& pos) const { if (m_displayMode == Mirror) return 0; for (auto it = m_screens.begin(); it != m_screens.end(); ++it) { if (it.value()->geometry().contains(pos)) { return it.key(); } } return -1; } QPoint ScreenManager::mapToGlobal(int screenId, const QPoint& pos) const { QScreen* screen = getScreenById(screenId); if (!screen) return pos; return screen->geometry().topLeft() + pos; } QPoint ScreenManager::mapFromGlobal(int screenId, const QPoint& pos) const { QScreen* screen = getScreenById(screenId); if (!screen) return pos; return pos - screen->geometry().topLeft(); } QList ScreenManager::getBackgroundWindows() const { return m_backgroundWindows.values(); } void ScreenManager::relocateWindows() { Q_EMIT windowsRelocateRequired(); } void ScreenManager::switchToSingleScreenMode() { Q_EMIT singleScreenModeActivated(); } void ScreenManager::switchToMultiScreenMode() { Q_EMIT multiScreenModeActivated(); } int ScreenManager::checkScreenMode(const QRect& geometry) { if (screenCount() == 1) { return Single; } for (QScreen* screen : QGuiApplication::screens()) { if (screen->geometry() != geometry) { return Extend; } } return Mirror; } void ScreenManager::handleScreenAdded(QScreen* screen) { if (!screen) return; if (screen->name().isEmpty()) return; qDebug() << "Screen added:" << screen->name()<geometry() != screen->geometry()) { view->setGeometry(screen->geometry()); } } // 为新屏幕分配ID int id = generateScreenId(); m_screenIds[screen] = id; m_screens[id] = screen; // 连接屏幕几何变化信号 connect(screen, &QScreen::geometryChanged, this, [=](const QRect &geometry) { handleScreenGeometryChanged(screen, geometry); }); // 更新显示模式和虚拟桌面几何形状 updateDisplayMode(); updateVirtualDesktopGeometry(); Q_EMIT screenAdded(screen, id); Q_EMIT screenCountChanged(); } void ScreenManager::handleScreenRemoved(QScreen* screen) { if (!screen) return; qDebug() << "Screen removed:" << screen->name(); // 获取屏幕ID,并从映射中删除 int id = m_screenIds.value(screen, -1); if (id >= 0) { m_screenIds.remove(screen); m_screens.remove(id); if (m_backgroundWindows.contains(id)) { QQuickView* window = m_backgroundWindows.take(id); Q_EMIT windowRemoved(window, id); } } // 更新显示模式和虚拟桌面几何形状 updateDisplayMode(); updateVirtualDesktopGeometry(); Q_EMIT screenRemoved(screen, id); Q_EMIT screenCountChanged(); } void ScreenManager::handlePrimaryScreenChanged(QScreen* screen) { if (!screen) return; if (screen->name().isEmpty()) return; qDebug() << "Primary screen changed to:" << screen->name(); // 确保主屏幕ID为0 int newPrimaryId = m_screenIds.value(screen, -1); if (newPrimaryId < 0) { // 新主屏幕还没有ID,分配ID 0 m_screenIds[screen] = 0; m_screens[0] = screen; } else if (newPrimaryId != 0) { // 交换ID QScreen* oldPrimary = m_screens.value(0); if (oldPrimary) { m_screenIds[oldPrimary] = newPrimaryId; m_screens[newPrimaryId] = oldPrimary; } m_screenIds[screen] = 0; m_screens[0] = screen; // 交换窗口 QQuickView* oldPrimaryWindow = m_backgroundWindows.value(0); QQuickView* newPrimaryWindow = m_backgroundWindows.value(newPrimaryId); if (oldPrimaryWindow && newPrimaryWindow) { m_backgroundWindows[0] = newPrimaryWindow; QRect newPrimaryGeo = screen->geometry(); qDebug() << "new primay:"<name()<geometry(); m_backgroundWindows[newPrimaryId] = oldPrimaryWindow; QRect oldPrimaryGeo = oldPrimary->geometry(); qDebug() << "old primay:"<name()<geometry(); } } Q_EMIT primaryScreenChanged(); } void ScreenManager::handleScreenGeometryChanged(QScreen *screen, const QRect &geometry) { qDebug() << "Screen geometry changed:" << geometry; if (!screen) return; int id = m_screenIds.value(screen); QQuickView *view = m_backgroundWindows.value(id); bool geometryChanged = false; if (view && view->geometry() != geometry) { view->setGeometry(geometry); geometryChanged = true; } bool modeChanged = updateDisplayMode(); if (modeChanged && geometryChanged) { windowsRelocateRequired(); } updateVirtualDesktopGeometry(); } void ScreenManager::addBackgroundWindow(QQuickView* window, QScreen* screen, int id) { if (!window || !screen) return; int screenId = (id >= 0) ? id : getScreenId(screen); if (screenId < 0) { screenId = generateScreenId(); m_screenIds[screen] = screenId; m_screens[screenId] = screen; } m_backgroundWindows[screenId] = window; Q_EMIT windowAdded(window, screenId); } QQuickView *ScreenManager::getWindowAt(const QPoint& pos) const { int id = m_displayMode == Mirror? 0 : getScreenIdAt(pos); QQuickView *window = m_backgroundWindows.value(id, nullptr); if (!window) { window = m_backgroundWindows.value(0); } return window; } QQuickView *ScreenManager::getWindowById(int screenId) const { QQuickView *window = m_backgroundWindows.value(screenId, nullptr); if (!window) { window = m_backgroundWindows.value(0); } return window; } void ScreenManager::removeBackgroundWindow(QQuickView* window) { for (auto it = m_backgroundWindows.begin(); it != m_backgroundWindows.end(); ++it) { if (it.value() == window) { int screenId = it.key(); m_backgroundWindows.remove(screenId); Q_EMIT windowRemoved(window, screenId); break; } } } peony/peony-qt-desktop/plasma-shell-manager.cpp0000664000175000017500000000621515154271070020561 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "plasma-shell-manager.h" #include #include #include #include #include static PlasmaShellManager* global_instance = nullptr; PlasmaShellManager *PlasmaShellManager::getInstance() { if (!global_instance) global_instance = new PlasmaShellManager; return global_instance; } bool PlasmaShellManager::setRole(QWindow *window, KWayland::Client::PlasmaShellSurface::Role role) { if (!supportPlasmaShell()) return false; auto surface = KWayland::Client::Surface::fromWindow(window); if (!surface) return false; auto plasmaShellSurface = m_shell->createSurface(surface, window); if (!plasmaShellSurface) return false; plasmaShellSurface->setRole(role); return true; } bool PlasmaShellManager::setPos(QWindow *window, const QPoint &pos) { if (!supportPlasmaShell()) return false; auto surface = KWayland::Client::Surface::fromWindow(window); if (!surface) return false; auto plasmaShellSurface = m_shell->createSurface(surface, window); if (!plasmaShellSurface) return false; plasmaShellSurface->setPosition(pos); return true; } bool PlasmaShellManager::supportPlasmaShell() { return m_shell; } KWayland::Client::PlasmaShellSurface *PlasmaShellManager::createSurface(QWindow *window) { if (!supportPlasmaShell()) return nullptr; auto surface = KWayland::Client::Surface::fromWindow(window); if (!surface) return nullptr; auto plasmaShellSurface = m_shell->createSurface(surface, window); return plasmaShellSurface; } PlasmaShellManager::PlasmaShellManager(QObject *parent) : QObject(parent) { if (!QApplication::platformName().toLower().contains("wayland")) return; auto connection = KWayland::Client::ConnectionThread::fromApplication(qApp); auto registry = new KWayland::Client::Registry(this); registry->create(connection->display()); connect(registry, &KWayland::Client::Registry::plasmaShellAnnounced, this, [=](){ const auto interface = registry->interface(KWayland::Client::Registry::Interface::PlasmaShell); if (interface.name != 0) { m_shell = registry->createPlasmaShell(interface.name, interface.version, this); } }); registry->setup(); connection->roundtrip(); } peony/peony-qt-desktop/desktop-index-widget.cpp0000664000175000017500000004132615154271070020630 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "icon-view-delegate.h" #include "desktop-index-widget.h" #include "desktop-icon-view-delegate.h" #include "advanced-desktop-icon-view.h" #include "file-info.h" #include "emblem-provider.h" #include "global-settings.h" #include #include #include #include #include #include #include #include //qt's global function extern void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed); using namespace Peony; DesktopIndexWidget::DesktopIndexWidget(DesktopIconViewDelegate *delegate, const QStyleOptionViewItem &option, const QModelIndex &index, QWidget *parent) : QWidget(parent) { setContentsMargins(0, 0, 0, 0); m_option = option; m_index = index; m_delegate = delegate; updateItem(); //FIXME: how to handle it in old version? //#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) // connect(qApp, &QApplication::fontChanged, this, [=]() { // m_delegate->getView()->setIndexWidget(m_index, nullptr); // }); //#endif auto view = m_delegate->getView(); view->m_real_do_edit = false; view->m_edit_trigger_timer.stop(); view->m_edit_trigger_timer.start(); } DesktopIndexWidget::~DesktopIndexWidget() { } bool DesktopIndexWidget::eventFilter(QObject *watched, QEvent *event) { switch (event->type()) { case QEvent::ApplicationFontChange: case QEvent::FontChange: { updateItem(); break; } default: break; } return false; } void DesktopIndexWidget::paintEvent(QPaintEvent *e) { auto view = m_delegate->getView(); //qDebug()<<"paint"; auto visualRect = m_delegate->getView()->visualRect(m_index); if (this->pos() != visualRect.topLeft()) { move(visualRect.topLeft()); return; } if (!view->selectionModel()->selectedIndexes().contains(m_index)) { view->m_real_do_edit = false; view->m_edit_trigger_timer.stop(); this->close(); return; } Q_UNUSED(e) QPainter p(this); // auto bgColor = m_option.palette.highlight().color(); int radius = view->radius(); auto bgColor = QApplication::palette().highlight().color(); p.save(); p.setPen(Qt::transparent); bgColor.setAlpha(255*0.7); p.setBrush(bgColor); p.drawRoundedRect(this->rect(), radius, radius); p.restore(); //auto font = view->getViewItemFont(&m_option); auto opt = m_option; auto iconSizeExcepted = m_delegate->getView()->iconSize(); auto iconRect = QApplication::style()->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, opt.widget); int y_delta = iconSizeExcepted.height() - iconRect.height(); opt.rect.moveTo(opt.rect.x(), opt.rect.y() + y_delta); //int maxTextHight = this->height() - iconSizeExcepted.height() - 10; int maxTextHight = view->viewport()->height() - this->geometry().y() - iconSizeExcepted.height() - 10; //setFixedHeight(opt.rect.height() + y_delta); // draw icon opt.text = nullptr; p.save(); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, &p, m_delegate->getView()); p.restore(); p.save(); p.translate(0, m_delegate->getView()->iconSize().height() + 5); if (b_elide_text) { int charWidth = opt.fontMetrics.averageCharWidth(); m_option.text = opt.fontMetrics.elidedText(m_option.text, Qt::ElideRight, ELIDE_TEXT_LENGTH * charWidth); } // draw text shadow p.save(); auto expectedSize = Peony::DirectoryView::IconViewTextHelper::getTextSizeForIndex(m_option, m_index, 0, 0); QPixmap pixmap(expectedSize); pixmap.fill(Qt::transparent); QPainter shadowPainter(&pixmap); shadowPainter.setPen(Qt::black); Peony::DirectoryView::IconViewTextHelper::paintText(&shadowPainter, m_option, m_index, maxTextHight, 0, 9999, false, Qt::black); shadowPainter.end(); QImage shadowImage(expectedSize + QSize(4, 4), QImage::Format_ARGB32_Premultiplied); shadowImage.fill(Qt::transparent); shadowPainter.begin(&shadowImage); shadowPainter.drawPixmap(2, 2, pixmap); qt_blurImage(shadowImage, 8, false, false); for (int x = 0; x < shadowImage.width(); x++) { for (int y = 0; y < shadowImage.height(); y++) { auto color = shadowImage.pixelColor(x, y); if (color.alpha() > 0) { color.setAlphaF(qMin(color.alphaF() * 1.5, 1.0)); shadowImage.setPixelColor(x, y, color); } } } shadowPainter.end(); p.translate(-3, -1); p.drawImage(0, 0, shadowImage); p.restore(); // draw text p.setPen(m_option.palette.highlightedText().color()); p.setFont(qApp->font()); Peony::DirectoryView::IconViewTextHelper::paintText(&p, m_option, m_index, maxTextHight, 0, 9999, false); p.restore(); QList emblemPoses = {4, 3, 2, 1}; //bottom right, bottom left, top right, top left QRect emblemRect = iconRect; int emblemsSize = 16; switch (view->zoomLevel()) { case AdvancedDesktopIconView::Small: { emblemsSize = 8; break; } case AdvancedDesktopIconView::Normal: { break; } case AdvancedDesktopIconView::Large: { emblemsSize = 24; break; } case AdvancedDesktopIconView::Huge: { emblemsSize = 32; break; } default: { break; } } auto rect = opt.rect; int topLeftX = emblemRect.x()-emblemsSize/2+3 < rect.x()? rect.x() : emblemRect.x()-emblemsSize/2+3; int topLeftY = emblemRect.y()-emblemsSize/2 < rect.y() - y_delta/2? rect.y() - y_delta/2 : emblemRect.y()-emblemsSize/2; int bottomRightX = emblemRect.right()-emblemsSize/2 <= topLeftX + emblemsSize? topLeftX + emblemsSize + 5 : emblemRect.right()-emblemsSize/2 ; int bottomRightY = emblemRect.bottom()-emblemsSize <= topLeftY + emblemsSize? topLeftY + emblemsSize + 5 : emblemRect.bottom()-emblemsSize; //paint link icon and locker icon FileInfo *file = FileInfo::fromUri(m_index.data(Qt::UserRole).toString()).get(); if ((m_index.data(Qt::UserRole).toString() != "computer:///") && (m_index.data(Qt::UserRole).toString() != "trash:///")) { auto linkRect = QRect(QPoint(topLeftX, topLeftY), QSize(emblemsSize, emblemsSize)); /** * @bug #262561: [File Manager] PDF desktop shortcut files with deleted source files * do not display the same icon on the desktop folder as on the desktop. * * If the source file of a symbolic link is deleted, an “X” icon will be displayed in the upper left corner. * * @author: Renyg * @date: 2024-09-11 */ if (! file->canRead() || !file->isExistTargetOfSymlink()) { emblemPoses.removeOne(1); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-unreadable"); p.save(); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(&p, linkRect, Qt::AlignCenter); p.restore(); } else if(! file->canWrite()) { //只读图标对应可读不可写情况,与可执行权限无关,link to bug#99998 emblemPoses.removeOne(1); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-readonly"); p.save(); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(&p, linkRect, Qt::AlignCenter); p.restore(); } } if (m_index.data(Qt::UserRole + 1).toBool()) { emblemPoses.removeOne(3); auto linkRect = QRect(QPoint(topLeftX, bottomRightY), QSize(emblemsSize, emblemsSize)); QIcon symbolicLinkIcon = QIcon::fromTheme("emblem-link-symbolic"); p.save(); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); symbolicLinkIcon.paint(&p, linkRect, Qt::AlignCenter); p.restore(); } // paint extension emblems, FIXME: adjust layout, and implemet on indexwidget, other view. auto extensionsEmblems = EmblemProviderManager::getInstance()->getAllEmblemsForUri(file->uri()); for (auto extensionsEmblem : extensionsEmblems) { if (emblemPoses.isEmpty()) { break; } QIcon icon = QIcon::fromTheme(extensionsEmblem); if (!icon.isNull()) { int pos = emblemPoses.takeFirst(); p.save(); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); switch (pos) { case 1: { icon.paint(&p, topLeftX, topLeftY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 2: { icon.paint(&p, bottomRightX, topLeftY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 3: { icon.paint(&p, topLeftX, bottomRightY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } case 4: { icon.paint(&p, bottomRightX, bottomRightY, emblemsSize, emblemsSize, Qt::AlignCenter); break; } default: break; } p.restore(); } } bgColor.setAlpha(255*0.8); p.setPen(bgColor); p.drawRoundedRect(this->rect().adjusted(0, 0, -1, -1), radius, radius); } void DesktopIndexWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { auto view = m_delegate->getView(); view->m_real_do_edit = true; if (view->m_edit_trigger_timer.isActive()) { if (view->m_edit_trigger_timer.remainingTime() < 3000 - qApp->styleHints()->mouseDoubleClickInterval() && view->m_edit_trigger_timer.remainingTime() > 0) { QTimer::singleShot(300, this, [=]() { if (view->m_real_do_edit) { //not allow to edit special items:computer,trash and personal home path folder name bool special_index = false; QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); special_index = (m_index.data(Qt::UserRole).toString() == "computer:///" || m_index.data(Qt::UserRole).toString() == "trash:///" || m_index.data(Qt::UserRole).toString() == homeUri); if (special_index) return ; if (!view->selectionModel()->selectedIndexes().contains(m_index)) { view->m_real_do_edit = false; view->m_edit_trigger_timer.stop(); this->close(); return; } view->setIndexWidget(m_index, nullptr); view->edit(m_index); } }); } else if(view->m_edit_trigger_timer.remainingTime() >= 3000 - qApp->styleHints()->mouseDoubleClickInterval()) { //优化文件点击策略,提升用户体验,关联bug#125368 //在双击时间间隔内,如果未触发双击事件,但是点击的是同一个有效图标,触发双击事件 //系统默认双击间隔为400ms, 策略为[0,400],触发双击,(400,3000)触发重命名 mouseDoubleClickEvent(event); } else { view->m_real_do_edit = false; view->m_edit_trigger_timer.stop(); } } else { view->m_real_do_edit = false; view->m_edit_trigger_timer.start(); } event->accept(); return; // if (m_edit_trigger.isActive()) { // qDebug()<<"IconViewIndexWidget::mousePressEvent: edit"<type(); // m_delegate->getView()->setIndexWidget(m_index, nullptr); // m_delegate->getView()->edit(m_index); // return; // } } if(event->button() == Qt::RightButton){ event->accept(); return; } QWidget::mousePressEvent(event); } void DesktopIndexWidget::mouseDoubleClickEvent(QMouseEvent *event) { if (! GlobalSettings::getInstance()->getValue(ENABLE_DOUBLE_CLICK_DESKTOP).toBool()) return; /** * @bug #250731: [File Manager] Right clicking on the same folder several times in the file manager will take you to the folder * * Prevent double-click events from triggering on right-click * Only double left clicks will be processed * * @author Renyg * @date 2024-08-13 */ if (event->button() == Qt::RightButton) { return; } auto view = m_delegate->getView(); if (!view->selectionModel()->selectedIndexes().contains(m_index)) { view->m_real_do_edit = false; view->m_edit_trigger_timer.stop(); this->close(); return; } m_delegate->getView()->activated(m_index); m_delegate->getView()->setIndexWidget(m_index, nullptr); return; } void DesktopIndexWidget::updateItem() { auto view = m_delegate->getView(); m_option = view->viewOptions(); m_option.font = qApp->font(); m_option.fontMetrics = qApp->fontMetrics(); m_delegate->initStyleOption(&m_option, m_index); QSize size = m_delegate->sizeHint(m_option, m_index); auto visualRect = m_delegate->getView()->visualRect(m_index); auto rectCopy = visualRect; move(visualRect.topLeft()); setFixedWidth(visualRect.width()); m_option.rect.setWidth(visualRect.width()); int rawHeight = size.height(); auto textSize = Peony::DirectoryView::IconViewTextHelper::getTextSizeForIndex(m_option, m_index, 0, 0); int fixedHeight = 5 + m_delegate->getView()->iconSize().height() + 5 + textSize.height() + 10; // int y_bottom = rectCopy.y() + fixedHeight; // qDebug() << "Y:" <getView()->height(); // b_elide_text = false; // if ( y_bottom > m_delegate->getView()->height() && m_option.text.length() > ELIDE_TEXT_LENGTH) // { // b_elide_text = true; // int charWidth = m_option.fontMetrics.averageCharWidth(); // m_option.text = m_option.fontMetrics.elidedText(m_option.text, Qt::ElideRight, ELIDE_TEXT_LENGTH * charWidth); // //recount size // textSize = Peony::DirectoryView::IconViewTextHelper::getTextSizeForIndex(m_option, m_index, 0, 0); // fixedHeight = 5 + m_delegate->getView()->iconSize().height() + 5 + textSize.height() + 10; // } // qDebug() << "updateItem fixedHeight:" <getViewItemFont(&m_option); auto rawTextRect = QApplication::style()->subElementRect(QStyle::SE_ItemViewItemText, &m_option, m_option.widget); auto iconSizeExcepted = m_delegate->getView()->iconSize(); auto iconRect = QApplication::style()->subElementRect(QStyle::SE_ItemViewItemDecoration, &m_option, m_option.widget); auto y_delta = iconSizeExcepted.height() - iconRect.height(); rawTextRect.setTop(iconRect.bottom() + y_delta + 5); rawTextRect.setHeight(9999); fixedHeight = qMin(view->viewport()->height() - this->geometry().y(), fixedHeight); setFixedHeight(fixedHeight); m_option.rect.setHeight(fixedHeight); } peony/peony-qt-desktop/advanced-desktop-icon-view.cpp0000664000175000017500000027571015154271070021711 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program 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. * * This program 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 . * * Authors: yangyanwei * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "advanced-desktop-icon-view.h" #include "file-enumerator.h" #include "file-meta-info.h" #include "file-info.h" #include "file-info-job.h" #include "file-info-manager.h" #include "file-watcher.h" #include "file-operation-manager.h" #include "file-move-operation.h" #include "file-trash-operation.h" #include "file-copy-operation.h" #include "file-operation-utils.h" #include "file-utils.h" #include "thumbnail-manager.h" #include "usershare-manager.h" #include "global-settings.h" #include "sound-effect.h" #include "audio-play-manager.h" #include "desktop-item-proxy-model.h" #include "advanced-desktop-item-model.h" #include "peony-desktop-application.h" #include "icon-view-style.h" #include "desktop-icon-view-delegate.h" #include "clipboard-utils.h" #include "properties-window.h" #include "desktop-menu.h" #include "file-item-model.h" #include "file-launch-manager.h" #include "image-mount-manager.h" #include "desktop-index-widget.h" #include "common.h" using namespace Peony; static bool refreshing = false; static bool meetSpecialConditions(const QStringList& selectedUris) { /* The desktop home directory, computer, and trash do not allow operations such as copying, cutting, * deleting, renaming, moving, or using shortcut keys for corresponding operations.add by 2021/06/17 */ static QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (selectedUris.contains("computer:///") ||selectedUris.contains("trash:///") ||selectedUris.contains(homeUri)){ return true; } return false; } AdvancedDesktopIconView::AdvancedDesktopIconView(QWidget *parent) : QAbstractItemView(parent) { QString localeName = QLocale::system().name(); if (localeName.contains("ug") || localeName.contains("kk") || localeName.contains("ky")) { setLayoutDirection(Qt::RightToLeft); } setAttribute(Qt::WA_AlwaysStackOnTop); setFrameShape(QFrame::NoFrame); setStyleSheet("QAbstractItemView { background-color: transparent; }"); setItemDelegate(new DesktopIconViewDelegate(this)); auto zoomLevel = this->zoomLevel(); setDefaultZoomLevel(zoomLevel); initShoutCut(); initDoubleClick(); connect(qApp, &QApplication::paletteChanged, this, [=]() { viewport()->update(); }); auto globalSettings = Peony::GlobalSettings::getInstance(); QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { m_radius = 0; } else { m_radius = 6; } connect(globalSettings, &GlobalSettings::valueChanged, this, [=](const QString &key){ if (key == "widgetThemeName") { QString widgetThemeName = globalSettings->getValue("widgetThemeName").toString(); if (widgetThemeName.contains("classical")) { m_radius = 0; } else { m_radius = 6; } viewport()->update(); } }); m_edit_trigger_timer.setSingleShot(true); m_edit_trigger_timer.setInterval(3000); m_last_index = QModelIndex(); // rubberband m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this/*->viewport()*/); m_rubberBand->setVisible(false); m_model = PeonyDesktopApplication::getModel(); m_proxy_model = new DesktopItemProxyModel(m_model); m_proxy_model->setSourceModel(m_model); setModel(m_proxy_model); setSelectionMode(QAbstractItemView::ExtendedSelection); setDragDropMode(QAbstractItemView::DragDrop); setMouseTracking(true);//追踪鼠标 setEditTriggers(QListView::NoEditTriggers); // dnd setDefaultDropAction(Qt::MoveAction); m_peonyDbusSer = new PeonyDbusService(this); m_peonyDbusSer->DbusServerRegister(); setMouseTracking(true);//追踪鼠标 connect(this, &AdvancedDesktopIconView::updateView, this, [=]() { m_itemPosHash.clear(); m_autoArrange.clear(); m_resolutionItemPosHash.clear(); m_proxy_model->invalidate(); reset(); if (m_proxy_model && m_proxy_model->getDesktopUseAutoLayout()) { if (m_autoArrange.count() != m_proxy_model->rowCount()) { qInfo()<<"desktop use auto layout but config cache is invalid, use current layout"; auto sortedUris = layoutItems(); // relayoutExsitingItemsAndUpdate(sortedUris); } return; } resolutionChange(); checkItemsOver(); repaint(); }); connect(m_model, &AdvancedDesktopItemModel::refreshed, this, [=]() { this->setCursor(QCursor(Qt::ArrowCursor)); refreshing = false; if (m_proxy_model->getDesktopUseAutoLayout()) { if (m_autoArrange.count() != m_proxy_model->rowCount()) { qInfo()<<"desktop use auto layout but config cache is invalid, use current layout"; auto sortedUris = layoutItems(); m_autoArrange = sortedUris; } viewport()->update(); return; } checkItemsOver(); viewport()->update(); }); // 图标和字体共同决定网格 connect(this, &AdvancedDesktopIconView::iconSizeChanged, this, &AdvancedDesktopIconView::recalculateAvailableRowAndColumnCount); connect(qApp, &QApplication::fontChanged, this, [=](){ //直接调用槽函数,获取font的高度是没改变之前的 QTimer::singleShot(0, this, [this]() { recalculateAvailableRowAndColumnCount(); }); }); connect(m_model, &AdvancedDesktopItemModel::requestClearIndexWidget, this, &AdvancedDesktopIconView::clearAllIndexWidgets); connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString &key) { if (key == DISPLAY_STANDARD_ICONS || key == HOME_ICON_VISIBLE || key == TRASH_ICON_VISIBLE || key == COMPUTER_ICON_VISIBLE) { m_proxy_model->invalidateModel(); this->resolutionChange(); checkItemsOver(); viewport()->update(); } else if (SHOW_HIDDEN_PREFERENCE == key) { m_show_hidden= GlobalSettings::getInstance()->getValue(key).toBool(); } }); //fix task bar overlap with desktop icon and can drag move issue //bug #27811,33188 if (QGSettings::isSchemaInstalled(PANEL_SETTINGS)) { //panel monitor if (!m_panelSetting) m_panelSetting = new QGSettings(PANEL_SETTINGS, QByteArray(), this); connect(m_panelSetting, &QGSettings::changed, this, [=](const QString &key){ if (key == "panelposition" || key == "panelsize" || key == "settingsislandposition" || key == "paneltype") { setMargins(); recalculateAvailableRowAndColumnCount(); } }); setMargins(); } // try fixing #63358 if (QGSettings::isSchemaInstalled(UKUI_STYLE_SETTINGS)) { auto styleSettings = new QGSettings(UKUI_STYLE_SETTINGS, QByteArray(), this); connect(styleSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == "iconThemeName") { QTimer::singleShot(1000, viewport(), [=]{ viewport()->update(); }); } }); } connect(m_model, &AdvancedDesktopItemModel::sig_relayoutItems, this, [=](){ if (m_proxy_model->getDesktopUseAutoLayout() && !m_is_renaming) { auto list = m_autoArrange; relayoutExsitingItemsAndUpdate(list); } }); connect(m_model, &AdvancedDesktopItemModel::selectUri, this, [=](const QString &uri){ if (!m_itemPosHash.contains(uri)) { return; } QTimer::singleShot(100, this, [=]() { setSelections(QStringList() << uri); scrollToSelection(uri); setFocus(); }); }); connect(this, &AdvancedDesktopIconView::sig_fileCreated, this, &AdvancedDesktopIconView::fileCreated); bool desktopAutoLayout = GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); m_proxy_model->setDesktopUseAutoLayout(desktopAutoLayout); setDropIndicatorShown(desktopAutoLayout); connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=](const QString &key){ if (key == DESKTOP_USE_AUTO_LAYOUT) { bool desktopAutoLayout = GlobalSettings::getInstance()->getValue(DESKTOP_USE_AUTO_LAYOUT).toBool(); m_proxy_model->setDesktopUseAutoLayout(desktopAutoLayout); setDropIndicatorShown(desktopAutoLayout); if (desktopAutoLayout) { auto sortedUris = layoutItems(); m_proxy_model->setSortedUris(sortedUris); } else { m_proxy_model->setSortedUris(QStringList()); } } }); connect(this, &QAbstractItemView::entered, this, &AdvancedDesktopIconView::onEntered); connect(m_proxy_model, &DesktopItemProxyModel::showHiddenFile, this, &AdvancedDesktopIconView::showHiddenFile); } AdvancedDesktopIconView::~AdvancedDesktopIconView() { delete m_peonyDbusSer; //saveAllItemPosistionInfos(); } void AdvancedDesktopIconView::initShoutCut() { QAction *copyAction = new QAction(this); copyAction->setShortcut(QKeySequence::Copy); connect(copyAction, &QAction::triggered, [=]() { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto selectedUris = this->getSelections(); if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)){ ClipboardUtils::setClipboardFiles(selectedUris, false); this->viewport()->update(); } }); addAction(copyAction); QAction *cutAction = new QAction(this); cutAction->setShortcut(QKeySequence::Cut); connect(cutAction, &QAction::triggered, [=]() { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto selectedUris = this->getSelections(); if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)) { ClipboardUtils::setClipboardFiles(selectedUris, true); //this->update(); this->viewport()->update(); } }); addAction(cutAction); QAction *pasteAction = new QAction(this); pasteAction->setShortcut(QKeySequence::Paste); connect(pasteAction, &QAction::triggered, [=]() { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } if (qApp->clipboard()->mimeData()->hasFormat ("uos/remote-copy")) { auto op = ClipboardUtils::pasteClipboardFiles(this->getDirectoryUri()); if (!op) { viewport()->update(); } } else { //auto clipUris = ClipboardUtils::getClipboardFilesUris(); if (ClipboardUtils::getInstance()->isClipboardHasFiles() && !meetSpecialConditions(this->getSelections())) { auto op = ClipboardUtils::pasteClipboardFiles(this->getDirectoryUri()); if (!op) { viewport()->update(); } } } }); addAction(pasteAction); //add CTRL+D for delete operation auto trashAction = new QAction(this); trashAction->setShortcuts(QList()<getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto selectedUris = getSelections(); if (!selectedUris.isEmpty() && !meetSpecialConditions(selectedUris)){ FileOperationUtils::trash(selectedUris, true); } }); addAction(trashAction); QAction *undoAction = new QAction(this); undoAction->setShortcut(QKeySequence::Undo); connect(undoAction, &QAction::triggered, [=]() { // do not relayout item with undo. setRenaming(true); FileOperationManager::getInstance()->undo(); }); addAction(undoAction); QAction *redoAction = new QAction(this); redoAction->setShortcut(QKeySequence::Redo); connect(redoAction, &QAction::triggered, [=]() { // do not relayout item with redo. setRenaming(true); FileOperationManager::getInstance()->redo(); }); addAction(redoAction); QAction *zoomInAction = new QAction(this); zoomInAction->setShortcut(QKeySequence::ZoomIn); connect(zoomInAction, &QAction::triggered, [=]() { this->zoomIn(); }); addAction(zoomInAction); QAction *zoomOutAction = new QAction(this); zoomOutAction->setShortcut(QKeySequence::ZoomOut); connect(zoomOutAction, &QAction::triggered, [=]() { this->zoomOut(); }); addAction(zoomOutAction); QAction *renameAction = new QAction(this); renameAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_E)); connect(renameAction, &QAction::triggered, [=]() { auto selections = this->getSelections(); if (selections.count() == 1 && !meetSpecialConditions(selections)) { this->editUri(selections.first()); } }); addAction(renameAction); QAction *removeAction = new QAction(this); removeAction->setShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete)); connect(removeAction, &QAction::triggered, [=]() { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } auto selectedUris = this->getSelections(); if (!meetSpecialConditions(selectedUris)){ qDebug() << "delete" << selectedUris; FileOperationUtils::executeRemoveActionWithDialog(selectedUris); } }); addAction(removeAction); QAction *helpAction = new QAction(this); helpAction->setShortcut(Qt::Key_F1); connect(helpAction, &QAction::triggered, this, [=]() { PeonyDesktopApplication::showGuide(); }); addAction(helpAction); auto propertiesWindowAction = new QAction(this); propertiesWindowAction->setShortcuts(QList()<getSelections().count() > 0) { menu.showProperties(this->getSelections()); } else { QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); menu.showProperties(desktopPath); } }); addAction(propertiesWindowAction); auto newFolderAction = new QAction(this); newFolderAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_N)); connect(newFolderAction, &QAction::triggered, this, [=]() { CreateTemplateOperation op(this->getDirectoryUri(), CreateTemplateOperation::EmptyFolder, tr("New Folder")); op.run(); auto targetUri = op.target(); QTimer::singleShot(300, this, [=]() { this->scrollToSelection(targetUri); for (auto index : m_proxy_model->getAllFileIndexes()) { closePersistentEditor(index); setIndexWidget(index, nullptr); } selectionModel()->clearSelection(); setState(QListView::NoState); auto origin = FileUtils::getOriginalUri(targetUri); auto index = m_proxy_model->mapFromSource(m_model->indexFromUri(origin)); edit(index); }); }); addAction(newFolderAction); QAction *refreshWinAction = new QAction(this); refreshWinAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); connect(refreshWinAction, &QAction::triggered, [=]() { this->refresh(); }); addAction(refreshWinAction); QAction *reverseSelectAction = new QAction(this); reverseSelectAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L)); connect(reverseSelectAction, &QAction::triggered, [=]() { this->invertSelections(); }); addAction(reverseSelectAction); QAction *normalIconAction = new QAction(this); normalIconAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); connect(normalIconAction, &QAction::triggered, [=]() { if (this->zoomLevel() == AdvancedDesktopIconView::Normal) return; this->setDefaultZoomLevel(AdvancedDesktopIconView::Normal); }); addAction(normalIconAction); auto refreshAction = new QAction(this); refreshAction->setShortcut(Qt::Key_F5); connect(refreshAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshAction); QAction *editAction = new QAction(this); editAction->setShortcuts(QList()<getSelections(); if (selections.count() == 1) { this->editUri(selections.first()); } else if (selections.count() > 1) { this->editUris(selections); } }); addAction(editAction); auto settings = GlobalSettings::getInstance(); m_show_hidden = settings->isExist(SHOW_HIDDEN_PREFERENCE)? settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(): false; //show hidden action QAction *showHiddenAction = new QAction(this); showHiddenAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_H)); addAction(showHiddenAction); connect(showHiddenAction, &QAction::triggered, this, [=]() { this->setShowHidden(); }); auto cancelAction = new QAction(this); cancelAction->setShortcut(Qt::Key_Escape); connect(cancelAction, &QAction::triggered, [=]() { if (Peony::ClipboardUtils::isClipboardHasFiles()) { Peony::ClipboardUtils::clearClipboard(); this->update(); } }); addAction(cancelAction); auto *selectAllAction = new QAction(this); selectAllAction->setShortcut(QKeySequence::SelectAll); connect(selectAllAction, &QAction::triggered, this, [=]() { if (! GlobalSettings::getInstance()->getValue(ENABLE_SHORTCUT_KEYS).toBool()) { return ; } this->selectAll(); }); addAction(selectAllAction); } void AdvancedDesktopIconView::openFileByUri(QString uri) { auto info = FileInfo::fromUri(uri); auto job = new FileInfoJob(info); job->setAutoDelete(); job->connect(job, &FileInfoJob::queryAsyncFinished, [=]() { if ((info->isDir() || info->isVolume() || info->isVirtual())) { QDir dir(info->filePath()); if (! dir.exists()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); auto result = QMessageBox::question(nullptr, tr("Open Link failed"), tr("File not exist, do you want to delete the link file?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (result == QMessageBox::Yes) { qDebug() << "Delete unused symbollink in desktop."; QStringList selections; selections.push_back(uri); FileOperationUtils::trash(selections, true); } return; } if (! info->uri().startsWith("trash://") && ! info->uri().startsWith("computer://") && ! info->canExecute()) { Peony::AudioPlayManager::getInstance()->playWarningAudio(); QMessageBox::critical(nullptr, tr("Open failed"), tr("Open directory failed, you have no permission!")); return; } #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; QUrl url = uri; p.setProgram("peony"); p.setArguments(QStringList() << url.toEncoded() <<"%U&"); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); QRect rect = info.get()->property("iconGeometry").toRect(); #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY if (rect.isValid()) data.setIconGeometry(rect); #endif data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); KStartupInfo::resetStartupEnv(); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()<isImageFile(uri)) { IMAGE_MOUNT_MANAGER->mountImage(uri); return; } if (!(info->isDesktopFile() && execSharedFileLink(uri))) { FileLaunchManager::openAsync(uri, false, false); } } this->clearSelection(); }); job->queryAsync(); } void AdvancedDesktopIconView::initDoubleClick() { connect(this, &QAbstractItemView::activated, this, [=](const QModelIndex &index) { qDebug() << "double click" << index.data(FileItemModel::UriRole); auto uri = index.data(FileItemModel::UriRole).toString(); openFileByUri(uri); }, Qt::UniqueConnection); } void AdvancedDesktopIconView::setMargins() { int settingsislandposition = m_panelSetting->keys().contains("settingsislandposition") ? m_panelSetting->get("settingsislandposition").toInt() : -1; int paneltype = m_panelSetting->keys().contains("paneltype") ? m_panelSetting->get("paneltype").toInt() : -1; int position = m_panelSetting->get("panelposition").toInt(); int margins = m_panelSetting->get("panelsize").toInt(); if (settingsislandposition == 1 && paneltype == 1) { setViewportMargins(0, 32, 0, margins); return; } switch (position) { case 1: { setViewportMargins(0, margins, 0, 0); break; } case 2: { setViewportMargins(margins, 0, 0, 0); break; } case 3: { setViewportMargins(0, 0, margins, 0); break; } default: { setViewportMargins(0, 0, 0, margins); break; } } } void AdvancedDesktopIconView::setId(int id) { m_proxy_model->setId(id); m_id = id ; } QRect AdvancedDesktopIconView::visualRect(const QModelIndex &index) const { if (!index.isValid()) return QRect(); QRect rect = QRect(QPoint(0, 0), m_gridSize); rect.adjust(5, 5, -5, -5); // todo: 通过model data获取index位置 bool ok = false; auto pos = getIndexGridPos(index, &ok); if (ok) { //qDebug()<rect().topRight().x(); int x = vewportX - rect.topRight().x() ; rect = QRect(x, rect.y(), rect.width(), rect.height()); } } else { qWarning()<<"no pos for item"<rowCount(); i++) { auto index = model()->index(i, 0); auto tmpRect = visualRect(index); if (tmpRect.contains(point)) return index; } return QModelIndex(); } QModelIndex AdvancedDesktopIconView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers) { // todo: 实现键盘切换选择 return QModelIndex(); } int AdvancedDesktopIconView::horizontalOffset() const { return 0; } int AdvancedDesktopIconView::verticalOffset() const { return 0; } bool AdvancedDesktopIconView::isIndexHidden(const QModelIndex &index) const { // todo: 根据屏幕id匹配 bool isHidden = /*m_id == index.data(ScreenIdRole).toInt() ? true :*/ false; return isHidden; } // fixme: 非qlistview不能在index非法的情况下触发选择,需要在mouseEvent中处理此流程 void AdvancedDesktopIconView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) { qDebug()<<"set selection"< last.x()) qSwap(first, last); QPoint leftPos ,rightPos; auto leftIndex = indexAt(first); bool leftOk = false; leftPos = getIndexGridPos(leftIndex, &leftOk); auto rightIndex= indexAt(last); bool rightOk = false; rightPos = getIndexGridPos(rightIndex, &rightOk); if (leftPos.x() == rightPos.x() && leftPos.y() > rightPos.y()) qSwap(leftPos, rightPos); if (leftOk && rightOk) { for (int i = 0; i < model()->rowCount(); i++) { auto index = model()->index(i, 0); bool ok = false; auto pos = getIndexGridPos(index, &ok); if (gridPosLesserThan(pos, leftPos)|| gridPosLesserThan(rightPos, pos)) { continue; } selection.select(index, index); // 单击重叠的图标只选中一个 if (command == QItemSelectionModel::ClearAndSelect || command == QItemSelectionModel::Select) break; } selectionModel()->select(selection, command); return; } } // todo 性能优化 for (int i = 0; i < model()->rowCount(); i++) { auto index = model()->index(i, 0); auto indexRect = visualRect(index); if (!indexRect.intersects(tmpRect) || !index.isValid()) continue; selection.select(index, index); // 单击重叠的图标只选中一个 if (command == QItemSelectionModel::ClearAndSelect || command == QItemSelectionModel::Select) break; } selectionModel()->select(selection, command); } QRegion AdvancedDesktopIconView::visualRegionForSelection(const QItemSelection &selection) const { QRegion region; auto indexes = selection.indexes(); for (auto index : indexes) { if (!index.isValid()) continue; auto tmpRect = visualRect(index); //防止分数缩放和显示覆盖影响 region += tmpRect.adjusted(-5, -5, 5, 5); } region.intersects(this->viewport()->rect()); return region; } QStyleOptionViewItem AdvancedDesktopIconView::viewOptions() const { auto option = QAbstractItemView::viewOptions(); option.decorationAlignment = Qt::AlignTop|Qt::AlignHCenter; option.decorationPosition = QStyleOptionViewItem::Top; option.displayAlignment = Qt::AlignTop|Qt::AlignHCenter; option.textElideMode = Qt::ElideMiddle; option.features = QStyleOptionViewItem::HasDisplay|QStyleOptionViewItem::HasDecoration|QStyleOptionViewItem::WrapText; return option; } void AdvancedDesktopIconView::startDrag(Qt::DropActions supportedActions) { // fixme默认为moveaction,支持copyaction m_rubberBand->setVisible(false); auto indexes = selectedIndexes(); if (indexes.count() > 0) { auto pos = m_dragPressPos; qreal scale = 1.0; QWidget *window = this->window(); if (window) { auto windowHandle = window->windowHandle(); if (windowHandle) { scale = windowHandle->devicePixelRatio(); } } auto drag = new QDrag(this); drag->setMimeData(model()->mimeData(indexes)); QRegion rect; QHash indexRectHash; for (auto index : indexes) { rect += (visualRect(index)); indexRectHash.insert(index, visualRect(index)); } QRect realRect = rect.boundingRect(); // fix #78263, text displayment is not completed. //realRect.adjust(-5, -5, 5, 5); realRect.adjust(-15, -15, 15, 15); QPixmap pixmap(realRect.size() * scale); pixmap.fill(Qt::transparent); pixmap.setDevicePixelRatio(scale); QPainter painter(&pixmap); // try fixing #190315, text shadow displayment issue while compositing not running. bool shouldDrawBackground = !QX11Info::isCompositingManagerRunning(); for (auto index : indexes) { painter.save(); painter.translate(indexRectHash.value(index).topLeft() - rect.boundingRect().topLeft()); if (shouldDrawBackground) { painter.setPen(qApp->palette().highlight().color()); painter.setBrush(qApp->palette().highlight()); painter.drawRoundedRect(QRect(0, 0, m_gridSize.width(), m_gridSize.height()).adjusted(1, 1, -1, -1), 6, 6); } QStyleOptionViewItem opt = viewOptions(); auto viewItemDelegate = qobject_cast(itemDelegate()); viewItemDelegate->initIndexOption(&opt, index); opt.rect.setSize(visualRect(index).size()); itemDelegate()->paint(&painter, opt, index); painter.restore(); } drag->setPixmap(pixmap); QRect hotspotRect = rect.boundingRect(); hotspotRect.adjust(horizontalOffset(), verticalOffset(), 0, 0); drag->setHotSpot(pos - hotspotRect.topLeft()); drag->setDragCursor(QPixmap(), m_ctrl_key_pressed? Qt::CopyAction: Qt::MoveAction); drag->exec(m_ctrl_key_pressed? Qt::CopyAction: Qt::MoveAction); } else { return QAbstractItemView::startDrag(Qt::MoveAction|Qt::CopyAction); } } void AdvancedDesktopIconView::reset() { // todo 待优化 if (m_availableColumnCount == 1 && m_availableRowCount == 1) return; if (model() && m_itemPosHash.count() < model()->rowCount()) { bool ok = false; qDebug()<rowCount(); for (int row = 0; row < model()->rowCount(); row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, QModelIndex()); auto pos = getIndexGridPos(index, &ok); if (!ok) { auto emptypos = findNextEmptyGridPos(); if (emptypos.x() < 0) { qWarning()<<"no empty pos"; //如果没有空位则后面的item不排序 break; } pos = emptypos; } auto uri = index.data(UriRole).toString(); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } } QAbstractItemView::reset(); } void AdvancedDesktopIconView::rowsInserted(const QModelIndex &parent, int start, int end) { // // 如果没有找到排序配置,则跳过此流程,避免出现顺序异常改变,这可能出现在首次升级且异常关闭的场景 bool ok = false; bool isFull = false; QPoint pos = QPoint(0, 0); if (m_proxy_model->getDesktopUseAutoLayout()) { QAbstractItemView::rowsInserted(parent, start, end); for (int i = start; i <= end; i++) { auto index = model()->index(i, 0, parent); auto uriAdded = index.data(Qt::UserRole).toString(); if (!m_autoArrange.contains(uriAdded)) { bool isRenaming = false; if (!isFull) { pos = getIndexGridPos(index, &ok); if (!ok || pos == QPoint(-1,-1) || (!refreshing && !m_itemPosHash.keys(pos).isEmpty())) { isRenaming = true; auto emptypos = findNextEmptyGridPos(); if (emptypos.x() < 0) { qWarning()<<"no empty pos"; //如果没有空位则后面的item不排序 emptypos = QPoint(0, 0); if (!m_storageBox.contains(uriAdded)) m_storageBox.append(uriAdded); isFull = true; } pos = emptypos; } } model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uriAdded, pos); if (!refreshing) { if (!isRenaming) { int index = pos.x() * m_availableRowCount + pos.y(); m_autoArrange.insert(index, uriAdded); } else { //刷新的时候不是按照顺序加载,统一在刷新之后获取列表 m_autoArrange.append(uriAdded); } } } } return; } for (int row = start; row <= end; row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, parent); QString uri = index.data(UriRole).toString(); m_itemPosHash.remove(uri); if (!isFull) { pos = getIndexGridPos(index, &ok); if (!ok || pos == QPoint(-1,-1) || (!refreshing && !m_itemPosHash.keys(pos).isEmpty())) { auto emptypos = findNextEmptyGridPos(); if (emptypos.x() < 0) { qWarning()<<"no empty pos"; //如果没有空位则后面的item不排序 emptypos = QPoint(0, 0); if (!m_storageBox.contains(uri)) m_storageBox.append(uri); isFull = true; } pos = emptypos; } } qDebug() << "-----------" <setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } QAbstractItemView::rowsInserted(parent, start, end); } void AdvancedDesktopIconView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { for (int row = start; row <= end; row++) { auto index = model()->index(row, 0); auto uri = index.data(Qt::UserRole).toString(); m_itemPosHash.remove(uri); m_resolutionItemPosHash.remove(uri); m_autoArrange.removeOne(uri); m_storageBox.removeOne(uri); qDebug() <<"AdvancedDesktopIconView::rowsAboutToBeRemoved" <viewport()); //QRect renderRect = e->rect(); QRect renderRect = viewport()->rect(); // todo: caculate item to be rendered. int num = model()->rowCount(); for (int i = 0; i < model()->rowCount(); i++) { auto options = viewOptions(); auto index = model()->index(i, 0); if (selectionModel()->selectedIndexes().contains(index)) options.state |= QStyle::State_Selected; auto tmpRect = visualRect(index); options.state.setFlag(QStyle::State_MouseOver, m_hoverIndex == index); options.rect = tmpRect; auto delegate = qobject_cast(itemDelegate()); delegate->paint(&painter, options, index); } if ((state() == DraggingState || m_isDragging) && m_proxy_model->getDesktopUseAutoLayout()) { QPainter p(viewport()); QStyleOption opt; opt.init(this); opt.rect = m_dropIndicatorRect; opt.palette.setColor(QPalette::Highlight, opt.palette.highlightedText().color()); style()->drawPrimitive(QStyle::PE_IndicatorItemViewItemDrop, &opt, &p, this); } } void AdvancedDesktopIconView::refresh() { this->setCursor(QCursor(Qt::WaitCursor)); //fix refresh clear copy files issue, link to bug#109247 if (Peony::ClipboardUtils::isDesktopFilesBeCut()) Peony::ClipboardUtils::clearClipboard();/* Refresh clear cut status */ if (!m_model) return; if (refreshing) return; refreshing = true; m_itemPosHash.clear(); m_autoArrange.clear(); m_model->refresh(); } void AdvancedDesktopIconView::resizeEvent(QResizeEvent *e) { QAbstractItemView::resizeEvent(e); // todo: 批处理 recalculateAvailableRowAndColumnCount(); // todo: 通过model data获取index位置,或者通过缓存获取 this->viewport()->update(); } void AdvancedDesktopIconView::dropEvent(QDropEvent *event) { m_isDragging = false; m_rubberBand->setVisible(false); // fix #122768, dirty region issues. this->viewport()->update(); m_real_do_edit = false; //qDebug()<<"drop event"; /*! \todo fix the bug that move drop action can not move the desktop item to correct position. i use copy action to avoid this bug, but the drop indicator is incorrect. */ m_edit_trigger_timer.stop(); if (event->keyboardModifiers() & Qt::ControlModifier) { m_ctrl_key_pressed = true; } else { m_ctrl_key_pressed = false; } auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; if (event->keyboardModifiers() & Qt::ShiftModifier) { action = Qt::TargetMoveAction; } qDebug() << "DesktopIconView dropEvent" <mimeData()->hasFormat("text/ukui_idm") && event->mimeData()->data("text/ukui_idm") == "ukui_idm") ? true : false; if(isdropbyukuiidm) { action = Qt::CopyAction; } auto view = qobject_cast(event->source()); if (m_proxy_model->getDesktopUseAutoLayout() && m_dropIndicatorPos != DropIndicatorPosition::OnItem && !m_ctrl_key_pressed) { qDebug()<<"drop do auto layout move"; bool sucess = dropWhenAotoArrange(event); if (sucess) { m_pressedPos = QPoint(-1,-1); view->m_pressedPos = QPoint(-1,-1); return; } } auto pos = event->pos(); auto index = indexAt(pos); if (index.isValid() || m_ctrl_key_pressed) { qDebug() <<"DesktopIconView index copyAction:"; auto urls = event->mimeData()->urls(); QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QStringList uris; for (auto url : urls) { if (url.toString() == "computer:///") uris << "computer:///"; else uris << url.path(); } //fix can drag copy home folder issue, link to bug#64824 if (uris.contains(homePath) || uris.contains("computer:///")) return; } if (!m_ctrl_key_pressed) { bool bmoved = false; if (index.isValid()) { auto uri = m_proxy_model->mapToSource(index).data(Qt::UserRole).toString(); auto info = FileInfo::fromUri(uri); if (!info->isDir()||event->mimeData()->urls().contains(uri)) { m_pressedPos = QPoint(-1,-1); return; } bmoved = true; } bool sucess = true; if (bmoved) { //move file to desktop folder qDebug() << "DesktopIconView move file to folder"; for (auto uuri : event->mimeData()->urls()) { if ("trash:///" == uuri.toDisplayString() || "computer:///" == uuri.toDisplayString()) { m_pressedPos = QPoint(-1,-1); return; } } sucess = m_model->dropMimeData(event->mimeData(), action, -1, -1, this->indexAt(event->pos())); } /*else {*/ // do not trigger file operation, link to: #66345 // m_model->setAcceptDropAction(false); // QAbstractItemView::dropEvent(event); // m_model->setAcceptDropAction(true); // } if (!sucess) { m_pressedPos = QPoint(-1,-1); return; } if (m_proxy_model->getDesktopUseAutoLayout()) { bool bDropToOtherScreen = false; auto selectedItems = selectedIndexes(); if (view) { selectedItems = selectedIndexes(); if (this != event->source()) { bDropToOtherScreen = true; selectedItems = view->selectedIndexes(); } auto destSortedUris = m_autoArrange; auto sourceSortedUris = view->m_autoArrange; for (auto index : selectedItems) { auto uri = index.data(Qt::UserRole).toString(); if (bDropToOtherScreen) { sourceSortedUris.removeOne(uri); } else { destSortedUris.removeOne(uri); } } relayoutExsitingItemsAndUpdate(destSortedUris); if (bDropToOtherScreen) { view->relayoutExsitingItemsAndUpdate(sourceSortedUris); } m_pressedPos = QPoint(-1,-1); view->m_pressedPos = QPoint(-1,-1); return; } } } if (event->source() == this && !m_ctrl_key_pressed) { qDebug() <<"DesktopIconView index:" <ignore(); m_pressedPos = QPoint(-1,-1); return; } auto gridOffset = dropedGridPos - pressedGridPos; qDebug()< tmpIndexes; QHash relayoutIndexes; for (QModelIndex index : selectedIndexes()) { QString uri = index.data(UriRole).toString(); m_itemPosHash.remove(uri); } for (QModelIndex index : selectedIndexes()) { QString uri = index.data(UriRole).toString(); tmpIndexes.insert(uri, index); bool ok = false; auto pos = getIndexGridPos(index, &ok); if (ok && !isInvalidPoint(pos)) { pos += gridOffset; if (isInvalidPoint(pos)|| !m_itemPosHash.keys(pos).isEmpty()) { relayoutIndexes.insert(uri, index); continue; } } else { relayoutIndexes.insert(uri, index); continue; } qDebug()<<" ----------- "<setData(index, QPoint(-1, -1), ExceptedPositionRole); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } for (QString uri : relayoutIndexes.keys()) { QPoint pos = findNextEmptyGridPos(dropedGridPos); if (!isInvalidPoint(pos)) { qDebug()<<" ----------- "<setData(index, QPoint(-1, -1), ExceptedPositionRole); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } } event->ignore(); m_pressedPos = QPoint(-1,-1); return; } else if (!m_ctrl_key_pressed && dragToOtherScreen(event)) { event->ignore(); m_pressedPos = QPoint(-1,-1); return; } else if (!index.isValid() && (event->proposedAction() == Qt::CopyAction || event->proposedAction() & Qt::MoveAction && m_ctrl_key_pressed)) { // fixme: 拷贝 m_model->dropMimeData(event->mimeData(), action, -1, -1, this->indexAt(event->pos())); m_pressedPos = QPoint(-1,-1); return; } return QAbstractItemView::dropEvent(event); } bool AdvancedDesktopIconView::dropWhenAotoArrange(QDropEvent *event) { qDebug() << "[AdvancedDesktopIconView::dropWhenAotoArrange]" <(event->source()); if (!view) { return false; } if (this != event->source() && view) { bDropToOtherScreen = true; selectedItems = view->selectedIndexes(); } if (m_dropIndicatorRect.isValid()) { QPoint offsetPos = QPoint(); if (m_dropIndicatorPos == DropIndicatorPosition::BelowItem) { offsetPos = QPoint(0, -m_gridSize.height()/2); } else if (m_dropIndicatorPos == DropIndicatorPosition::AboveItem) { offsetPos = QPoint(0, m_gridSize.height()/2); } auto currentHoverIndex = indexAt(m_dropIndicatorRect.center() + offsetPos); if (currentHoverIndex.isValid()) { auto currentHoverUri = currentHoverIndex.data(Qt::UserRole).toString(); auto destSortedUris = m_autoArrange; auto sourceSortedUris = view->m_autoArrange; QStringList draggedUris; for (int i = 0; i < destSortedUris.count(); i++) { draggedUris.append(QString()); } int insertedPos = destSortedUris.indexOf(currentHoverUri); if (m_dropIndicatorPos == DropIndicatorPosition::BelowItem) { insertedPos++; } if (bDropToOtherScreen) { for (auto index : selectedItems) { auto uri = index.data(Qt::UserRole).toString(); sourceSortedUris.removeOne(uri); view->model()->setData(index, m_id, ScreenIdRole); destSortedUris.insert(insertedPos, uri); } } else { for (auto index : selectedItems) { auto uri = index.data(Qt::UserRole).toString(); int pos = destSortedUris.indexOf(uri); destSortedUris.replace(pos, QString()); draggedUris.replace(pos, uri); } draggedUris.removeAll(QString()); //draggedUris.reserve(draggedUris.count()); for (int i = draggedUris.count() - 1; i >= 0; i--) { auto uri = draggedUris[i]; destSortedUris.insert(insertedPos, uri); } destSortedUris.removeAll(QString()); } relayoutExsitingItemsAndUpdate(destSortedUris); if (bDropToOtherScreen) { view->relayoutExsitingItemsAndUpdate(sourceSortedUris); } m_proxy_model->setSortedUris(destSortedUris); return true; } else { qCritical()<<"has drop indicator rect but could not find current hovered index"; } } else { bool dropToEnd = true; auto posIndicator = event->pos(); for (auto pos : m_itemPosHash.values()) { QRect rect(QPoint(pos.x() * m_gridSize.width(), pos.y() * m_gridSize.height()), m_gridSize); if (gridPosLesserThan(posIndicator, rect.center())) { dropToEnd = false; break; } } if (dropToEnd) { auto sortedUris = m_autoArrange; QStringList draggedUris; for (int i = 0; i < sortedUris.count(); i++) { draggedUris.append(QString()); } if (!bDropToOtherScreen) { for (auto index : selectedItems) { auto uri = index.data(Qt::UserRole).toString(); int pos = sortedUris.indexOf(uri); sortedUris.replace(pos, QString()); draggedUris.replace(pos, uri); } sortedUris.removeAll(QString()); draggedUris.removeAll(QString()); sortedUris.append(draggedUris); } else { auto destSortedUris = view->m_autoArrange; for (auto index : selectedItems) { auto uri = index.data(Qt::UserRole).toString(); destSortedUris.removeOne(uri); draggedUris.append(uri); view->model()->setData(index, m_id, ScreenIdRole); } sortedUris.removeAll(QString()); draggedUris.removeAll(QString()); sortedUris.append(draggedUris); view->relayoutExsitingItemsAndUpdate(destSortedUris); } relayoutExsitingItemsAndUpdate(sortedUris); return true; } else { qDebug()<<"do nothing for drop auto layout"; if (m_dropIndicatorPos != OnItem) { // 如果不是移动拖拽到图标上,则不触发后续拖拽流程,避免出现图标未自动排列的情况 return true; } } } return false; } void AdvancedDesktopIconView::wheelEvent(QWheelEvent *e) { if (QApplication::keyboardModifiers() == Qt::ControlModifier) { if (e->delta() > 0) { zoomIn(); } else { zoomOut(); } } } void AdvancedDesktopIconView::keyPressEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Home: { QPoint homePos; QModelIndex homeIndex; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QPoint postion = index.data(PositionRole).toPoint(); if (!gridPosLesserThan(homePos, postion)) { homeIndex = index; homePos = index.data(PositionRole).toPoint(); } } selectionModel()->select(homeIndex, QItemSelectionModel::SelectCurrent); break; } case Qt::Key_End: { QPoint endPos; QModelIndex endIndex; for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QPoint postion = index.data(PositionRole).toPoint(); if (gridPosLesserThan(endPos, postion)) { endIndex = index; endPos = postion; } } selectionModel()->select(endIndex, QItemSelectionModel::SelectCurrent); break; } case Qt::Key_Up: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto up = center - QPoint(0, m_gridSize.height()); auto upIndex = indexAt(up); if (upIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(upIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), upIndex, this); setIndexWidget(upIndex, indexWidget); indexWidget->move(visualRect(upIndex).topLeft()); } } return; } case Qt::Key_Down: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto down = center + QPoint(0, m_gridSize.height()); auto downIndex = indexAt(down); if (downIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(downIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), downIndex, this); setIndexWidget(downIndex, indexWidget); indexWidget->move(visualRect(downIndex).topLeft()); } } return; } case Qt::Key_Left: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto left = center - QPoint(m_gridSize.width(), 0); auto leftIndex = indexAt(left); if (leftIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(leftIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), leftIndex, this); setIndexWidget(leftIndex, indexWidget); indexWidget->move(visualRect(leftIndex).topLeft()); } } return; } case Qt::Key_Right: { if (getSelections().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::SelectCurrent); } else { auto index = selectionModel()->selectedIndexes().first(); auto center = visualRect(index).center(); auto right = center + QPoint(m_gridSize.width(), 0); auto rightIndex = indexAt(right); if (rightIndex.isValid()) { clearAllIndexWidgets(); selectionModel()->select(rightIndex, QItemSelectionModel::SelectCurrent); auto delegate = qobject_cast(itemDelegate()); auto indexWidget = new DesktopIndexWidget(delegate, viewOptions(), rightIndex, this); setIndexWidget(rightIndex, indexWidget); } } return; } case Qt::Key_Shift: m_shift_key_pressed = true; case Qt::Key_Control: m_ctrl_or_shift_pressed = true; break; case Qt::Key_Enter: case Qt::Key_Return: { auto selections = this->getSelections(); for (auto uri : selections) { openFileByUri(uri); } } break; default: return QAbstractItemView::keyPressEvent(e); } } void AdvancedDesktopIconView::keyReleaseEvent(QKeyEvent *e) { QAbstractItemView::keyReleaseEvent(e); m_ctrl_or_shift_pressed = false; m_ctrl_key_pressed = false; m_shift_key_pressed = false; } void AdvancedDesktopIconView::recalculateAvailableRowAndColumnCount() { m_gridSize = QSize(10, 10); // padding: 5 m_gridSize += iconSize(); // icon size m_gridSize += QSize(0, 5); // text-icon-padding: 5 QFont font = qApp->font(); font.setPointSize(15); QFontMetrics fm = QFontMetrics(font); m_gridSize += QSize(0, fm.height()*2); // 2 line text height, todo: fix bo_CN m_gridSize.setWidth(qMax(qApp->fontMetrics().averageCharWidth()*5 + 10, m_gridSize.width() + 31)); auto size = viewport()->rect().size(); m_availableRowCount = qMax(1, size.height()/m_gridSize.height()); m_availableColumnCount = qMax(1, size.width()/m_gridSize.width()); reset(); resolutionChange(); checkItemsOver(); viewport()->update(); //update all item } QPoint AdvancedDesktopIconView::getIndexGridPos(const QModelIndex &index, bool *ok) const { //fix bug#249915, unzip file to desktop crash issue if (! index.isValid() || ! index.data().isValid()) { return invalidPoint(); } *ok = index.data(PositionRole).isValid(); if (!(*ok)) return invalidPoint(); return index.data(PositionRole).toPoint(); } QPoint AdvancedDesktopIconView::findNextEmptyGridPos(const QPoint &startGridPos) { for (int column = 0; column < m_availableColumnCount; column++) { for (int row = 0; row < m_availableRowCount; row++) { QPoint pos = QPoint(column, row); if (gridPosLesserThan(pos, startGridPos)) continue; if (m_itemPosHash.keys(pos).isEmpty()) return pos; } } return invalidPoint(); } bool AdvancedDesktopIconView::isInvalidPoint(const QPoint &point) { return point.x() < 0 || point.x() >= m_availableColumnCount || point.y() < 0 || point.y() >= m_availableRowCount; } QPoint AdvancedDesktopIconView::invalidPoint() const { return QPoint(-1, -1); } QPoint AdvancedDesktopIconView::getGridPosFromMousePos(const QPoint &mousePos) { int x = mousePos.x()/m_gridSize.width(); if (layoutDirection() == Qt::RightToLeft) { int vewportX = viewport()->rect().topRight().x(); x = (vewportX - mousePos.x())/m_gridSize.width(); } return QPoint(x, mousePos.y()/m_gridSize.height()); } bool AdvancedDesktopIconView::gridPosLesserThan(const QPoint &leftPos, const QPoint &rightPos) { if (leftPos.x() < rightPos.x()) return true; if (leftPos.x() > rightPos.x()) return false; if (leftPos.y() < rightPos.y()) return true; return false; } const QStringList AdvancedDesktopIconView::getSelections() { QStringList uris; auto indexes = selectionModel()->selection().indexes(); for (auto index : indexes) { uris<rowCount(); i++) { auto index = m_proxy_model->index(i, 0); uris<rowCount(); return 0; } void AdvancedDesktopIconView::setSelections(const QStringList &uris) { clearSelection(); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); if (uris.contains(index.data(Qt::UserRole).toString())) { selectionModel()->select(index, QItemSelectionModel::Select); } } } void AdvancedDesktopIconView::invertSelections() { QItemSelectionModel *selectionModel = this->selectionModel(); const QItemSelection currentSelection = selectionModel->selection(); this->selectAll(); selectionModel->select(currentSelection, QItemSelectionModel::Deselect); //clearAllIndexWidgets(); } void AdvancedDesktopIconView::setEditFlag(bool edit) { qDebug() << "setEditFlag:" <updateBlackAndWriteLists(); /* * 重新按照既定规则排序,这样可以避免出现空缺和图标重叠的情况 */ //不可重新排序,会丢失位置,只做检查调整空缺和重叠情况,相关bug#161875 resolutionChange(); viewport()->update(); return 0; } QString AdvancedDesktopIconView::getBlackAndWhiteModel() { return m_proxy_model->getBlackAndWhiteModel(); } QSet AdvancedDesktopIconView::getBWListInfo() { return m_proxy_model->getBWListInfo(); } bool AdvancedDesktopIconView::getBlackAndWhiteListExist(QString name) { return m_proxy_model->getBlackAndWhiteListExist(name); } void AdvancedDesktopIconView::setSortType(int sortType) { m_resolutionItemPosHash.clear(); m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_proxy_model->setSortType(sortType); m_proxy_model->sort(1); m_proxy_model->sort(0, Qt::SortOrder(m_proxy_model->getSortOrder())); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); int col = i/m_availableRowCount; int row = i%m_availableRowCount; if (col >= m_availableColumnCount) { row = 0; col = 0; m_storageBox.append(uri); } QPoint pos(col, row); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); m_autoArrange.append(uri); } } int AdvancedDesktopIconView::getSortType() { return m_proxy_model->getSortType(); } void AdvancedDesktopIconView::scrollToSelection(const QString &uri) { } int AdvancedDesktopIconView::getSortOrder() { return m_proxy_model->getSortOrder(); } void AdvancedDesktopIconView::setSortOrder(int sortOrder) { m_resolutionItemPosHash.clear(); m_itemPosHash.clear(); m_autoArrange.clear(); m_storageBox.clear(); m_proxy_model->setSortOrder(sortOrder); m_proxy_model->sort(0, Qt::SortOrder(sortOrder)); for (int i = 0; i < m_proxy_model->rowCount(); i++) { auto index = m_proxy_model->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); int col = i/m_availableRowCount; int row = i%m_availableRowCount; if (col >= m_availableColumnCount) { row = 0; col = 0; m_storageBox.append(uri); } QPoint pos(col, row); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); m_autoArrange.append(uri); } } void AdvancedDesktopIconView::editUri(const QString &uri) { clearAllIndexWidgets(); qDebug() << "editUri clearAllIndexWidgets"; auto origin = FileUtils::getOriginalUri(uri); QTimer::singleShot(100, this, [=]() { auto index = m_proxy_model->mapFromSource(m_model->indexFromUri(origin)); edit(index); qDebug() << "editUri index:"<mapFromSource(m_model->indexFromUri(origin))); }); } void AdvancedDesktopIconView::UpdateToEditUris(QStringList uris) { m_uris_to_edit = uris; } void AdvancedDesktopIconView::setCutFiles(const QStringList &uris) { ClipboardUtils::setClipboardFiles(uris, true); this->viewport()->update(); } void AdvancedDesktopIconView::closeView() { deleteLater(); } void AdvancedDesktopIconView::fileCreated(const QString &uri) { // qDebug()<<"DesktopIconView::fileCreated,view:" << this <state(); // if (this->state() & QAbstractItemView::EditingState) // return; // if (! this->m_uris_to_edit.isEmpty()) // return; // qDebug() << "fileCreated setSelections"<setSelections(m_new_files_to_be_selected); // m_new_files_to_be_selected.clear(); // }); // } else { // if (!m_new_files_to_be_selected.contains(uri)) { // m_new_files_to_be_selected<getDesktopUseAutoLayout()) { //自动排序情况下如果有重复名字导致替换后出现空位,需要重新排序 clearAllIndexWidgets(); bool haveEmptyPosition = checkEmptyPositon(); if (haveEmptyPosition) { m_autoArrange = layoutItems(); } } /* 新建文件/文件夹,可编辑文件名,copy时不能编辑 */ //fix bug#164160, use same way as mainwindow if(this->m_uris_to_edit.isEmpty()) return; QString editUri = Peony::FileUtils::urlDecode(this->m_uris_to_edit.first()); QString infoUri = Peony::FileUtils::urlDecode(uri); qDebug() << "fileCreated editUri:"<editUri(uri); m_edit_uri = uri; }); } this->m_uris_to_edit.clear(); } bool AdvancedDesktopIconView::dragToOtherScreen(QDropEvent *event) { // 从其它视图拖拽到此视图空白区域 auto view = qobject_cast(event->source()); if (this != event->source() && view) { QPoint pressedGridPos = view->getGridPosFromMousePos(view->m_pressedPos); QPoint dropedGridPos = getGridPosFromMousePos(event->pos()); m_pressedPos = QPoint(-1,-1); view->m_pressedPos = QPoint(-1,-1); m_rubberBand->setVisible(false); auto gridOffset = dropedGridPos - pressedGridPos; qDebug()< relayoutIndexes; QModelIndexList dragIndex = view->selectedIndexes(); for (QModelIndex index : dragIndex) { QString uri = index.data(UriRole).toString(); bool ok = false; auto pos = getIndexGridPos(index, &ok); if (ok && !isInvalidPoint(pos)) { pos += gridOffset; if (isInvalidPoint(pos) || !m_itemPosHash.keys(pos).isEmpty()) { relayoutIndexes.insert(uri, index); continue; } } else { relayoutIndexes.insert(uri, index); continue; } m_itemPosHash.insert(uri, pos); view->m_itemPosHash.remove(uri); qDebug()<<" ----------- "<model()->setData(index, pos, PositionRole); view->model()->setData(index, m_id, ScreenIdRole); setFileMetaInfoPos(uri, pos); } for (QString uri : relayoutIndexes.keys()) { QPoint pos = findNextEmptyGridPos(dropedGridPos); if (!isInvalidPoint(pos)) { m_itemPosHash.insert(uri, pos); qDebug()<<" ----------- "<model()->setData(index, pos, PositionRole); view->model()->setData(index, m_id, ScreenIdRole); qDebug()<<" -----------relayoutIndexes "<invalidate(); view->m_proxy_model->invalidate(); return true; } return false; } void AdvancedDesktopIconView::mousePressEvent(QMouseEvent *e) { m_dragPressPos = e->pos(); if (e->button() == Qt::LeftButton) { m_pressedPos = e->pos(); m_rubberBand->setGeometry(QRect(e->pos(), QSize())); m_rubberBand->setVisible(true); } else { m_pressedPos = QPoint(-1,-1); } // bug extend selection bug m_real_do_edit = false; if (e->modifiers() & Qt::ShiftModifier) { m_shift_key_pressed = true; } else { m_shift_key_pressed = false; } if (e->modifiers() & Qt::ControlModifier) m_ctrl_key_pressed = true; else { m_ctrl_key_pressed = false; if (!m_shift_key_pressed) m_ctrl_or_shift_pressed = false; } auto index = indexAt(e->pos()); if (!m_ctrl_or_shift_pressed) { if (!index.isValid()) { clearAllIndexWidgets(); clearSelection(); Q_EMIT clearOtherViewSelection(); } else { m_last_index = index; //fix rename state has no menuRequest issue, bug#44107 if (! m_is_edit) { clearAllIndexWidgets(); Q_EMIT clearOtherViewSelection(); //force to recreate new DesktopIndexWidget, to fix not show name issue if (indexWidget(m_last_index)) setIndexWidget(m_last_index, nullptr); auto indexWidget = new DesktopIndexWidget(qobject_cast(itemDelegate()), viewOptions(), m_last_index); setIndexWidget(m_last_index, indexWidget); indexWidget->move(visualRect(m_last_index).topLeft()); } } } //qDebug()<button() != Qt::LeftButton) { // fix #115384, context menu key issue if (e->button() == Qt::RightButton) { auto index = indexAt(e->pos()); if (!selectedIndexes().contains(index)) { selectionModel()->select(index, QItemSelectionModel::SelectCurrent); } } return; } if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier && selectedIndexes().contains(index)) { m_noSelectOnPress = true; } else { m_noSelectOnPress = false; } QAbstractItemView::mousePressEvent(e); } void AdvancedDesktopIconView::mouseReleaseEvent(QMouseEvent *event) { m_pressedPos = QPoint(-1, -1); m_rubberBand->setVisible(false); m_noSelectOnPress = false; QAbstractItemView::mouseReleaseEvent(event); this->viewport()->update(viewport()->rect()); } void AdvancedDesktopIconView::mouseMoveEvent(QMouseEvent *event) { QAbstractItemView::mouseMoveEvent(event); QModelIndex itemIndex = indexAt(event->pos()); if (!itemIndex.isValid()) { if (QToolTip::isVisible()) { QToolTip::hideText(); } } auto tmpRect = QRect(event->pos(), m_pressedPos).normalized(); if (m_pressedPos.x() >= 0 && m_pressedPos.y() >= 0 && m_rubberBand->isVisible() && state() != QAbstractItemView::DraggingState) { tmpRect.translate(viewportMargins().left(), viewportMargins().top()); m_rubberBand->setGeometry(tmpRect); setState(QAbstractItemView::DragSelectingState); } // ugly, 需要优化 if (state() == QAbstractItemView::DragSelectingState) setSelection(tmpRect, selectionCommand(indexAt(event->pos()), event)); } void AdvancedDesktopIconView::mouseDoubleClickEvent(QMouseEvent *event) { if (! GlobalSettings::getInstance()->getValue(ENABLE_DOUBLE_CLICK_DESKTOP).toBool()) return; QAbstractItemView::mouseDoubleClickEvent(event); m_real_do_edit = false; } void AdvancedDesktopIconView::dragEnterEvent(QDragEnterEvent *e) { m_real_do_edit = false; m_isDragging = true; auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; qDebug()<<"drag enter event" <mimeData()->hasUrls()) { if (FileUtils::containsStandardPath(e->mimeData()->urls())) { e->ignore(); return; } e->setDropAction(action); e->accept(); //e->acceptProposedAction(); } } void AdvancedDesktopIconView::dragMoveEvent(QDragMoveEvent *e) { m_real_do_edit = false; if (e->keyboardModifiers() & Qt::ControlModifier) m_ctrl_key_pressed = true; else m_ctrl_key_pressed = false; auto action = m_ctrl_key_pressed ? Qt::CopyAction : Qt::MoveAction; auto index = indexAt(e->pos()); if (index.isValid() && index != m_last_index) { QHoverEvent he(QHoverEvent::HoverMove, e->posF(), e->posF()); viewportEvent(&he); } else { QHoverEvent he(QHoverEvent::HoverLeave, e->posF(), e->posF()); viewportEvent(&he); } if (/*e->source() == this &&*/ m_proxy_model->getDesktopUseAutoLayout()) { if (index.isValid()) { auto oldRect = m_dropIndicatorRect; auto rect = visualRect(index); int y = (m_gridSize.height() - rect.height())/2 + 1; if (e->pos().y() - rect.top() <= 5) { m_dropIndicatorRect = rect; m_dropIndicatorRect.setBottom(rect.top() + 1); m_dropIndicatorRect.translate(0, -y); m_dropIndicatorPos = DropIndicatorPosition::AboveItem; } else if (rect.bottom() - e->pos().y() <= 20) { m_dropIndicatorRect = rect; m_dropIndicatorRect.setTop(rect.bottom() - 1); m_dropIndicatorRect.translate(0, y); m_dropIndicatorPos = DropIndicatorPosition::BelowItem; } else { m_dropIndicatorRect = QRect(); m_dropIndicatorPos = DropIndicatorPosition::OnItem; } if (oldRect != m_dropIndicatorRect) viewport()->update(rect.adjusted(0, -100, 0, 100)); } else { if (m_dropIndicatorRect.isValid()) { viewport()->update(m_dropIndicatorRect.adjusted(0, -100, 0, 100)); } m_dropIndicatorRect = QRect(); m_dropIndicatorPos = DropIndicatorPosition::OnViewport; } } e->setDropAction(action); if (e->isAccepted()) return; qDebug()<<"drag move event" <source()) { e->accept(); return QAbstractItemView::dragMoveEvent(e); } e->accept(); } void AdvancedDesktopIconView::dragLeaveEvent(QDragLeaveEvent *e) { m_isDragging = false; QAbstractItemView::dragLeaveEvent(e); } bool AdvancedDesktopIconView::viewportEvent(QEvent *e) { switch (e->type()) { case QEvent::HoverMove: case QEvent::HoverEnter: onEntered(indexAt(static_cast(e)->pos())); break; case QEvent::HoverLeave: onEntered(QModelIndex()); break; case QEvent::Leave: onEntered(QModelIndex()); // If we've left, no hover should be needed anymore m_rubberBand->setVisible(false); break; default: break; } return QAbstractItemView::viewportEvent(e); } QItemSelectionModel::SelectionFlags AdvancedDesktopIconView::selectionCommand(const QModelIndex &index, const QEvent *event) const { if (!event) return QAbstractItemView::selectionCommand(index, event); if (event->type() == QEvent::MouseButtonPress) { auto e = static_cast(event); if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier && selectedIndexes().contains(index)) { return QItemSelectionModel::NoUpdate; } } else if (event->type() == QEvent::MouseButtonRelease) { auto e = static_cast(event); if (e->button() == Qt::LeftButton && e->modifiers() & Qt::ControlModifier) { QItemSelectionModel::SelectionFlags flags; if (m_noSelectOnPress) { flags = QItemSelectionModel::Deselect; } return flags; } } return QAbstractItemView::selectionCommand(index, event); } void AdvancedDesktopIconView::zoomOut() { clearAllIndexWidgets(); switch (zoomLevel()) { case Huge: Q_EMIT setZoomLevel(Large); break; case Large: Q_EMIT setZoomLevel(Normal); break; case Normal: Q_EMIT setZoomLevel(Small); break; default: //setDefaultZoomLevel(zoomLevel()); break; } } void AdvancedDesktopIconView::zoomIn() { clearAllIndexWidgets(); switch (zoomLevel()) { case Small: Q_EMIT setZoomLevel(Normal); break; case Normal: Q_EMIT setZoomLevel(Large); break; case Large: Q_EMIT setZoomLevel(Huge); break; default: //setDefaultZoomLevel(zoomLevel()); break; } } void AdvancedDesktopIconView::setDefaultZoomLevel(ZoomLevel level) { //qDebug()<<"set default zoom level:"<setMetaInfoInt("peony-qt-desktop-zoom-level", int(m_zoom_level)); } } AdvancedDesktopIconView::ZoomLevel AdvancedDesktopIconView::zoomLevel() const { //FIXME: if (m_zoom_level != Invalid) return m_zoom_level; auto metaInfo = FileMetaInfo::fromUri("computer:///"); if (metaInfo) { auto i = metaInfo->getMetaInfoInt("peony-qt-desktop-zoom-level"); return ZoomLevel(i); } GFile *computer = g_file_new_for_uri("computer:///"); g_file_query_info_async(computer, "metadata::peony-qt-desktop-zoom-level", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, G_PRIORITY_DEFAULT, nullptr, GAsyncReadyCallback(queryZoomLevelAsyncCallback), const_cast(this)); g_object_unref(computer); return Normal; } void AdvancedDesktopIconView::clearAllIndexWidgets(const QStringList &uris) { if (!model()) return; m_hoverIndex = QModelIndex(); //fix bug#164160, when edit new file, infoUpdate call clearAllIndexWidgets issue if (m_is_edit && uris.length()>0 && m_edit_uri == uris.first()) return; if(uris.length()>0 ) qDebug() << "clearAllIndexWidgets uris:"<index(row, 0); while (index.isValid()) { if (uris.isEmpty() || uris.contains(index.data(Qt::UserRole).toString())) { auto widget = indexWidget(index); if (widget) { widget->hide(); } setIndexWidget(index, nullptr); //qDebug() << "clearAllIndexWidgets setIndexWidget"<index(row, 0); } // avoid dirty region out of index visual rect. // link to: #77272. viewport()->update(); } void AdvancedDesktopIconView::setFileMetaInfoPos(const QString &uri, const QPoint &pos) { m_itemPosHash.insert(uri, pos); QPoint currentPos(pos.x()*m_gridSize.width(), pos.y()*m_gridSize.height()); QRect rect(mapToGlobal(currentPos)*qApp->devicePixelRatio(), m_gridSize*qApp->devicePixelRatio()); FileInfo::fromUri(uri).get()->setProperty("iconGeometry", rect); } void AdvancedDesktopIconView::resolutionChange() { qInfo()<<"start resolutionChange()"; QSize screenSize = this->viewport()->size(); // do not relayout items while screen size is empty. if (screenSize.isEmpty()) { qWarning()<<"screen size is not available"; return; } if (m_itemPosHash.isEmpty()) { return; } if (m_proxy_model && m_proxy_model->getDesktopUseAutoLayout()) { // setSortType(int(DesktopItemProxyModel::SortType::RelatedPos)); relayoutExsitingItemsAndUpdate(m_autoArrange); return; } QStringList needChanged; for (QString uri : m_itemPosHash.keys()) { QPoint pos = m_itemPosHash.value(uri); if (isInvalidPoint(pos)) { needChanged.append(uri); if (!m_resolutionItemPosHash.contains(uri)) { // remember item position before resolution changed. m_resolutionItemPosHash.insert(uri, pos); } } } qInfo()<<"need changed item"<rowCount(); row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); auto pos = m_itemPosHash.value(uri); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); if (m_resolutionItemPosHash.contains(uri)) { QPoint reolutionItemPos = m_resolutionItemPosHash.value(uri); QStringList exceptedPos; exceptedPos<setData(index, exceptedPos, ExceptedPositionRole); } } } void AdvancedDesktopIconView::relayoutExsitingItems(const QStringList &uris) { if (uris.isEmpty() || m_itemPosHash.isEmpty()) { return; } for (auto uri : uris) { m_itemPosHash.remove(uri); } auto allFileUris = getAllFileUris(); QPoint startPos = QPoint(); int i = 0; for (; i < uris.count(); i++) { QString uri = uris[i]; if (!allFileUris.contains(uri)) continue; startPos = findNextEmptyGridPos(startPos); if (isInvalidPoint(startPos)) { break; } setFileMetaInfoPos(uri, startPos); m_storageBox.removeOne(uri); } for(; i < uris.count(); i++) { QString uri = uris[i]; setFileMetaInfoPos(uri, QPoint(0, 0)); if (!m_storageBox.contains(uri)) { m_storageBox.append(uri); } } } static bool iconSizeLessThan (const QPair& p1, const QPair& p2) { if (p1.first.x() > p2.first.x()) return false; if (p1.first.x() < p2.first.x()) return true; if ((p1.first.x() == p2.first.x())) return p1.first.y() < p2.first.y(); return true; } QStringList AdvancedDesktopIconView::layoutItems(bool closest) { if (!closest) { QHash extendMap; QHash primaryItemMap; QList> newPosition; QStringList overItem; for (int row = 0; row < model()->rowCount(); row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); auto extendPos = index.data(ExtendScreenPositionRole).toStringList(); if (3 == extendPos.count() && 0 != extendPos[2].toInt()) { extendMap.insert(uri, pos); } else { newPosition << QPair(pos, uri); primaryItemMap.insert(uri, pos); } } for (QString uri : extendMap.keys()) { QPoint pos = extendMap.value(uri); if (primaryItemMap.keys(pos).isEmpty()) { newPosition << QPair(pos, uri); } else { overItem.append(uri); } } if (!newPosition.isEmpty()) { std::stable_sort(newPosition.begin(), newPosition.end(), iconSizeLessThan); QStringList sortedUris; for (auto pair : newPosition) { if (m_storageBox.contains(pair.second)) { overItem.prepend(pair.second); } else { sortedUris.append(pair.second); } } sortedUris << overItem; sortedUris.removeDuplicates(); qDebug() <<"--------------------layoutItems" <invalidate(); for (int row = 0; row < model()->rowCount(); row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); if(!uris.contains(uri)) continue; auto pos = m_itemPosHash.value(uri); model()->setData(index, pos, PositionRole); } qDebug() << "AdvancedDesktopIconView::relayoutExsitingItemsAndUpdat---------" <update(); } void AdvancedDesktopIconView::checkItemsOver() { QStringList primaryItem, extendItem; QStringList needRelayoutItems; for (int i = 0; i < model()->rowCount(); i++) { QModelIndex index = model()->index(i, 0); QString uri = index.data(Qt::UserRole).toString(); QPoint pos = index.data(PositionRole).toPoint(); auto overUris = m_itemPosHash.keys(pos); if (overUris.count() > 1) { auto extendPos = index.data(ExtendScreenPositionRole).toStringList(); if (3 == extendPos.count() && 0 != extendPos[2].toInt()) { extendItem.append(uri); } else { primaryItem.append(uri); } } } primaryItem<rowCount(); row++) { // todo: 桌面整理时的表现 auto index = model()->index(row, 0, QModelIndex()); auto uri = index.data(UriRole).toString(); auto pos = m_itemPosHash.value(uri); model()->setData(index, pos, PositionRole); setFileMetaInfoPos(uri, pos); } } GAsyncReadyCallback AdvancedDesktopIconView::queryZoomLevelAsyncCallback(GObject *obj, GAsyncResult *res, AdvancedDesktopIconView *p_this) { GError *err = nullptr; auto info = g_file_query_info_finish(G_FILE(obj), res, &err); if (info) { char* zoom_level = g_file_info_get_attribute_as_string(info, "metadata::peony-qt-desktop-zoom-level"); if (!zoom_level) { //qDebug()<<"======================no zoom level meta info\n\n\n"; g_object_unref(info); p_this->setDefaultZoomLevel(Normal); return nullptr; } g_object_unref(info); QString zoomLevel = zoom_level; g_free(zoom_level); int level =(zoomLevel.toInt()) == Invalid? Normal: ZoomLevel(QString(zoomLevel).toInt()); p_this->setDefaultZoomLevel(ZoomLevel(level)); return nullptr; } else { if (err) { qDebug()<code<message; g_error_free(err); } p_this->setDefaultZoomLevel(Normal); return nullptr; } } bool AdvancedDesktopIconView::isFull() { //bug#123045 主屏桌面空间不足,新建的文件未放置到扩展屏桌面上 qDebug() << "colNum:" <rowCount(); for (int column = 0; column < m_availableColumnCount; column++) { for (int row = 0; row < m_availableRowCount; row++) { QPoint pos = QPoint(column, row); if (m_itemPosHash.keys(pos).isEmpty()) return false; } } return true; } void AdvancedDesktopIconView::setShowHidden() { m_show_hidden = !GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool(); m_proxy_model->setShowHidden(m_show_hidden); //fix show hidden file desktop icons overlapped issue //QTimer::singleShot(100, this, [=]() { //resetAllItemPositionInfos(); //refresh(); //}); //fix#181595 桌面图标设置隐藏后排序 // Q_EMIT updateView(); m_proxy_model->invalidate(); showHiddenFile(); } void AdvancedDesktopIconView::showHiddenFile() { if (m_proxy_model && m_proxy_model->getDesktopUseAutoLayout()) { relayoutExsitingItemsAndUpdate(m_autoArrange); } viewport()->update(); return; } QPoint AdvancedDesktopIconView::checkGridPos(const QPoint pos) { if (!isInvalidPoint(pos)) { return pos; } int col = pos.x() >= m_availableColumnCount ? m_availableColumnCount-1 : pos.x(); int row = pos.y() >= m_availableRowCount ? m_availableRowCount-1 : pos.y(); QPoint newPos = findNextEmptyGridPos(QPoint(col, row)); return newPos; } void AdvancedDesktopIconView::onEntered(const QModelIndex &index) { if (m_hoverIndex == index) return; if (m_hoverIndex.isValid()) { const QRect rect = visualRect(m_hoverIndex); if (viewport()->rect().intersects(rect)) viewport()->update(rect); } if (index.isValid()) { const QRect rect = visualRect(index); if (viewport()->rect().intersects(rect)) viewport()->update(rect); } m_hoverIndex = index; } bool AdvancedDesktopIconView::checkEmptyPositon() { if (m_autoArrange.isEmpty()) return false; for (int col = 0; col < m_availableColumnCount; col++) { for (int row = 0; row < m_availableRowCount; row++) { if (col * m_availableRowCount + row + 1 > m_autoArrange.count()) { return false; } if (m_itemPosHash.keys(QPoint(col, row)).isEmpty()) { return true; } } } return false; } bool AdvancedDesktopIconView::execSharedFileLink(const QString uri) { auto info = FileInfo::fromUri(uri); if (info->isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } if (uri.endsWith(".desktop")) { GKeyFile* key_file = g_key_file_new(); QUrl url = uri; QString desktopfp = url.path(); g_key_file_load_from_file(key_file, desktopfp.toUtf8().constData(), G_KEY_FILE_KEEP_COMMENTS, nullptr); GError* error = NULL; if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-Peony-CMD", nullptr)) { if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, nullptr)) { g_autofree char* val = g_key_file_get_value(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, &error); if (error) { qWarning() << "get desktop file:" << uri << " name error:" << error->code << " -- " << error->message; g_error_free(error); error = nullptr; } else { #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QProcess p; p.setProgram("peony"); QString str = val; str = str.replace("peony ",""); p.setArguments(QStringList() << str); qint64 pid; p.startDetached(&pid); // send startinfo to kwindowsystem quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0; KStartupInfoId startInfoId; startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp)); startInfoId.setupStartupEnv(); KStartupInfoData data; data.setHostname(); data.addPid(pid); #ifdef KSTARTUPINFO_HAS_SET_ICON_GEOMETRY QRect rect = info.get()->property("iconGeometry").toRect(); if (rect.isValid()) { data.setIconGeometry(rect); } #endif data.setLaunchedBy(getpid()); KStartupInfo::sendStartup(startInfoId, data); #else QProcess p; QString strq; for (int i = 0;i < uri.length();++i) { if(uri[i] == ' '){ strq += "%20"; }else{ strq += uri[i]; } } p.startDetached("/usr/bin/peony", QStringList()< * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This program 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. * * This program 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 https://www.gnu.org/licenses/. * */ /* Generated by wayland-scanner 1.18.0 */ #ifndef UKUI_OUTPUT_CLIENT_PROTOCOL_H #define UKUI_OUTPUT_CLIENT_PROTOCOL_H #include #include #include "wayland-client.h" #ifdef __cplusplus extern "C" { #endif struct ukui_output; /** * @page page_iface_ukui_output ukui_output * @section page_iface_ukui_output_desc Description * * This example shows how to add extra functionality to Wayland * through an extension. This is the global object of the extension. * @section page_iface_ukui_output_api API * See @ref iface_ukui_output. */ /** * @defgroup iface_ukui_output The ukui_output interface * * This example shows how to add extra functionality to Wayland * through an extension. This is the global object of the extension. */ extern const struct wl_interface ukui_output_interface; #define UKUI_OUTPUT_SET_OUTPUTS_PAINT_ENABLED 0 /** * @ingroup iface_ukui_output */ #define UKUI_OUTPUT_SET_OUTPUTS_PAINT_ENABLED_SINCE_VERSION 1 /** @ingroup iface_ukui_output */ static inline void ukui_output_set_user_data(struct ukui_output *ukui_output, void *user_data) { wl_proxy_set_user_data((struct wl_proxy *) ukui_output, user_data); } /** @ingroup iface_ukui_output */ static inline void * ukui_output_get_user_data(struct ukui_output *ukui_output) { return wl_proxy_get_user_data((struct wl_proxy *) ukui_output); } static inline uint32_t ukui_output_get_version(struct ukui_output *ukui_output) { return wl_proxy_get_version((struct wl_proxy *) ukui_output); } /** @ingroup iface_ukui_output */ static inline void ukui_output_destroy(struct ukui_output *ukui_output) { wl_proxy_destroy((struct wl_proxy *) ukui_output); } /** * @ingroup iface_ukui_output * * 允许/禁止绘制窗口到屏幕,通常用在屏幕设置阶段 */ static inline void ukui_output_set_outputs_paint_enabled(struct ukui_output *ukui_output, uint32_t enable) { wl_proxy_marshal((struct wl_proxy *) ukui_output, UKUI_OUTPUT_SET_OUTPUTS_PAINT_ENABLED, enable); } #ifdef __cplusplus } #endif #endif peony/common.pri0000664000175000017500000000464115154271106012645 0ustar fengfengVERSION = 3.2.2 DEFINES += VERSION='\\"$${VERSION}\\"' DEFINES += MULTI_DISABLE DEFINES += V10_SP1='\\"V10SP1\\"' DEFINES += V10_SP1_EDU='\\"V10SP1-edu\\"' DEB_VERSION = 3.14.5.7 DEFINES += DEB_VERSION='\\"$${DEB_VERSION}\\"' exists(/usr/include/ukuisdk/kylin-com4cxx.h) { message("kylin common for cxx find.") DEFINES += KYLIN_COMMON=true LIBS += -lukui-com4cxx } exists(/usr/include/kysdk/applications/kdialog.h) { message("kyfiledialog find") DEFINES += KY_FILE_DIALOG } exists(/usr/include/kysdk/kysdk-system/libkysysinfo.h) { message("kysysinfo find") DEFINES += KY_SDK_SYSINFO } exists(/usr/include/kysdk/applications/kaboutdialog.h) { message("kyqtwidgets find") DEFINES += KY_SDK_QT_WIDGETS } exists(/usr/include/kysdk/applications/ukuistylehelper/ukuistylehelper.h) { message("kywaylandhelper find") DEFINES += KY_SDK_WAYLANDHELPER } exists("/usr/include/libkyudfburn/udfburn_global.h") { DEFINES += KY_UDF_BURN } exists("/usr/include/ukui-search/libsearch_global.h") { DEFINES += KY_UKUI_SEARCH } # exists("/usr/include/kysdk/desktop/kysdk-soundeffects_global.h") { # DEFINES += KY_SDK_SOUND_EFFECTS # PKGCONFIG += kysdk-soundeffects # } exists("/usr/include/kysdk/kysdk-system/libkydate.h") { DEFINES += KY_SDK_DATE PKGCONFIG += kysdk-systime } exists(/usr/include/kysdk/kysdk-system/libkysysinfo.h) { message("kysysinfo find") DEFINES += KY_SDK_SYSINFO } exists(/usr/include/kysdk/kysdk-system/libkydatacollect.h) { message("datacollect find") DEFINES += KY_SDK_DATACOLLECT } #include exists(/usr/include/applications/kabase/log.hpp) { message ("kysdkbase found") DEFINES += KY_SDK_KABASE } exists(/usr/include/kysdk/kysdk-system/libkypackages.h) { message("kypackages find") DEFINES += KY_SDK_PACKAGES } exists(/usr/include/kysdk/kysdk-system/libkydiskinfo.h) { message("kydiskinfo find") DEFINES += KY_SDK_DISKINFO } USE_SET_ICON=$$(USE_SET_ICON_GEOMETRY) equals(USE_SET_ICON,1) { message("USE_SET_ICON_GEOMETRY is set") DEFINES += KSTARTUPINFO_HAS_SET_ICON_GEOMETRY } else { message("USE_SET_ICON_GEOMETRY is not set") } BUILD_WITH_SDK_FEEDBACK_MENU_ACTION=$$(USE_FEEDBACK_MENU_ACTION) equals(BUILD_WITH_SDK_FEEDBACK_MENU_ACTION, 1) { DEFINES += BUILD_WITH_FEEDBACK_ACTION } else { message("do not build with kdk feedback menu action") } #DEFINES += VFS_CUSTOM_PLUGIN peony/CONTRIBUTING.md0000664000175000017500000000470415154271070013072 0ustar fengfeng# Peony contribution guide ## Introduction If you are reading this page, you might volunteer to be a contributor of this project. There are some suggestions from me. ## Your role(s) What role do you want to play in this project? This point is very important. - If you just find the problem and report a bug, you should be a user of Peony. - If you are good at one or more foreign languages, you should be a translator. - If you are familiar with the framework and developing on it, you should be a developer or programer of Peony. The different character's contribution is equally important. But the threshold is different. You need to choose your role(s) based on your own situation. ## Start with an issue If you are a new commer, I suggest you start by emitting an issue. I can get to know you from the issue you submitted, and there's no "risk" in emitting a issue. ## Translators are in short supply Peony is an i18n project, and it is shamed that I only studied Chinese and English. If you are familiar with English and proficient in other languages, I hope you can help me with the internationalization of the project. ## Pull request will be treated with caution I need to think carefully about your PR. If your idea doesn't agree with mine or I find a problem during my code review, I may refuse your request or ask you to modify it. I hope you can do a lot of verification on your work, because this is the code outside my scope, and when the two are combined, I need to be responsible for it. I don't want to let the contribution become a burden due to negligence. A pull request can also start with a issue, that might be more well founded and friendly. ## Document and verification It also makes sense to write new documents and verify existing documents. A good document can reflect your contribution level, and the verification of documents reflects your focus. Even though they may not contribute directly to the project, they are still very important. ## Communication If you have question about the project, just emit an issue for help. I will try my best to answer your questions. You also can use e-mail contract with me, here is my e-mail address: > lanyue@kylinos.cn ## More encouragement, less demeaning It's not easy to make a good project, especially an open source project. I hope that you can respect these labor achievements. If there's something bad to do, it should not be pointed out in a derogatory way, but like the suggestions given in the article. peony/peony-qt-plugin-test/0000775000175000017500000000000015154271070014661 5ustar fengfengpeony/peony-qt-plugin-test/gtk2-style-enhanced-plugin/0000775000175000017500000000000015154271070021725 5ustar fengfengpeony/peony-qt-plugin-test/gtk2-style-enhanced-plugin/gtk2-style-enhanced-plugin.cpp0000664000175000017500000000211015154271070027467 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "gtk2-style-enhanced-plugin.h" #include "complementary-style.h" using namespace Peony; Gtk2StyleEnhancedPlugin::Gtk2StyleEnhancedPlugin(QObject *parent) : QObject(parent) { } QProxyStyle *Gtk2StyleEnhancedPlugin::getStyle() { return ComplementaryStyle::getStyle(); } peony/peony-qt-plugin-test/gtk2-style-enhanced-plugin/gtk2-style-enhanced-plugin.pro0000664000175000017500000000256515154271070027523 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-11-13T10:58:32 # #------------------------------------------------- QT += widgets TARGET = gtk2-style-enhanced-plugin TEMPLATE = lib DEFINES += GTK2STYLEENHANCEDPLUGIN_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) include(../../libpeony-qt/libpeony-qt-header.pri) PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 CONFIG += c++11 link_pkgconfig no_keywords LIBS += -L$$PWD/../../libpeony-qt/ -lpeony-qt SOURCES += \ gtk2-style-enhanced-plugin.cpp HEADERS += \ gtk2-style-enhanced-plugin.h \ gtk2-style-enhanced-plugin_global.h DESTDIR += ../../testdir unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } peony/peony-qt-plugin-test/gtk2-style-enhanced-plugin/gtk2-style-enhanced-plugin.h0000664000175000017500000000367015154271070027150 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef GTK2STYLEENHANCEDPLUGIN_H #define GTK2STYLEENHANCEDPLUGIN_H #include "gtk2-style-enhanced-plugin_global.h" #include #include #include "style-plugin-iface.h" namespace Peony { class GTK2STYLEENHANCEDPLUGINSHARED_EXPORT Gtk2StyleEnhancedPlugin : public QObject, public StylePluginIface { Q_OBJECT Q_PLUGIN_METADATA(IID StylePluginIface_iid) Q_INTERFACES(Peony::StylePluginIface) public: explicit Gtk2StyleEnhancedPlugin(QObject *parent = nullptr); PluginInterface::PluginType pluginType() { return PluginInterface::StylePlugin; } const QString name() { return tr("Gtk theme enhanced extension"); } const QString description() { return tr("Improve the gtk-themed controls' style and painting"); } const QIcon icon() { return QIcon::fromTheme("utilities-terminal-symbolic"); } void setEnable(bool enable) { m_enable = enable; } bool isEnable() { return m_enable; } int defaultPriority() { return 0; } QProxyStyle *getStyle(); private: bool m_enable; }; } #endif // GTK2STYLEENHANCEDPLUGIN_H peony/peony-qt-plugin-test/gtk2-style-enhanced-plugin/gtk2-style-enhanced-plugin_global.h0000664000175000017500000000217515154271070030467 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef GTK2STYLEENHANCEDPLUGIN_GLOBAL_H #define GTK2STYLEENHANCEDPLUGIN_GLOBAL_H #include #if defined(GTK2STYLEENHANCEDPLUGIN_LIBRARY) # define GTK2STYLEENHANCEDPLUGINSHARED_EXPORT Q_DECL_EXPORT #else # define GTK2STYLEENHANCEDPLUGINSHARED_EXPORT Q_DECL_IMPORT #endif #endif // GTK2STYLEENHANCEDPLUGIN_GLOBAL_H peony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/0000775000175000017500000000000015154271070024765 5ustar fengfeng././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-plugin-example_global.hpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-plug0000664000175000017500000000231315154271070033033 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PROPERTIESWINDOWTABPAGEPLUGINEXAMPLE_GLOBAL_H #define PROPERTIESWINDOWTABPAGEPLUGINEXAMPLE_GLOBAL_H #include #if defined(PROPERTIESWINDOWTABPAGEPLUGINEXAMPLE_LIBRARY) # define PROPERTIESWINDOWTABPAGEPLUGINEXAMPLESHARED_EXPORT Q_DECL_EXPORT #else # define PROPERTIESWINDOWTABPAGEPLUGINEXAMPLESHARED_EXPORT Q_DECL_IMPORT #endif #endif // PROPERTIESWINDOWTABPAGEPLUGINEXAMPLE_GLOBAL_H ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-examplefactory.hpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-exam0000664000175000017500000000463715154271070033031 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PROPERTIESWINDOWTABPAGEEXAMPLEFACTORY_H #define PROPERTIESWINDOWTABPAGEEXAMPLEFACTORY_H #include "properties-window-tab-page-plugin-example_global.h" #include "properties-window-tab-page-plugin-iface.h" #include class PROPERTIESWINDOWTABPAGEPLUGINEXAMPLESHARED_EXPORT PropertiesWindowTabPageExampleFactory : public QObject, public Peony::PropertiesWindowTabPagePluginIface { Q_OBJECT Q_PLUGIN_METADATA(IID PropertiesWindowTabPagePluginIface_iid) Q_INTERFACES(Peony::PropertiesWindowTabPagePluginIface) public: explicit PropertiesWindowTabPageExampleFactory(QObject *parent = nullptr); ~PropertiesWindowTabPageExampleFactory() override; PluginInterface::PluginType pluginType() override { return PluginInterface::PropertiesWindowPlugin; } const QString name() override { return "Properties Page Plugin Example"; } const QString description() override { return "This plugin is a factory plugin providing the add-on properties page for peony-qt's properties window"; } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic"); } void setEnable(bool enable) override { m_enable = enable; } bool isEnable() override { return m_enable; } int tabOrder() override { return 0; } bool supportUris(const QStringList &uris) override { return true; } QWidget *createTabPage(const QStringList &uris) override; void closeFactory() override { deleteLater(); } private: bool m_enable = true; }; #endif // PROPERTIESWINDOWTABPAGEEXAMPLEFACTORY_H ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-examplefactory.cpppeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-exam0000664000175000017500000000262415154271070033023 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "properties-window-tab-page-examplefactory.h" #include PropertiesWindowTabPageExampleFactory::PropertiesWindowTabPageExampleFactory(QObject *parent) : QObject (parent) { } PropertiesWindowTabPageExampleFactory::~PropertiesWindowTabPageExampleFactory() { } QWidget *PropertiesWindowTabPageExampleFactory::createTabPage(const QStringList &uris) { QStringList l = uris; auto label = new QLabel(tr("This page is an external plugin page.\n" "uris:\n" "%1").arg(l.join(",\n"))); label->setWordWrap(true); return label; } ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootpeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-plugin-example.propeony/peony-qt-plugin-test/properties-window-tab-page-plugin-example/properties-window-tab-page-plug0000664000175000017500000000241115154271070033032 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-10-24T13:53:42 # #------------------------------------------------- QT += widgets TARGET = properties-window-tab-page-plugin-example TEMPLATE = lib DEFINES += PROPERTIESWINDOWTABPAGEPLUGINEXAMPLE_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) SOURCES += \ properties-window-tab-page-examplefactory.cpp HEADERS += \ properties-window-tab-page-examplefactory.h \ properties-window-tab-page-plugin-example_global.h DESTDIR = ../../testdir unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } peony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/0000775000175000017500000000000015154271070023775 5ustar fengfengpeony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/content-preview-page.cpp0000664000175000017500000000256215154271070030551 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "content-preview-page.h" #include #include ContentPreviewPage::ContentPreviewPage(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); setLayout(layout); m_label = new QLabel(tr("This page is a part of peony-qt extension"), this); layout->addWidget(m_label); } ContentPreviewPage::~ContentPreviewPage() { } void ContentPreviewPage::startPreview() { m_label->setText(m_current_uri); } void ContentPreviewPage::cancel() { m_label->setText(tr("This page is a part of peony-qt extension")); } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootpeony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/peony-qt-preview-file-content-plugin_global.hpeony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/peony-qt-preview-file-content-plugin0000664000175000017500000000225515154271070033040 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PEONYQTPREVIEWFILECONTENTPLUGIN_GLOBAL_H #define PEONYQTPREVIEWFILECONTENTPLUGIN_GLOBAL_H #include #if defined(PEONYQTPREVIEWFILECONTENTPLUGIN_LIBRARY) # define PEONYQTPREVIEWFILECONTENTPLUGINSHARED_EXPORT Q_DECL_EXPORT #else # define PEONYQTPREVIEWFILECONTENTPLUGINSHARED_EXPORT Q_DECL_IMPORT #endif #endif // PEONYQTPREVIEWFILECONTENTPLUGIN_GLOBAL_H peony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/content-preview-page.h0000664000175000017500000000326215154271070030214 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef CONTENTPREVIEWPAGE_H #define CONTENTPREVIEWPAGE_H #include #include "preview-page-plugin-iface.h" class QLabel; class ContentPreviewPage : public QWidget, public Peony::PreviewPageIface { Q_OBJECT public: explicit ContentPreviewPage(QWidget *parent = nullptr); ~ContentPreviewPage() override; void prepare(const QString &uri, PreviewType type) override { m_current_uri = uri; m_current_type = type; } void prepare(const QString &uri) override { m_current_uri = uri; } void startPreview() override; void cancel() override; void closePreviewPage() override { deleteLater(); } signals: public slots: private: QLabel *m_label = nullptr; QString m_current_uri = nullptr; Peony::PreviewPageIface::PreviewType m_current_type = Peony::PreviewPageIface::Other; }; #endif // CONTENTPREVIEWPAGE_H peony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/content-preview-page-factory.h0000664000175000017500000000526315154271070031664 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef CONTENTPREVIEWPAGEFACTORY_H #define CONTENTPREVIEWPAGEFACTORY_H #include "peony-qt-preview-file-content-plugin_global.h" #include "preview-page-plugin-iface.h" /*! * \brief The ContentPreviewPageFactory class * * \details This example is showing you how to * implement a preview page plugin for peony-qt. * We should start at implement the PreviewPagePluginIface * with your own factory. * * You have to declare your factory * as PreviewPagePluginIface derived class * and override all virtual method both * Peony::PreviewPagePluginIface and Peony::PluginIface provided. * * \note * You don't need declare the PreviewPageIface as a plugin interface, * But you should aslo implement your own PreviewPage * by deriving Peony::PreviewPageIface for the return value * as this class's createPreviewPage() method. */ class PEONYQTPREVIEWFILECONTENTPLUGINSHARED_EXPORT ContentPreviewPageFactory : public QObject, public Peony::PreviewPagePluginIface { Q_OBJECT Q_PLUGIN_METADATA(IID PreviewPagePluginIface_iid) Q_INTERFACES(Peony::PreviewPagePluginIface) public: explicit ContentPreviewPageFactory(QObject *parent = nullptr); ~ContentPreviewPageFactory() override; PluginInterface::PluginType pluginType() override { return PluginInterface::PreviewPagePlugin; } const QString name() override { return "Preview Page Plugin"; } const QString description() override { return "This plugin is a factory plugin providing the content preview page for FMWindow"; } const QIcon icon() override { return QIcon::fromTheme("ukui-preview-file-details"); } void setEnable(bool enable) override { m_enable = enable; } bool isEnable() override { return m_enable; } Peony::PreviewPageIface *createPreviewPage() override; private: bool m_enable = true; }; #endif // CONTENTPREVIEWPAGEFACTORY_H peony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/content-preview-page-factory.cpp0000664000175000017500000000220615154271070032211 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "content-preview-page-factory.h" #include "content-preview-page.h" ContentPreviewPageFactory::ContentPreviewPageFactory(QObject *parent) : QObject (parent) { } ContentPreviewPageFactory::~ContentPreviewPageFactory() { } Peony::PreviewPageIface *ContentPreviewPageFactory::createPreviewPage() { return new ContentPreviewPage; } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootpeony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/peony-qt-preview-file-content-plugin.propeony/peony-qt-plugin-test/peony-qt-preview-file-content-plugin/peony-qt-preview-file-content-plugin0000664000175000017500000000252615154271070033041 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-10-24T09:25:02 # #------------------------------------------------- QT += widgets #network webengine webenginewidgets webkit webkitwidgets TARGET = peony-qt-preview-file-content-plugin TEMPLATE = lib DEFINES += PEONYQTPREVIEWFILECONTENTPLUGIN_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) SOURCES += \ content-preview-page-factory.cpp \ content-preview-page.cpp HEADERS += \ content-preview-page-factory.h \ peony-qt-preview-file-content-plugin_global.h \ content-preview-page.h DESTDIR += ../../testdir unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } peony/peony-qt-plugin-test/peony-qt-menu-plugin-example/0000775000175000017500000000000015154271070022324 5ustar fengfengpeony/peony-qt-plugin-test/peony-qt-menu-plugin-example/menu-plugin-example.cpp0000664000175000017500000000374415154271070026731 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "menu-plugin-example.h" #include #include #include using namespace Peony; MenuPluginExample::MenuPluginExample(QObject *parent) : QObject(parent) { } QString MenuPluginExample::testPlugin() { qDebug()<<"menu test plugin1"; return QString("MenuPluginExample"); } QList MenuPluginExample::menuActions(Types types, const QString &uri, const QStringList &selectionUris) { //return QList(); Q_UNUSED(types); Q_UNUSED(uri); Q_UNUSED(selectionUris); QList actions; QAction *action = new QAction(QIcon::fromTheme("search"), tr("plugin-sub-menu test")); actions<parentWidget()); connect(action, &QAction::destroyed, [=]() { qDebug()<<"delete sub menu"; menu->deleteLater(); }); menu->addAction("sub test1"); menu->addSeparator(); menu->addAction("sub test2"); action->setMenu(menu); QAction *action2 = new QAction(QIcon::fromTheme("media-eject"), tr("plugin-action test")); connect(action2, &QAction::triggered, [=]() { qDebug()<<"action triggered"; }); actions<. * * Authors: Yue Lan * */ #ifndef PEONYQTMENUPLUGINEXAMPLE_GLOBAL_H #define PEONYQTMENUPLUGINEXAMPLE_GLOBAL_H #include #if defined(PEONYQTMENUPLUGINEXAMPLE_LIBRARY) # define PEONYQTMENUPLUGINEXAMPLESHARED_EXPORT Q_DECL_EXPORT #else # define PEONYQTMENUPLUGINEXAMPLESHARED_EXPORT Q_DECL_IMPORT #endif #endif // PEONYQTMENUPLUGINEXAMPLE_GLOBAL_H peony/peony-qt-plugin-test/peony-qt-menu-plugin-example/menu-plugin-example.h0000664000175000017500000000373215154271070026373 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef MENUPLUGINEXAMPLE_H #define MENUPLUGINEXAMPLE_H #include "peony-qt-menu-plugin-example_global.h" #include #include #include "menu-plugin-iface.h" namespace Peony { class PEONYQTMENUPLUGINEXAMPLESHARED_EXPORT MenuPluginExample : public QObject, public MenuPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID MenuPluginInterface_iid) Q_INTERFACES(Peony::MenuPluginInterface) public: explicit MenuPluginExample(QObject *parent = nullptr); PluginInterface::PluginType pluginType() override { return PluginInterface::MenuPlugin; } const QString name() override { return "testMenuPlugin1"; } const QString description() override { return "This is a menu type test plugin"; } const QIcon icon() override { return QIcon::fromTheme("search"); } void setEnable(bool enable) override { m_enable = enable; } bool isEnable() override { return m_enable; } QString testPlugin() override; QList menuActions(Types types, const QString &uri, const QStringList &selectionUris) override; private: bool m_enable; }; } #endif // MENUPLUGINEXAMPLE_H peony/peony-qt-plugin-test/peony-qt-menu-plugin-example/peony-qt-menu-plugin-example.pro0000664000175000017500000000227015154271070030512 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-10-29T09:29:17 # #------------------------------------------------- QT += widgets TARGET = peony-qt-menu-plugin-example TEMPLATE = lib DEFINES += PEONYQTMENUPLUGINEXAMPLE_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) SOURCES += \ menu-plugin-example.cpp HEADERS += \ menu-plugin-example.h \ peony-qt-menu-plugin-example_global.h DESTDIR += ../../testdir unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } peony/peony-qt-plugin-test/directory-view-extensions-plugin-test/0000775000175000017500000000000015154271070024303 5ustar fengfeng././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-test-plugin.hpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-test-plug0000664000175000017500000000471715154271070033332 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef DIRECTORYVIEWEXTENSIONSTESTPLUGIN_H #define DIRECTORYVIEWEXTENSIONSTESTPLUGIN_H #include "directory-view-extensions-plugin-test_global.h" #include "directory-view-plugin-iface2.h" namespace Peony { class DIRECTORYVIEWEXTENSIONSPLUGINTESTSHARED_EXPORT DirectoryViewExtensionsTestPlugin : public QObject, public DirectoryViewPluginIface2 { Q_OBJECT Q_PLUGIN_METADATA(IID DirectoryViewPluginIface2_iid) Q_INTERFACES(Peony::DirectoryViewPluginIface2) public: explicit DirectoryViewExtensionsTestPlugin(QObject *parent = nullptr); //plugin implement const QString name() override { return QObject::tr("Directory View Plugin"); } PluginType pluginType() override { return PluginType::DirectoryViewPlugin2; } const QString description() override { return QObject::tr("Show the folder children as icons."); } const QIcon icon() override { return QIcon::fromTheme("folder"); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //directory view plugin implemeny QString viewIdentity() override { return QObject::tr("Directory View Plugin"); } QIcon viewIcon() override { return QIcon::fromTheme("folder"); } bool supportUri(const QString &uri) override { return !uri.isEmpty(); } //void fillDirectoryView(DirectoryViewWidget *view) override; DirectoryViewWidget *create() override; int zoom_level_hint() override { return 0; } int priority(const QString &) override { return -1; } }; } #endif // DIRECTORYVIEWEXTENSIONSTESTPLUGIN_H ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-plugin-test.propeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-plugin-te0000664000175000017500000000262215154271070033303 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-11-18T09:07:42 # #------------------------------------------------- QT += widgets TARGET = directory-view-extensions-plugin-test TEMPLATE = lib DEFINES += DIRECTORYVIEWEXTENSIONSPLUGINTEST_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) include(../../libpeony-qt/libpeony-qt-header.pri) PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 CONFIG += c++11 link_pkgconfig no_keywords LIBS += -L$$PWD/../../libpeony-qt/ -lpeony-qt SOURCES += \ directory-view-extensions-test-plugin.cpp HEADERS += \ directory-view-extensions-test-plugin.h \ directory-view-extensions-plugin-test_global.h unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-plugin-test_global.hpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-plugin-te0000664000175000017500000000227115154271070033303 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef DIRECTORYVIEWEXTENSIONSPLUGINTEST_GLOBAL_H #define DIRECTORYVIEWEXTENSIONSPLUGINTEST_GLOBAL_H #include #if defined(DIRECTORYVIEWEXTENSIONSPLUGINTEST_LIBRARY) # define DIRECTORYVIEWEXTENSIONSPLUGINTESTSHARED_EXPORT Q_DECL_EXPORT #else # define DIRECTORYVIEWEXTENSIONSPLUGINTESTSHARED_EXPORT Q_DECL_IMPORT #endif #endif // DIRECTORYVIEWEXTENSIONSPLUGINTEST_GLOBAL_H ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootpeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-test-plugin.cpppeony/peony-qt-plugin-test/directory-view-extensions-plugin-test/directory-view-extensions-test-plug0000664000175000017500000000312015154271070033315 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "directory-view-extensions-test-plugin.h" #include "directory-view-widget.h" #include #include #include using namespace Peony; DirectoryViewExtensionsTestPlugin::DirectoryViewExtensionsTestPlugin(QObject *parent) : QObject(parent) { } //void DirectoryViewExtensionsTestPlugin::fillDirectoryView(DirectoryViewWidget *view) //{ // auto layout = new QVBoxLayout(view); // layout->addWidget(new QLabel("test icon view", nullptr)); // view->setLayout(layout); //} DirectoryViewWidget *DirectoryViewExtensionsTestPlugin::create() { qDebug()<<"create directory view"; auto w = new DirectoryViewWidget; auto layout = new QVBoxLayout(w); layout->addWidget(new QLabel("test directory view", w)); w->setLayout(layout); return w; } peony/peony-qt-plugin-test/peony-qt-plugin-test.pro0000664000175000017500000000042515154271070021431 0ustar fengfengTEMPLATE = subdirs SUBDIRS += \ peony-qt-preview-file-content-plugin \ properties-window-tab-page-plugin-example \ peony-qt-menu-plugin-example \ #peony-qt-menu-plugin-mate-terminal \ #gtk2-style-enhanced-plugin \ directory-view-extensions-plugin-test peony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/0000775000175000017500000000000015154271070023430 5ustar fengfengpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/mate-terminal-menu-plugin.h0000664000175000017500000000411115154271070030573 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef MATETERMINALMENUPLUGIN_H #define MATETERMINALMENUPLUGIN_H #include "peony-qt-menu-plugin-mate-terminal_global.h" #include #include #include "menu-plugin-iface.h" namespace Peony { class PEONYQTMENUPLUGINMATETERMINALSHARED_EXPORT MateTerminalMenuPlugin : public QObject, public MenuPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID MenuPluginInterface_iid) Q_INTERFACES(Peony::MenuPluginInterface) public: explicit MateTerminalMenuPlugin(QObject *parent = nullptr); PluginInterface::PluginType pluginType() override { return PluginInterface::MenuPlugin; } const QString name() override { return tr("Peony-Qt Mate Terminal Menu Extension"); } const QString description() override { return tr("Open Terminal with menu."); } const QIcon icon() override { return QIcon::fromTheme("utilities-terminal-symbolic"); } void setEnable(bool enable) override { m_enable = enable; } bool isEnable() override { return m_enable; } QString testPlugin() override { return "test"; } QList menuActions(Types types, const QString &uri, const QStringList &selectionUris) override; private: bool m_enable; }; } #endif // MATETERMINALMENUPLUGIN_H peony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/translations/0000775000175000017500000000000015154271106026151 5ustar fengfeng././@LongLink0000644000000000000000000000016500000000000011605 Lustar rootrootpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/translations/peony-qt-mate-terminal-extension_zh_CN.qmpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/translations/peony-qt-mate-terminal-ex0000664000175000017500000000052715154271106033023 0ustar fengfeng Peony::MateTerminalMenuPlugin Open Directory in Terminal 打开终端 Peony-Qt Mate Terminal Menu Extension UKUI文件管理器终端扩展 Open Terminal with menu. 使用右键菜单打开终端。 ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/translations/peony-qt-mate-terminal-extension_tr.tspeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/translations/peony-qt-mate-terminal-ex0000664000175000017500000000160115154271070033015 0ustar fengfeng Peony::MateTerminalMenuPlugin Open Directory in Terminal Dizini Terminalde Aç Peony-Qt Mate Terminal Menu Extension Peony-Qt Mate Terminal Menü Eklentisi Open Terminal with menu. Terminali menü ile aç ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/peony-qt-menu-plugin-mate-terminal_global.hpeony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/peony-qt-menu-plugin-mate-terminal_glo0000664000175000017500000000224115154271070032762 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef PEONYQTMENUPLUGINMATETERMINAL_GLOBAL_H #define PEONYQTMENUPLUGINMATETERMINAL_GLOBAL_H #include #if defined(PEONYQTMENUPLUGINMATETERMINAL_LIBRARY) # define PEONYQTMENUPLUGINMATETERMINALSHARED_EXPORT Q_DECL_EXPORT #else # define PEONYQTMENUPLUGINMATETERMINALSHARED_EXPORT Q_DECL_IMPORT #endif #endif // PEONYQTMENUPLUGINMATETERMINAL_GLOBAL_H peony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/peony-qt-menu-plugin-mate-terminal.pro0000664000175000017500000000302515154271070032721 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-11-05T10:40:52 # #------------------------------------------------- QT += widgets TARGET = peony-qt-menu-plugin-mate-terminal TEMPLATE = lib DEFINES += PEONYQTMENUPLUGINMATETERMINAL_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 include(../../plugin-iface/plugin-iface.pri) include(../../libpeony-qt/libpeony-qt-header.pri) PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 CONFIG += c++11 link_pkgconfig no_keywords lrelease LIBS += -L$$PWD/../../libpeony-qt/ -lpeony-qt SOURCES += \ mate-terminal-menu-plugin.cpp HEADERS += \ mate-terminal-menu-plugin.h \ peony-qt-menu-plugin-mate-terminal_global.h DESTDIR = ../../testdir TRANSLATIONS += translations/peony-qt-mate-terminal-extension_zh_CN.ts unix { target.path = $$[QT_INSTALL_LIBS]/peony-extensions INSTALLS += target } RESOURCES += \ peony-qt-menu-plugin-mate-terminal.qrc peony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/peony-qt-menu-plugin-mate-terminal.qrc0000664000175000017500000000032115154271070032702 0ustar fengfeng translations/peony-qt-mate-terminal-extension_zh_CN.ts translations/peony-qt-mate-terminal-extension_zh_CN.qm peony/peony-qt-plugin-test/peony-qt-menu-plugin-mate-terminal/mate-terminal-menu-plugin.cpp0000664000175000017500000000601015154271070031126 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2019, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "mate-terminal-menu-plugin.h" #include "file-info.h" #include #include #include #include #include #include #include using namespace Peony; MateTerminalMenuPlugin::MateTerminalMenuPlugin(QObject *parent) : QObject (parent) { QTranslator *t = new QTranslator(this); qDebug()<<"\n\n\n\n\n\n\ntranslate:"<load(":/translations/peony-qt-mate-terminal-extension_"+QLocale::system().name()); QApplication::installTranslator(t); } void openTerminal(const QString &uri) { qDebug()<<"triggered"<message; g_error_free(err); err = nullptr; } g_strfreev (argv); } QList MateTerminalMenuPlugin::menuActions(Types types, const QString &uri, const QStringList &selectionUris) { QList actions; if (types == MenuPluginInterface::DirectoryView || types == MenuPluginInterface::DesktopWindow) { if (selectionUris.isEmpty()) { QAction *dirAction = new QAction(QIcon::fromTheme("utilities-terminal-symbolic"), tr("Open Directory in Terminal")); dirAction->connect(dirAction, &QAction::triggered, [=]() { openTerminal(uri); }); actions<isDir()) { QAction *dirAction = new QAction(QIcon::fromTheme("utilities-terminal-symbolic"), tr("Open Directory in Terminal")); dirAction->connect(dirAction, &QAction::triggered, [=]() { openTerminal(selectionUris.first()); }); actions< Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. peony/.github/0000775000175000017500000000000015154271070012174 5ustar fengfengpeony/.github/workflows/0000775000175000017500000000000015154271070014231 5ustar fengfengpeony/.github/workflows/build.yml0000664000175000017500000000744215154271070016062 0ustar fengfengname: Check build on: push: branches: - master pull_request: branches: - master jobs: archlinux-latest: name: on Archlinux runs-on: ubuntu-20.04 container: docker.io/library/archlinux:latest steps: - name: Checkout peony source code uses: actions/checkout@v2 - name: Refresh pacman repository and force upgrade run: pacman -Syyu --noconfirm - name: Install build dependencies run: pacman -S --noconfirm base-devel qt5-base gsettings-qt kwindowsystem poppler-qt5 qt5-x11extras glib2 qt5-tools udisks2 gtk2 libnotify glibc - name: QMake configure & Make run: | mkdir build; cd build; qmake-qt5 ..; make -j$(nproc); debian-sid: name: on Debian Sid runs-on: ubuntu-20.04 container: docker.io/library/debian:sid env: DEBIAN_FRONTEND: noninteractive steps: - name: Checkout peony source code uses: actions/checkout@v2 - name: Update apt repository run: apt-get update -y - name: Install build dependcies run: apt-get install -y build-essential qt5-default qttools5-dev-tools debhelper-compat pkg-kde-tools pkg-config libglib2.0-dev libqt5x11extras5-dev libgsettings-qt-dev libpoppler-dev libpoppler-qt5-dev libkf5windowsystem-dev qtbase5-private-dev libudisks2-dev libgtk2.0-dev libnotify-dev libcanberra-dev - name: QMake configure & Make run: | mkdir build; cd build; qmake ..; make -j$(nproc); fedora-latest: name: on Fedora Latest runs-on: ubuntu-20.04 container: docker.io/library/fedora:latest steps: - name: Checkout peony source code uses: actions/checkout@v2 - name: Install build dependencies run: dnf install --refresh -y make gcc gcc-c++ which cmake cmake-rpm-macros autoconf automake intltool rpm-build qt5-devel qt5-rpm-macros qt5-qtbase-devel qt5-qttools-devel glib2-devel qt5-qtbase-devel gsettings-qt-devel kf5-kwindowsystem-devel poppler-qt5-devel qt5-qtx11extras-devel qt5-qtbase-private-devel libudisks2-devel gtk2-devel libnotify-devel - name: QMake configure & Make run: | mkdir build; cd build; qmake-qt5 ..; make -j$(nproc); fedora-rawhide: name: on Fedora Rawhide runs-on: ubuntu-20.04 container: docker.io/library/fedora:rawhide steps: - name: Checkout peony source code uses: actions/checkout@v2 - name: Install build dependencies run: dnf install --refresh --nogpg -y make gcc gcc-c++ which cmake cmake-rpm-macros autoconf automake intltool rpm-build qt5-rpm-macros qt5-qtbase-devel qt5-qttools-devel glib2-devel qt5-qtbase-devel gsettings-qt-devel kf5-kwindowsystem-devel poppler-qt5-devel qt5-qtx11extras-devel qt5-qtbase-private-devel libudisks2-devel gtk2-devel libnotify-devel - name: QMake configure & Make run: | mkdir build; cd build; qmake-qt5 ..; make -j$(nproc); ubuntu-latest: name: on Ubuntu Latest runs-on: ubuntu-20.04 container: docker.io/library/ubuntu:latest env: DEBIAN_FRONTEND: noninteractive steps: - name: Checkout peony source code uses: actions/checkout@v2 - name: Update apt repository run: apt-get update -y - name: Install build dependcies run: apt-get install -y build-essential qt5-default qttools5-dev-tools debhelper-compat pkg-kde-tools pkg-config libglib2.0-dev libqt5x11extras5-dev libgsettings-qt-dev libpoppler-dev libpoppler-qt5-dev libkf5windowsystem-dev qtbase5-private-dev libudisks2-dev libgtk2.0-dev libnotify-dev - name: QMake configure & Make run: | mkdir build; cd build; qmake ..; make -j$(nproc); peony/stable/0000775000175000017500000000000015167662230012114 5ustar fengfengpeony/stable/stable.pro0000664000175000017500000000040415154271070014100 0ustar fengfeng###################################################################### # Automatically generated by qmake (3.1) Wed Dec 13 16:01:39 2023 ###################################################################### TEMPLATE = subdirs # Directories SUBDIRS += ukui3 peony/stable/ukui3/0000775000175000017500000000000015167662230013154 5ustar fengfengpeony/stable/ukui3/properties-window/0000775000175000017500000000000015167662230016655 5ustar fengfengpeony/stable/ukui3/properties-window/controls/0000775000175000017500000000000015154271106020512 5ustar fengfengpeony/stable/ukui3/properties-window/controls/recent-and-trash-properties-page.cpp0000664000175000017500000002400015154271106027455 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "recent-and-trash-properties-page.h" #include "file-info.h" #include "file-info-job.h" #include "file-utils.h" #include "global-settings.h" #include "file-count-operation.h" #include "file-meta-info.h" #include #include #include #include #include #include #include #include using namespace Peony; //460 - 16 - 16 = 428 #define FIXED_ROW_WIDTH 428; QString RecentAndTrashPropertiesPage::getIconName() { if (m_fileInfo == nullptr) return "application-x-desktop"; QString realPath; realPath = m_fileInfo->targetUri(); auto _desktop_file = g_desktop_app_info_new_from_filename(QUrl(realPath).path().toUtf8().constData()); if (_desktop_file) { return QString(g_desktop_app_info_get_string(_desktop_file, "Icon")); } //在找不到图标时,返回默认图标 - When the icon is not found, return to the default icon return "application-x-desktop"; } RecentAndTrashPropertiesPage::RecentAndTrashPropertiesPage(const QStringList &uris, QWidget *parent) : PropertiesWindowTabIface(parent) { m_uri = uris.first(); m_fileInfo = FileInfo::fromUri(m_uri); FileInfoJob *job = new FileInfoJob(m_fileInfo); job->setAutoDelete(true); connect(job, &FileInfoJob::queryAsyncFinished, this, &RecentAndTrashPropertiesPage::init); job->queryAsync(); } void RecentAndTrashPropertiesPage::init() { if (m_futureWatcher) { delete m_futureWatcher; m_futureWatcher = nullptr; } auto targetFileInfo = FileInfo::fromUri(m_fileInfo.get()->targetUri()); FileInfoJob j(targetFileInfo); j.querySync(); m_layout = new QFormLayout(this); m_layout->setRowWrapPolicy(QFormLayout::WrapLongRows); m_layout->setFormAlignment(Qt::AlignLeft|Qt::AlignHCenter); m_layout->setLabelAlignment(Qt::AlignRight|Qt::AlignHCenter); m_layout->setContentsMargins(16,16,16,0); this->setLayout(m_layout); QString iconName = m_fileInfo->iconName(); if (iconName == "application-x-desktop") { iconName = getIconName(); } auto icon = new QPushButton(QIcon::fromTheme(iconName), nullptr, this); icon->setFocusPolicy(Qt::NoFocus); icon->setAttribute(Qt::WA_TransparentForMouseEvents); icon->setIconSize(QSize(48, 48)); icon->setProperty("isIcon", true); QVBoxLayout *boxLayout = new QVBoxLayout(this); auto name = new QLineEdit(this); name->setReadOnly(true); name->setText(m_fileInfo->displayName()); if (!targetFileInfo.get()->displayName().isEmpty()) { name->setText(targetFileInfo.get()->displayName()); } boxLayout->addWidget(name); boxLayout->setAlignment(Qt::AlignBottom); m_layout->addRow(icon, boxLayout); m_layout->setAlignment(Qt::AlignCenter); addSeparator(); bool startWithTrash = m_uri.startsWith("trash:///"); if (startWithTrash) { if (m_uri == "trash:///") { auto checkbox = new QCheckBox(tr("Show confirm dialog while trashing.")); m_layout->addWidget(checkbox); connect(checkbox, &QCheckBox::toggled, this, [=](bool checked){ this->setProperty("check", checked); }); auto value = GlobalSettings::getInstance()->getValue("showTrashDialog"); if (value.isValid()) { checkbox->setChecked(value.toBool()); } else { checkbox->setChecked(true); } } else { QLabel *label =new QLabel(this); GFile *file = g_file_new_for_uri(m_uri.toUtf8().constData()); GFileInfo *info = g_file_query_info(file, G_FILE_ATTRIBUTE_TRASH_ORIG_PATH, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); auto origin_path = g_file_info_get_attribute_byte_string(info, G_FILE_ATTRIBUTE_TRASH_ORIG_PATH); if (!origin_path) { auto targetInfo = FileInfo::fromUri(m_uri); QString path = targetInfo.get()->property("orig-path").toString(); if (!path.isEmpty()) { origin_path = path.toUtf8().constData(); } } QUrl url(FileUtils::getParentUri("file://" + QString(origin_path))); quint64 width = FIXED_ROW_WIDTH - label->fontMetrics().horizontalAdvance(tr("Origin Path: ")); label->setText(label->fontMetrics().elidedText(url.path(), Qt::ElideMiddle,width)); label->setWordWrap(true); // g_object_unref(info); // g_object_unref(file); m_layout->addRow(tr("Origin Path: "), label); QLabel *size_label =new QLabel(this); if (m_fileInfo->isDir()) { FileCountOperation *fileCountOp = new FileCountOperation(QStringList() << m_fileInfo->uri()); fileCountOp->setAutoDelete(true); connect(fileCountOp, &FileCountOperation::countDone, [=](quint64 file_count, quint64 hidden_file_count, quint64 total_size) { char *fileTotalSizeFormat = g_format_size_full(total_size, G_FORMAT_SIZE_IEC_UNITS); QString fileTotalSizeFormatString(fileTotalSizeFormat); size_label->setText(fileTotalSizeFormatString.replace("iB", "B")); g_free(fileTotalSizeFormat); }); QThreadPool::globalInstance()->start(fileCountOp); } else { size_label->setText(m_fileInfo->fileSize()); } m_layout->addRow(tr("Size: "), size_label); //add delete date label QLabel *delete_label =new QLabel(this); info = g_file_query_info(file, G_FILE_ATTRIBUTE_TRASH_DELETION_DATE, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); //use sdk interface to get time format QString deletion_date = m_fileInfo->deletionDate(); if (deletion_date.isEmpty()) { deletion_date = m_fileInfo->modifiedDate(); } quint64 delete_width = FIXED_ROW_WIDTH - delete_label->fontMetrics().horizontalAdvance(tr("Deletion Date: ")); delete_label->setText(label->fontMetrics().elidedText(deletion_date, Qt::ElideMiddle, delete_width)); delete_label->setWordWrap(true); //no need of old way // if (QGSettings::isSchemaInstalled("org.ukui.control-center.panel.plugins")) { // QGSettings *settings = new QGSettings("org.ukui.control-center.panel.plugins", "", this); // connect(settings, &QGSettings::changed, this, [=](const QString &key) { // if(key == "date") { // QString current_text = delete_label->text(); // QString new_date_type = settings->get("date").toString(); // //cn : 1999/11/11 // //en : 1999-11-11 // if ((new_date_type == "cn") && current_text.contains("-")) { // delete_label->setText(current_text.replace("-", "/")); // } else if ((new_date_type == "en") && current_text.contains("/")) { // delete_label->setText(current_text.replace("/", "-")); // } // } // }); // QString current_text = delete_label->text(); // QString new_date_type = settings->get("date").toString(); // if ((new_date_type == "cn") && current_text.contains("-")) { // delete_label->setText(current_text.replace("-", "/")); // } else if ((new_date_type == "en") && current_text.contains("/")) { // delete_label->setText(current_text.replace("/", "-")); // } // } g_object_unref(info); g_object_unref(file); m_layout->addRow(tr("Deletion Date: "), delete_label); } } else { if (m_uri == "recent:///") { } else { QLabel *sizeLabel =new QLabel(this); QLabel *locationLabel =new QLabel(this); auto targetUri = m_fileInfo->targetUri(); quint64 width = FIXED_ROW_WIDTH - locationLabel->fontMetrics().horizontalAdvance(tr("Original Location: ")); locationLabel->setText(locationLabel->fontMetrics().elidedText(QUrl(targetUri).path(), Qt::ElideMiddle,width)); locationLabel->setWordWrap(true); sizeLabel->setText(m_fileInfo->fileSize()); m_layout->addRow(tr("Size: "), sizeLabel); m_layout->addRow(tr("Original Location: "), locationLabel); } } } void RecentAndTrashPropertiesPage::addSeparator() { auto separator = new QFrame(this); separator->setFrameShape(QFrame::HLine); m_layout->addRow(separator); } void RecentAndTrashPropertiesPage::saveAllChange() { bool check = this->property("check").toBool(); GlobalSettings::getInstance()->setGSettingValue("showTrashDialog", check); } peony/stable/ukui3/properties-window/controls/recent-and-trash-properties-page.h0000664000175000017500000000314115154271070027125 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLERECENTANDTRASHPROPERTIESPAGE_H #define STABLERECENTANDTRASHPROPERTIESPAGE_H #include #include #include "file-info.h" #include "properties-window-tab-iface.h" #include "peony-core_global.h" class QFormLayout; namespace Peony { class PEONYCORESHARED_EXPORT RecentAndTrashPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: explicit RecentAndTrashPropertiesPage(const QStringList &uris, QWidget *parent = nullptr); protected: void addSeparator(); void init(); QString getIconName(); private: QString m_uri; QFormLayout *m_layout; std::shared_ptr m_fileInfo = nullptr; QFutureWatcher *m_futureWatcher = nullptr; // PropertiesWindowTabIface interface public: void saveAllChange(); }; } #endif // RECENTANDTRASHPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/property-page.pri0000664000175000017500000000241515154271070024026 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/basic-properties-page.h \ $$PWD/basic-properties-page-factory.h \ $$PWD/permissions-properties-page-factory.h \ $$PWD/permissions-properties-page.h \ $$PWD/computer-properties-page-factory.h \ $$PWD/computer-properties-page.h \ $$PWD/recent-and-trash-properties-page-factory.h \ $$PWD/recent-and-trash-properties-page.h \ $$PWD/mark-properties-page-factory.h \ $$PWD/mark-properties-page.h \ $$PWD/open-with-properties-page-factory.h \ $$PWD/open-with-properties-page.h \ $$PWD/details-properties-page-factory.h \ $$PWD/details-properties-page.h SOURCES += \ $$PWD/basic-properties-page.cpp \ $$PWD/basic-properties-page-factory.cpp \ $$PWD/permissions-properties-page-factory.cpp \ $$PWD/permissions-properties-page.cpp \ $$PWD/computer-properties-page-factory.cpp \ $$PWD/computer-properties-page.cpp \ $$PWD/recent-and-trash-properties-page-factory.cpp \ $$PWD/recent-and-trash-properties-page.cpp \ $$PWD/mark-properties-page-factory.cpp \ $$PWD/mark-properties-page.cpp \ $$PWD/open-with-properties-page-factory.cpp \ $$PWD/open-with-properties-page.cpp \ $$PWD/details-properties-page-factory.cpp \ $$PWD/details-properties-page.cpp peony/stable/ukui3/properties-window/controls/permissions-properties-page.cpp0000664000175000017500000011736015154271106026705 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "permissions-properties-page.h" #include "linux-pwd-helper.h" #include "file-watcher.h" #include "file-info.h" #include "file-info-job.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Peony; #define OWNER 0 #define GROUP 1 #define OTHERS 2 #define USER 0 #define READABLE 2 #define WRITEABLE 3 #define EXECUTEABLE 4 //460 - 22 - 22 = 416 ,右侧有字符被遮挡,再减去6px -_-; #define TARGET_LABEL_WIDTH 410 PermissionsPropertiesPage::PermissionsPropertiesPage(const QStringList &uris, QWidget *parent) : PropertiesWindowTabIface(parent) { m_uri = uris.first(); QUrl url(m_uri); //note:请查看:BasicPropertiesPage::getFIleInfo(QString uri) - Look BasicPropertiesPage::getFIleInfo(QString uri) if (m_uri.startsWith("favorite://")) { m_uri = "file://" + url.path(); url = QUrl(m_uri); } m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0,0,0,0); this->setLayout(m_layout); m_label = new QLabel(this); QString str = tr("Target: %1").arg(url.path()); updateLabelShow(str); m_label->setMinimumHeight(60); m_label->setContentsMargins(22,0,22,0); m_layout->addWidget(m_label); m_message = new QLabel(this); m_message->setAlignment(Qt::AlignCenter); this->initTableWidget(); m_layout->addWidget(m_message); m_message->setVisible(false); m_watcher = std::make_shared(m_uri); connect(m_watcher.get(), &FileWatcher::locationChanged, this, &PermissionsPropertiesPage::queryPermissionsAsync); connect(this, &PermissionsPropertiesPage::checkBoxChanged, this, &PermissionsPropertiesPage::changePermission); queryPermissionsAsync(nullptr, m_uri); this->addAdvancedLayout(); if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *gSetting = new QGSettings("org.ukui.style", QByteArray(), this); connect(gSetting, &QGSettings::changed, this, [=](const QString &key) { if ("systemFontSize" == key) { updateLabelShow(str); } }); } } PermissionsPropertiesPage::~PermissionsPropertiesPage() { } void PermissionsPropertiesPage::initTableWidget() { m_table = new QTableWidget(this); m_table->setRowCount(4); m_table->setColumnCount(5); m_table->verticalHeader()->setVisible(false); m_table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_table->horizontalHeader()->setFrameShape(QFrame::NoFrame); m_table->setFrameShape(QFrame::NoFrame); m_table->horizontalHeader()->setSelectionMode(QTableWidget::NoSelection); m_table->setSelectionMode(QTableWidget::NoSelection); m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_table->setShowGrid(false); m_table->horizontalHeader()->setMinimumHeight(34); m_table->rowHeight(34); m_table->setAlternatingRowColors(true); auto l = QStringList(); l<setHorizontalHeaderLabels(l); m_table->setEditTriggers(QTableWidget::NoEditTriggers); //开启手动设置宽度 - Enable manual width setting m_table->horizontalHeader()->setMinimumSectionSize(30); m_table->horizontalHeader()->setMaximumSectionSize(400); m_table->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive); m_table->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Interactive); m_table->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); m_table->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch); m_table->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed); m_table->horizontalHeaderItem(0)->setTextAlignment(Qt::AlignLeft); m_table->setColumnWidth(0, 145); m_table->setColumnWidth(1, 70); m_table->setColumnWidth(4, 115); m_layout->addWidget(m_table); } void PermissionsPropertiesPage::queryPermissionsAsync(const QString &, const QString &uri) { m_uri = uri; QUrl url = m_uri; m_label->setText(m_label->fontMetrics().elidedText(tr("Target: %1").arg(url.path()), Qt::ElideMiddle,TARGET_LABEL_WIDTH)); m_table->setEnabled(false); GFile *file = g_file_new_for_uri(m_uri.toUtf8().constData()); g_file_query_info_async(file, "owner::*," "access::*," "unix::mode", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, 0, nullptr, GAsyncReadyCallback(async_query_permisson_callback), this); g_object_unref(file); } GAsyncReadyCallback PermissionsPropertiesPage::async_query_permisson_callback(GObject *obj, GAsyncResult *res, PermissionsPropertiesPage *p_this) { GError *err = nullptr; auto info = g_file_query_info_finish(G_FILE(obj), res, &err); if (!info) { if (p_this) { p_this->m_table->setVisible(false); p_this->m_message->setText(tr("Can not get the permission info.")); p_this->m_message->setVisible(true); } } if (err) { qDebug()<message; if (p_this) { p_this->m_table->setVisible(false); p_this->m_message->setText(tr("Can not get the permission info.")); p_this->m_message->setVisible(true); } g_error_free(err); } if (info) { if (p_this) { bool enable = true; auto table = p_this->m_table; auto user = g_file_info_get_attribute_string(info, G_FILE_ATTRIBUTE_OWNER_USER); //auto owner = g_file_info_get_attribute_string(info, G_FILE_ATTRIBUTE_OWNER_USER_REAL); QString userString = user; QString groupName = g_file_info_get_attribute_string(info, G_FILE_ATTRIBUTE_OWNER_GROUP); QString userNameDisplayString = user; bool current_user_readable = g_file_info_get_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ); bool current_user_writeable = g_file_info_get_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); bool current_user_executable = g_file_info_get_attribute_boolean(info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE); p_this->m_has_unix_mode = g_file_info_has_attribute(info, G_FILE_ATTRIBUTE_UNIX_MODE); guint32 mode = 0; if (p_this->m_has_unix_mode) mode = g_file_info_get_attribute_uint32(info, G_FILE_ATTRIBUTE_UNIX_MODE); auto owner_readable = mode & S_IRUSR; auto owner_writeable = mode & S_IWUSR; auto owner_executable = mode & S_IXUSR; //read p_this->m_permissions[0][0] = owner_readable; //write p_this->m_permissions[0][1] = owner_writeable; //executable p_this->m_permissions[0][2] = owner_executable; auto group_readable = mode & S_IRGRP; auto group_writeable = mode & S_IWGRP; auto group_executable = mode & S_IXGRP; p_this->m_permissions[1][0] = group_readable; p_this->m_permissions[1][1] = group_writeable; p_this->m_permissions[1][2] = group_executable; auto other_readable = mode & S_IROTH; auto other_writeable = mode & S_IWOTH; auto other_executable = mode & S_IXOTH; p_this->m_permissions[2][0] = other_readable; p_this->m_permissions[2][1] = other_writeable; p_this->m_permissions[2][2] = other_executable; qDebug()<pw_name; if (userString == username) { userNameDisplayString += tr("(Me)"); isSelf = true; } /* if (userNameDisplayString.isEmpty()) userNameDisplayString = tr("Unkwon"); if (groupName == pw->pw_gecos) isSameGroup = true; if (groupName.isEmpty()) groupName = tr("Unkwon"); */ if (!isSelf && !isSameGroup) { qDebug()<<"the uid not permit"; enable = false; } if (pw->pw_uid == 0) { QFileInfo file("/usr/sbin/security-switch"); if(file.exists() == true) { QProcess shProcess; shProcess.start("/usr/sbin/security-switch --get"); if (!shProcess.waitForStarted()) { qDebug()<<"wait get security state start timeout"; } else { if (!shProcess.waitForFinished()) { qDebug()<<"wait get security state finshed timeout"; } else { QString secState = shProcess.readAllStandardOutput(); qDebug()<<"security-switch get test "<< secState; if (secState.contains("strict")) { qDebug()<<"now it is in strict mode, so root is not super"; } else { qDebug()<<"pw uid is 0, it is super"; enable = true; } } } } else { qDebug()<<"security-switch is not support, so it is super"; enable = true; } /* if (!kysec_is_disabled() && kysec_get_3adm_status()) { qDebug()<<"now it is in strict mode, so root is not super"; } else { qDebug()<<"pw uid is 0, it is super"; enable = true; }*/ } } else { enable = false; } if (enable) { table->setRowCount(3); //更新表格选中情况 p_this->updateCheckBox(); table->setItem(0, 0, nullptr); QTableWidgetItem* itemR0C0 = new QTableWidgetItem(QIcon::fromTheme("emblem-personal"), userNameDisplayString); table->setItem(0, 0, itemR0C0); itemR0C0->setToolTip(userNameDisplayString); table->setItem(1, 0, nullptr); QTableWidgetItem* itemR1C0 = new QTableWidgetItem(QIcon::fromTheme("emblem-people"), groupName); table->setItem(1, 0, itemR1C0); itemR1C0->setToolTip(groupName); table->setItem(2, 0, nullptr); QTableWidgetItem* itemR2C0 = new QTableWidgetItem(QIcon::fromTheme("emblem-people"), tr("Others")); table->setItem(2, 0, itemR2C0); itemR2C0->setToolTip(tr("Others")); auto itemR0C1 = new QTableWidgetItem(tr("Owner")); itemR0C1->setTextAlignment(Qt::AlignCenter); itemR0C1->setToolTip(tr("Owner")); auto itemR1C1 = new QTableWidgetItem(tr("Group")); itemR1C1->setTextAlignment(Qt::AlignCenter); itemR1C1->setToolTip(tr("Group")); auto itemR2C1 = new QTableWidgetItem(tr("Other")); itemR2C1->setTextAlignment(Qt::AlignCenter); itemR2C1->setToolTip(tr("Other")); table->setItem(0, 1, itemR0C1); table->setItem(1, 1, itemR1C1); table->setItem(2, 1, itemR2C1); table->showRow(0); table->showRow(1); table->showRow(2); } else { p_this->m_message->setText(tr("You can not change the access of this file.")); p_this->m_message->show(); table->setRowCount(1); QTableWidgetItem *itemR0C0 = new QTableWidgetItem(QIcon::fromTheme("emblem-personal"), tr("Me")); table->setItem(0, 0, nullptr); table->setItem(0, 0, itemR0C0); auto itemR0C1 = new QTableWidgetItem(tr("User")); itemR0C1->setTextAlignment(Qt::AlignCenter); table->setItem(0, 1, itemR0C1); for (int i = 0; i < 3; i++) { table->setCellWidget(0, i + 2, nullptr); QWidget *w = new QWidget(table); QHBoxLayout *l = new QHBoxLayout(w); l->setContentsMargins(0, 0, 0, 0); w->setLayout(l); l->setAlignment(Qt::AlignCenter); auto checkbox = new QCheckBox(w); l->addWidget(checkbox); table->setCellWidget(0, i + 2, w); switch (i) { case 0: checkbox->setChecked(current_user_readable); break; case 1: checkbox->setChecked(current_user_writeable); break; case 2: checkbox->setChecked(current_user_executable); break; } } } table->setEnabled(enable); //防止误修改 p_this->m_enable = enable; } g_object_unref(info); } return nullptr; } void PermissionsPropertiesPage::changePermission(int row, int column, bool checked) { if(!m_enable) return; m_permissions[row][column] = checked; this->thisPageChanged(); this->updateCheckBox(); } /*! * update file ermissions * \brief PermissionsPropertiesPage::savePermissions */ void PermissionsPropertiesPage::savePermissions() { /*! \bug even though directory know the file's attributes have been changed, and model request updated the data, the view doesn't paint the current emblems correctly. */ //FIXME: should use g_file_set_attribute() with mode info? if(!m_enable) return; mode_t mod = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { bool b = m_permissions[i][j]; if (b) { int rc = i*10 + j; switch (rc) { case 0: { mod |= S_IRUSR; break; } case 1: { mod |= S_IWUSR; break; } case 2: { mod |= S_IXUSR; break; } case 10: { mod |= S_IRGRP; break; } case 11: { mod |= S_IWGRP; break; } case 12: { mod |= S_IXGRP; break; } case 20: { mod |= S_IROTH; break; } case 21: { mod |= S_IWOTH; break; } case 22: { mod |= S_IXOTH; break; } } } } } if (m_has_unix_mode) { g_autoptr(GFile) pfile = g_file_new_for_uri(m_uri.toUtf8().constData()); g_file_set_attribute_uint32(pfile, G_FILE_ATTRIBUTE_UNIX_MODE, (guint32)mod, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); } auto fileInfo = FileInfo::fromUri(m_uri); FileInfoJob *job = new FileInfoJob(fileInfo); job->setAutoDelete(true); job->querySync(); } void PermissionsPropertiesPage::saveAllChange() { if(this->m_thisPageChanged) this->savePermissions(); qDebug() << "PermissionsPropertiesPage::saveAllChange()" << this->m_thisPageChanged; } void PermissionsPropertiesPage::thisPageChanged() { this->m_thisPageChanged = true; } void PermissionsPropertiesPage::updateCheckBox() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { m_table->setCellWidget(i, j + 2, nullptr); QWidget *w = new QWidget(m_table); QHBoxLayout *l = new QHBoxLayout(w); l->setContentsMargins(0, 0, 0, 0); w->setLayout(l); l->setAlignment(Qt::AlignCenter); auto checkbox = new QCheckBox(w); l->addWidget(checkbox); m_table->setCellWidget(i, j + 2, w); checkbox->setChecked(this->m_permissions[i][j]); //disable home path bool check_enable = true; bool check_enable_filesafe = true; QString uri = m_uri; if(uri.startsWith("filesafe:///")){ QStringList list = uri.split("/"); if(list.size()==4){ check_enable = false; } if(list.size()>=5){ check_enable_filesafe = false; } } QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (this->m_uri == homeUri || !check_enable || (!check_enable_filesafe && i > 0)) checkbox->setDisabled(true); else checkbox->setDisabled(false); connect(checkbox, &QCheckBox::clicked, this, [=]() { qDebug()<<"clicked"<isChecked(); if (i == 1) { auto info = FileInfo::fromUri(m_uri); QStringList args; bool ret; args << "getfacl" << "-p" << QString("\"%1\"").arg(info->filePath()); QString acl = UserShareInfoManager::getInstance()->exectueSetAclCommand(args, &ret); if (!ret && !acl.isEmpty()) { this->close(); return; } if (acl.count("user:") >= 2 && !m_isShow) { m_isShow = true; auto res = QMessageBox::question(nullptr, tr("Permissions modify tip"), tr("The current file or folder has already set ACL permissions. Modifying user group permissions may cause the permissions set in ACL to be unusable. Do you want to continue modifying user group permissions?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if (QMessageBox::No == res) { checkbox->setChecked(!checkbox->isChecked()); return; } } } this->checkBoxChanged(i, j, checkbox->isChecked()); }); } } } void PermissionsPropertiesPage::addAdvancedLayout() { QHBoxLayout *hboxLayout = new QHBoxLayout(); hboxLayout->setContentsMargins(16, 16, 16, 16); m_advancedBtn = new QPushButton(tr("Permission refinement settings")); m_layout->addWidget(m_advancedBtn); if (m_uri.startsWith("filesafe://") || m_uri.startsWith("smb://") || m_uri.startsWith("sftp://") || m_uri.startsWith("ftp://") || m_uri.startsWith("kmre://")) { m_advancedBtn->setVisible(false); } connect(m_advancedBtn, &QPushButton::clicked, this, [=](){ auto info = FileInfo::fromUri(m_uri); auto displayname = info->displayName(); bool isAdvancedShare = UserShareInfoManager::getInstance()->checkDirAdvancedShare(displayname); AdvancedPermissionsPage *page = new AdvancedPermissionsPage(m_uri); connect(page, &AdvancedPermissionsPage::updatePermissions, this, [=](){ queryPermissionsAsync(nullptr, m_uri); }); if (isAdvancedShare) { auto result = QMessageBox::question(nullptr, tr("Permission refinement settings"), tr("The current user has set advanced sharing. If you still need to modify permissions, advanced sharing may not be available. Do you want to continue setting?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if (QMessageBox::Yes == result) { page->show(); } } else { page->show(); } }); hboxLayout->addWidget(m_advancedBtn); hboxLayout->addStretch(2); m_layout->addLayout(hboxLayout); } void PermissionsPropertiesPage::updateLabelShow(const QString &str) { int fontSize = m_label->fontMetrics().horizontalAdvance(str); QString tmp = str; if(fontSize > TARGET_LABEL_WIDTH) { m_label->setToolTip(str); tmp = m_label->fontMetrics().elidedText(str, Qt::ElideMiddle, TARGET_LABEL_WIDTH); } m_label->setText(tmp); } QWidget *PermissionsPropertiesPage::createCellWidget(QWidget *parent, QIcon icon, QString text) { QWidget *widget = new QWidget(parent); QHBoxLayout *layout = new QHBoxLayout(widget); layout->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); layout->setContentsMargins(22, 0, 0, 0); //组件间距 - Widget spacing layout->setSpacing(9); QPushButton *cellIcon = new QPushButton(widget); cellIcon->setStyleSheet("QPushButton{" "border-radius: 8px; " "background-color: transparent;" "max-width:16px;" "max-height:16px;" "min-width:16px;" "min-height:16px;" "}"); cellIcon->setEnabled(false); cellIcon->setIcon(icon); cellIcon->setIconSize(QSize(16, 16)); layout->addWidget(cellIcon); QLabel *label = new QLabel(widget); label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); QFontMetrics fontMetrics = label->fontMetrics(); int fontSize = fontMetrics.horizontalAdvance(text); QString str = text; //widget宽度200px;设计稿在左边空出22px;icon宽度16px,icon右侧9px; //200-22-16-9 = 153 , widget:剩下的3px给右侧留空 -_-; if(fontSize > 150) { widget->setToolTip(text); str = fontMetrics.elidedText(text, Qt::ElideRight, 150); } label->setText(str); layout->addWidget(label); return widget; } AdvancedPermissionsPage::AdvancedPermissionsPage(const QString &uri, QWidget *parent) { m_uri = uri; this->init(); } AdvancedPermissionsPage::~AdvancedPermissionsPage() { } void AdvancedPermissionsPage::init() { this->setWindowTitle(tr("Permission refinement settings")); this->setWindowIcon(QIcon::fromTheme("system-file-manager")); this->setContextMenuPolicy(Qt::CustomContextMenu); this->setAttribute(Qt::WA_DeleteOnClose); this->setFixedSize(460, 600); this->setContentsMargins(0, 10, 0, 0); this->setWindowFlags(this->windowFlags() & ~Qt::WindowMinMaxButtonsHint & ~Qt::WindowSystemMenuHint); this->setWindowModality(Qt::ApplicationModal); m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setSpacing(0); this->getUserInfo(); this->initFloorOne(); this->initFloorTwo(); this->addSeparate(); this->initFloorThree(); this->addSeparate(); this->initFloorFour(); this->initCheckState(); connect(m_tabWidget, &QTableWidget::cellEntered, this, &AdvancedPermissionsPage::updateDelAclBtn); connect(m_tabWidget, &QTableWidget::cellClicked, this, &AdvancedPermissionsPage::updateDelAclBtn); connect(m_listWidget, &QListWidget::currentTextChanged, this, [=](QString currentIndex){ if (!m_userInfo.contains(currentIndex)) { m_addUserBtn->setEnabled(true); } else { m_addUserBtn->setEnabled(false); } QFontMetrics fontWidth(m_listLabel->font()); QString elideNote = fontWidth.elidedText(currentIndex, Qt::ElideMiddle, 300); m_listLabel->setText(elideNote); m_listLabel->setToolTip(currentIndex); }); connect(m_addUserBtn, &QPushButton::clicked, this, [=](){ QListWidgetItem *item = m_listWidget->currentItem(); if (nullptr != item) { QString name = item->text(); //增加用户默认acl m_mutex.lock(); m_userInfo.insert(name, "rwx"); m_mutex.unlock(); m_addUserBtn->setEnabled(false); m_inheritsBox->setEnabled(true); int rowCount = m_tabWidget->rowCount(); m_tabWidget->insertRow(rowCount); QTableWidgetItem* itemC = new QTableWidgetItem(name); itemC->setFlags(itemC->flags() | Qt::ItemIsSelectable); itemC->setToolTip(name); m_tabWidget->setItem(rowCount, 0, itemC); for (int i = 1; i < 4; ++i) { m_tabWidget->setCellWidget(rowCount, i, nullptr); QWidget *w = new QWidget(m_tabWidget); QHBoxLayout *l = new QHBoxLayout(w); l->setContentsMargins(0, 0, 0, 0); w->setLayout(l); l->setAlignment(Qt::AlignCenter); auto checkbox = new QCheckBox(w); bool check = updateCheckBox(i, name); checkbox->setChecked(check); l->addWidget(checkbox); m_tabWidget->setCellWidget(rowCount, i, w); } } }); connect(m_delUserBtn, &QPushButton::clicked, this, [=](){ QTableWidgetItem *item = m_tabWidget->currentItem(); if (nullptr != item) { QString name = item->text(); if (m_userInfo.contains(name)) { m_mutex.lock(); m_userInfo.remove(name); m_mutex.unlock(); int currentRow = m_tabWidget->currentRow(); m_tabWidget->removeRow(currentRow); if (m_tabWidget->rowCount() <= 0) { m_delUserBtn->setEnabled(false); } } } if (m_tabWidget->rowCount() == 0) { m_inheritsBox->setEnabled(false); } }); connect(m_cancelBtn, &QPushButton::clicked, this, [=](){ m_userInfo.clear(); m_defaultAcl.clear(); this->close(); }); connect(m_saveBtn, &QPushButton::clicked, this, [=](){ for (int row = 0; row < m_tabWidget->rowCount(); ++row) { for (int col = 0; col < m_tabWidget->columnCount(); ++col) { if (col == 0) { continue; } QWidget *w = m_tabWidget->cellWidget(row, col); QCheckBox *box = w->findChild(); updateUserInfo(row, col, box->isChecked()); } } auto result = QMessageBox::question(nullptr, tr("Permission refinement settings tip"), tr("Setting ACL permissions will result in a change in the user group permissions for basic permissions. Do you need to continue setting ACL permissions?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ); if (result == QMessageBox::Yes) { this->checkInheritsBoxInfo(); this->saveAclPermissions(); qDebug() << __func__ << "userInfo" << m_userInfo; Q_EMIT this->updatePermissions(); this->close(); } }); } void AdvancedPermissionsPage::initTableWidget() { m_tabWidget = new QTableWidget(this); m_tabWidget->setColumnCount(4); m_tabWidget->verticalHeader()->setVisible(false); m_tabWidget->verticalHeader()->setMinimumSectionSize(12); m_tabWidget->horizontalHeader()->setFrameShape(QFrame::NoFrame); m_tabWidget->setFrameShape(QFrame::NoFrame); m_tabWidget->horizontalHeader()->setSelectionMode(QTableWidget::NoSelection); m_tabWidget->verticalHeader()->setSelectionMode(QTableWidget::NoSelection); m_tabWidget->setSelectionMode(QTableWidget::SingleSelection); m_tabWidget->setSelectionBehavior(QAbstractItemView::SelectItems); m_tabWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_tabWidget->setShowGrid(false); m_tabWidget->horizontalHeader()->setMinimumHeight(34); m_tabWidget->rowHeight(34); m_tabWidget->setAlternatingRowColors(true); auto l = QStringList(); l<setHorizontalHeaderLabels(l); m_tabWidget->setEditTriggers(QTableWidget::NoEditTriggers); m_tabWidget->horizontalHeader()->setMinimumSectionSize(30); m_tabWidget->horizontalHeader()->setMaximumSectionSize(400); m_tabWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive); m_tabWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); m_tabWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); m_tabWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed); //m_tabWidget->horizontalHeaderItem(0)->setTextAlignment(Qt::AlignLeft); m_tabWidget->setColumnWidth(0, 100); m_tabWidget->setColumnWidth(1, 75); m_tabWidget->setColumnWidth(3, 120); m_layout->addWidget(m_tabWidget); int rowCount = m_userInfo.count(); m_tabWidget->setRowCount(rowCount); //Add all user acl QMap::iterator iter; int row = 0; for (iter = m_userInfo.begin(); iter != m_userInfo.end(); iter++) { QString key = iter.key(); QTableWidgetItem* itemC0 = new QTableWidgetItem(key); itemC0->setFlags(itemC0->flags() | Qt::ItemIsSelectable); itemC0->setToolTip(key); m_tabWidget->setItem(row, 0, itemC0); for (int j = 1; j < 4; j++) { m_tabWidget->setCellWidget(row, j, nullptr); QWidget *w = new QWidget(m_tabWidget); QHBoxLayout *l = new QHBoxLayout(w); l->setContentsMargins(0, 0, 0, 0); w->setLayout(l); l->setAlignment(Qt::AlignCenter); auto checkbox = new QCheckBox(w); bool check = updateCheckBox(j, key); checkbox->setChecked(check); l->addWidget(checkbox); m_tabWidget->setCellWidget(row, j, w); } ++row; } } void AdvancedPermissionsPage::initListWidget() { QVBoxLayout *vBoxLayout = new QVBoxLayout; vBoxLayout->setContentsMargins(22, 0, 22, 0); m_listWidget = new QListWidget(this); m_listWidget->setUniformItemSizes(true); m_listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_sysAccounts = new SystemDbusAccounts(this); QStringList m_userNames = m_sysAccounts->getAllUserNames(); QString loginName = qgetenv("USER"); if (!m_userNames.isEmpty()) { for (QString user : m_userNames) { if (0 != user.compare(loginName)) { auto item = new QListWidgetItem(user, m_listWidget); item->setToolTip(user); m_listWidget->addItem(item); } } } vBoxLayout->addWidget(m_listWidget); m_layout->addLayout(vBoxLayout); } void AdvancedPermissionsPage::initFloorOne() { m_label = new QLabel(tr("Permission refinement settings"), this); m_label->setContentsMargins(22, 0, 22, 0); m_layout->addWidget(m_label); } void AdvancedPermissionsPage::initFloorTwo() { this->initTableWidget(); m_layout->addSpacing(10); QHBoxLayout *hBoxLayout = new QHBoxLayout; hBoxLayout->setContentsMargins(22, 0, 22, 0); hBoxLayout->setSpacing(0); m_delUserBtn = new QPushButton(tr("delete")); m_delUserBtn->setEnabled(false); m_inheritsBox = new QCheckBox(tr("Inherit permission")); hBoxLayout->addWidget(m_inheritsBox, 2); hBoxLayout->addStretch(1); hBoxLayout->addWidget(m_delUserBtn, 1); m_layout->addLayout(hBoxLayout); m_layout->addSpacing(10); } void AdvancedPermissionsPage::initFloorThree() { m_layout->addSpacing(10); this->initListWidget(); QHBoxLayout *hBoxLayout = new QHBoxLayout; hBoxLayout->setContentsMargins(22, 0, 22, 0); hBoxLayout->setSpacing(0); m_addUserBtn = new QPushButton(tr("Add")); m_listLabel = new QLabel; m_addUserBtn->setEnabled(false); hBoxLayout->addWidget(m_listLabel, 3); hBoxLayout->addSpacing(10); hBoxLayout->addWidget(m_addUserBtn, 1); m_layout->addSpacing(10); m_layout->addLayout(hBoxLayout); m_layout->addSpacing(10); } void AdvancedPermissionsPage::initFloorFour() { m_layout->addSpacing(10); QHBoxLayout *hBoxLayout2 = new QHBoxLayout; hBoxLayout2->setContentsMargins(22, 0, 22, 0); hBoxLayout2->setSpacing(0); m_saveBtn = new QPushButton(tr("Apply")); m_cancelBtn = new QPushButton(tr("Cancel")); hBoxLayout2->addStretch(1); hBoxLayout2->addWidget(m_saveBtn); hBoxLayout2->addSpacing(10); hBoxLayout2->addWidget(m_cancelBtn); m_layout->addLayout(hBoxLayout2); m_layout->addSpacing(16); } void AdvancedPermissionsPage::addSeparate() { QPushButton *separate = new QPushButton; separate->setFixedHeight(1); separate->setFocusPolicy(Qt::NoFocus); separate->setEnabled(false); m_layout->addWidget(separate); } void AdvancedPermissionsPage::getUserInfo() { if (m_userInfo.isEmpty()) { auto info = FileInfo::fromUri(m_uri); QStringList args; bool ret; args << "getfacl" << "-p" << QString("\"%1\"").arg(info->filePath()); QString acl = UserShareInfoManager::getInstance()->exectueSetAclCommand(args, &ret); if (!ret && !acl.isEmpty()) { this->close(); return; } parseUserInfoAcl(acl); } } void AdvancedPermissionsPage::parseUserInfoAcl(QString strAcl) { if (!strAcl.isEmpty()) { QStringList lists = strAcl.split('\n'); for (int i = 0; i < lists.size();) { QString list = lists.at(i); if (list.startsWith("#") || list.isEmpty() || list.contains("user::") || list.contains("group::") || list.contains("mask::") || list.contains("other::") || list.startsWith("default:")) { if (list.startsWith("default:user:") && !list.contains("user::")) { QString tmp = list; tmp = tmp.remove(1, 6); m_defaultAcl.append(tmp); m_defaultAcl.append(","); } lists.removeOne(list); } else if (list.contains("#effective:")) { int ind = lists.indexOf(list); int index = list.indexOf("\t"); int size = list.size(); QString tmp = list.remove(index, size); lists.replace(ind, tmp); } else { i++; } } for (QString l : lists) { //当前格式为:user:kylin:rwx,user:kylin2:r-x QStringList tmpLists = l.split(":"); QString name = tmpLists.at(1); QString per = tmpLists.at(2); m_mutex.lock(); m_userInfo.insert(name, per); m_mutex.unlock(); } qDebug() << __func__ << "init userInfo" << m_userInfo << m_defaultAcl; } } bool AdvancedPermissionsPage::updateCheckBox(int col, QString &name) { bool ret = false; if (name.isEmpty() || col < 0) { return ret; } if (col == 1 && m_userInfo.value(name).contains("r")) { ret = true; } else if (col == 2 && m_userInfo.value(name).contains("w")) { ret = true; } else if (col == 3 && m_userInfo.value(name).contains("x")) { ret = true; } return ret; } void AdvancedPermissionsPage::updateUserInfo(int row, int col, bool checked) { if (checked && col >= 1 && col <= 3) { QTableWidgetItem *item = m_tabWidget->item(row, 0); if (nullptr != item && m_userInfo.contains(item->text())) { QString name = item->text(); QString perm = m_userInfo.value(name); if (col == 1) { perm = perm.replace(col - 1, 1, "r"); } else if (col == 2) { perm = perm.replace(col - 1, 1, "w"); } else if (col == 3) { perm = perm.replace(col - 1, 1, "x"); } m_userInfo.remove(name); m_userInfo.insert(name, perm); } } else if (!checked && col >= 1 && col <= 3) { QTableWidgetItem *item = m_tabWidget->item(row, 0); if (nullptr != item && m_userInfo.contains(item->text())) { QString name = item->text(); QString perm = m_userInfo.value(name); perm = perm.replace(col - 1, 1, "-"); m_userInfo.remove(name); m_userInfo.insert(name, perm); } } } void AdvancedPermissionsPage::checkInheritsBoxInfo() { if (m_inheritsBox->isChecked()) { m_defaultAcl.clear(); QMap::iterator iter; for (iter = m_userInfo.begin(); iter != m_userInfo.end(); ++iter) { QString tmp = "d:u:" + iter.key() + ":" + iter.value() + ","; m_defaultAcl.append(tmp); } } else { m_defaultAcl.clear(); } } void AdvancedPermissionsPage::initCheckState() { if (m_tabWidget->rowCount() == 0) { m_inheritsBox->setEnabled(false); m_inheritsBox->setChecked(false); } else if (m_defaultAcl.isEmpty() && m_tabWidget->rowCount() > 0) { m_inheritsBox->setEnabled(true); m_inheritsBox->setChecked(false); } else { m_inheritsBox->setEnabled(true); m_inheritsBox->setChecked(true); } } void AdvancedPermissionsPage::saveAclPermissions() { bool retb; QStringList args; auto info = FileInfo::fromUri(m_uri); args << "setfacl" << "-b" << QString("\"%1\"").arg(info->filePath()); QString result = UserShareInfoManager::exectueSetAclCommand(args, &retb); if (!retb && !result.isEmpty()) { return; } if (!m_userInfo.isEmpty()) { QString tmpUserInfo = m_defaultAcl; QMap::iterator iter; for (iter = m_userInfo.begin(); iter != m_userInfo.end(); ++iter) { QString tmp = QString("u:%1:%2,").arg(iter.key()).arg(iter.value()); tmpUserInfo.append(tmp); } bool retm; args.clear(); args << "setfacl" << "-m" << tmpUserInfo << QString("\"%1\"").arg(info->filePath()); qDebug() << __func__ << tmpUserInfo; result = UserShareInfoManager::getInstance()->exectueSetAclCommand(args, &retm); if (!retm && !result.isEmpty()) { return; } } } void AdvancedPermissionsPage::updateDelAclBtn(int row, int col) { if (col >= 1) { m_delUserBtn->setEnabled(false); } else if (col == 0) { m_delUserBtn->setEnabled(true); } } peony/stable/ukui3/properties-window/controls/permissions-properties-page-factory.cpp0000664000175000017500000000361115154271070030343 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "permissions-properties-page-factory.h" #include "permissions-properties-page.h" #include using namespace Peony; static PermissionsPropertiesPageFactory *global_instance = nullptr; PermissionsPropertiesPageFactory::PermissionsPropertiesPageFactory(QObject *parent) : QObject(parent) { } bool PermissionsPropertiesPageFactory::supportUris(const QStringList &uris) { //FIXME: 需要明确支持范围 //FIXME: Need to clarify the scope of support if (uris.count() != 1) return false; QString uri = uris.first(); if (uri.startsWith("computer://") || uri.startsWith("recent://") || uri.startsWith("trash://")) return false; return true; } PropertiesWindowTabIface *PermissionsPropertiesPageFactory::createTabPage(const QStringList &uris) { return new PermissionsPropertiesPage(uris); } void PermissionsPropertiesPageFactory::closeFactory() { this->deleteLater(); } PermissionsPropertiesPageFactory *PermissionsPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new PermissionsPropertiesPageFactory; return global_instance; } peony/stable/ukui3/properties-window/controls/recent-and-trash-properties-page-factory.cpp0000664000175000017500000000332115154271070031125 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "recent-and-trash-properties-page-factory.h" #include "recent-and-trash-properties-page.h" #include using namespace Peony; static RecentAndTrashPropertiesPageFactory *global_instance = nullptr; RecentAndTrashPropertiesPageFactory *RecentAndTrashPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new RecentAndTrashPropertiesPageFactory; return global_instance; } RecentAndTrashPropertiesPageFactory::RecentAndTrashPropertiesPageFactory(QObject *parent) : QObject(parent) { } bool RecentAndTrashPropertiesPageFactory::supportUris(const QStringList &uris) { if (uris.count() != 1) return false; if (uris.first().contains("trash:///") || uris.first().contains("recent:///")) return true; return false; } PropertiesWindowTabIface *RecentAndTrashPropertiesPageFactory::createTabPage(const QStringList &uris) { return new RecentAndTrashPropertiesPage(uris); } peony/stable/ukui3/properties-window/controls/mark-properties-page-factory.h0000664000175000017500000000412515154271070026370 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEMARKPROPERTIESPAGEFACTORY_H #define STABLEMARKPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class MarkPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static MarkPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Mark"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("mark this file."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 900; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override; private: explicit MarkPropertiesPageFactory(QObject *parent = nullptr); ~MarkPropertiesPageFactory() override; }; } #endif //MARKPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/open-with-properties-page-factory.cpp0000664000175000017500000000445015154271070027704 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "open-with-properties-page-factory.h" #include "open-with-properties-page.h" #include "file-info.h" #include "file-info-job.h" using namespace Peony; static OpenWithPropertiesPageFactory *global_instance = nullptr; OpenWithPropertiesPageFactory *OpenWithPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new OpenWithPropertiesPageFactory; return global_instance; } OpenWithPropertiesPageFactory::OpenWithPropertiesPageFactory(QObject *parent) : QObject(parent) { } OpenWithPropertiesPageFactory::~OpenWithPropertiesPageFactory() { } bool OpenWithPropertiesPageFactory::supportUris(const QStringList &uris) { //FIXME: 需要明确支持范围 //FIXME: Need to clarify the scope of support if (uris.count() != 1) return false; QString uri = uris.first(); if (uri.startsWith("computer://") || uri.startsWith("recent://") || uri.startsWith("trash://")) return false; auto fileInfo = FileInfo::fromUri(uris.first()); FileInfoJob *job = new FileInfoJob(fileInfo); job->setAutoDelete(true); job->querySync(); if (fileInfo.get()->isDir() || fileInfo.get()->isDesktopFile() || fileInfo.get()->isVolume() || fileInfo.get()->isVirtual() || fileInfo->isSymbolLink()) return false; return true; } PropertiesWindowTabIface *OpenWithPropertiesPageFactory::createTabPage(const QStringList &uris) { return new OpenWithPropertiesPage(uris.first()); } void OpenWithPropertiesPageFactory::closeFactory() { this->deleteLater(); } peony/stable/ukui3/properties-window/controls/mark-properties-page.h0000664000175000017500000000372615154271070024731 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEMARKPROPERTIESPAGE_H #define STABLEMARKPROPERTIESPAGE_H #include "properties-window-tab-iface.h" #include "file-label-model.h" #include #include #include namespace Peony { class MarkPropertiesPage : public PropertiesWindowTabIface { public: /*! * \brief 保存设置 */ void saveAllChange() override; /*! * \brief 初始化表格相关设置 */ void initTableWidget(); /*! * \brief 初始化表格中的数据 */ void initTableData(); void changeLabel(int labelId, bool checked); public: MarkPropertiesPage(const QString &uri, QWidget *parent = nullptr); ~MarkPropertiesPage(); private: QString m_uri; QVBoxLayout *m_layout = nullptr; QTableWidget *m_tableWidget = nullptr; //文件标记模型 FileLabelModel *m_fileLabelModel = nullptr; //当前文件的全部标签 QList m_thisFileLabelIds; /*! * \brief 把color转换为16进制字符串 * \param color * \return */ QString convertRGB16HexStr(const QColor color); void updateTableLabelShow(QLabel* label, const QString &str); }; } #endif //MARKPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/computer-properties-page.cpp0000664000175000017500000003331715154271070026167 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "computer-properties-page.h" #include "linux-pwd-helper.h" #include "file-utils.h" #ifndef KY_UDF_BURN #include "datacdrom.h" #else #include using namespace UdfBurn; #endif #include #include #include #include #include #include #include #include #include #include using namespace Peony; ComputerPropertiesPage::ComputerPropertiesPage(const QString &uri, QWidget *parent) : PropertiesWindowTabIface(parent) { m_uri = uri; m_layout = new QFormLayout(this); m_layout->setContentsMargins(24, 16, 24, 16); m_layout->setRowWrapPolicy(QFormLayout::WrapLongRows); m_layout->setFormAlignment(Qt::AlignLeft); m_layout->setVerticalSpacing(8); m_layout->setHorizontalSpacing(24); //m_layout->setLabelAlignment(Qt::AlignRight); setLayout(m_layout); if (uri == "computer:///") { //computer infos QFile cpuInfo("/proc/cpuinfo"); cpuInfo.open(QFile::ReadOnly); QFile memInfo("/proc/meminfo"); memInfo.open(QFile::ReadOnly); auto cpuInfos = cpuInfo.readAll().split('\n'); auto memInfos = memInfo.readAll().split('\n'); QString cpuName; QString cpuCoreCount; QString memSize; for (QString string : cpuInfos) { if (!cpuName.isEmpty() && !cpuCoreCount.isEmpty()) { break; } if (string.startsWith("model name")) { cpuName = string.split(":").last(); } if (string.startsWith("cpu cores")) { cpuCoreCount = string.split(":").last(); } } for (QString string : memInfos) { if (string.startsWith("MemTotal")) { memSize = string.split(":").last(); break; } } memSize.remove(" "); m_layout->addRow(tr("CPU Name:"), new QLabel(cpuName, this)); m_layout->addRow(tr("CPU Core:"), new QLabel(cpuCoreCount, this)); m_layout->addRow(tr("Memory Size:"), new QLabel(" "+memSize, this)); cpuInfo.close(); memInfo.close(); addSeparator(); //user infos auto user = LinuxPWDHelper::getCurrentUser(); QString userName = user.fullName(); userName.replace(',', " "); QString desktopEnv = g_getenv("XDG_CURRENT_DESKTOP"); m_layout->addRow(tr("User Name: "), new QLabel(userName, this)); m_layout->addRow(tr("Desktop: "), new QLabel(desktopEnv, this)); } else { //FIXME: replace BLOCKING api in ui thread. auto targetUri = FileUtils::getTargetUri(uri); if (uri == "computer:///ukui-data-volume") { targetUri = "file:///data"; } if (targetUri.isNull()) { m_layout->addRow(new QLabel(tr("You should mount this volume first"), nullptr)); return; } if (targetUri == "file:///" || targetUri == "file:///data") { //NOTE: file:/// has not mount. GFile *file = g_file_new_for_uri(targetUri.toUtf8().constData()); GFileInfo *info = g_file_query_filesystem_info(file, "*", nullptr, nullptr); quint64 total = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); quint64 used = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_USED); quint64 available = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); char *fs_type = g_file_info_get_attribute_as_string(info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE); QString type(fs_type); if (type.contains("ext")) { used = total - available; } m_layout->addRow(tr("Name: "), new QLabel(targetUri == "file:///" ? tr("File System") : tr("Data"), this)); m_layout->addRow(tr("Total Space: "), new QLabel(formatCapacityString(total), this)); m_layout->addRow(tr("Used Space: "), new QLabel(formatCapacityString(used), this)); m_layout->addRow(tr("Free Space: "), new QLabel(formatCapacityString(available), this)); m_layout->addRow(tr("Type: "), new QLabel(fs_type, this)); g_free(fs_type); g_object_unref(info); g_object_unref(file); auto progressBar = new QProgressBar(this); auto value = double(used*1.0/total)*100; progressBar->setValue(int(value)); m_layout->addRow(progressBar); m_layout->setAlignment(progressBar, Qt::AlignBottom); return; } //FIXME: get volume info correctly. //使用枚举的方法解决空光盘显示未知分区的问题。#58255,#58199 std::shared_ptr volume = ComputerPropertiesPage::EnumerateOneVolumeByTargetUri(targetUri); std::shared_ptr mount = nullptr; if (volume) { mount = std::make_shared(g_volume_get_mount(volume->getGVolume()), true); } else { mount = VolumeManager::getMountFromUri(targetUri); volume = VolumeManager::getVolumeFromMount(mount); } if (mount) { GFile *file = g_file_new_for_uri(targetUri.toUtf8().constData()); GFileInfo *info = g_file_query_filesystem_info(file, "*", nullptr, nullptr); quint64 totalSpace = 0; quint64 usedSpace = 0; quint64 availableSpace = 0; bool isCDDisk = false; bool isFtp = false; if (info) { quint64 total = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); quint64 used = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_USED); quint64 free = g_file_info_get_attribute_uint64(info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); if (nullptr != volume) { char *deviceName = g_volume_get_identifier(G_VOLUME(volume->getGVolume()), G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); QString unixDeviceName; if(deviceName) { unixDeviceName = QString(deviceName); g_free(deviceName); } //光盘 if (!unixDeviceName.isNull() && !unixDeviceName.isEmpty() && unixDeviceName.startsWith("/dev/sr")) { isCDDisk = true; DataCDROM *cdrom = new DataCDROM(unixDeviceName); if (cdrom) { cdrom->getCDROMInfo(); //usedSpace = used; //used无法正确获取追加刻录后光盘的使用容量,getCDROMUsedCapacity()无法获取可擦除光盘的使用容量 usedSpace = cdrom->getCDROMUsedCapacity(); if((cdrom->getCDROMType()).contains("DVD+RW") || (cdrom->getCDROMType()).contains("DVD-RW")){ usedSpace =used; } totalSpace = cdrom->getCDROMCapacity(); availableSpace = totalSpace - usedSpace; delete cdrom; cdrom = nullptr; } } } if (totalSpace == 0) { if (total > 0 && (used > 0 || free > 0)) { if (used > 0 && used <= total) { usedSpace = used; totalSpace = total; } else if (free > 0 && free <= total) { usedSpace = total - free; totalSpace = total; } } availableSpace = free; } } char *fs_type = g_file_info_get_attribute_as_string(info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE); //use dubs to get file system type, fix ntfs show as fuse issue QString type = getFileSystemType(uri); if (type.length() <=0) type = fs_type; if (type.contains("ext")) { usedSpace = totalSpace - availableSpace; } if (targetUri.startsWith("ftp://")) { isFtp = true; } m_layout->addRow(tr("Name: "), new QLabel(mount->name(), this)); /* if (bMobileDevice) m_layout->addRow(tr("Total Space: "), new QLabel(sizeInfo, this)); else */ if (!isFtp) { m_layout->addRow(tr("Total Space: "), new QLabel(formatCapacityString(totalSpace), this)); m_layout->addRow(tr("Used Space: "), new QLabel(formatCapacityString(usedSpace), this)); m_layout->addRow(tr("Free Space: "), new QLabel(formatCapacityString(availableSpace), this)); } m_layout->addRow(tr("Type: "), new QLabel(type, this)); if (!isFtp) { auto progressBar = new QProgressBar(this); auto value = double(usedSpace*1.0/totalSpace)*100; progressBar->setValue(int((value > 0 && value < 1 ) ? 1 : value)); m_layout->addRow(progressBar); m_layout->setAlignment(progressBar, Qt::AlignBottom); } //fix bug#141923, empty disks not show kylin burner issue //fix bug#146557, U盘系统盘显示刻录软件问题 if (isCDDisk && QFile::exists("/usr/bin/kylin-burner")) { auto pushbutton = new QPushButton(tr("Kylin Burner")); connect(pushbutton, &QPushButton::clicked, pushbutton, [=](){ QProcess p; p.startDetached("/usr/bin/kylin-burner"); p.waitForStarted(); }); m_layout->addRow(new QLabel(tr("Open with: \t")), pushbutton); } g_free(fs_type); g_object_unref(info); g_object_unref(file); } else { m_layout->addRow(new QLabel(tr("Unknown"), nullptr)); } } } void ComputerPropertiesPage::addSeparator() { auto separator = new QFrame(this); separator->setFrameShape(QFrame::HLine); m_layout->addRow(separator); } void ComputerPropertiesPage::saveAllChange() { } QString ComputerPropertiesPage::getFileSystemType(QString uri) { QString unixDevice,dbusPath; QString fsType = ""; unixDevice = FileUtils::getUnixDevice(uri); //fix bug#95731, encrypted data disk show property crash issue //encrypted disk unixDevice name is like /dev/mapper/kylin--vg-data if (unixDevice.isEmpty() || ! (unixDevice.startsWith("/dev/sd") || unixDevice.startsWith("/dev/sr"))) { return fsType; } dbusPath = "/org/freedesktop/UDisks2/block_devices/" + unixDevice.split("/").last(); if (! QDBusConnection::systemBus().isConnected()) return fsType; QDBusInterface blockInterface("org.freedesktop.UDisks2", dbusPath, "org.freedesktop.UDisks2.Block", QDBusConnection::systemBus()); if(blockInterface.isValid()) fsType = blockInterface.property("IdType").toString(); //if need diff FAT16 and FAT32, should use IdVersion // if(fsType == "" && blockInterface.isValid()) // fsType = blockInterface.property("IdVersion").toString(); return fsType; } std::shared_ptr ComputerPropertiesPage::EnumerateOneVolumeByTargetUri(QString targetUri) { std::shared_ptr volume = nullptr; //enumerate auto volume_monitor = g_volume_monitor_get(); auto current_volumes = g_volume_monitor_get_volumes(volume_monitor); GList *l = current_volumes; while (l) { volume = std::make_shared(G_VOLUME(l->data), true); GMount *gMount = g_volume_get_mount(volume->getGVolume()); GFile *gFile = g_mount_get_root(gMount); char *volumePath = g_file_get_uri(gFile); bool isCurrentVolume = (volumePath == targetUri); g_object_unref(gMount); g_object_unref(gFile); g_free(volumePath); if (isCurrentVolume) break; volume = nullptr; l = l->next; } return volume; } QString ComputerPropertiesPage::formatCapacityString(quint64 capacityNum) { // char *strGB = g_format_size_full(capacityNum, G_FORMAT_SIZE_DEFAULT); char *strGiB = g_format_size_full(capacityNum, G_FORMAT_SIZE_IEC_UNITS); // QString formatString(""); // formatString = QString("%1%2%3%4").arg(strGB).arg(" (").arg(strGiB).arg(")"); QString formatString(strGiB); //根据设计要求,按照1024字节对数据进行格式化(1GB = 1024MB),同时将GiB改为GB显示,以便于用户理解。参考windows显示样式。 formatString.replace("iB", "B"); // g_free(strGB); g_free(strGiB); return formatString; } peony/stable/ukui3/properties-window/controls/computer-properties-page-factory.cpp0000664000175000017500000000313515154271070027627 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "computer-properties-page-factory.h" #include "computer-properties-page.h" using namespace Peony; static ComputerPropertiesPageFactory *global_instance = nullptr; ComputerPropertiesPageFactory::ComputerPropertiesPageFactory(QObject *parent) : QObject(parent) { } ComputerPropertiesPageFactory *ComputerPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new ComputerPropertiesPageFactory; return global_instance; } bool ComputerPropertiesPageFactory::supportUris(const QStringList &uris) { if (uris.count() != 1) return false; if (!uris.first().contains("computer:///")) return false; return true; } PropertiesWindowTabIface *ComputerPropertiesPageFactory::createTabPage(const QStringList &uris) { return new ComputerPropertiesPage(uris.first()); } peony/stable/ukui3/properties-window/controls/open-with-properties-page.h0000664000175000017500000001072115154271070025702 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEOPENWITHPROPERTIESPAGE_H #define STABLEOPENWITHPROPERTIESPAGE_H #include "properties-window-tab-iface.h" #include "file-label-model.h" #include "file-info-job.h" #include "file-launch-action.h" #include #include #include #include #include #include #include #include namespace Peony { class LaunchHashList { public: static LaunchHashList *getAllLaunchHashList(const QString &uri, QWidget *parent = nullptr); LaunchHashList(); LaunchHashList(const QString &uri, QWidget *parent = nullptr); ~LaunchHashList(); public: //保存该文件的全部打开方式 - Save all open methods of the file QListWidget *m_actionList = nullptr; //每个listItem对应的launchAction - Launch Action corresponding to each list Item QHash *m_actionHash = nullptr; }; class NewFileLaunchDialog : public QDialog { Q_OBJECT public: explicit NewFileLaunchDialog(const QString &uri, QWidget *parent = nullptr); virtual ~NewFileLaunchDialog(); QSize sizeHint() const override { return QSize(400, 600); } private: QVBoxLayout *m_layout = nullptr; QDialogButtonBox *m_button_box = nullptr; LaunchHashList *m_launchHashList = nullptr; }; class AllFileLaunchDialog : public QDialog { Q_OBJECT public: explicit AllFileLaunchDialog(const QString &uri, QWidget *parent = nullptr); virtual ~AllFileLaunchDialog(); QSize sizeHint() const override { return QSize(400, 600); } private: QVBoxLayout *m_layout = nullptr; QDialogButtonBox *m_button_box = nullptr; LaunchHashList *m_launchHashList = nullptr; }; //默认打开方式组件 class DefaultOpenWithWidget : public QWidget { Q_OBJECT private: FileLaunchAction* m_launchAction = nullptr; QLabel* m_appNameLabel = nullptr; QLabel* m_appIconLabel = nullptr; QHBoxLayout* m_layout = nullptr; public: explicit DefaultOpenWithWidget(QWidget *parent = nullptr); ~DefaultOpenWithWidget() override; /** * \brief 设置应用图标 * \param appIcon */ void setAppIcon(QIcon appIcon); /** * \brief 设置应用名称 * \param appName */ void setAppName(QString appName); /*! * \brief 获取当前打开方式 */ FileLaunchAction* getLaunchAction(); void setLaunchAction(FileLaunchAction* launchAction); protected: void resizeEvent(QResizeEvent *event) override; }; //open with page class OpenWithPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: /*! * \brief 创建默认打开方式的Widget * \param uri * \param parent * \return */ static DefaultOpenWithWidget* createDefaultOpenWithWidget(const QString &uri, QWidget *parent = nullptr); public: void initFloorOne(); void initFloorTwo(); void initFloorThree(); void addSeparator() { QFrame *separator = new QFrame(this); separator->setFrameShape(QFrame::HLine); m_layout->addWidget(separator); } public: explicit OpenWithPropertiesPage(const QString &uri, QWidget *parent = nullptr); ~OpenWithPropertiesPage(); void init(); void saveAllChange() override; private: QVBoxLayout *m_layout = nullptr; std::shared_ptr m_fileInfo = nullptr; QFutureWatcher *m_futureWatcher = nullptr; //新的打开方式 FileLaunchAction *m_newAction = nullptr; LaunchHashList *m_launchHashList = nullptr; //默认打开方式 DefaultOpenWithWidget* m_defaultOpenWithWidget = nullptr; }; } #endif //OPENWITHPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/details-properties-page-factory.h0000664000175000017500000000405115154271070027061 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEPEONY_DETAILS_PROPERTIES_PAGE_FACTORY_H #define STABLEPEONY_DETAILS_PROPERTIES_PAGE_FACTORY_H #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class DetailsPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static DetailsPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Details"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("Details"); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 600; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override; private: explicit DetailsPropertiesPageFactory(); ~DetailsPropertiesPageFactory(); }; } #endif //PEONY_DETAILS_PROPERTIES_PAGE_FACTORY_H peony/stable/ukui3/properties-window/controls/details-properties-page.cpp0000664000175000017500000002762415154271106025762 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "details-properties-page.h" #include "file-info.h" #include "file-utils.h" #include #include #include #include #include #include "linux-pwd-helper.h" #include "global-settings.h" #include "file-watcher.h" #include "global-settings.h" using namespace Peony; #define FIXED_LABEL_WIDTH 150 //460 - 150 - 22 - 22 = #define FIXED_CONTENT_WIDTH 266 DetailsPropertiesPage::DetailsPropertiesPage(const QString &uri, QWidget *parent) : PropertiesWindowTabIface(parent) { m_uri = uri; m_watcher = std::make_shared(m_uri); m_watcher->startMonitor(); m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0,10,0,0); m_tableWidget = new QTableWidget(this); this->initTableWidget(); m_layout->addWidget(m_tableWidget); this->setLayout(m_layout); //FIXME: replace BLOCKING api in ui thread. this->getFIleInfo(); this->initDetailsPropertiesPage(); } void DetailsPropertiesPage::getFIleInfo() { m_fileInfo = FileInfo::fromUri(m_uri); FileInfoJob *fileInfoJob = new FileInfoJob(m_fileInfo); fileInfoJob->setAutoDelete(true); fileInfoJob->querySync(); } QLabel *DetailsPropertiesPage::createFixedLabel(quint64 minWidth, quint64 minHeight, QString text, QWidget *parent) { QLabel *l = new QLabel(parent); if(minWidth != 0) l->setMinimumWidth(minWidth); if(minHeight != 0) l->setMinimumHeight(minHeight); l->setText(text); return l; } QWidget *DetailsPropertiesPage::createTableRow(QString labelText, QLabel *contentLabel) { QWidget *row = new QWidget(m_tableWidget); QHBoxLayout *boxLayout = new QHBoxLayout(row); boxLayout->setContentsMargins(0, 0, 0, 0); row->setLayout(boxLayout); QLabel *label1 = this->createFixedLabel(FIXED_LABEL_WIDTH,0,labelText,row); label1->setContentsMargins(22,0,0,0); contentLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); contentLabel->setCursor(Qt::IBeamCursor); boxLayout->addWidget(label1); boxLayout->addWidget(contentLabel); boxLayout->addStretch(1); return row; } QWidget *DetailsPropertiesPage::createTableRow(QString labelText, QString content) { QWidget *row = new QWidget(m_tableWidget); QHBoxLayout *boxLayout = new QHBoxLayout(row); boxLayout->setContentsMargins(0, 0, 0, 0); row->setLayout(boxLayout); QLabel *label1 = this->createFixedLabel(FIXED_LABEL_WIDTH,0,labelText,row); label1->setContentsMargins(22,0,0,0); QLabel *labelContent = this->createFixedLabel(0,0,content,row); labelContent->setTextInteractionFlags(Qt::TextSelectableByMouse); labelContent->setCursor(Qt::IBeamCursor); boxLayout->addWidget(label1); boxLayout->addWidget(labelContent); boxLayout->addStretch(1); return row; } void DetailsPropertiesPage::addRow(QString labelText, QString content) { int rowCount = m_tableWidget->rowCount(); m_tableWidget->setRowCount( rowCount + 1); m_tableWidget->setCellWidget((rowCount - 1),0,createTableRow(labelText, content)); } void DetailsPropertiesPage::addRow(QString labelText, QLabel *contentLabel) { int rowCount = m_tableWidget->rowCount(); m_tableWidget->setRowCount( rowCount + 1); m_tableWidget->setCellWidget((rowCount - 1),0,createTableRow(labelText, contentLabel)); } void DetailsPropertiesPage::initTableWidget() { m_tableWidget->setColumnCount(1); m_tableWidget->setRowCount(1); m_tableWidget->verticalHeader()->setVisible(false); m_tableWidget->horizontalHeader()->setVisible(false); m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_tableWidget->setFrameShape(QFrame::NoFrame); m_tableWidget->setSelectionMode(QTableWidget::NoSelection); m_tableWidget->setShowGrid(false); m_tableWidget->setAlternatingRowColors(true); m_tableWidget->rowHeight(36); m_tableWidget->setEditTriggers(QTableWidget::NoEditTriggers); } void DetailsPropertiesPage::initDetailsPropertiesPage() { if (!m_tableWidget) return; QFontMetrics fm = this->fontMetrics(); //name QString fileName = m_fileInfo->displayName(); m_nameLabel = this->createFixedLabel(0, 0, "", m_tableWidget); if (fm.horizontalAdvance(fileName) > FIXED_CONTENT_WIDTH) { m_nameLabel->setToolTip(fileName); fileName = m_tableWidget->fontMetrics().elidedText(fileName, Qt::ElideMiddle, FIXED_CONTENT_WIDTH); } m_nameLabel->setText(fileName); this->addRow(tr("Name:"), m_nameLabel); //type this->addRow(tr("File type:"),m_fileInfo->fileType()); //location QUrl url = FileUtils::getParentUri(m_fileInfo->uri()); QString location = url.toDisplayString(); if (location.startsWith("file://")) location = location.split("file://").last(); m_localLabel = this->createFixedLabel(0, 0, "", m_tableWidget); if (fm.horizontalAdvance(location) > FIXED_CONTENT_WIDTH) { m_localLabel->setToolTip(location); location = m_tableWidget->fontMetrics().elidedText(location, Qt::ElideMiddle,FIXED_CONTENT_WIDTH); } m_localLabel->setText(location); this->addRow(tr("Location:"), m_localLabel); //createTime if (m_fileInfo->isDir()) { m_createDateLabel = this->createFixedLabel(0,0,"",m_tableWidget); this->addRow(tr("Create time:"),m_createDateLabel); } //modifiedTime m_modifyDateLabel = this->createFixedLabel(0,0,"",m_tableWidget); this->addRow(tr("Modify time:"),m_modifyDateLabel); //default format this->setSystemTimeFormat(tr("yyyy-MM-dd, HH:mm:ss")); // set time connect(GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=] (const QString& key) { if (UKUI_CONTROL_CENTER_PANEL_PLUGIN_TIME == key) { // if ("12" == GlobalSettings::getInstance()->getValue(key)) { // setSystemTimeFormat(tr("yyyy-MM-dd, hh:mm:ss AP")); // } else if ("24" == GlobalSettings::getInstance()->getValue(key)) { // setSystemTimeFormat(tr("yyyy-MM-dd, HH:mm:ss")); // } updateFileInfo(m_fileInfo.get()->uri()); } }); #ifdef KY_SDK_DATE connect(GlobalSettings::getInstance(), &GlobalSettings::updateLongDataFormat, this, &DetailsPropertiesPage::updateDateFormat); #endif //size this->addRow(tr("File size:"),m_fileInfo->fileSize()); //判断文件类型 if (m_fileInfo->isImageFile()) { if (m_fileInfo->canRead()) { //image info m_imageWidthLabel = this->createFixedLabel(0, 0, "", m_tableWidget); this->addRow(tr("Width:"), m_imageWidthLabel); m_imageHeightLabel = this->createFixedLabel(0, 0, "", m_tableWidget); this->addRow(tr("Height:"), m_imageHeightLabel); m_imageDepthLabel = this->createFixedLabel(0, 0, "", m_tableWidget); //FIXME:缺少图片位深 // this->addRow(tr("Depth:"),m_imageDepthLabel); } } m_ownerLabel = this->createFixedLabel(0,0,tr("Owner"),m_tableWidget); this->addRow(tr("Owner:"), m_ownerLabel); m_computerLabel = this->createFixedLabel(0,0,tr("Computer"),m_tableWidget); this->addRow(tr("Computer:"), m_computerLabel); m_tableWidget->hideRow(m_tableWidget->rowCount() - 1); this->updateFileInfo(m_uri); connect(m_watcher.get(), &FileWatcher::locationChanged, [=](const QString&, const QString &uri) { this->updateFileInfo(m_uri); }); } DetailsPropertiesPage::~DetailsPropertiesPage() { } void DetailsPropertiesPage::saveAllChange() { if (!m_thisPageChanged) return; } void DetailsPropertiesPage::setSystemTimeFormat(QString format) { this->m_systemTimeFormat = format; } void DetailsPropertiesPage::updateDateFormat(QString dateFormat) { //update date and time show format, task #101605 qDebug() << "sdk format signal:"<uri()); m_date_format = dateFormat; } } void DetailsPropertiesPage::updateFileInfo(const QString &uri) { this->getFIleInfo(); QUrl url(uri); if(uri.startsWith("filesafe:///")){ QUrl newUrl = QUrl(m_fileInfo->targetUri()); url = newUrl; } QFontMetrics fm = this->fontMetrics(); //FIXME:暂时不处理除了本地文件外的文件信息,希望添加对其他文件的支持 if (url.isLocalFile()) { QString path = url.path(); QFileInfo qFileInfo(path); m_ownerLabel->setText(qFileInfo.owner()); //FIXME:明确当前文件所属计算机 if (qFileInfo.isNativePath()) { QString str_m_computerLabel = tr("%1 (this computer)").arg(LinuxPWDHelper::localHost()); if (fm.horizontalAdvance(str_m_computerLabel) > FIXED_CONTENT_WIDTH) { m_computerLabel->setToolTip(str_m_computerLabel); str_m_computerLabel = m_tableWidget->fontMetrics().elidedText(str_m_computerLabel, Qt::ElideMiddle, FIXED_CONTENT_WIDTH); } m_computerLabel->setText(str_m_computerLabel); } else { m_computerLabel->setText(tr("Unknown")); } //FIXME:文件的创建时间会随着文件被修改而发生改变,甚至会出现创建时间晚于修改时间问题 后期将qt的方法替换为gio的方法 //参考:https://www.oschina.net/news/126468/gnome-40-alpha-preview if (qFileInfo.isDir() && m_createDateLabel) { QDateTime date1 = qFileInfo.birthTime(); QString time1 = date1.toString(m_systemTimeFormat); m_createDateLabel->setText(time1); } GFile *file = g_file_new_for_uri(uri.toUtf8().constData()); GFileInfo *info = g_file_query_info(file, "time::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); g_object_unref(file); quint64 timeNum2 = g_file_info_get_attribute_uint64(info,"time::modified"); // QDateTime date2 = QDateTime::fromMSecsSinceEpoch(timeNum2*1000); // QString time2 = date2.toString(m_systemTimeFormat); QString time2 = GlobalSettings::getInstance()->transToSystemTimeFormat(timeNum2, true); m_modifyDateLabel->setText(time2); g_object_unref(info); } else { if (m_createDateLabel) m_createDateLabel->setText(tr("Can't get remote file information")); m_modifyDateLabel->setText(tr("Can't get remote file information")); } //image file if (m_fileInfo->isImageFile()) { //image width QImageReader r(url.path()); if (m_imageHeightLabel && m_imageWidthLabel && m_imageDepthLabel) { m_imageWidthLabel->setText(tr("%1 px").arg(r.size().width())); m_imageHeightLabel->setText(tr("%1 px").arg(r.size().height())); //FIXME:获取图片文件的位深 // m_imageDepthLabel->setText(32); } } } peony/stable/ukui3/properties-window/controls/permissions-properties-page.h0000664000175000017500000001044515154271070026346 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEPERMISSIONSPROPERTIESPAGE_H #define STABLEPERMISSIONSPROPERTIESPAGE_H #include #include #include #include #include #include #include "properties-window-tab-iface.h" #include "peony-core_global.h" #include "systemd-bus-accounts.h" #include "usershare-manager.h" #include #include class QLabel; class QTableWidget; class QCheckBox; namespace Peony { class FileWatcher; class PEONYCORESHARED_EXPORT PermissionsPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: explicit PermissionsPropertiesPage(const QStringList &uris, QWidget *parent = nullptr); ~PermissionsPropertiesPage(); /*! * init the main Widget * \brief initTabWidget */ void initTableWidget(); /** * \brief 创建一个自定义的表格单元组件,带图标和文字 * \param parent * \param icon * \param text * \return */ static QWidget* createCellWidget(QWidget* parent,QIcon icon, QString text); void savePermissions(); void updateCheckBox(); void addAdvancedLayout(); void updateLabelShow(const QString &str); protected: static GAsyncReadyCallback async_query_permisson_callback(GObject *obj, GAsyncResult *res, PermissionsPropertiesPage *p_this); void queryPermissionsAsync(const QString&, const QString &uri); protected Q_SLOTS: void changePermission(int row, int column, bool checked); Q_SIGNALS: void checkBoxChanged(int row, int column, bool checked); private: QString m_uri; std::shared_ptr m_watcher; QVBoxLayout *m_layout = nullptr; QLabel *m_label = nullptr; QLabel *m_message = nullptr; QTableWidget *m_table = nullptr; QPushButton *m_advancedBtn = nullptr; //防止错误修改权限 bool m_enable = false; bool m_permissions[3][3]; //unixmode能力,标识修改权限是否可使用gio接口 bool m_has_unix_mode = false; bool m_isShow = false; public: void thisPageChanged() override; // PropertiesWindowTabIface interface public: void saveAllChange(); }; class AdvancedPermissionsPage : public QWidget { Q_OBJECT public: explicit AdvancedPermissionsPage(const QString &uri, QWidget *parent = nullptr); ~AdvancedPermissionsPage(); void init(); void initTableWidget(); void initListWidget(); void initFloorOne(); void initFloorTwo(); void initFloorThree(); void initFloorFour(); void addSeparate(); void getUserInfo(); void parseUserInfoAcl(QString strAcl); bool updateCheckBox(int col, QString &name); void updateUserInfo(int row, int col, bool checked); void checkInheritsBoxInfo(); void initCheckState(); void saveAclPermissions(); Q_SIGNALS: void updatePermissions(); protected Q_SLOTS: void updateDelAclBtn(int row, int col); private: QString m_uri; QString m_defaultAcl; SystemDbusAccounts *m_sysAccounts = nullptr; QMap m_userInfo; QMutex m_mutex; bool m_thisPageChanged = false; QLabel *m_label = nullptr; QLabel *m_listLabel = nullptr; QTableWidget *m_tabWidget = nullptr; QListWidget *m_listWidget = nullptr; QPushButton *m_saveBtn = nullptr; QPushButton *m_cancelBtn = nullptr; QPushButton *m_addUserBtn = nullptr; QPushButton *m_delUserBtn = nullptr; QCheckBox *m_inheritsBox = nullptr; QVBoxLayout *m_layout = nullptr; }; } #endif // PERMISSIONSPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/basic-properties-page.h0000664000175000017500000001474515154271070025063 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEBASICPROPERTIESPAGE_H #define STABLEBASICPROPERTIESPAGE_H #include #include "peony-core_global.h" #include #include #include #include #include #include #include #include "properties-window-tab-iface.h" #include "open-with-properties-page.h" #define CELL1K 1024 #define CELL4K 4096 #define CELL1M 1048576 #define CELL1G 1073741824 #define TEMP_PERMISSIONS "temp-permissions" class QVBoxLayout; class QFormLayout; class QPushButton; class QLabel; class QLineEdit; namespace Peony { class FileInfo; class FileWatcher; class FileCountOperation; class FileNameThread : public QThread { Q_OBJECT private: const QStringList &m_uris; public: FileNameThread(const QStringList &uris) : m_uris(uris){} Q_SIGNALS: void fileNameReady(QString fileName); protected: void run(); }; /*! * \brief The BasicPropertiesPage class * \todo * handle special files, such as divice or remote server. */ class BasicPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: enum FileType{ BP_Folder = 1, BP_File, BP_Application, BP_MultipleFIle /*选中多个文件*/ }; explicit BasicPropertiesPage(const QStringList &uris, QWidget *parent = nullptr); ~BasicPropertiesPage(); void init(); // PropertiesWindowTabIface interface public: void saveAllChange(); protected: void addSeparator(); /*! * * \brief formLayout 左侧label栏 * \param minWidth * \param minHeight * \param text * \param parent * \return */ QLabel *createFixedLabel(quint64 minWidth, quint64 minHeight, QString text, QWidget *parent = nullptr); QLabel *createFixedLabel(quint64 minWidth, quint64 minHeight, QWidget *parent = nullptr); void addOpenWithLayout(QWidget *parent = nullptr); /*! * 初始化第一层显示区域 * \brief * \param uris * \param fileType */ void initFloorOne(const QStringList &uris,BasicPropertiesPage::FileType fileType); void initFloorTwo(const QStringList &uris,BasicPropertiesPage::FileType fileType); void initFloorThree(BasicPropertiesPage::FileType fileType); void initFloorFour(); BasicPropertiesPage::FileType checkFileType(const QStringList &uris); void chooseFileIcon(); void changeFileIcon(); void moveFile(); /** * \brief * \return 如果对名称进行了修改,返回true */ bool isNameChanged(); void setSysTimeFormat(); protected Q_SLOTS: void getFIleInfo(QString uri); void onSingleFileChanged(const QString &oldUri, const QString &newUri); void countFilesAsync(const QStringList &uris); void onFileCountOne(const QString &uri, quint64 size); void cancelCount(); void updateInfo(const QString &uri); void updateDateFormat(QString dateFormat); private: QVBoxLayout *m_layout = nullptr; std::shared_ptr m_info = nullptr; QStringList m_uris; // QFutureWatcher *m_futureWatcher = nullptr; std::shared_ptr m_watcher; std::shared_ptr m_thumbnail_watcher; void updateCountInfo(bool isDone = false); qint64 m_fileDoneCount = 0; qint64 m_labelWidth = 0; //左侧label宽度 //floor1 QPushButton *m_iconButton = nullptr; //文件图标 QString m_newFileIconPath; //文件新图标 //**new version QLineEdit *m_displayNameEdit = nullptr; //文件名称 QLineEdit *m_locationEdit = nullptr; //文件路径 QPushButton *m_moveButton = nullptr; //移动位置按钮 //floor2 -- public QLabel *m_fileTypeLabel = nullptr; //文件类型 QLabel *m_fileSizeLabel = nullptr; //文件大小 QLabel *m_fileTotalSizeLabel = nullptr; //文件占用空间 quint64 m_fileSizeCount = 0; quint64 m_fileTotalSizeCount = 0; //folder type QLabel *m_folderContainLabel = nullptr; //文件夹下文件统计Label quint64 m_folderContainFiles = 0; //文件夹下文件数量 quint64 m_folderContainFolders = 0; //文件夹下文件夹数量 //file , zip QHBoxLayout *m_openWithLayout = nullptr; //文件打开方式 DefaultOpenWithWidget *m_defaultOpenWithWidget = nullptr; //application QLabel *m_descrptionLabel = nullptr; //应用程序描述 //floor3 QString m_systemTimeFormat = ""; QLabel *m_timeCreatedLabel = nullptr; QLabel *m_timeModifiedLabel = nullptr; QLabel *m_timeAccessLabel = nullptr; quint64 m_timeCreated = 0; quint64 m_timeModified = 0; quint64 m_timeAccess = 0; QWidget *m_timeCreatedFormLeft = nullptr; //floor4 QCheckBox *m_readOnly = nullptr; QCheckBox *m_hidden = nullptr; // FileCountOperation *m_countOp = nullptr; QTimer *m_timer = nullptr; bool m_isReadOnly = false; QString m_date_format = ""; }; class PushButtonStyle : public QProxyStyle { public: static PushButtonStyle *getStyle(); PushButtonStyle() : QProxyStyle() {} void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const; int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget = nullptr) const; }; } #endif // BASICPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/basic-properties-page-factory.h0000664000175000017500000000423115154271070026515 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEBASICPROPERTIESPAGEFACTORY_H #define STABLEBASICPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class BasicPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static BasicPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Basic"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("Show the basic file properties, and allow you to modify the access and name."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 1000; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override; private: explicit BasicPropertiesPageFactory(QObject *parent = nullptr); ~BasicPropertiesPageFactory() override; }; } #endif // BASICPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/basic-properties-page-factory.cpp0000664000175000017500000000415415154271070027054 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "basic-properties-page-factory.h" #include "basic-properties-page.h" using namespace Peony; static BasicPropertiesPageFactory *global_instance = nullptr; BasicPropertiesPageFactory *BasicPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new BasicPropertiesPageFactory; return global_instance; } BasicPropertiesPageFactory::BasicPropertiesPageFactory(QObject *parent) : QObject(parent) { } BasicPropertiesPageFactory::~BasicPropertiesPageFactory() { } bool BasicPropertiesPageFactory::supportUris(const QStringList &uris) { //FIXME: 需要明确支持范围 //FIXME: Need to clarify the scope of support qDebug() << "BasicPropertiesPageFactory::supportUris trace:" << uris.contains("computer:///") << uris; if (uris.contains("computer:///") || uris.contains("recent:///") || uris.contains("trash:///") || uris.contains("network:///")) return false; for (auto uri : uris) { if (uri.startsWith("computer://") || uri.startsWith("trash://") || uri.startsWith("recent://")) return false; } return true; } void BasicPropertiesPageFactory::closeFactory() { this->deleteLater(); } PropertiesWindowTabIface *BasicPropertiesPageFactory::createTabPage(const QStringList &uris) { BasicPropertiesPage *p = new BasicPropertiesPage(uris); return p; } peony/stable/ukui3/properties-window/controls/details-properties-page-factory.cpp0000664000175000017500000000453015154271070027416 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "details-properties-page-factory.h" #include "details-properties-page.h" #include "file-info.h" using namespace Peony; static DetailsPropertiesPageFactory *global_instance = nullptr; DetailsPropertiesPageFactory *DetailsPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new DetailsPropertiesPageFactory; return global_instance; } DetailsPropertiesPageFactory::DetailsPropertiesPageFactory() { } DetailsPropertiesPageFactory::~DetailsPropertiesPageFactory() { } bool DetailsPropertiesPageFactory::supportUris(const QStringList &uris) { //FIXME: 需要明确支持范围 //FIXME: Need to clarify the scope of support //只支持文件和应用 //Only supports files and applications if (uris.count() != 1) return false; QString uri = uris.first(); if (uri.startsWith("computer://") || uri.startsWith("recent://") || uri.startsWith("trash://")) return false; //FIXME: 替换ui线程中的阻塞API //FIXME: replace BLOCKING api in ui thread. auto fileInfo = FileInfo::fromUri(uri); FileInfoJob *job = new FileInfoJob(fileInfo); job->setAutoDelete(true); job->querySync(); //排除文件夹和卷 //Exclude folders and volumes if (fileInfo.get()->isDir() || fileInfo.get()->isVolume()) return false; return true; } PropertiesWindowTabIface *DetailsPropertiesPageFactory::createTabPage(const QStringList &uris) { return new DetailsPropertiesPage(uris.first()); } void DetailsPropertiesPageFactory::closeFactory() { this->deleteLater(); } peony/stable/ukui3/properties-window/controls/computer-properties-page-factory.h0000664000175000017500000000427715154271070027304 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLECOMPUTERPROPERTIESPAGEFACTORY_H #define STABLECOMPUTERPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class PEONYCORESHARED_EXPORT ComputerPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static ComputerPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Computer Properties"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("Show the computer properties or items in computer."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 1000-1; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override {} private: explicit ComputerPropertiesPageFactory(QObject *parent = nullptr); ~ComputerPropertiesPageFactory() override {} }; } #endif // COMPUTERPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/details-properties-page.h0000664000175000017500000000540315154271070025416 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEDETAILSPROPERTIESPAGE_H #define STABLEDETAILSPROPERTIESPAGE_H #include "properties-window-tab-iface.h" #include "file-info-job.h" #include #include #include #include namespace Peony { class FileWatcher; class DetailsPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: explicit DetailsPropertiesPage(const QString &uri, QWidget *parent = nullptr); ~DetailsPropertiesPage(); /*! * \brief 统一创建新的label * \param minWidth * \param minHeight * \param text * \param parent * \return */ QLabel *createFixedLabel(quint64 minWidth, quint64 minHeight, QString text, QWidget *parent); void initDetailsPropertiesPage(); void saveAllChange() override; public: // void getFIleInfo(); Q_SIGNALS: void fileInfoReady(); public Q_SLOTS: void updateDateFormat(QString dateFormat); private: QString m_uri = nullptr; std::shared_ptr m_fileInfo = nullptr; std::shared_ptr m_watcher; QString m_systemTimeFormat = nullptr; QVBoxLayout *m_layout = nullptr; QTableWidget *m_tableWidget = nullptr; QLabel *m_createDateLabel = nullptr; QLabel *m_modifyDateLabel = nullptr; //image file QLabel *m_imageWidthLabel = nullptr; QLabel *m_imageHeightLabel = nullptr; QLabel *m_imageDepthLabel = nullptr; QLabel *m_ownerLabel = nullptr; QLabel *m_computerLabel = nullptr; QLabel *m_localLabel = nullptr; QLabel *m_nameLabel = nullptr; QString m_date_format = ""; QWidget *createTableRow(QString labelText, QString content); QWidget *createTableRow(QString labelText, QLabel *contentLabel); void addRow(QString labelText, QString content); void addRow(QString labelText, QLabel *contentLabel); void initTableWidget(); void setSystemTimeFormat(QString format); void updateFileInfo(const QString &uri); }; } #endif //DETAILSPROPERTIESPAGE_H peony/stable/ukui3/properties-window/controls/permissions-properties-page-factory.h0000664000175000017500000000422415154271070030011 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEPERMISSIONSPROPERTIESPAGEFACTORY_H #define STABLEPERMISSIONSPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class PEONYCORESHARED_EXPORT PermissionsPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static PermissionsPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Permissions"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("Show and modify file's permission, owner and group."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 800; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override; private: explicit PermissionsPropertiesPageFactory(QObject *parent = nullptr); }; } #endif // PERMISSIONSPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/recent-and-trash-properties-page-factory.h0000664000175000017500000000441215154271070030574 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLERECENTANDTRASHPROPERTIESPAGEFACTORY_H #define STABLERECENTANDTRASHPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class PEONYCORESHARED_EXPORT RecentAndTrashPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static RecentAndTrashPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Trash and Recent"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("Show the file properties or items in trash or recent."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 1000-3; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override { this->deleteLater(); } private: explicit RecentAndTrashPropertiesPageFactory(QObject *parent = nullptr); ~RecentAndTrashPropertiesPageFactory() override {} }; } #endif // RECENTANDTRASHPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/open-with-properties-page.cpp0000664000175000017500000003667715154271106026257 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "open-with-properties-page.h" #include "file-info.h" #include "file-launch-manager.h" #include "global-settings.h" #include #include #include #include using namespace Peony; OpenWithPropertiesPage::OpenWithPropertiesPage(const QString &uri, QWidget *parent) : PropertiesWindowTabIface(parent) { m_fileInfo = FileInfo::fromUri(uri); FileInfoJob *job = new FileInfoJob(m_fileInfo); job->setAutoDelete(true); connect(job, &FileInfoJob::queryAsyncFinished, this, &OpenWithPropertiesPage::init); job->queryAsync(); } void OpenWithPropertiesPage::init() { if (m_futureWatcher) { delete m_futureWatcher; m_futureWatcher = nullptr; } m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0,0,0,0); this->initFloorOne(); this->addSeparator(); this->initFloorTwo(); this->addSeparator(); this->initFloorThree(); this->setLayout(m_layout); } OpenWithPropertiesPage::~OpenWithPropertiesPage() { } void OpenWithPropertiesPage::saveAllChange() { if (!m_thisPageChanged) return; if (m_newAction) { FileLaunchManager::setDefaultLauchAction(m_fileInfo.get()->uri(), m_newAction); } } void OpenWithPropertiesPage::initFloorOne() { QFrame *floor1 = new QFrame(this); QVBoxLayout *layout1 = new QVBoxLayout(this); layout1->setContentsMargins(22,0,22,0); floor1->setLayout(layout1); floor1->setMaximumHeight(142); //这几个组件的最小高度可能让人迷糊,这么设置的原因是因为设计图有一定的区域留空,而label可以自适应高度, //利用这个特性可以将留空的高度全部设置给label使得不用设置margin。(setContentsMargins) QLabel *targetTypeMsgLabel = new QLabel(floor1); targetTypeMsgLabel->setMinimumHeight(60); qDebug() << "targetTypeMsgLabel :" << targetTypeMsgLabel->height(); targetTypeMsgLabel->setText(tr("How do you want to open \"%1%2\" files ?").arg(".").arg(m_fileInfo.get()->displayName().split(".").last())); layout1->addWidget(targetTypeMsgLabel); QLabel *defaultOpenLabel = new QLabel(floor1); defaultOpenLabel->setMinimumHeight(35); defaultOpenLabel->setText(tr("Default open with:")); layout1->addWidget(defaultOpenLabel); m_defaultOpenWithWidget = OpenWithPropertiesPage::createDefaultOpenWithWidget(m_fileInfo->uri(), floor1); m_defaultOpenWithWidget->setMinimumHeight(45); layout1->addWidget(m_defaultOpenWithWidget); m_layout->addWidget(floor1); } void OpenWithPropertiesPage::initFloorTwo() { QFrame *floor2 = new QFrame(this); QVBoxLayout *layout2 = new QVBoxLayout(this); floor2->setLayout(layout2); floor2->setMaximumHeight(226); layout2->setContentsMargins(0,0,0,0); QLabel *otherOpenLabel = new QLabel(floor2); otherOpenLabel->setText(tr("Other:")); otherOpenLabel->setContentsMargins(22,0,0,0); layout2->addWidget(otherOpenLabel); m_launchHashList = new LaunchHashList(m_fileInfo.get()->uri(), floor2); //自定义列表属性 m_launchHashList->m_actionList->setFrameShape(QListWidget::NoFrame); m_launchHashList->m_actionList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // m_launchHashList->m_actionList->setContentsMargins(22,0,0,0); m_launchHashList->m_actionList->setFixedHeight(180); m_launchHashList->m_actionList->setAlternatingRowColors(true); m_launchHashList->m_actionList->setIconSize(QSize(44, 44)); // m_launchHashList->m_actionList->setStyleSheet("QListWidget::Item{padding-left:22px;}"); m_launchHashList->m_actionList->setStyleSheet("QListWidget::Item{margin-left:22px;}"); //m_newAction connect(m_launchHashList->m_actionList, &QListWidget::currentItemChanged, [=](QListWidgetItem *current) { if (!current) return ; FileLaunchAction *action = m_launchHashList->m_actionHash->value(current); if (action == FileLaunchManager::getDefaultAction(m_fileInfo.get()->uri())) return ; this->m_newAction = action; this->thisPageChanged(); }); layout2->addWidget(m_launchHashList->m_actionList); this->m_layout->addWidget(floor2); } void OpenWithPropertiesPage::initFloorThree() { QFrame *floor3 = new QFrame(this); QVBoxLayout *layout3 = new QVBoxLayout(this); floor3->setLayout(layout3); floor3->setMaximumHeight(122); layout3->setContentsMargins(22,0,0,0); QString str1; str1 = "" + tr("Choose other application") + ""; QLabel *allOpenLabel = new QLabel(str1, floor3); allOpenLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); connect(allOpenLabel, &QLabel::linkActivated, this, [=]() { AllFileLaunchDialog dialog(m_fileInfo.get()->uri()); if (QDialog::Accepted == dialog.exec()) { m_defaultOpenWithWidget->setLaunchAction(FileLaunchManager::getDefaultAction(m_fileInfo->uri())); } }); layout3->addWidget(allOpenLabel); QString str2; str2 = "" + tr("Go to application center") + ""; QLabel *otherOpenLabel = new QLabel(str2, floor3); otherOpenLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); connect(otherOpenLabel, &QLabel::linkActivated, this, [=]() { QtConcurrent::run([=]() { QProcess p; if (COMMERCIAL_VERSION) p.setProgram("/usr/bin/kylin-software-center"); else p.setProgram("/usr/bin/ubuntu-kylin-software-center"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else if (COMMERCIAL_VERSION) p.startDetached("/usr/bin/kylin-software-center"); else p.startDetached("/usr/bin/ubuntu-kylin-software-center"); #endif }); }); bool isVisible = false; if(QFileInfo::exists("/usr/bin/kylin-software-center") || QFileInfo::exists("/usr/bin/ubuntu-kylin-software-center")){ isVisible = true; } otherOpenLabel->setVisible(isVisible); layout3->addWidget(otherOpenLabel); layout3->addStretch(1); this->m_layout->addWidget(floor3); } NewFileLaunchDialog::NewFileLaunchDialog(const QString &uri, QWidget *parent) : QDialog(parent) { m_launchHashList = new LaunchHashList(uri, this); m_layout = new QVBoxLayout(this); setLayout(m_layout); setWindowTitle(tr("Choose new application")); m_layout->addWidget(new QLabel(tr("Choose an Application to open this file"), this)); m_launchHashList->m_actionList->setIconSize(QSize(48, 48)); m_launchHashList->m_actionList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_layout->addWidget(m_launchHashList->m_actionList, 1); m_layout->addWidget(new QLabel(tr("apply now"), this)); m_button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,this); m_layout->addWidget(m_button_box); //add button translate m_button_box->button(QDialogButtonBox::Ok)->setText(tr("OK")); m_button_box->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(this, &QDialog::accepted, [=]() { if (!m_launchHashList->m_actionList->currentItem()) return ; FileLaunchAction *action = m_launchHashList->m_actionHash->value(m_launchHashList->m_actionList->currentItem()); if (action) { FileLaunchManager::setDefaultLauchAction(uri, action); } }); connect(m_button_box, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); } NewFileLaunchDialog::~NewFileLaunchDialog() { if (m_launchHashList) { delete m_launchHashList; m_launchHashList = nullptr; } } DefaultOpenWithWidget* OpenWithPropertiesPage::createDefaultOpenWithWidget(const QString &uri, QWidget *parent) { DefaultOpenWithWidget* defaultOpenWithWidget = new DefaultOpenWithWidget(parent); defaultOpenWithWidget->setLaunchAction(FileLaunchManager::getDefaultAction(uri)); return defaultOpenWithWidget; } LaunchHashList::LaunchHashList(const QString &uri, QWidget *parent) { m_actionHash = new QHash(); m_actionList = new QListWidget(parent); auto allLaunchActions = FileLaunchManager::getRecommendActions(uri); if (allLaunchActions.count() >= 1) { auto defaultLaunchAction = FileLaunchManager::getDefaultAction(uri); auto defaultItem = new QListWidgetItem(!defaultLaunchAction->icon().isNull()? defaultLaunchAction->icon() : QIcon::fromTheme("application-x-desktop"), defaultLaunchAction->text(), m_actionList); m_actionList->addItem(defaultItem); m_actionList->setCurrentItem(defaultItem); //NOTE:是否需要在列表中显示默认的打开方式 - Do you need to display the default opening method in the list // m_actionList->setItemHidden(defaultItem, true); for (auto action : allLaunchActions) { if (action->getAppInfoDisplayName() == defaultLaunchAction->getAppInfoDisplayName()) continue; auto item = new QListWidgetItem(!action->icon().isNull()? action->icon(): QIcon::fromTheme("application-x-desktop"), action->text(), m_actionList); action->setParent(m_actionList); m_actionList->addItem(item); m_actionHash->insert(item, action); } } } LaunchHashList *LaunchHashList::getAllLaunchHashList(const QString &uri, QWidget *parent) { LaunchHashList *launchHashList = new LaunchHashList(); launchHashList->m_actionHash = new QHash(); launchHashList->m_actionList = new QListWidget(parent); auto allLaunchActions = FileLaunchManager::getAllActions(uri); if (allLaunchActions.count() >= 1) { for (auto action : allLaunchActions) { auto item = new QListWidgetItem(!action->icon().isNull()? action->icon(): QIcon::fromTheme("application-x-desktop"), action->text(), launchHashList->m_actionList); action->setParent(launchHashList->m_actionList); launchHashList->m_actionHash->insert(item, action); launchHashList->m_actionList->addItem(item); } } return launchHashList; } LaunchHashList::LaunchHashList() { } LaunchHashList::~LaunchHashList() { if (m_actionHash) { for (auto key : m_actionHash->keys()) { delete m_actionHash->value(key); } delete m_actionHash; } if (m_actionHash) m_actionList->deleteLater(); } AllFileLaunchDialog::AllFileLaunchDialog(const QString &uri, QWidget *parent) : QDialog(parent) { m_launchHashList = LaunchHashList::getAllLaunchHashList(uri, this); m_layout = new QVBoxLayout(this); setLayout(m_layout); setWindowTitle(tr("Choose new application")); m_layout->addWidget(new QLabel(tr("Choose an Application to open this file"), this)); m_launchHashList->m_actionList->setIconSize(QSize(48, 48)); m_launchHashList->m_actionList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_layout->addWidget(m_launchHashList->m_actionList, 1); m_layout->addWidget(new QLabel(tr("apply now"), this)); m_button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,this); m_layout->addWidget(m_button_box); //add button translate m_button_box->button(QDialogButtonBox::Ok)->setText(tr("OK")); m_button_box->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); connect(this, &QDialog::accepted, [=]() { if (!m_launchHashList->m_actionList->currentItem()) return ; FileLaunchAction *action = m_launchHashList->m_actionHash->value(m_launchHashList->m_actionList->currentItem()); if (action) { FileLaunchManager::setDefaultLauchAction(uri, action); } }); connect(m_button_box, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); } AllFileLaunchDialog::~AllFileLaunchDialog() { if (m_launchHashList) { delete m_launchHashList; m_launchHashList = nullptr; } } //默认打开方式组件 DefaultOpenWithWidget::DefaultOpenWithWidget(QWidget *parent) : QWidget(parent) { m_appIconLabel = new QLabel(this); m_appNameLabel = new QLabel(this); //设置绝对宽度解决在一定概率下因为图标过大导致appName只剩 ‘...’ 问题 m_appIconLabel->setFixedWidth(32); m_layout = new QHBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setAlignment(Qt::AlignVCenter); m_layout->addWidget(m_appIconLabel, 1); m_layout->addWidget(m_appNameLabel, 9); } void DefaultOpenWithWidget::setAppName(QString appName) { if (appName.isNull()) { this->m_appNameLabel->setText(tr("No default app")); this->m_appIconLabel->setFixedWidth(0); this->m_layout->setSpacing(0); } else { this->m_appNameLabel->setText(appName); this->m_appNameLabel->setToolTip(appName); } } void DefaultOpenWithWidget::setAppIcon(QIcon appIcon) { if (appIcon.isNull()) { this->m_appIconLabel->setPixmap(QIcon::fromTheme("application-x-desktop").pixmap(24, 24)); } else { this->m_appIconLabel->setPixmap(appIcon.pixmap(24, 24)); } } void DefaultOpenWithWidget::resizeEvent(QResizeEvent *event) { //m_appIconLabel->maximumWidth() = 32px; int width = this->width() - m_appIconLabel->maximumWidth(); if (m_appNameLabel->fontMetrics().horizontalAdvance(m_appNameLabel->text()) > width) { m_appNameLabel->setText(m_appNameLabel->fontMetrics().elidedText(m_appNameLabel->text(), Qt::ElideRight, width)); } QWidget::resizeEvent(event); } FileLaunchAction* DefaultOpenWithWidget::getLaunchAction() { return m_launchAction; } void DefaultOpenWithWidget::setLaunchAction(FileLaunchAction* launchAction) { if (m_launchAction) { delete m_launchAction; m_launchAction = nullptr; } if (launchAction) { this->m_launchAction = launchAction; this->setAppIcon(m_launchAction->icon()); this->setAppName(m_launchAction->text()); } else { this->setAppIcon(QIcon()); this->setAppName(QString()); } } DefaultOpenWithWidget::~DefaultOpenWithWidget() { if (m_launchAction) { delete m_launchAction; m_launchAction = nullptr; } } peony/stable/ukui3/properties-window/controls/mark-properties-page-factory.cpp0000664000175000017500000000355315154271070026727 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "mark-properties-page-factory.h" #include "mark-properties-page.h" using namespace Peony; static MarkPropertiesPageFactory *global_instance = nullptr; MarkPropertiesPageFactory *MarkPropertiesPageFactory::getInstance() { if (!global_instance) global_instance = new MarkPropertiesPageFactory; return global_instance; } MarkPropertiesPageFactory::MarkPropertiesPageFactory(QObject *parent) : QObject(parent) { } MarkPropertiesPageFactory::~MarkPropertiesPageFactory() { } bool MarkPropertiesPageFactory::supportUris(const QStringList &uris) { //FIXME: 需要明确支持范围 //FIXME: Need to clarify the scope of support if (uris.count() != 1) return false; QString uri = uris.first(); if (uri.startsWith("computer://") || uri.startsWith("recent://") || uri.startsWith("trash://")) return false; return true; } PropertiesWindowTabIface *MarkPropertiesPageFactory::createTabPage(const QStringList &uris) { return new MarkPropertiesPage(uris.first()); } void MarkPropertiesPageFactory::closeFactory() { this->deleteLater(); } peony/stable/ukui3/properties-window/controls/basic-properties-page.cpp0000664000175000017500000013506015154271106025410 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "basic-properties-page.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "file-info.h" #include "file-info-job.h" #include "file-utils.h" #include "thumbnail-manager.h" #include "file-operation-utils.h" #include "file-watcher.h" #include "file-count-operation.h" #include "file-operation-manager.h" #include "file-meta-info.h" #include "global-settings.h" #include "generic-thumbnailer.h" #include "file-operation-manager.h" #include "open-with-properties-page.h" #include "global-settings.h" #include #define DEBUG qDebug() << "[" << __FILE__ << ":" << __FUNCTION__ << ":" << __LINE__ << "]" using namespace Peony; static PushButtonStyle *global_instance = nullptr; PushButtonStyle *PushButtonStyle::getStyle() { if (!global_instance) { global_instance = new PushButtonStyle; } return global_instance; } void PushButtonStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case CE_PushButton: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { proxy()->drawControl(CE_PushButtonBevel, option, painter, widget); QStyleOptionButton subopt = *button; subopt.rect = proxy()->subElementRect(SE_PushButtonContents, option, widget); proxy()->drawControl(CE_PushButtonLabel, &subopt, painter, widget); return; } break; } default: break; } qApp->style()->drawControl(element, option, painter, widget); } int PushButtonStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric) { case PM_ButtonMargin: { return 0; } default: return QProxyStyle::pixelMetric(metric, option, widget); } } QRect PushButtonStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_PushButtonContents: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { const bool icon = !button->icon.isNull(); const bool text = !button->text.isEmpty(); QRect rect = option->rect; int Margin_Height = 2; int ToolButton_MarginWidth = 10; int Button_MarginWidth = proxy()->pixelMetric(PM_ButtonMargin, option, widget); if (text && !icon && !(button->features & QStyleOptionButton::HasMenu)) { rect.adjust(Button_MarginWidth, 0, -Button_MarginWidth, 0); } else if (!text && icon && !(button->features & QStyleOptionButton::HasMenu)) { } else { rect.adjust(ToolButton_MarginWidth, Margin_Height, -ToolButton_MarginWidth, -Margin_Height); } if (button->features & (QStyleOptionButton::AutoDefaultButton | QStyleOptionButton::DefaultButton)) { int dbw = proxy()->pixelMetric(PM_ButtonDefaultIndicator, option, widget); rect.adjust(dbw, dbw, -dbw, -dbw); } return rect; } break; } default: break; } return QProxyStyle::subElementRect(element, option, widget); } BasicPropertiesPage::BasicPropertiesPage(const QStringList &uris, QWidget *parent) : PropertiesWindowTabIface(parent) { m_uris = uris; m_timer = new QTimer(this); m_timer->setInterval(750); connect(m_timer, &QTimer::timeout, this, [=]{ updateCountInfo(true); }); //getFIleInfo this->getFIleInfo(m_uris.first()); this->init(); // QFuture future = QtConcurrent::run([=]() { // getFIleInfo(m_uris.first()); // }); // // m_futureWatcher = new QFutureWatcher; // m_futureWatcher->setFuture(future); // // connect(m_futureWatcher,&QFutureWatcher::finished,this,&BasicPropertiesPage::init); } void BasicPropertiesPage::init() { // if (m_futureWatcher) { // delete m_futureWatcher; // m_futureWatcher = nullptr; // } //Time Modified: (是左侧显示最长的字符串) m_labelWidth = fontMetrics().horizontalAdvance(tr("Time Modified:")) + 5; m_labelWidth = m_labelWidth < 90 ? 90 : m_labelWidth; //check file type and search fileinfo FileType fileType = this->checkFileType(m_uris); //单个文件才能换icon if (fileType != BP_MultipleFIle) { m_watcher = std::make_shared(m_uris.first()); m_watcher->connect(m_watcher.get(), &FileWatcher::locationChanged, this, &BasicPropertiesPage::onSingleFileChanged); m_watcher->startMonitor(); m_thumbnail_watcher = std::make_shared("thumbnail:///"); connect(m_thumbnail_watcher.get(), &FileWatcher::fileChanged, this, [=](const QString &uri){ auto icon = ThumbnailManager::getInstance()->tryGetThumbnail(uri); m_iconButton->setIcon(icon); //QMessageBox::information(0, 0, "icon updated"); }); } m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setSpacing(0); this->setLayout(m_layout); this->initFloorOne(m_uris,fileType); this->addSeparator(); this->initFloorTwo(m_uris,fileType); this->addSeparator(); if(fileType != BP_MultipleFIle ) { this->initFloorThree(fileType); this->addSeparator(); this->initFloorFour(); } m_layout->addStretch(1); } BasicPropertiesPage::~BasicPropertiesPage() { disconnect(); cancelCount(); } void BasicPropertiesPage::addSeparator() { QFrame *separator = new QFrame(this); separator->setFrameShape(QFrame::HLine); m_layout->addWidget(separator); } void BasicPropertiesPage::addOpenWithLayout(QWidget *parent) { if (m_openWithLayout) { m_defaultOpenWithWidget = OpenWithPropertiesPage::createDefaultOpenWithWidget(m_info->uri(), parent); m_openWithLayout->setContentsMargins(0,0,16,0); m_openWithLayout->setAlignment(Qt::AlignVCenter); m_openWithLayout->addWidget(m_defaultOpenWithWidget); m_openWithLayout->addStretch(1); QPushButton *moreAppButton = new QPushButton(parent); moreAppButton->setStyle(PushButtonStyle::getStyle()); moreAppButton->setText(tr("Change")); moreAppButton->setMinimumSize((moreAppButton->fontMetrics().horizontalAdvance(tr("Change")) + 5), 30); m_openWithLayout->addWidget(moreAppButton); connect(moreAppButton,&QPushButton::clicked,this,[=](){ NewFileLaunchDialog dialog(m_info.get()->uri()); if (QDialog::Accepted == dialog.exec()) { m_defaultOpenWithWidget->setLaunchAction(FileLaunchManager::getDefaultAction(m_info->uri())); } }); } } /*! * * \brief BasicPropertiesPage::initFloorOne */ void BasicPropertiesPage::initFloorOne(const QStringList &uris,BasicPropertiesPage::FileType fileType) { QFrame *floor1 = new QFrame(this); QGridLayout *layout1 = new QGridLayout(floor1); layout1->setContentsMargins(22,16,0,16); floor1->setMinimumHeight(100); floor1->setLayout(layout1); m_iconButton = new QPushButton(floor1); m_displayNameEdit = new QLineEdit(floor1); m_locationEdit = new QLineEdit(floor1); m_iconButton->setFixedSize(QSize(60,60)); m_iconButton->setIconSize(QSize(48,48)); m_iconButton->setProperty("isIcon", true); auto form1 = new QFormLayout(floor1); layout1->addLayout(form1,0,0); form1->setContentsMargins(0,0,30,0); form1->setFormAlignment(Qt::AlignVCenter); form1->addRow(m_iconButton); //icon area if (fileType != BP_MultipleFIle) { connect(m_iconButton, &QPushButton::clicked, this, &BasicPropertiesPage::chooseFileIcon); this->onSingleFileChanged(nullptr, uris.first()); } else { m_iconButton->setIcon(QIcon::fromTheme("unknown")); } //text area auto form2 = new QFormLayout(floor1); layout1->addLayout(form2, 0, 1); m_displayNameEdit->setMinimumHeight(32); m_locationEdit->setMinimumHeight(32); form2->addRow(tr("Name"), m_displayNameEdit); form2->addRow(tr("Location"), m_locationEdit); if(uris.first() == "filesafe:///"){ form2->itemAt(1,QFormLayout::LabelRole)->widget()->setEnabled(false); } //select multiplefiles if (fileType == BP_MultipleFIle || !m_info->canRename()) m_displayNameEdit->setReadOnly(true); //选中多个文件时,使用另外的线程获取文件名称并拼接 if (fileType == BP_MultipleFIle) { FileNameThread *getNameThread = new FileNameThread(uris); getNameThread->start(); connect(getNameThread, &FileNameThread::fileNameReady, this, [=](QString fileName) { m_displayNameEdit->setText(fileName); m_displayNameEdit->setToolTip(fileName); delete getNameThread; }); } connect(m_displayNameEdit, &QLineEdit::textChanged, [=]() { if (isNameChanged()) { this->thisPageChanged(); } }); m_locationEdit->setReadOnly(true); QUrl url = FileUtils::getParentUri(uris.first()); QString location = url.toDisplayString(); if (location.startsWith("file://")) location = location.split("file://").last(); m_locationEdit->setText(location); //move -button if(fileType == BP_Folder) { m_moveButton = new QPushButton(floor1); auto form3 = new QFormLayout(floor1); form3->setContentsMargins(0,0,16,0); form3->setFormAlignment(Qt::AlignBottom); m_moveButton->setText(tr("move")); m_moveButton->setMinimumSize(70,32); //暂时使用设置最大高度的方式解决与输入框自适应不一致问题 m_moveButton->setMaximumSize(70, 38); form3->addRow(m_moveButton); //home目录不支持移动和重命名 //不能改名的文件自然不能移动 标准位置文件夹也不能移动 if(m_info.get()->uri() == ("file://"+QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first()) || !m_info->canRename() || FileUtils::isStandardPath(m_info->uri())) { m_displayNameEdit->setReadOnly(true); m_moveButton->setDisabled(true); } connect(m_moveButton,&QPushButton::clicked,this,&BasicPropertiesPage::moveFile); layout1->addLayout(form3,0,2); } else { layout1->setContentsMargins(22,16,16,16); } QString fileUri = uris.at(0); //filesafe插件中保护箱下目录不能移动——fix bug 76864 //fix show properties in filesafe path crash issue, link to bug#74350 if(fileUri.startsWith("filesafe:///") && m_moveButton) { m_moveButton->setVisible(false); } if(fileUri.startsWith("filesafe:///") && (fileUri.remove("filesafe:///").indexOf("/") == -1)) { disconnect(m_iconButton, &QPushButton::clicked, this, &BasicPropertiesPage::chooseFileIcon); m_displayNameEdit->setReadOnly(true); m_locationEdit->setDisabled(true); } if (uris.first() == ("file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation))) { m_iconButton->setFocusPolicy(Qt::NoFocus); m_iconButton->setAttribute(Qt::WA_TransparentForMouseEvents); disconnect(m_iconButton, &QPushButton::clicked, this, &BasicPropertiesPage::chooseFileIcon); } //add floor1 to context m_layout->addWidget(floor1); } void BasicPropertiesPage::initFloorTwo(const QStringList &uris,BasicPropertiesPage::FileType fileType) { QFrame *floor2 = new QFrame(this); QFormLayout *layout2 = new QFormLayout(floor2); layout2->setContentsMargins(22,16,0,16); layout2->setVerticalSpacing(8); floor2->setLayout(layout2); //144px 为多选文件情况下占用的最大高度 - 144px is the maximum height occupied in the case of multiple selection files floor2->setMinimumHeight(144); m_fileTypeLabel = this->createFixedLabel(0,32,floor2); m_fileSizeLabel = this->createFixedLabel(0,32,floor2); m_fileTotalSizeLabel = this->createFixedLabel(0,32,floor2); layout2->addRow(tr("Type:"),m_fileTypeLabel); if(fileType != BP_MultipleFIle) { //FIX:目前只是在这里对文件快捷方式进行判断并显示,这并不合适,希望在底层文件fileType直接增加快捷方式。 //FIX:At present, only the file shortcuts are judged and displayed here. This is not appropriate. //I hope to directly add shortcuts to the underlying file file Type. m_fileTypeLabel->setText(m_info->isSymbolLink() ? tr("symbolLink") : m_info.get()->fileType()); } if(fileType == BP_Folder && uris.first() == "filesafe:///"){ m_fileTypeLabel->setText(tr("Folder")); } //根据文件类型添加组件 - Add components based on file type switch (fileType) { case BP_Folder: m_folderContainLabel = this->createFixedLabel(0,32,floor2); layout2->addRow(this->createFixedLabel(m_labelWidth,32,tr("Include:"),floor2),m_folderContainLabel); break; case BP_File: m_openWithLayout = new QHBoxLayout(floor2); layout2->addRow(this->createFixedLabel(m_labelWidth,32,tr("Open with:"),floor2),m_openWithLayout); this->addOpenWithLayout(floor2); break; case BP_Application: { m_descrptionLabel = this->createFixedLabel(0,32,floor2); layout2->addRow(this->createFixedLabel(m_labelWidth,32,tr("Description:"),floor2),m_descrptionLabel); //fix bug#53504, not show duplicated name issue QString displayName = m_info.get()->displayName(); if (m_info->isDesktopFile()) { displayName = FileUtils::handleDesktopFileName(m_info->uri(), displayName); } m_descrptionLabel->setText(displayName); } break; case BP_MultipleFIle: m_fileTypeLabel->setText(tr("Select multiple files")); default: break; } layout2->addRow(this->createFixedLabel(m_labelWidth,32,tr("Size:"),floor2),m_fileSizeLabel); layout2->addRow(this->createFixedLabel(m_labelWidth,32,tr("Space Useage:"),floor2),m_fileTotalSizeLabel); this->countFilesAsync(uris); m_layout->addWidget(floor2); } void BasicPropertiesPage::initFloorThree(BasicPropertiesPage::FileType fileType) { this->setSysTimeFormat(); // set time if (QGSettings::isSchemaInstalled("org.ukui.control-center.panel.plugins")) { QGSettings* settings = new QGSettings("org.ukui.control-center.panel.plugins", QByteArray(), this); connect(settings, &QGSettings::changed, this, [=](const QString &key) { if ("hoursystem" == key) { setSysTimeFormat(); updateInfo(m_info->uri()); } }); } #ifdef KY_SDK_DATE connect(GlobalSettings::getInstance(), &GlobalSettings::updateLongDataFormat, this, &BasicPropertiesPage::updateDateFormat); #endif auto floor3 = new QFrame(this); QFormLayout *layout3 = new QFormLayout(floor3); layout3->setVerticalSpacing(8); floor3->setLayout(layout3); floor3->setMinimumHeight(64); layout3->setContentsMargins(22,16,0,16); switch (fileType) { case BP_File: case BP_Application: case BP_Folder: m_timeCreatedLabel = this->createFixedLabel(0,32,floor3); m_timeCreatedFormLeft = this->createFixedLabel(m_labelWidth,32,tr("Time Created:"),floor3); layout3->addRow(m_timeCreatedFormLeft, m_timeCreatedLabel); m_timeModifiedLabel = this->createFixedLabel(0,32,floor3); m_timeAccessLabel = this->createFixedLabel(0,32,floor3); layout3->addRow(this->createFixedLabel(m_labelWidth,32,tr("Time Modified:"),floor3), m_timeModifiedLabel); layout3->addRow(this->createFixedLabel(m_labelWidth,32,tr("Time Access:"),floor3), m_timeAccessLabel); break; default: break; } m_layout->addWidget(floor3); updateInfo(m_info.get()->uri()); connect(m_watcher.get(), &FileWatcher::locationChanged, [=](const QString&, const QString &uri) { this->updateInfo(uri); }); } /*! * 底部隐藏多选框和只读选择框 * \brief BasicPropertiesPage::initFloorFour */ void BasicPropertiesPage::initFloorFour() { QFrame *floor4 = new QFrame(this); QFormLayout *layout4 = new QFormLayout(floor4); floor4->setMaximumHeight(64); layout4->setContentsMargins(22,16,0,16); m_readOnly = new QCheckBox(tr("Readonly"), floor4); m_hidden = new QCheckBox(tr("Hidden"), floor4); QHBoxLayout *hBoxLayout = new QHBoxLayout(floor4); hBoxLayout->addWidget(m_readOnly); hBoxLayout->addStretch(1); hBoxLayout->addWidget(m_hidden); hBoxLayout->addStretch(2); if(m_info.get()->canRead() && !m_info.get()->canWrite()) m_readOnly->setCheckState(Qt::Checked); if(m_info.get()->displayName().startsWith(".")) m_hidden->setCheckState(Qt::Checked); m_readOnly->setDisabled(!m_info->canRename()); QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); bool isDesktop = FileUtils::isSamePath(m_info->uri(), desktopPath); //fix bug#113890,hiden Desktop folder change desktop show m_hidden->setDisabled(!m_info->canRename() || isDesktop); m_isReadOnly = m_readOnly->isChecked(); layout4->addRow(this->createFixedLabel(m_labelWidth,32,tr("Property:"),floor4),hBoxLayout); //确认被修改 connect(m_readOnly,&QCheckBox::stateChanged,this,&BasicPropertiesPage::thisPageChanged); connect(m_hidden,&QCheckBox::stateChanged,this,&BasicPropertiesPage::thisPageChanged); m_layout->addWidget(floor4); } BasicPropertiesPage::FileType BasicPropertiesPage::checkFileType(const QStringList &uris) { if(uris.count() != 1) { return BP_MultipleFIle; } else { if (m_info->displayName().isNull() || m_info->displayName().isEmpty()) { this->getFIleInfo(uris.first()); } if(m_info.get()->isDir()) return BP_Folder; if(m_info.get()->isDesktopFile()) return BP_Application; return BP_File; } } //异步获取数据 void BasicPropertiesPage::getFIleInfo(QString uri) { //将在收藏夹的文件路径替换为真实路径 - Replace the file path in the favorites with the real path //FIX:如果是远程文件夹或者其它非本地文件夹添加到收藏夹呢? - What if remote folders or other non-local folders are added to favorites? if (uri.startsWith("favorite://")) { QUrl url(uri); uri = "file://" + url.path(); m_uris.clear(); m_uris.append(uri); } std::shared_ptr fileInfo = FileInfo::fromUri(uri); FileInfoJob *fileInfoJob = new FileInfoJob(fileInfo); fileInfoJob->setAutoDelete(); fileInfoJob->querySync(); m_info = fileInfo; } QIcon generateThumbnail(const QString &uri) { QUrl url = uri; if (! uri.startsWith("file:///")) { url = FileUtils::getTargetUri(uri); } auto _desktop_file = g_desktop_app_info_new_from_filename(url.path().toUtf8().constData()); auto _icon_string = g_desktop_app_info_get_string(_desktop_file, "Icon"); QIcon thumbnail = QIcon::fromTheme(_icon_string); QString string = _icon_string; //fix desktop file set customer icon issue, link to bug#77638 auto info = FileInfo::fromUri(uri); if (! info->customIcon().isEmpty()){ thumbnail = GenericThumbnailer::generateThumbnail(info->customIcon(), true); } if (thumbnail.isNull() && string.startsWith("/")) { thumbnail = GenericThumbnailer::generateThumbnail(_icon_string, true); } DEBUG << "thumbnail" << thumbnail <<_icon_string; g_free(_icon_string); g_object_unref(_desktop_file); return thumbnail; } void BasicPropertiesPage::onSingleFileChanged(const QString &oldUri, const QString &newUri) { this->getFIleInfo(newUri); ThumbnailManager::getInstance()->createThumbnail(m_info.get()->uri(), m_thumbnail_watcher); auto icon = QIcon::fromTheme(m_info.get()->iconName(), QIcon::fromTheme("unknown")); auto thumbnail = ThumbnailManager::getInstance()->tryGetThumbnail(m_info.get()->uri()); m_iconButton->setIcon(thumbnail.isNull() ? icon : thumbnail); //fix bug#53504, not show duplicated name issue. QString fileName = m_info->displayName(); if (m_info->isDesktopFile() && !fileName.endsWith(".desktop")) { fileName = FileUtils::handleDesktopFileName(m_info->uri(), fileName); } //fix bug:#82320 QRegularExpression regex("^file:///data/usershare(/{,1})$"); if (regex.match(m_info->uri()).hasMatch()) { fileName = tr("usershare"); } m_displayNameEdit->setText(fileName); m_displayNameEdit->setToolTip(fileName); if (thumbnail.isNull()) { ThumbnailManager::getInstance()->createThumbnail(m_info.get()->uri(), m_thumbnail_watcher); } m_iconButton->setIcon(thumbnail.isNull() ? icon : thumbnail); QUrl url = FileUtils::getParentUri(m_info.get()->uri()); QString location = url.toDisplayString(); if (location.startsWith("file://")) location = location.split("file://").last(); m_locationEdit->setText(location); } void BasicPropertiesPage::countFilesAsync(const QStringList &uris) { m_timer->start(); //old op will delete later if (m_countOp) { m_countOp->disconnect(); m_countOp->cancel(); } //clear old data m_folderContainFiles = 0; m_folderContainFolders = 0; m_fileSizeCount = 0; m_fileTotalSizeCount = 0; if (uris.count() == 1) { auto uri = uris.first(); auto info = FileInfo::fromUri(uri); QStringList realUris; //判断是不是快捷方式 - Determine if it is a shortcut if (info->isSymbolLink()) { if (!info.get()->symlinkTarget().isEmpty()) realUris << ("file://" + info.get()->symlinkTarget()); } m_countOp = new FileCountOperation(realUris.isEmpty() ? uris : realUris); DEBUG << "symlinkTarget:" << info.get()->symlinkTarget(); } else { QStringList lists; for (auto uri : uris) { auto info = FileInfo::fromUri(uri); if (info->isSymbolLink()) { if (!info.get()->symlinkTarget().isEmpty()) { QString temp = "file://" + info.get()->symlinkTarget(); lists.append(temp); } else { lists.append(uri); } } else { lists.append(uri); } } m_countOp = new FileCountOperation(lists); } m_countOp->setAutoDelete(true); connect(m_countOp, &FileOperation::operationPreparedOne, this, &BasicPropertiesPage::onFileCountOne, Qt::BlockingQueuedConnection); connect(m_countOp, &FileCountOperation::countDone, this, [=](quint64 file_count, quint64 hidden_file_count, quint64 total_size) { m_timer->stop(); m_countOp = nullptr; m_folderContainFiles = file_count - m_folderContainFolders; m_fileSizeCount = total_size; //不统计文件夹本身 - Do not count the folder itself if (m_folderContainFolders != 0) { m_folderContainFolders--; } this->updateCountInfo(true); //使用du -s 命令查看文件实际占用的磁盘空间。 for (QString uri : m_uris) { QUrl url(uri); if (url.isLocalFile()) { std::shared_ptr fileInfo = FileInfo::fromUri(uri); FileInfoJob *fileInfoJob = new FileInfoJob(fileInfo); fileInfoJob->setAutoDelete(); fileInfoJob->querySync(); //某些带空格的文件名称会导致命令错误,加上引号解决此问题。 QString path; if(uri == "filesafe:///") { path = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/.box"; } else { // g_autoptr (GFile) gfile = g_file_new_for_uri(uri.toUtf8().constData()); // g_autofree gchar *gpath = g_file_get_path(gfile); // if (gpath) { // path = gpath; // } else { path = QString("%1%2%3").arg("\"").arg(url.path()).arg("\""); // } } QProcess process; if (fileInfo->isSymbolLink()) { process.start("/usr/bin/du -L " + path); } else { process.start("/usr/bin/du -s " + path); } process.waitForFinished(); QString result = process.readAllStandardOutput(); //du -s xxx 输出格式:4 xxx (大小单位为KB) m_fileTotalSizeCount += result.split(QRegularExpression("\\s+")).first().toLong(); } } //转换为 xx Bytes m_fileTotalSizeCount *= CELL1K; if (m_fileTotalSizeCount == 0) { quint64 a = 0; quint64 b = 0; a = m_fileSizeCount % CELL4K; b = m_fileSizeCount / CELL4K; quint64 cell4k = (a == 0) ? b : (b + 1); m_fileTotalSizeCount = cell4k * CELL4K; } //gio格式化工具 char *fileTotalSizeFormat = g_format_size_full(m_fileTotalSizeCount,G_FORMAT_SIZE_IEC_UNITS); QString fileTotalSizeFormatString(fileTotalSizeFormat); fileTotalSizeFormatString.replace("iB", "B"); QString fileTotalSizeText(tr("%1 (%2 Bytes)").arg(fileTotalSizeFormatString).arg(m_fileTotalSizeCount)); g_free(fileTotalSizeFormat); m_fileTotalSizeLabel->setText(fileTotalSizeText); }); QThreadPool::globalInstance()->start(m_countOp); } void BasicPropertiesPage::onFileCountOne(const QString &uri, quint64 size) { //...FIX:第一版本在当前位置对文件夹进行统计,慢 // std::shared_ptr l_fileInfo = FileInfo::fromUri(uri); // FileInfoJob *fileInfoJob = new FileInfoJob(l_fileInfo); // fileInfoJob->setAutoDelete(); // fileInfoJob->querySync(); // bool a = l_fileInfo.get()->isDir(); bool isDir = false; g_autoptr (GFile) file = g_file_new_for_uri(uri.toUtf8().constData()); g_autoptr (GFileInfo) info = g_file_query_info(file, "standard::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); GFileType fileType = g_file_info_get_file_type(info); QString contentType = g_file_info_get_content_type (info); if (fileType == G_FILE_TYPE_DIRECTORY || contentType == "inode/directory") { isDir = true; } if (isDir) m_folderContainFolders ++; else m_folderContainFiles ++; m_fileSizeCount += size; m_fileDoneCount ++; //500 files update ui updateCountInfo((m_fileDoneCount % 500 == 0)); } void BasicPropertiesPage::cancelCount() { m_timer->stop(); if (m_countOp) m_countOp->cancel(); } void BasicPropertiesPage::moveFile(){ auto newDirPath = QString(QFileDialog::getExistingDirectoryUrl(nullptr, tr("Choose a new folder:"),m_info.get()->uri()).toEncoded()); DEBUG << "new path:" << newDirPath ; if(newDirPath.isEmpty()) return; if(newDirPath == m_info.get()->uri()) { QMessageBox::critical(nullptr, tr("Error"), tr("cannot move a folder to itself !"), QMessageBox::Yes, QMessageBox::Yes); return; } if(newDirPath.startsWith(m_info.get()->uri())) { QMessageBox::critical(nullptr, tr("Error"), tr("cannot move a folder to itself !"), QMessageBox::Yes, QMessageBox::Yes); return; } DEBUG << "old Path:" << m_info.get()->uri() << newDirPath; QStringList uriList; uriList << m_info.get()->uri(); auto fileOpe = FileOperationUtils::move(uriList,newDirPath,true); connect(fileOpe,&FileOperation::operationFinished,[=](){ if (!fileOpe->hasError()) { QProcess p; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) p.setProgram("/usr/bin/peony"); p.setArguments(QStringList()<<"--show-folders" << newDirPath); p.startDetached(); #else p.startDetached("/usr/bin/peony", QStringList()<<"--show-folders"<< newDirPath); #endif Q_EMIT requestCloseMainWindow(); } }); } /*! * 响应窗口确定按钮 * \brief BasicPropertiesPage::saveAllChange */ void BasicPropertiesPage::saveAllChange() { if (m_watcher) m_watcher->stopMonitor(); if (m_thumbnail_watcher) m_thumbnail_watcher->stopMonitor(); //未发生修改 if (!this->m_thisPageChanged) return; //拒绝修改home目录 if (m_info.get()->uri() == ("file://"+QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first())) { return; } //修改图标 this->changeFileIcon(); if (m_readOnly && m_isReadOnly != m_readOnly->isChecked()) { mode_t mod = 0; quint32 mode = 0; if(m_readOnly->isChecked()) { // mod |= S_IRUSR; // mod |= S_IRGRP; // mod |= S_IROTH; g_autoptr(GFile) file = g_file_new_for_uri(m_info.get()->uri().toUtf8().constData()); if (file) { g_autoptr(GError) error = NULL; g_autoptr(GFileInfo) info = g_file_query_info(file, "unix::mode", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, &error); bool has_unix_mode = g_file_info_has_attribute(info, G_FILE_ATTRIBUTE_UNIX_MODE); if (has_unix_mode) { mode = g_file_info_get_attribute_uint32(info, G_FILE_ATTRIBUTE_UNIX_MODE); auto metaInfo = FileMetaInfo::fromUri(m_info.get()->uri()); if (metaInfo) { metaInfo->setMetaInfoInt(TEMP_PERMISSIONS, mode); } } } //去除写权限 mode &= ~S_IWUSR; mode &= ~S_IWGRP; mode &= ~S_IWOTH; mod = mode; } else { auto metaInfo = FileMetaInfo::fromUri(m_info.get()->uri()); if (metaInfo && metaInfo->getMetaInfoInt(TEMP_PERMISSIONS)) { mod = metaInfo->getMetaInfoInt(TEMP_PERMISSIONS); } else { mod |= S_IRUSR; mod |= S_IRGRP; mod |= S_IROTH; mod |= S_IWUSR; // mod |= S_IWGRP; // mod |= S_IWOTH; } } //FIX:如果该文件之前就是可执行,那么应该保留可执行权限 if (m_info->canExecute()) mod |= S_IXUSR; //.desktop文件给予可执行,.desktop文件原本可执行才给可执行权限 if (((m_info.get()->isDesktopFile()) || m_info.get()->displayName().endsWith(".desktop")) && m_info->canExecute()) { //FIX:可执行范围 目前只给拥有者执行权限 mod |= S_IXUSR; //mod |= S_IXGRP; //mod |= S_IXOTH; } QUrl url = m_info.get()->uri(); g_chmod(url.path().toUtf8(), mod); } //是否进行文件隐藏操作 - Whether to hide files bool existHiddenOpt = false; if (m_hidden) { QString newName = m_info.get()->displayName(); if (newName.startsWith(".")) newName = newName.mid(1,-1); if (isNameChanged()) { newName = m_displayNameEdit->text(); } bool isHidden = m_info.get()->displayName().startsWith("."); //以前没隐藏,并且选中隐藏框 if(!isHidden && m_hidden->isChecked()) { newName = "." + newName; FileOperationUtils::rename(m_info.get()->uri(), newName, true); existHiddenOpt = true; } else if(isHidden && !m_hidden->isChecked()) { //以前已经隐藏,并且取消选中隐藏框 FileOperationUtils::rename(m_info.get()->uri(), newName, true); existHiddenOpt = true; } } if (!existHiddenOpt) { if (isNameChanged()) { FileOperationUtils::rename(m_info.get()->uri(), m_displayNameEdit->text(), true); } } //FIX:修复桌面快捷方式文件的缩略图改变后需要手动刷新才更新的问题 //fix the problem that the thumbnails of desktop shortcut files need to be manually refreshed before they are updated after being changed. QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); //if (m_info.get()->uri().contains(desktopUri) && m_info.get()->isSymbolLink()) { QProcess p; p.setProgram("/usr/bin/touch"); p.setArguments(QStringList()<<"-h"<filePath()); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/touch", QStringList()<<"-h"<filePath()); #endif p.waitForFinished(-1); //} } void BasicPropertiesPage::chooseFileIcon() { QUrl iconPathUrl; iconPathUrl.setPath("/usr/share/icons"); auto picture = QFileDialog::getOpenFileName(nullptr, tr("Choose a custom icon"), "/usr/share/icons", "*.png *.jpg *.jpeg *.svg"); QFileInfo fileInfo(picture); if (fileInfo.exists()) { qint64 fileSize = fileInfo.size(); double fileSizeMB = fileSize / (1024.0 * 1024.0); qDebug() << "fileSize is :" << fileSizeMB << "MB"; if (fileSizeMB > 1.0) { QMessageBox::warning(nullptr, "", tr("Please select a image that is smaller than 1MB.")); return; } } else { qDebug() << "file does not exist :" << picture; } if (!picture.isEmpty()) { qDebug()<<"chose new file icon:"<< picture; m_iconButton->setIcon(QIcon(picture)); this->m_newFileIconPath = picture; this->thisPageChanged(); } } void BasicPropertiesPage::changeFileIcon() { if (!m_newFileIconPath.isEmpty()) { auto metaInfo = FileMetaInfo::fromUri(m_info.get()->uri()); // QFileInfo fileInfo(m_newFileIconPath); // if (!QIcon::fromTheme(fileInfo.baseName()).isNull()) // metaInfo.get()->setMetaInfoString("custom-icon", fileInfo.baseName()); // else metaInfo.get()->setMetaInfoString("custom-icon", m_newFileIconPath); ThumbnailManager::getInstance()->createThumbnail(m_info.get()->uri(), m_thumbnail_watcher, true); } } void BasicPropertiesPage::updateCountInfo(bool isDone) { if (isDone) { QString fileSizeText; quint64 a = 0; a = m_fileSizeCount / CELL1K; //小于1KB if (a < 1) { fileSizeText = tr("%1 Bytes").arg(m_fileSizeCount); } else { char *fileSizeFormat = g_format_size_full(m_fileSizeCount,G_FORMAT_SIZE_IEC_UNITS); QString fileSizeFormatString(fileSizeFormat); //根据设计要求,按照1024字节对数据进行格式化(1GB = 1024MB),同时将GiB改为GB显示,以便于用户理解。参考windows显示样式。 fileSizeFormatString.replace("iB", "B"); fileSizeText = tr("%1 (%2 Bytes)").arg(fileSizeFormatString).arg(m_fileSizeCount); g_free(fileSizeFormat); } m_fileSizeLabel->setText(fileSizeText); //在为完成统计前,先显示文件大小而不是占用空间大小 m_fileTotalSizeLabel->setText(fileSizeText); if(m_folderContainLabel) m_folderContainLabel->setText(tr("%1 files, %2 folders").arg(m_folderContainFiles).arg(m_folderContainFolders)); } } void BasicPropertiesPage::updateDateFormat(QString dateFormat) { //update date and time show format, task #101605 qDebug() << "sdk format signal:"<uri()); m_date_format = dateFormat; } } void BasicPropertiesPage::updateInfo(const QString &uri) { //QT获取文件相关时间 , m_info = FileInfo::fromUri(uri); FileInfoJob *fileInfoJob = new FileInfoJob(m_info); fileInfoJob->setAutoDelete(); connect(fileInfoJob, &FileInfoJob::queryAsyncFinished, this, [=](){ QUrl url(uri); //FIXME:暂时不处理除了本地文件外的文件信息,希望添加对其他文件的支持 //if (url.isLocalFile()) { if(m_info->accessTime() != 0 && m_info->modifiedTime() != 0){ // if(m_timeModifiedLabel) { // QDateTime date2 = qFileInfo.lastModified(); // QString time2 = date2.toString(m_systemTimeFormat); // m_timeModifiedLabel->setText(time2); // } // if(m_timeAccessLabel) { // QDateTime date3 = qFileInfo.lastRead(); // QString time3 = date3.toString(m_systemTimeFormat); // m_timeAccessLabel->setText(time3); // } GFile *file = g_file_new_for_uri(uri.toUtf8().constData()); GFileInfo *info = g_file_query_info(file, "time::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr); g_object_unref(file); m_timeModified = g_file_info_get_attribute_uint64(info,"time::modified"); if(m_timeModifiedLabel) { // QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_timeModified*1000); // QString time2 = date2.toString(m_systemTimeFormat); QString time2 = GlobalSettings::getInstance()->transToSystemTimeFormat(m_timeModified, true); m_timeModifiedLabel->setText(time2); } if(m_timeAccessLabel) { m_timeAccess = g_file_info_get_attribute_uint64(info,"time::access"); // QDateTime date3 = QDateTime::fromMSecsSinceEpoch(m_timeAccess*1000); // QString time3 = date3.toString(m_systemTimeFormat); QString time3 = GlobalSettings::getInstance()->transToSystemTimeFormat(m_timeAccess, true); m_timeAccessLabel->setText(time3); } QString path = url.path(); QFileInfo qFileInfo(path); bool visible = true; if (/*qFileInfo.isDir() && */m_timeCreatedLabel) { m_timeCreated = g_file_info_get_attribute_uint64(info, "time::created"); visible = m_timeCreated; // 客户需要必须显示创建时间,因此使用三个时间最小时间戳为创建时间 quint64 minTime = m_timeCreated != 0 ? m_timeCreated : m_timeModified; minTime = qMin (minTime, m_timeModified); if (m_timeAccess != 0) minTime = qMin (minTime, m_timeAccess); m_timeCreated = minTime; // QDateTime createDate = QDateTime::fromMSecsSinceEpoch(m_timeCreated*1000); // QString createTime = createDate.toString(m_systemTimeFormat); QString createTime = GlobalSettings::getInstance()->transToSystemTimeFormat(m_timeCreated, true); m_timeCreatedLabel->setText(createTime); // // FIXME:目前只是文件夹显示创建时间,当创建时间获取失败的时候,将修改时间作为创建时间 // QDateTime date1 = qFileInfo.birthTime(); // if (date1.isValid()) { // QString time1 = date1.toString(m_systemTimeFormat); // m_timeCreatedLabel->setText(time1); // } else { // m_timeCreated = g_file_info_get_attribute_uint64(info, "time::modified"); // QDateTime createDate = QDateTime::fromMSecsSinceEpoch(m_timeCreated*1000); // QString createTime = createDate.toString(m_systemTimeFormat); // m_timeCreatedLabel->setText(createTime); // } } g_object_unref(info); m_timeCreatedFormLeft->setVisible(visible); m_timeCreatedLabel->setVisible(visible); } else { if (m_timeCreatedLabel){ if (QGSettings::isSchemaInstalled("org.ukui.style")) { //font monitor QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key){ if (key == "systemFontSize") { QFontMetrics fontWidth(m_timeCreatedLabel->font()); QString elideNote = fontWidth.elidedText(tr("Can't get remote file information"),Qt::ElideRight,280); m_timeCreatedLabel->setText(elideNote); m_timeCreatedLabel->setToolTip(tr("Can't get remote file information")); } }); } QFontMetrics fontWidth(m_timeCreatedLabel->font()); QString elideNote = fontWidth.elidedText(tr("Can't get remote file information"),Qt::ElideRight,280); m_timeCreatedLabel->setText(elideNote); m_timeCreatedLabel->setToolTip(tr("Can't get remote file information")); } } //FIXME:GVFS底层暂未实现文件创建时间获取API,暂时使用QT获取文件创建时间 /* m_timeCreated = g_file_info_get_attribute_uint64(info,G_FILE_ATTRIBUTE_TIME_CREATED); //m_timeCreated = g_file_info_get_attribute_uint64(info, "time::created"); QDateTime date1 = QDateTime::fromMSecsSinceEpoch(m_timeCreated*1000); QString time1 = date1.toString(m_systemTimeFormat); m_timeCreatedLabel->setText(time1); if(m_timeModifiedLabel) { m_timeModified = g_file_info_get_attribute_uint64(info, "time::modified"); QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_timeModified*1000); QString time2 = date2.toString(m_systemTimeFormat); m_timeModifiedLabel->setText(time2); } if(m_timeAccessLabel) { m_timeAccess = g_file_info_get_attribute_uint64(info, "time::access"); QDateTime date3 = QDateTime::fromMSecsSinceEpoch(m_timeAccess*1000); QString time3 = date3.toString(m_systemTimeFormat); m_timeAccessLabel->setText(time3); } g_object_unref(info); */ }); fileInfoJob->queryAsync(); } QLabel *BasicPropertiesPage::createFixedLabel(quint64 minWidth, quint64 minHeight, QString text, QWidget *parent) { QLabel *label = new QLabel(parent); if (minWidth != 0) label->setMinimumWidth(minWidth); if (minHeight != 0) label->setMinimumHeight(minHeight); label->setText(text); return label; } QLabel *BasicPropertiesPage::createFixedLabel(quint64 minWidth, quint64 minHeight, QWidget *parent) { QLabel *label = new QLabel(parent); if (minWidth != 0) label->setMinimumWidth(minWidth); if (minHeight != 0) label->setMinimumHeight(minHeight); return label; } bool BasicPropertiesPage::isNameChanged() { if (!m_displayNameEdit->isReadOnly() && !m_displayNameEdit->text().isEmpty()) { QString fileName(m_info->displayName()); //桌面文件 if (m_info->isDesktopFile() && !fileName.endsWith(".desktop")) { //做过处理的名称 QString handledName = FileUtils::handleDesktopFileName(m_info->uri(), fileName); if (fileName != handledName) { //用户是否手动修改 if (handledName != m_displayNameEdit->text()) return true; else return false; } } //文件名称被修改过 if (fileName != m_displayNameEdit->text()) return true; else return false; } return false; } void BasicPropertiesPage::setSysTimeFormat() { this->m_systemTimeFormat = GlobalSettings::getInstance()->getSystemTimeFormat(); } void FileNameThread::run() { QString fileName = ""; if (m_uris.count() == 1) { std::shared_ptr fileInfo = FileInfo::fromUri(m_uris.first()); FileInfoJob *fileInfoJob = new FileInfoJob(fileInfo); fileInfoJob->setAutoDelete(); fileInfoJob->querySync(); fileName = fileInfo.get()->displayName(); //fix bug#53504, not show duplicated name issue if (fileInfo->isDesktopFile()) { fileName = FileUtils::handleDesktopFileName(fileInfo->uri(), fileName); } } else { QStringList stringList; for (auto uri : m_uris) { //FIXME: replace BLOCKING api in ui thread.(finish) ** std::shared_ptr fileInfo = FileInfo::fromUri(uri); FileInfoJob *fileInfoJob = new FileInfoJob(fileInfo); fileInfoJob->setAutoDelete(); fileInfoJob->querySync(); stringList<< fileInfo.get()->displayName(); } auto text = stringList.join(","); fileName = QString(text); } Q_EMIT fileNameReady(fileName); } peony/stable/ukui3/properties-window/controls/mark-properties-page.cpp0000664000175000017500000001637015154271070025263 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #include "mark-properties-page.h" #include "file-operation-utils.h" #include #include #include #include #include #include #include #define FILE_LABEL_WIDTH 150 using namespace Peony; MarkPropertiesPage::MarkPropertiesPage(const QString &uri, QWidget *parent) : PropertiesWindowTabIface(parent) { this->m_uri = uri; //note:请查看:BasicPropertiesPage::getFIleInfo(QString uri) - Look BasicPropertiesPage::getFIleInfo(QString uri) if (uri.startsWith("favorite://")) { QUrl url(uri); m_uri = "file://" + url.path(); } this->m_layout = new QVBoxLayout(this); //表格自带一部分高度,所以手动删减一部分 m_layout->setContentsMargins(16,16,16,20); this->initTableWidget(); this->initTableData(); this->setLayout(m_layout); if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *gSetting = new QGSettings("org.ukui.style", QByteArray(), this); connect(gSetting, &QGSettings::changed, this, [=](const QString &key) { if ("systemFontSize" == key) { for (int row = 0; row < m_tableWidget->rowCount(); row++) { for (int col = 0; col < m_tableWidget->columnCount(); col++) { QWidget* w = m_tableWidget->cellWidget(row, col); QLabel* label = w->findChild(); auto items = m_fileLabelModel->getAllFileLabelItems(); int index = m_tableWidget->columnCount() * row + col; if (!label->text().isEmpty() && index < items.count()) { updateTableLabelShow(label, items.at(index)->name()); } } } } }); } } void MarkPropertiesPage::initTableWidget() { this->m_tableWidget = new QTableWidget(this); m_tableWidget->setContentsMargins(0,0,0,0); m_tableWidget->setRowCount(4); m_tableWidget->setColumnCount(2); m_tableWidget->setSelectionMode(QTableWidget::NoSelection); m_tableWidget->setFrameShape(QFrame::NoFrame); m_tableWidget->horizontalHeader()->setVisible(false); m_tableWidget->verticalHeader()->setVisible(false); m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //显示线条 m_tableWidget->setShowGrid(false); m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_tableWidget->resizeRowsToContents(); //隔行换色 m_tableWidget->setAlternatingRowColors(false); m_layout->addWidget(m_tableWidget); } MarkPropertiesPage::~MarkPropertiesPage() { } void MarkPropertiesPage::saveAllChange() { if(!this->m_thisPageChanged) return; //1.清除旧的标记 for (auto labelId : m_fileLabelModel->getFileLabelIds(m_uri)) { this->m_fileLabelModel->removeFileLabel(m_uri,labelId); } //2.写入新的标记 for(auto labelId : this->m_thisFileLabelIds) { m_fileLabelModel->addLabelToFile(m_uri,labelId); } } void MarkPropertiesPage::initTableData() { m_fileLabelModel = FileLabelModel::getGlobalModel(); m_thisFileLabelIds = m_fileLabelModel->getFileLabelIds(m_uri); QList allLabels = m_fileLabelModel->getAllFileLabelItems(); int rowCount = (allLabels.count()%2 == 0 ? allLabels.count()/2 : allLabels.count()/2 + 1); m_tableWidget->setRowCount(rowCount); int totalLabel = allLabels.count()%2 ? allLabels.count()+1 : allLabels.count(); for (int i = 0; i < totalLabel; i++) { QWidget *widget = new QWidget(m_tableWidget); QHBoxLayout *boxLayout = new QHBoxLayout(m_tableWidget); boxLayout->setAlignment(Qt::AlignLeft); boxLayout->setContentsMargins(8,0,8,0); widget->setLayout(boxLayout); //fix last single box can input letters issue, bug#38757 if (i >= allLabels.count()) { QLabel *label = new QLabel(widget); label->setText(""); boxLayout->addWidget(label); m_tableWidget->setCellWidget(i/2,i%2,widget); continue; } auto item = allLabels.at(i); QCheckBox *checkBox = new QCheckBox(widget); checkBox->setChecked(m_thisFileLabelIds.contains(item->id())); boxLayout->addWidget(checkBox); QPushButton *button = new QPushButton(widget); button->palette().window(); button->setStyleSheet("QPushButton{" "border-radius: 6px; " "background-color: " + convertRGB16HexStr(item->color()) + ";" " max-width:12px;" " max-height:12px;" " min-width:12px;" " min-height:12px;" "}"); button->setEnabled(false); boxLayout->addWidget(button); QLabel *label = new QLabel(widget); updateTableLabelShow(label, item->name()); boxLayout->addWidget(label); connect(checkBox,&QCheckBox::clicked,this,[=](bool checked){ this->changeLabel(item->id(),checked); }); m_tableWidget->setCellWidget(i/2,i%2,widget); } m_layout->addWidget(m_tableWidget); } void MarkPropertiesPage::changeLabel(int labelId, bool checked) { qDebug() << "id" << labelId << checked; //1.检查是否存在 bool hasLabelId = this->m_thisFileLabelIds.contains(labelId); //2.如果选中并且不存在 if(checked && !hasLabelId) this->m_thisFileLabelIds.append(labelId); //3.如果取消选中,并且存在 if(!checked && hasLabelId) this->m_thisFileLabelIds.removeAt(this->m_thisFileLabelIds.indexOf(labelId)); this->thisPageChanged(); } QString MarkPropertiesPage::convertRGB16HexStr(const QColor color) { if (color == Qt::transparent) return "transparent"; QString redStr = QString("%1").arg(color.red(),2,16,QChar('0')); QString greenStr = QString("%1").arg(color.green(),2,16,QChar('0')); QString blueStr = QString("%1").arg(color.blue(),2,16,QChar('0')); QString hexStr = "#" + redStr + greenStr + blueStr; return hexStr; } void MarkPropertiesPage::updateTableLabelShow(QLabel *label, const QString &str) { QString tmp = str; QFontMetrics fontWidth(label->font()); QString elideNote = fontWidth.elidedText(tmp, Qt::ElideRight, FILE_LABEL_WIDTH); label->setText(elideNote); label->setToolTip(tmp); } peony/stable/ukui3/properties-window/controls/open-with-properties-page-factory.h0000664000175000017500000000415115154271070027347 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Wenfei He * */ #ifndef STABLEOPENWITHPROPERTIESPAGEFACTORY_H #define STABLEOPENWITHPROPERTIESPAGEFACTORY_H #include #include "peony-core_global.h" #include "properties-window-tab-page-plugin-iface.h" namespace Peony { class OpenWithPropertiesPageFactory : public QObject, public PropertiesWindowTabPagePluginIface { Q_OBJECT public: static OpenWithPropertiesPageFactory *getInstance(); //plugin iface const QString name() override { return QObject::tr("Open With"); } PluginType pluginType() override { return PluginType::PropertiesWindowPlugin; } const QString description() override { return QObject::tr("open with."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } //properties plugin iface int tabOrder() override { return 700; } bool supportUris(const QStringList &uris) override; PropertiesWindowTabIface *createTabPage(const QStringList &uris) override; void closeFactory() override; private: explicit OpenWithPropertiesPageFactory(QObject *parent = nullptr); ~OpenWithPropertiesPageFactory(); }; } #endif //OPENWITHPROPERTIESPAGEFACTORY_H peony/stable/ukui3/properties-window/controls/computer-properties-page.h0000664000175000017500000000377215154271070025636 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLECOMPUTERPROPERTIESPAGE_H #define STABLECOMPUTERPROPERTIESPAGE_H #include #include "properties-window-tab-iface.h" #include "peony-core_global.h" #include "volume-manager.h" class QFormLayout; namespace Peony { class PEONYCORESHARED_EXPORT ComputerPropertiesPage : public PropertiesWindowTabIface { Q_OBJECT public: explicit ComputerPropertiesPage(const QString &uri, QWidget *parent = nullptr); protected: void addSeparator(); /** * \brief dbus获取文件系统函数 * \param uri * \return */ QString getFileSystemType(QString uri); /*! * \brief 通过给定的targetUri从全部卷中获取匹配的卷。 * \param targetUri 需要匹配的目标Uri (挂载路径) * \return 具有给定targetUri的卷,如果不存在则返回 nullptr */ static std::shared_ptr EnumerateOneVolumeByTargetUri(QString targetUri); /** * \brief 统一格式化容量字符串 * \param capacityNum * \return */ QString formatCapacityString(quint64 capacityNum); private: QString m_uri; QFormLayout *m_layout; // PropertiesWindowTabIface interface public: void saveAllChange(); }; } #endif // COMPUTERPROPERTIESPAGE_H peony/stable/ukui3/properties-window/common.json0000664000175000017500000000003315154271070021026 0ustar fengfeng{ "version": "3.2.2" } peony/stable/ukui3/properties-window/properties-window-factory.h0000664000175000017500000000505315154271070024171 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEPROPERTIESWINDOWFACTORY_H #define STABLEPROPERTIESWINDOWFACTORY_H #include #include #include "properties-window-factory-plugin-iface.h" #include "properties-window_global.h" namespace Peony { class PropertiesWindowTabPagePluginIface; class StablePropertiesWindow; /*! * \brief The StablePropertiesWindowFactory class * \deprecated */ class STABLEPROPERTIESWINDOW_EXPORT StablePropertiesWindowFactory : public QObject, public PropertiesWindowFactoryPluginIface { Q_OBJECT Q_PLUGIN_METADATA(IID PropertiesWindowFactoryPluginIface_iid FILE "common.json") Q_INTERFACES(Peony::PropertiesWindowFactoryPluginIface) public: static StablePropertiesWindowFactory *getInstance(); //plugin iface const QString version() override { return "ukui3.0"; } const QString name() override { return "ukui3.0"; } // PluginType pluginType() override { // return PluginType::PropertiesWindowPlugin; // } const QString description() override { return QObject::tr("Show properties plugin window."); } const QIcon icon() override { return QIcon::fromTheme("view-paged-symbolic", QIcon::fromTheme("folder")); } void setEnable(bool enable) override { Q_UNUSED(enable) } bool isEnable() override { return true; } QMainWindow *create(const QStringList &uris, QWidget *parent); void closeFactory(); explicit StablePropertiesWindowFactory(QObject *parent = nullptr); ~StablePropertiesWindowFactory() override {} bool registerFactory(QObject *factory); bool unregisterFactory(QObject *factory); void show(); private: StablePropertiesWindow* m_window = nullptr; }; } #endif // STABLEPROPERTIESWINDOWFACTORY_H peony/stable/ukui3/properties-window/properties-window-factory.cpp0000664000175000017500000000426415154271070024527 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2023, Tianjin KYLIN Information Technology Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "properties-window-factory.h" #include "properties-window.h" using namespace Peony; static StablePropertiesWindowFactory *global_instance = nullptr; StablePropertiesWindowFactory::StablePropertiesWindowFactory(QObject *parent) : QObject(parent) { PropertiesWindowPluginManager::getInstance()->initFactory(); } StablePropertiesWindowFactory *StablePropertiesWindowFactory::getInstance() { if (!global_instance) global_instance = new StablePropertiesWindowFactory; return global_instance; } QMainWindow *StablePropertiesWindowFactory::create(const QStringList &uris, QWidget *parent) { m_window = new StablePropertiesWindow(uris, parent); return m_window; } void StablePropertiesWindowFactory::closeFactory() { this->deleteLater(); } bool StablePropertiesWindowFactory::registerFactory(QObject *factory) { PropertiesWindowTabPagePluginIface *Iface = dynamic_cast(factory); return PropertiesWindowPluginManager::getInstance()->registerFactory(Iface); } bool StablePropertiesWindowFactory::unregisterFactory(QObject *factory) { PropertiesWindowTabPagePluginIface *Iface = dynamic_cast(factory); return PropertiesWindowPluginManager::getInstance()->unregisterFactory(Iface); } void StablePropertiesWindowFactory::show() { if (m_window) { m_window->show(); } } peony/stable/ukui3/properties-window/properties-window.pro0000664000175000017500000000600215154271106023070 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2023-11-29T09:45:20 # #------------------------------------------------- QT += network core widgets gui concurrent xml dbus #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized -Werror=unused-label include(../../../common.pri) include(../../../plugin-iface/unstable/window-plugin-iface.pri) include(controls/property-page.pri) INCLUDEPATH += $$PWD/../../../libpeony-qt/file-operation INCLUDEPATH += $$PWD/../../../libpeony-qt/file-launcher INCLUDEPATH += $$PWD/../../../libpeony-qt/model INCLUDEPATH += $$PWD/../../../libpeony-qt/vfs INCLUDEPATH += $$PWD/../../../libpeony-qt/convenient-utils INCLUDEPATH += $$PWD/../../../libpeony-qt/convenient-utils/disc INCLUDEPATH += $$PWD/../../../libpeony-qt/effects INCLUDEPATH += $$PWD/../../../plugin-iface/ INCLUDEPATH += $$PWD/../../../libpeony-qt/ INCLUDEPATH += $$PWD/../../../libpeony-qt/thumbnail DISTFILES += $$PWD/common.json PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 poppler-qt6 gsettings-qt6 libcanberra libnotify udisks2 openssl dconf KF6WindowSystem LIBS +=-L$$PWD/../../../libpeony-qt/ -lpeony -lX11 -lukui-log4qt CONFIG += debug link_pkgconfig plugin no_keywords TARGET = stable-properties-window TEMPLATE = lib DEFINES += STABLEPROPERTIESWINDOW_LIBRARY CONFIG += c++11 #contains(DEFINES, KY_FILE_DIALOG) { # PKGCONFIG += kysdk-qtwidgets #} #contains(DEFINES, KY_SDK_SYSINFO) { # PKGCONFIG += kysdk-sysinfo #} #contains(DEFINES, KY_SDK_QT_WIDGETS) { # PKGCONFIG += kysdk-qtwidgets #} #contains(DEFINES, KY_SDK_WAYLANDHELPER) { # PKGCONFIG += kysdk-waylandhelper #} #contains(DEFINES, KY_SDK_SYSINFO) { # PKGCONFIG += kysdk-sysinfo #} #schemes.files += org.ukui.peony.settings.gschema.xml #schemes.path = /usr/share/glib-2.0/schemas/ PROPERTIES_WINDOW_PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/peony-properties-window DEFINES += PROPERTIES_WINDOW_PLUGIN_INSTALL_DIRS='\\"$${PROPERTIES_WINDOW_PLUGIN_INSTALL_DIRS}\\"' #QMAKE_CXXFLAGS += -execution-charset:utf-8 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ properties-window-factory.cpp \ properties-window.cpp HEADERS += \ properties-window.h \ properties-window_global.h \ properties-window-factory.h \ # Default rules for deployment. unix { target.path = $$[QT_INSTALL_LIBS]/peony-properties-window } !isEmpty(target.path): INSTALLS += target peony/stable/ukui3/properties-window/properties-window_global.h0000664000175000017500000000200715154271070024040 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2023, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * */ #ifndef DEVELCONTROL_GLOBAL_H #define DEVELCONTROL_GLOBAL_H #include #if defined(STABLEPROPERTIESWINDOW_LIBRARY) # define STABLEPROPERTIESWINDOW_EXPORT Q_DECL_EXPORT #else # define STABLEPROPERTIESWINDOW_EXPORT Q_DECL_IMPORT #endif #endif // DEVELCONTROL_GLOBAL_H peony/stable/ukui3/properties-window/properties-window.h0000664000175000017500000001373415154271070022531 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEPROPERTIESWINDOW_H #define STABLEPROPERTIESWINDOW_H #include #include #include "properties-window_global.h" #include "properties-window-tab-iface.h" #include #include #include #include #include #include namespace Peony { class PropertiesWindowTabPagePluginIface; class PropertiesWindowPluginManager : public QObject { friend class PropertiesWindow; Q_OBJECT public: static PropertiesWindowPluginManager* getInstance(); void release(); void setOpenFromDesktop(); void setOpenFromPeony(); bool registerFactory(PropertiesWindowTabPagePluginIface *factory); bool unregisterFactory(PropertiesWindowTabPagePluginIface *factory); const QStringList getFactoryNames(); PropertiesWindowTabPagePluginIface *getFactory(const QString &id); void initFactory(); private: explicit PropertiesWindowPluginManager(QObject *parent = nullptr); ~PropertiesWindowPluginManager() override; QHash m_factory_hash; QMap m_sorted_factory_map; QMutex m_mutex; }; class STABLEPROPERTIESWINDOW_EXPORT StablePropertiesWindow : public QMainWindow { Q_OBJECT public: explicit StablePropertiesWindow(const QStringList &uris, QWidget *parent = nullptr); void setWindowTitleTextAndIcon(); /*! * 判断当前的uris中是否'不存在'目录 * \brief notDir * \return */ void notDir(); void gotoAboutComputer(); void show(); void init(); /*! * 初始化底部按钮栏 * \brief initStatusBar */ void initStatusBar(); /*! * 设置tab栏的样式。 * FIX:目前tab样式不能跟随主题 * \brief initTabPage * \param uris */ void initTabPage(const QStringList &uris); /*! * \brief 获取一些桌面文件的图标 - Get the icons of some desktop files * \param fileInfo * \return */ QString getIconName(); QStringList &getUris() { return m_uris; } /*! * 检查当前的uris是否已经在窗口中打开 * 如果已经打开,那么返回true, * 如果没有打开,那么返回false * \brief checkUriIsOpen * \param uris * \return */ static bool checkUriIsOpen(QStringList &uris, StablePropertiesWindow *newWindow); /*! * 返回指定uris在 openPropertiesWindows 中的索引,如果不存在,返回 -1 * Returns the index of the specified uris in openPropertiesWindows, if it does not exist, returns -1 * \brief getOpenUriIndex * \return */ static qint64 getOpenUriIndex(QStringList &uris); /*! * 从已打开窗口列表中删除索引的窗口 * \brief removeThisWindow * \param index */ static void removeThisWindow(qint64 index); /*! * 存放当前窗口的所有tab页面 * \brief addTabPage * \param tabPage */ void addTabPage(PropertiesWindowTabIface *tabPage) { if (tabPage) { m_openTabPage.append(tabPage); connect(tabPage, &PropertiesWindowTabIface::requestCloseMainWindow, this, [=]() { Q_ASSERT(tabPage); this->close(); }); } } /*! * 响应确认按钮 * \brief saveAllChanged */ void saveAllChanged(); /** * @brief 收藏夹中的文件夹是以favorite:// 开头的,但是该uri的schema无法正常确定文件的位置, * 所以在该uri最后附带了query列表 schema=xxx以说明该文件的实际schema。 * 该函数通过解析query列表获取正确的uri。 * 修改直接在引用的参数 uri上进行。 * @param uri * @return */ QString rebuildUriBySchema(QString &uri); /** * @brief 对kmre-vfs中的文件进行特殊处理,以获取真实路径 * @param uri * @return */ bool handleKMREUri(QString &uri); protected: /** * 在窗口关闭时,将存储的窗口指针从openPropertiesWindows中删除 * @brief closeEvent * @param event */ void closeEvent(QCloseEvent *event); private: bool m_notDir = true; std::shared_ptr m_fileInfo = nullptr; bool m_destroyThis = false; QStringList m_uris; QList m_openTabPage; public: //init in properties-window.cpp static const qint32 s_windowWidth; static const qint32 s_windowHeightFolder; static const qint32 s_windowHeightOther; static const QSize s_bottomButtonSize; // QWidget interface }; class tabStyle : public QProxyStyle { // QStyle interface public: void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; QSize sizeFromContents(QStyle::ContentsType ct, const QStyleOption *opt, const QSize &contentsSize, const QWidget *w) const; }; class PropertiesWindowPrivate : public QTabWidget { friend class StablePropertiesWindow; Q_OBJECT private: explicit PropertiesWindowPrivate(const QStringList &uris, QWidget *parent = nullptr); }; } #endif // DEVELPROPERTIESWINDOW_H peony/stable/ukui3/properties-window/properties-window-plugin-manager.h0000664000175000017500000000351515154271070025431 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef STABLEPROPERTIESWINDOWPLUGINMANAGER_H #define STABLEPROPERTIESWINDOWPLUGINMANAGER_H #include "peony-core_global.h" #include "properties-window-tab-iface.h" #include #include namespace Peony { class PropertiesWindowTabPagePluginIface; class PropertiesWindowPluginManager : public QObject { friend class PropertiesWindowFactory; Q_OBJECT public: //static PropertiesWindowPluginManager* getInstance(); void release(); void setOpenFromDesktop(); void setOpenFromPeony(); bool registerFactory(PropertiesWindowTabPagePluginIface *factory); bool unregisterFactory(PropertiesWindowTabPagePluginIface *factory); const QStringList getFactoryNames(); PropertiesWindowTabPagePluginIface *getFactory(const QString &id); explicit PropertiesWindowPluginManager(QObject *parent = nullptr); ~PropertiesWindowPluginManager() override; private: QHash m_factory_hash; QMap m_sorted_factory_map; QMutex m_mutex; }; } #endif // PROPERTIESWINDOW_H peony/stable/ukui3/properties-window/properties-window.cpp0000664000175000017500000006170615154271106023066 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "properties-window.h" #include "properties-window-tab-page-plugin-iface.h" #include "basic-properties-page-factory.h" #include "permissions-properties-page-factory.h" #include "computer-properties-page-factory.h" #include "recent-and-trash-properties-page-factory.h" #include "mark-properties-page-factory.h" #include "open-with-properties-page-factory.h" #include "details-properties-page-factory.h" #include "thumbnail-manager.h" #include "file-utils.h" #include "vfs-plugin-manager.h" //#include "properties-window-factory.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "file-info-job.h" using namespace Peony; #define WINDOW_NOT_OPEN -1 //single properties-window //static QHash openPropertiesWindow = nullptr; static QList *openedPropertiesWindows = nullptr; //plugin manager static PropertiesWindowPluginManager *global_instance = nullptr; PropertiesWindowPluginManager *PropertiesWindowPluginManager::getInstance() { if (!global_instance) global_instance = new PropertiesWindowPluginManager; return global_instance; } void PropertiesWindowPluginManager::setOpenFromDesktop() { unregisterFactory(MarkPropertiesPageFactory::getInstance()); } void PropertiesWindowPluginManager::setOpenFromPeony() { registerFactory(MarkPropertiesPageFactory::getInstance()); } void PropertiesWindowPluginManager::release() { deleteLater(); } PropertiesWindowPluginManager::PropertiesWindowPluginManager(QObject *parent) : QObject(parent) { //register internal factories. // registerFactory(BasicPropertiesPageFactory::getInstance()); // registerFactory(PermissionsPropertiesPageFactory::getInstance()); // registerFactory(ComputerPropertiesPageFactory::getInstance()); // registerFactory(RecentAndTrashPropertiesPageFactory::getInstance()); // registerFactory(MarkPropertiesPageFactory::getInstance()); // registerFactory(OpenWithPropertiesPageFactory::getInstance()); // registerFactory(DetailsPropertiesPageFactory::getInstance()); } PropertiesWindowPluginManager::~PropertiesWindowPluginManager() { for (auto factory : m_factory_hash) { factory->closeFactory(); } m_factory_hash.clear(); } bool PropertiesWindowPluginManager::registerFactory(PropertiesWindowTabPagePluginIface *factory) { m_mutex.lock(); auto id = factory->name(); if (m_factory_hash.value(id)) { m_mutex.unlock(); return false; } m_factory_hash.insert(id, factory); m_sorted_factory_map.insert(-factory->tabOrder(), id); m_mutex.unlock(); return true; } bool PropertiesWindowPluginManager::unregisterFactory(PropertiesWindowTabPagePluginIface *factory) { m_mutex.lock(); auto id = factory->name(); if (m_factory_hash.value(id)) { m_factory_hash.remove(id); int current = 0; for (auto i = m_sorted_factory_map.begin(); i != m_sorted_factory_map.end(); ++i) { if (i.value() == id) { current = i.key(); break; } } m_sorted_factory_map.remove(current); m_mutex.unlock(); return true; } m_mutex.unlock(); return false; } const QStringList PropertiesWindowPluginManager::getFactoryNames() { QStringList list; for (auto factoryId : m_sorted_factory_map) { list << factoryId; } return list; } void PropertiesWindowPluginManager::initFactory() { registerFactory(BasicPropertiesPageFactory::getInstance()); registerFactory(PermissionsPropertiesPageFactory::getInstance()); registerFactory(ComputerPropertiesPageFactory::getInstance()); registerFactory(RecentAndTrashPropertiesPageFactory::getInstance()); registerFactory(MarkPropertiesPageFactory::getInstance()); registerFactory(OpenWithPropertiesPageFactory::getInstance()); registerFactory(DetailsPropertiesPageFactory::getInstance()); } PropertiesWindowTabPagePluginIface *PropertiesWindowPluginManager::getFactory(const QString &id) { return m_factory_hash.value(id); } /*! * init PropertiesWindows`s static member * \brief PropertiesWindow::s_windowWidth */ const qint32 StablePropertiesWindow::s_windowWidth = 460; const qint32 StablePropertiesWindow::s_windowHeightFolder = 600; const qint32 StablePropertiesWindow::s_windowHeightOther = 652; const QSize StablePropertiesWindow::s_bottomButtonSize = QSize(96, 36); StablePropertiesWindow::StablePropertiesWindow(const QStringList &uris, QWidget *parent) : QMainWindow(parent) { qDebug() << "llllllllllllllllllllllllllllllllll"; if (uris.count() == 0) { m_destroyThis = true; return; } //将uri编码统一解码,解决uri的不一致问题。from bug:53504 for (QString uri : uris) { uri = FileUtils::urlDecode(uri); if (uri.startsWith("favorite://")) { rebuildUriBySchema(uri); } else if (uri.startsWith("kmre://")) { if (!handleKMREUri(uri)) { m_destroyThis = true; return; } } else if (uri.startsWith("network://")) { m_destroyThis = true; return; } //fix bug:70565,将已被编码的字符串解码后从新编码,保证在属性窗口中的编码中特殊字符为%xx形式。 //编码时排除'()',防止 FileUtils::handleDesktopFileName 方法匹配不到(),避免出现bug:53504. m_uris.append(uri.toUtf8().toPercentEncoding(":/()")); } // m_uris = uris; m_uris.removeDuplicates(); qDebug() << __FUNCTION__ << m_uris.count() << m_uris; setWindowOpacity(0); if (qApp->property("showProperties").isValid() && qApp->property("showProperties").toBool()) { PropertiesWindowPluginManager::getInstance()->setOpenFromDesktop(); qApp->setProperty("showProperties", false); } else { PropertiesWindowPluginManager::getInstance()->setOpenFromPeony(); } //FIX:BUG #31635 if (m_uris.contains("computer:///")) { QtConcurrent::run([=]() { gotoAboutComputer(); }); m_uris.removeAt(m_uris.indexOf("computer:///")); } this->notDir(); if (!m_uris.isEmpty() && !StablePropertiesWindow::checkUriIsOpen(m_uris, this)) { this->init(); } else { m_destroyThis = true; } connect(qApp, &QApplication::fontChanged, [=](){ QFont font = qApp->font(); for (auto widget : qApp->allWidgets()) { widget->setFont(font); } }); if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *settings = new QGSettings("org.ukui.style", QByteArray(), this); connect(settings, &QGSettings::changed, this, [=](const QString &key) { if("iconThemeName" == key) { if (!m_uris.isEmpty()) { this->setWindowTitleTextAndIcon(); } } }); } } void StablePropertiesWindow::init() { this->setContextMenuPolicy(Qt::CustomContextMenu); this->setAttribute(Qt::WA_DeleteOnClose); this->setContentsMargins(0, 10, 0, 0); //only show close button this->setWindowFlags(this->windowFlags() & ~Qt::WindowMinMaxButtonsHint & ~Qt::WindowSystemMenuHint); this->setWindowTitleTextAndIcon(); //KWindowSystem::setState(this->winId(), NET::SkipTaskbar|NET::SkipPager); if (m_notDir) { //如果含有文件夹,那么高度是600,如果是其他文件,那么高度是652 //If there are folders, the height is 600, if it is other files, the height is 652 this->setFixedSize(StablePropertiesWindow::s_windowWidth, StablePropertiesWindow::s_windowHeightOther); } else { this->setFixedSize(StablePropertiesWindow::s_windowWidth, StablePropertiesWindow::s_windowHeightFolder); } this->initStatusBar(); this->initTabPage(m_uris); QTimer::singleShot(400, Qt::PreciseTimer, this, [=]{ //fix bug:58167 setFocus(Qt::OtherFocusReason); setWindowOpacity(1); }); } /*! * recent:/// : 最近 * trash:/// : 回收站 * * \brief PropertiesWindow::setWindowTitleText */ void StablePropertiesWindow::setWindowTitleTextAndIcon() { QString windowTitle = ""; QString iconName = "system-file-manager"; /** * \brief Trash 和 Recent 情况下,uris中只有一个uri - In the case of Trash and Recent, there is only one uri in the uris */ if (m_uris.contains("trash:///")) { windowTitle = tr("Trash"); iconName = m_fileInfo.get()->iconName(); } else if (m_uris.contains("recent:///")) { windowTitle = tr("Recent"); iconName = m_fileInfo.get()->iconName(); } else { qint32 fileNum = m_uris.count(); if (fileNum > 1) { //use default icon windowTitle = tr("Selected") + QString(tr(" %1 Files")).arg(fileNum); } else { qDebug() << __FILE__ << __FUNCTION__ << "fileInfo is null :" << (m_fileInfo.get() == nullptr); if (m_fileInfo) { //fix bug:#82320 QRegularExpression regex("^file:///data/usershare(/{,1})$"); QRegularExpressionMatch match = regex.match(m_fileInfo->uri()); if (match.hasMatch()) { windowTitle = tr("usershare"); } else { windowTitle = m_fileInfo.get()->displayName(); } //fix bug#182415, fix show unknow-icon issue, but basic info icon is correct iconName = FileUtils::getFileIconName(m_fileInfo.get()->uri(), true); if (iconName.isEmpty()) { iconName = FileUtils::getFileIconName(m_fileInfo.get()->uri(), false); } if("computer:///ukui-data-volume" == m_fileInfo->uri()){ windowTitle = tr("Data"); iconName = "drive-harddisk"; } } } } windowTitle += " " + tr("Properties"); if (iconName == "application-x-desktop") { iconName = getIconName(); } const QByteArray id("org.ukui.style"); if (QGSettings::isSchemaInstalled(id)) { QGSettings *styleSettings = new QGSettings(id, QByteArray(), this); connect(styleSettings, &QGSettings::changed, this, [=](const QString &key){ if (key == "iconThemeName") { setWindowIcon(QIcon::fromTheme(iconName, QIcon::fromTheme("unknown"))); } }); } this->setWindowIcon(QIcon::fromTheme(iconName, QIcon::fromTheme("unknown"))); this->setWindowTitle(windowTitle); } void StablePropertiesWindow::notDir() { //FIXME:请尝试使用非阻塞方式获取 FIleInfo - Please try to obtain FIleInfo in a non-blocking way bool first = true; QStringList targetUris; for (QString uri : m_uris) { auto fileInfo = FileInfo::fromUri(uri); FileInfoJob *fileInfoJob = new FileInfoJob(fileInfo); fileInfoJob->setAutoDelete(); fileInfoJob->querySync(); if (first) { //使用第一个文件信息确认所在目录等基本信息。 //在最近文件夹中多选状态下,文件所在位置将会不准确,因为最近文件夹中的文件来自于不同的位置。 m_fileInfo = fileInfo; first = false; } if (fileInfo.get()->isDir() && m_notDir) { m_notDir = false; } if (uri.startsWith("recent://")) { if (fileInfo->targetUri() != "") { targetUris.append(fileInfo->targetUri()); } } } if (targetUris.count() > 0) m_uris = targetUris; } void StablePropertiesWindow::show() { if (m_destroyThis) { this->close(); return; } return QWidget::show(); } void StablePropertiesWindow::gotoAboutComputer() { QProcess p; p.setProgram("/usr/bin/ukui-control-center"); //-m About para to show about computer infos, related to bug#88258 p.setArguments(QStringList()<<"-m" << "About"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) p.startDetached(); #else p.startDetached("/usr/bin/ukui-control-center", QStringList()<<"-m" << "About"); #endif p.waitForFinished(-1); } /*! * * \brief PropertiesWindow::initStatusBar */ void StablePropertiesWindow::initStatusBar() { QToolBar *bottomToolBar = new QToolBar(this); bottomToolBar->setMovable(false); bottomToolBar->setMinimumSize(StablePropertiesWindow::s_windowWidth, 64); bottomToolBar->setStyleSheet("QToolBar{border-color: transparent;border: none;}"); QWidget *container = new QWidget(bottomToolBar); container->setContentsMargins(0, 0, 0, 0); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // use button-box 暂时不能使用button box实现底部按钮 // QDialogButtonBox *buttonBox = new QDialogButtonBox(Qt::Horizontal,statusBar); // buttonBox->setMinimumSize(PropertiesWindow::s_windowWidth,64); // buttonBox->setContentsMargins(0,0,16,0); // QPushButton *cancelButton = buttonBox->addButton(tr("Cancel"),QDialogButtonBox::RejectRole); // QPushButton *okButton = buttonBox->addButton(tr("Ok"),QDialogButtonBox::AcceptRole); // okButton->setMinimumSize(PropertiesWindow::s_bottomButtonSize); // cancelButton->setMinimumSize(PropertiesWindow::s_bottomButtonSize); // statusBar->addWidget(buttonBox); //use HBox-layout QHBoxLayout *bottomToolLayout = new QHBoxLayout(container); bottomToolLayout->setSpacing(16); bottomToolLayout->setContentsMargins(0, 0, 16, 0); QPushButton *okButton = new QPushButton(tr("Ok"), container); QPushButton *cancelButton = new QPushButton(tr("Cancel"), container); okButton->setMinimumSize(StablePropertiesWindow::s_bottomButtonSize); cancelButton->setMinimumSize(StablePropertiesWindow::s_bottomButtonSize); bottomToolLayout->addStretch(1); bottomToolLayout->addWidget(cancelButton); bottomToolLayout->addWidget(okButton); container->setLayout(bottomToolLayout); bottomToolBar->addWidget(container); this->addToolBar(Qt::ToolBarArea::BottomToolBarArea, bottomToolBar); //set cancelButton event process connect(cancelButton, &QPushButton::clicked, this, &QMainWindow::close); connect(okButton, &QPushButton::clicked, this, &StablePropertiesWindow::saveAllChanged); } void StablePropertiesWindow::initTabPage(const QStringList &uris) { if(uris.isEmpty()) return; auto window = new PropertiesWindowPrivate(uris, this); window->tabBar()->setStyle(new tabStyle); //Warning: 不要设置tab高度,否则会导致tab页切换上下跳动 //Do not set the tab height, otherwise it will cause the tab page to switch up and down //window->tabBar()->setMinimumHeight(72); this->setCentralWidget(window); } bool StablePropertiesWindow::checkUriIsOpen(QStringList &uris, StablePropertiesWindow *newWindow) { if (!openedPropertiesWindows) { openedPropertiesWindows = new QList(); qDebug() << __FILE__ << __FUNCTION__ << "new->openedPropertiesWindows"; } //1.对uris进行排序 - Sort uris std::sort(uris.begin(), uris.end(), [](QString a, QString b) { return a < b; }); //2.检查是否已经打开 - Check if it is open qint64 index = StablePropertiesWindow::getOpenUriIndex(uris); if (index != WINDOW_NOT_OPEN) { openedPropertiesWindows->at(index)->raise(); return true; } openedPropertiesWindows->append(newWindow); return false; } qint64 StablePropertiesWindow::getOpenUriIndex(QStringList &uris) { //strong ! if (!openedPropertiesWindows) return WINDOW_NOT_OPEN; quint64 index = 0; for (StablePropertiesWindow *window : *openedPropertiesWindows) { if (window->getUris() == uris) { //当前的uris已经存在打开的窗口 - The current uris already exists in the open window return index; } index++; } return WINDOW_NOT_OPEN; } void StablePropertiesWindow::removeThisWindow(qint64 index) { if (index == WINDOW_NOT_OPEN) return; if (!openedPropertiesWindows) return; openedPropertiesWindows->removeAt(index); if (openedPropertiesWindows->count() == 0) { delete openedPropertiesWindows; openedPropertiesWindows = nullptr; qDebug() << __FILE__ << __FUNCTION__ << "delete->openedPropertiesWindows"; } } QString StablePropertiesWindow::getIconName() { if (m_fileInfo == nullptr) return "application-x-desktop"; QString realPath; bool startWithTrash = m_fileInfo->uri().startsWith("trash:///"); bool startWithRecent = m_fileInfo->uri().startsWith("recent:///"); if (startWithTrash) { realPath = QStandardPaths::standardLocations(QStandardPaths::HomeLocation).first() + "/.local/share/Trash/files/" + m_fileInfo->displayName(); } else if (startWithRecent) { realPath = m_fileInfo->targetUri(); } else { realPath = m_fileInfo->uri(); } auto _desktop_file = g_desktop_app_info_new_from_filename(QUrl(realPath).path().toUtf8().constData()); if (_desktop_file) { return QString(g_desktop_app_info_get_string(_desktop_file, "Icon")); } //在找不到图标时,返回默认图标 - When the icon is not found, return to the default icon return "application-x-desktop"; } void StablePropertiesWindow::closeEvent(QCloseEvent *event) { /** * \brief 如果当前uris窗口已经打开,那么不能移除全局的记录,只需要关闭当前窗口即可 * If the current uris window is already open, then the global record cannot be removed, just close the current window */ if (m_destroyThis) return; StablePropertiesWindow::removeThisWindow(StablePropertiesWindow::getOpenUriIndex(this->getUris())); } /*! * save all changed settings when 'ok' is clicked * \brief PropertiesWindow::saveAllChanged */ void StablePropertiesWindow::saveAllChanged() { qDebug() << "PropertiesWindow::saveAllChanged()" << "count" << m_openTabPage.count(); if (!m_openTabPage.count() == 0) { for (auto tabPage : m_openTabPage) { tabPage->saveAllChange(); } } this->close(); } QString StablePropertiesWindow::rebuildUriBySchema(QString &uri) { QUrl url(uri); if (!url.isValid()) { return uri; } QMap queryMap; QStringList queryList = url.query().split("&"); for (QString str : queryList) { QStringList query = str.split("="); queryMap.insert(query.first(), query.last()); } QString schema = queryMap.value("schema"); if (schema.isEmpty()) { return uri; } uri.replace(0, QString("favorite").length(), schema); //删除uri '?'及之后的信息 uri.remove(uri.lastIndexOf("?"), (url.query().length() + 1)); return uri; } bool StablePropertiesWindow::handleKMREUri(QString &uri) { // bool kmreIsInstalled = false; // for (VFSPluginIface *vfs : VFSPluginManager::getInstance()->registeredPlugins()) { // if (vfs->uriScheme() == "kmre://") { // kmreIsInstalled = true; // break; // } // } // // if (!kmreIsInstalled) { // return false; // } if (uri == "kmre:///") { uid_t uid = geteuid(); struct passwd *pw = getpwuid(uid); if (!pw) { return false; } uri = QString("file:///var/lib/kmre/data/kmre-%1-%2").arg(QString::number(uid)).arg(QString(pw->pw_name)); } else if (uri.contains("&real-path:")) { //kmre:///picture&real-path:/var/lib uri = "file://" + uri.split("&real-path:").last(); } else { } return true; } //properties window PropertiesWindowPrivate::PropertiesWindowPrivate(const QStringList &uris, QWidget *parent) : QTabWidget(parent) { setTabsClosable(false); setMovable(false); setContentsMargins(0, 0, 0, 0); //监听悬浮事件 this->tabBar()->setAttribute(Qt::WA_Hover, true); auto manager = PropertiesWindowPluginManager::getInstance(); auto names = manager->getFactoryNames(); int index = 0; for (auto name : names) { auto factory = manager->getFactory(name); if (factory->supportUris(uris)) { auto tabPage = factory->createTabPage(uris); tabPage->setParent(this); addTab(tabPage, factory->name()); setTabToolTip(index, factory->name()); ++index; (qobject_cast(parent))->addTabPage(tabPage); } } } void tabStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { /** * FIX:需要修复颜色不能跟随主题的问题 * \brief */ if (element == CE_TabBarTab) { if (const QStyleOptionTab *tab = qstyleoption_cast(option)) { //设置按钮的左右上下偏移 QRect rect = tab->rect; //顶部下移8px rect.setTop(rect.y() + 8); //底部上移8px rect.setBottom((rect.y() + rect.height()) - 8); //左侧移动4px rect.setLeft(rect.x() + 4); //右侧移动2px rect.setRight((rect.x() + rect.width()) - 2); const QPalette &palette = widget->palette(); //未选中时文字颜色 - Text color when not selected painter->setPen(palette.color(QPalette::ButtonText)); if (tab->state & QStyle::State_Selected) { painter->save(); painter->setPen(palette.color(QPalette::Highlight)); painter->setBrush(palette.brush(QPalette::Highlight)); painter->setRenderHint(QPainter::Antialiasing); // 反锯齿; painter->drawRoundedRect(rect, 4, 4); painter->restore(); //选中时文字颜色 - Text color when selected painter->setPen(palette.color(QPalette::HighlightedText)); } else if (tab->state & QStyle::State_MouseOver) { painter->save(); QColor color = palette.color(QPalette::Highlight).lighter(140); painter->setPen(color); painter->setBrush(color); painter->setRenderHint(QPainter::Antialiasing); // 反锯齿; painter->drawRoundedRect(rect,4,4); painter->restore(); //选中时文字颜色 - Text color when selected painter->setPen(palette.color(QPalette::HighlightedText)); } else if (tab->state & QStyle::State_MouseOver) { painter->save(); QColor color = palette.color(QPalette::Highlight).lighter(140); painter->setPen(color); painter->setBrush(color); painter->setRenderHint(QPainter::Antialiasing); // 反锯齿; painter->drawRoundedRect(rect, 4, 4); painter->restore(); } painter->drawText(rect, tab->text, QTextOption(Qt::AlignCenter)); return; } } if (element == CE_TabBarTabLabel) { qApp->style()->drawControl(element, option, painter, widget); } } QSize tabStyle::sizeFromContents(QStyle::ContentsType ct, const QStyleOption *opt, const QSize &contentsSize, const QWidget *widget) const { QSize barSize = QProxyStyle::sizeFromContents(ct, opt, contentsSize, widget); if (ct == QStyle::CT_TabBarTab) { barSize.transpose(); const QStyleOptionTab *tab = qstyleoption_cast(opt); //解决按钮不能自适应的问题 int fontWidth = tab->fontMetrics.horizontalAdvance(tab->text); //宽度统一加上30px barSize.setWidth(fontWidth + 30); //46 - 8 - 8 = 30; barSize.setHeight(46); } return barSize; } peony/stable/ukui3/windows/0000775000175000017500000000000015167662230014646 5ustar fengfengpeony/stable/ukui3/windows/common.json0000664000175000017500000000003315154271070017017 0ustar fengfeng{ "version": "3.2.2" } peony/stable/ukui3/windows/windows.pro0000664000175000017500000000530715154271106017061 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2023-11-29T09:45:20 # #------------------------------------------------- QT += network core widgets gui concurrent xml dbus greaterThan(QT_MAJOR_VERSION, 4): QT += widgets #QMAKE_CXXFLAGS += -Werror=return-type -Werror=return-local-addr -Werror=uninitialized -Werror=unused-label include(../../../common.pri) include(../../../libpeony-qt/libpeony-qt-header.pri) include(../../../3rd-parties/SingleApplication/singleapplication.pri) include(../../../src/windows/windows.pri) include(../control/control.pri) include(../../../plugin-iface/unstable/window-plugin-iface.pri) DISTFILES += $$PWD/common.json DEFINES += QAPPLICATION_CLASS=QApplication PKGCONFIG +=gio-2.0 glib-2.0 gio-unix-2.0 gsettings-qt6 libcanberra libnotify udisks2 openssl dconf KF6WindowSystem LIBS +=-L$$PWD/../../../libpeony-qt/ -lgio-2.0 -lglib-2.0 -lX11 -lukui-log4qt -lpeony #CONFIG += c++11 link_pkgconfig no_keywords lrelease CONFIG += debug link_pkgconfig plugin TARGET = stable-main-window TEMPLATE = lib DEFINES += DEVELCONTROL_LIBRARY CONFIG += c++11 contains(DEFINES, KY_FILE_DIALOG) { PKGCONFIG += kysdk-qtwidgets } contains(DEFINES, KY_SDK_SYSINFO) { PKGCONFIG += kysdk-sysinfo } contains(DEFINES, KY_SDK_QT_WIDGETS) { PKGCONFIG += kysdk-qtwidgets } contains(DEFINES, KY_SDK_WAYLANDHELPER) { PKGCONFIG += kysdk-waylandhelper } contains(DEFINES, KY_SDK_SYSINFO) { PKGCONFIG += kysdk-sysinfo } schemes.files += org.ukui.peony.settings.gschema.xml schemes.path = /usr/share/glib-2.0/schemas/ WINDOW_PLUGIN_INSTALL_DIRS = $$[QT_INSTALL_LIBS]/peony-main-window DEFINES += WINDOW_PLUGIN_INSTALL_DIRS='\\"$${WINDOW_PLUGIN_INSTALL_DIRS}\\"' QMAKE_CXXFLAGS += -execution-charset:utf-8 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main-window.cpp \ main-window-factory.cpp \ peony-main-window-style.cpp HEADERS += \ main-window-factory.h \ main-window.h \ peony-main-window-style.h \ windows_global.h # Default rules for deployment. unix { target.path = $$[QT_INSTALL_LIBS]/peony-main-window } !isEmpty(target.path): INSTALLS += target peony/stable/ukui3/windows/main-window.cpp0000664000175000017500000017747515154271106017622 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "main-window.h" #include "header-bar.h" #include "global-settings.h" #include "border-shadow-effect.h" #include "directoryviewhelper.h" //#include #include #include //#include #include #include #include #include "side-bar-proxy-filter-sort-model.h" #include "side-bar-model.h" #include "directory-view-container.h" #include "tab-widget.h" #include "tab-status-bar.h" #include "x11-window-manager.h" #include "properties-window-factory-plugin-manager.h" //#include "properties-window.h" #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "navigation-side-bar.h" #include "advance-search-bar.h" #include "status-bar.h" #include "peony-main-window-style.h" #include "file-operation-manager.h" #include "file-operation-utils.h" #include "file-utils.h" #include "create-template-operation.h" #include "file-operation-error-dialog.h" #include "clipboard-utils.h" #include "search-vfs-uri-parser.h" #include "file-delete-operation.h" #include "directory-view-menu.h" #include "directory-view-widget.h" #include "main-window-factory.h" #include "thumbnail-manager.h" #include "../peony-application.h" #include "global-settings.h" #include "audio-play-manager.h" #include "float-pane-widget.h" #include "file-meta-info.h" #include "sound-effect.h" #include "location-bar.h" #include "file-launch-action.h" #include "file-launch-manager.h" #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) #include #endif #include #include #include #include // NOTE build failed on Archlinux. Can't detect `QGSettings/QGSettings' header // fixed by replaced `QGSettings/QGSettings' with `QGSettings' #include #include #include #include static MainWindow *last_resize_window = nullptr; static QWidgetList blur_window_list; MainWindow::MainWindow(const QString &uri, QWidget *parent) : QMainWindow(parent) { // try fix #162452, filedialog changes peony main windows view type and sort options. setObjectName("_peony_mainwindow"); setContextMenuPolicy(Qt::CustomContextMenu); installEventFilter(this); //use qApp set window icon, task#29435 qApp->setWindowIcon(QIcon::fromTheme("system-file-manager")); //setWindowTitle(tr("File Manager")); //check all settings and init checkSettings(); setStyle(PeonyMainWindowStyle::getStyle()); m_effect = new BorderShadowEffect(this); m_effect->setPadding(0); m_effect->setBorderRadius(0); m_effect->setBlurRadius(0); //setGraphicsEffect(m_effect); setAnimated(false); setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_TranslucentBackground); //setAttribute(Qt::WA_OpaquePaintEvent); //fix double window base buttons issue, not effect MinMax button hints //auto flags = windowFlags() &~Qt::WindowMinMaxButtonsHint; //setWindowFlags(flags |Qt::FramelessWindowHint); //setWindowFlags(windowFlags()|Qt::FramelessWindowHint); //setContentsMargins(4, 4, 4, 4); //disable style window manager setProperty("useStyleWindowManager", false); //set minimum width by design request setMinimumWidth(WINDOW_MINIMUM_WIDTH); //init UI initUI(uri); // set tab order if (XAtomHelper::isPlatformX11()) { XAtomHelper::getInstance()->setUKUIDecoraiontHint(this->winId(), true); MotifWmHints hints; hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; hints.functions = MWM_FUNC_ALL; hints.decorations = MWM_DECOR_BORDER; XAtomHelper::getInstance()->setWindowMotifHint(this->winId(), hints); Window rootWindow = 0; int screen = 0; if (auto *x11App = qApp->nativeInterface()) { Display *display = XAtomHelper::getDisplay(); screen = DefaultScreen(display); rootWindow = RootWindow(display, screen); NETWinInfo info(x11App->connection(), this->winId(), rootWindow, NET::Properties(), NET::WM2DesktopFileName); info.setDesktopFileName("peony"); } } startMonitorThumbnailForbidStatus(); auto start_cost_time = QDateTime::currentMSecsSinceEpoch() - qApp->property("startTime").toLongLong();//PeonyApplication::peony_start_time; qDebug() << "peony start end in main-window time:" <getView()->setSelections(selectionUris); getCurrentPage()->getView()->scrollToSelection(selectionUris.first()); }); }); } MainWindow::~MainWindow() { blur_window_list.removeOne(this); //fix bug 40913, when window is maximazed, not update size if (last_resize_window == this && !isMaximized()) { auto settings = Peony::GlobalSettings::getInstance(); settings->setValue(DEFAULT_WINDOW_SIZE, this->size()); last_resize_window = nullptr; } } void MainWindow::updateDateFormat(QString dateFormat) { //update date and time show format, task #101605 qDebug() << "sdk format signal:"<refresh(); m_date_format = dateFormat; } } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseMove) { auto me = static_cast(event); auto widget = this->childAt(me->pos()); if (!widget) { // set default sidebar width flag m_should_save_side_bar_width = true; } } if (event->type() == QEvent::MouseButtonRelease) { if (m_should_save_side_bar_width) { // real set default side bar width auto settings = Peony::GlobalSettings::getInstance(); settings->setValue(DEFAULT_SIDEBAR_WIDTH, m_side_bar->width()); qDebug() << "main window set DEFAULT_SIDEBAR_WIDTH:" << m_side_bar->width(); } m_should_save_side_bar_width = false; } return false; } QSize MainWindow::sizeHint() const { auto screenSize = QApplication::primaryScreen()->size(); QSize windowSize; windowSize.setWidth(screenSize.width()*2/3); windowSize.setHeight(screenSize.height()*4/5); QSize defaultSize = (Peony::GlobalSettings::getInstance()->getValue(DEFAULT_WINDOW_SIZE)).toSize(); if (!defaultSize.isValid()) return windowSize; int width = qMin(defaultSize.width(), screenSize.width()); int height = qMin(defaultSize.height(), screenSize.height()); //return screenSize*2/3; //qreal dpr = qApp->devicePixelRatio(); return QSize(width, height); } Peony::FMWindowIface *MainWindow::create(const QString &uri) { auto window = new MainWindow(uri); connect(window, &MainWindow::locationChanged, this, [=](){ if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); }); window->setAttribute(Qt::WA_DeleteOnClose); // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } window->show(); return window; } Peony::FMWindowIface *MainWindow::create(const QStringList &uris) { if (uris.isEmpty()) { auto window = new MainWindow; if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); return window; } auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(this->currentViewZoomLevel()); window->addNewTabs(l); window->setAttribute(Qt::WA_DeleteOnClose); // KWindowSystem::raiseWindow(window->winId()); // if (KWindowSystem::activeWindow() != window->winId()) { // KWindowSystem::activateWindow(window->winId()); // } if (QWindow *w = window->windowHandle()) { w->raise(); w->requestActivate(); } window->show(); return window; } Peony::FMWindowIface *MainWindow::createWithZoomLevel(const QString &uri, int zoomLevel) { auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); return window; } Peony::FMWindowIface *MainWindow::createWithZoomLevel(const QStringList &uris, int zoomLevel) { if (uris.isEmpty()) { auto window = new MainWindow; if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); return window; } auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); if (currentViewSupportZoom()) window->setCurrentViewZoomLevel(zoomLevel); window->addNewTabs(l); return window; } Peony::FMWindowFactory *MainWindow::getFactory() { return nullptr;//StableMainWindowFactory::getInstance(); } Peony::DirectoryViewContainer *MainWindow::getCurrentPage() { return m_tab->currentPage(); } void MainWindow::checkSettings() { if (QGSettings::isSchemaInstalled("org.ukui.style")) { //font monitor QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key){ qDebug() << "fontSetting changed:" << key; if (key == "systemFont" || key == "systemFontSize") { QFont font = this->font(); for(auto widget : qApp->allWidgets()) widget->setFont(font); } //use qApp set window icon, task#29435 /*else if ("iconThemeName" == key) { setWindowIcon(QIcon::fromTheme("system-file-manager")); }*/ }); } } void MainWindow::setShortCuts() { if (!m_shortcuts_set) { //stop loading action QAction *stopLoadingAction = new QAction(this); stopLoadingAction->setShortcut(QKeySequence(Qt::Key_Escape)); addAction(stopLoadingAction); connect(stopLoadingAction, &QAction::triggered, this, &MainWindow::forceStopLoading); //show hidden action QAction *showHiddenAction = new QAction(this); showHiddenAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_H)); showHiddenAction->setCheckable(true); addAction(showHiddenAction); connect(showHiddenAction, &QAction::triggered, this, [=]() { //qDebug() << "show hidden"; this->setShowHidden(!getWindowShowHidden()); }); auto undoAction = new QAction(QIcon::fromTheme("edit-undo-symbolic"), tr("Undo"), this); undoAction->setShortcut(QKeySequence::Undo); addAction(undoAction); connect(undoAction, &QAction::triggered, [=]() { Peony::FileOperationManager::getInstance()->undo(); }); auto redoAction = new QAction(QIcon::fromTheme("edit-redo-symbolic"), tr("Redo"), this); redoAction->setShortcut(QKeySequence::Redo); addAction(redoAction); connect(redoAction, &QAction::triggered, [=]() { Peony::FileOperationManager::getInstance()->redo(); }); //add CTRL+D for delete operation auto trashAction = new QAction(this); trashAction->setShortcuts(QList()<getCurrentSelections(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QString documentPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); QString musicPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); QString moviesPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)); QString picturespPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); QString downloadPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); if (!uris.isEmpty() && !uris.contains(desktopUri) && !uris.contains(homeUri) && !uris.contains(documentPath) && !uris.contains(musicPath) && !uris.contains(moviesPath) && !uris.contains(picturespPath) && !uris.contains(downloadPath)) { bool canTrash = true; for (auto uri : uris) { if(Peony::FileUtils::isLongNameFileOfNotDel2Trash(uri)){/* 在家目录/下载/扩展目录下存放的长文件名文件使用永久删除,link bug#188864 */ canTrash = false; break; } } bool isTrash = this->getCurrentUri() == "trash:///"; if (!isTrash && canTrash) { Peony::FileOperationUtils::trash(uris, true); } else { Peony::FileOperationUtils::executeRemoveActionWithDialog(uris); } } }); addAction(trashAction); auto deleteAction = new QAction(this); deleteAction->setShortcuts(QList()<getCurrentSelections(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString documentPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); QString musicPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MusicLocation)); QString moviesPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)); QString picturespPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); QString downloadPath = Peony::FileUtils::getEncodedUri("file://" + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (! uris.contains(desktopUri) && !uris.contains(homeUri) && !uris.contains(documentPath) && !uris.contains(musicPath) && !uris.contains(moviesPath) && !uris.contains(picturespPath) && !uris.contains(downloadPath)) { Peony::FileOperationUtils::executeRemoveActionWithDialog(uris); } }); auto searchAction = new QAction(this); searchAction->setShortcuts(QList()<startEdit(m_is_search); }); addAction(searchAction); //F4 or Alt+D, change to address auto locationAction = new QAction(this); locationAction->setShortcuts(QList()<startEdit(); }); addAction(locationAction); auto newWindowAction = new QAction(this); newWindowAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N)); connect(newWindowAction, &QAction::triggered, this, [=]() { MainWindow *newWindow = new MainWindow(getCurrentUri()); newWindow->show(); }); addAction(newWindowAction); auto closeWindowAction = new QAction(this); closeWindowAction->setShortcuts(QList()<close(); }); addAction(closeWindowAction); auto aboutAction = new QAction(this); aboutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F2)); connect(aboutAction, &QAction::triggered, this, [=]() { //PeonyApplication::about(); }); addAction(aboutAction); auto newTabAction = new QAction(this); newTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); connect(newTabAction, &QAction::triggered, this, [=]() { this->addNewTabs(QStringList()<getCurrentUri()); }); addAction(newTabAction); auto closeTabAction = new QAction(this); closeTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); connect(closeTabAction, &QAction::triggered, this, [=]() { if (m_tab->count() <= 1) { this->close(); } else { m_tab->removeTab(m_tab->currentIndex()); } }); addAction(closeTabAction); auto nextTabAction = new QAction(this); nextTabAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Tab)); connect(nextTabAction, &QAction::triggered, this, [=]() { int currentIndex = m_tab->currentIndex(); if (currentIndex + 1 < m_tab->count()) { m_tab->setCurrentIndex(currentIndex + 1); } else { m_tab->setCurrentIndex(0); } }); addAction(nextTabAction); auto previousTabAction = new QAction(this); previousTabAction->setShortcuts(QList()<currentIndex(); if (currentIndex > 0) { m_tab->setCurrentIndex(currentIndex - 1); } else { m_tab->setCurrentIndex(m_tab->count() - 1); } }); addAction(previousTabAction); auto newFolderAction = new QAction(this); newFolderAction->setShortcuts(QList()<setShortcuts(QList()< 0) { uris<create(uris); //Peony::PropertiesWindow *w = new Peony::PropertiesWindow(uris); w->setAttribute(Qt::WA_DeleteOnClose); Peony::PropertiesWindowFactoryPluginManager::getInstance()->show(); //w->show(); }); addAction(propertiesWindowAction); auto helpAction = new QAction(this); helpAction->setShortcut(QKeySequence(Qt::Key_F1)); connect(helpAction, &QAction::triggered, this, [=]() { //PeonyApplication::help(); }); addAction(helpAction); auto maxAction = new QAction(this); maxAction->setShortcut(QKeySequence(Qt::Key_F11)); connect(maxAction, &QAction::triggered, this, [=]() { //showFullScreen has some issue, change to showMaximized, fix #20043 m_header_bar->cancelEdit(); maximizeOrRestore(); }); addAction(maxAction); auto previewPageAction = new QAction(this); previewPageAction->setShortcuts(QList()<getTriggeredPreviewPage(); if (triggered) { m_tab->setPreviewPage(nullptr); } else { auto instance = Peony::PreviewPageFactoryManager::getInstance(); auto lastPreviewPageId = instance->getLastPreviewPageId(); auto *page = instance->getPlugin(lastPreviewPageId)->createPreviewPage(); m_tab->setPreviewPage(page); } m_tab->setTriggeredPreviewPage(!triggered); m_tab->updatePreviewButtonStatus(!triggered); }); addAction(previewPageAction); auto refreshWindowAction = new QAction(this); refreshWindowAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); connect(refreshWindowAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshWindowAction); auto listToIconViewAction = new QAction(this); listToIconViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); connect(listToIconViewAction, &QAction::triggered, this, [=]() { this->beginSwitchView(QString("Icon View")); }); addAction(listToIconViewAction); auto iconToListViewAction = new QAction(this); iconToListViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); connect(iconToListViewAction, &QAction::triggered, this, [=]() { this->beginSwitchView(QString("List View")); }); addAction(iconToListViewAction); auto reverseSelectAction = new QAction(this); reverseSelectAction->setShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_L)); connect(reverseSelectAction, &QAction::triggered, this, [=]() { this->getCurrentPage()->getView()->invertSelections(); }); addAction(reverseSelectAction); auto remodelViewAction = new QAction(this); remodelViewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); connect(remodelViewAction, &QAction::triggered, this, [=]() { this->getCurrentPage()->setZoomLevelRequest(25); }); addAction(remodelViewAction); auto enlargViewAction = new QAction(this); enlargViewAction->setShortcut(QKeySequence::ZoomIn); connect(enlargViewAction, &QAction::triggered, this, [=]() { int defaultZoomLevel = this->currentViewZoomLevel(); if(defaultZoomLevel <= 95){ defaultZoomLevel+=5; } for (int i = 0; i < 5; i++) { this->getCurrentPage()->setZoomLevelRequest(defaultZoomLevel); } }); addAction(enlargViewAction); auto shrinkViewAction = new QAction(this); shrinkViewAction->setShortcut(QKeySequence::ZoomOut); connect(shrinkViewAction, &QAction::triggered, this, [=]() { int defaultZoomLevel = this->currentViewZoomLevel(); if (defaultZoomLevel >= 5) { defaultZoomLevel-=5; } else { defaultZoomLevel = 0; } this->getCurrentPage()->setZoomLevelRequest(defaultZoomLevel); }); addAction(shrinkViewAction); auto quitAllAction = new QAction(this); quitAllAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); connect(quitAllAction, &QAction::triggered, this, [=]() { QProcess p(0); p.start("/usr/bin/peony", QStringList()<<"-q"); p.waitForStarted(); p.waitForFinished(); }); addAction(quitAllAction); auto refreshAction = new QAction(this); refreshAction->setShortcut(Qt::Key_F5); connect(refreshAction, &QAction::triggered, this, [=]() { this->refresh(); }); addAction(refreshAction); //select all files in view, fix bug#115442 auto *selectAllAction = new QAction(this); selectAllAction->setShortcut(QKeySequence::SelectAll); connect(selectAllAction, &QAction::triggered, this, [=]() { if (this->getCurrentPage()->getView()) { /// note: 通过getAllFileUris设置的全选效率过低,如果增加接口则会导致二进制兼容性问题 /// 所以这里使用现有的反选接口实现高效的全选,这个方法在mainwindow中也有用到 //auto allFiles = this->getCurrentPage()->getView()->getAllFileUris(); //this->getCurrentPage()->getView()->setSelections(allFiles); this->getCurrentPage()->getView()->setSelections(QStringList()); this->getCurrentPage()->getView()->invertSelections(); } }); addAction(selectAllAction); //file operations auto *copyAction = new QAction(this); copyAction->setShortcut(QKeySequence::Copy); connect(copyAction, &QAction::triggered, [=]() { bool is_recent = false; if (!this->getCurrentSelections().isEmpty()) { // if (this->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } if (this->getCurrentSelections().first().startsWith("recent://", Qt::CaseInsensitive)) { is_recent = true; } if (this->getCurrentSelections().first().startsWith("favorite://", Qt::CaseInsensitive)) { return ; } } else return; QStringList selections; if (is_recent) { for(auto uri:this->getCurrentSelections()) { uri = Peony::FileUtils::getTargetUri(uri); selections << uri; } } else{ selections = this->getCurrentSelections(); } Peony::ClipboardUtils::setClipboardFiles(selections, false); }); addAction(copyAction); auto *pasteAction = new QAction(this); pasteAction->setShortcut(QKeySequence::Paste); connect(pasteAction, &QAction::triggered, [=]() { auto currentUri = getCurrentUri(); if (currentUri.startsWith("trash://") || currentUri.startsWith("recent://") || currentUri.startsWith("computer://") || currentUri.startsWith("favorite://") || currentUri.startsWith("search://") || currentUri == "filesafe:///" || currentUri.startsWith("burn://")) { /* Add hint information,link to bug#107640. */ QMessageBox::warning(this, tr("warn"), tr("This operation is not supported.")); return; } //fix bug#183268, not allow paste in mtp, gphoto2 path or can not write path auto info = Peony::FileInfo::fromUri(currentUri); //comment to fix bug#191108, huawei phone can paste file success if (!info->canWrite() /*|| currentUri.startsWith("mtp://") || currentUri.startsWith("gphoto2://")*/) { return; } Peony::ClipboardUtils::getInstance()->updateClipboardManually(); if (Peony::ClipboardUtils::isClipboardHasFiles()) { //FIXME: how about duplicated copy? //FIXME: how to deal with a failed move? auto op = Peony::ClipboardUtils::pasteClipboardFiles(this->getCurrentUri()); if (op) { connect(op, &Peony::FileOperation::operationFinished, this, [=](){ auto opInfo = op->getOperationInfo(); auto targetUirs = opInfo->dests(); setCurrentSelectionUris(targetUirs); }, Qt::BlockingQueuedConnection); } else{ //fix paste file in old path not update issue, link to bug#71627 this->getCurrentPage()->getView()->repaintView(); } } }); addAction(pasteAction); auto *cutAction = new QAction(this); cutAction->setShortcut(QKeySequence::Cut); connect(cutAction, &QAction::triggered, [=]() { if (!this->getCurrentSelections().isEmpty()) { // if (this->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } if (this->getCurrentSelections().first().startsWith("recent://", Qt::CaseInsensitive)) { return ; } if (this->getCurrentSelections().first().startsWith("favorite://", Qt::CaseInsensitive)) { return ; } auto currentUri = getCurrentUri(); if (currentUri.startsWith("search://")) return; auto info = Peony::FileInfo::fromUri(currentUri); if (!info->canWrite()) { return; } QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (! this->getCurrentSelections().contains(desktopUri) && ! this->getCurrentSelections().contains(homeUri)) { Peony::ClipboardUtils::setClipboardFiles(this->getCurrentSelections(), true); this->getCurrentPage()->getView()->repaintView(); } } }); addAction(cutAction); m_shortcuts_set = true; } } void MainWindow::updateTabPageTitle() { m_tab->updateTabPageTitle(); //FIXME: replace BLOCKING api in ui thread. auto curUri = getCurrentUri(); auto show = Peony::FileUtils::getFileDisplayName(curUri); QString title = show;// + "-" + tr("File Manager"); if (curUri.startsWith("search:///")) title = tr("Search"); if (title.length() <= 0) title = tr("File Manager"); //qDebug() << "updateTabPageTitle:" <hasError()) return; auto opInfo = op->getOperationInfo(); //auto targetUri = opInfo->target(); this->getCurrentPage()->getView()->clearIndexWidget(); //set a short time delay, fix bug#86070, select two folders QTimer::singleShot(10, this, [=](){ this->editUri(opInfo->target()); }); }, Qt::BlockingQueuedConnection); // QTimer::singleShot(500, this, [=]() { // this->getCurrentPage()->getView()->scrollToSelection(targetUri); // this->editUri(targetUri); // }); } void MainWindow::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Backspace) { auto uri = Peony::FileUtils::getParentUri(getCurrentUri()); //qDebug() << "goUp Action" << getCurrentUri() << uri; if (uri.isNull()) return; m_tab->goToUri(uri, true, true); } if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { auto selections = this->getCurrentSelections(); //if select only one item, let view to process if (selections.count() > 1) { QString currentUri = this->getCurrentUri(); if(currentUri == "filesafe:///") { return ; } QStringList files; QStringList dirs; for (auto uri : selections) { auto info = Peony::FileInfo::fromUri(uri); if (info->isDir() || info->isVolume()) { dirs<addPage(uri); } QMap fileMap; for (auto uri : files) { QString defaultAppName = Peony::FileLaunchManager::getDefaultAction(uri)->getAppInfoName(); QStringList list; if (fileMap.contains(defaultAppName)) { list = fileMap[defaultAppName]; list << uri; fileMap.insert(defaultAppName, list); } else { list << uri; fileMap.insert(defaultAppName, list); } } if(!fileMap.empty()) { QMap::iterator iter = fileMap.begin(); while (iter != fileMap.end()) { Peony::FileLaunchManager::openAsync(iter.value()); iter++; } } } } return QMainWindow::keyPressEvent(e); } const QString MainWindow::getCurrentUri() { return m_tab->getCurrentUri(); } const QStringList MainWindow::getCurrentSelections() { return m_tab->getCurrentSelections(); } const QStringList MainWindow::getCurrentAllFileUris() { return m_tab->getAllFileUris(); } Qt::SortOrder MainWindow::getCurrentSortOrder() { return m_tab->getSortOrder(); } int MainWindow::getCurrentSortColumn() { return m_tab->getSortType(); } bool MainWindow::getWindowShowHidden() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SHOW_HIDDEN_PREFERENCE).toBool(); } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).isValid()? metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).toBool(): false; } else { qDebug()<<"can not get file meta info"<getValue(SHOW_HIDDEN_PREFERENCE).toBool(); } } } bool MainWindow::getWindowUseDefaultNameSortOrder() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SORT_CHINESE_FIRST).isValid()? settings->getValue(SORT_CHINESE_FIRST).toBool(): true; } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SORT_CHINESE_FIRST).isValid()? metaInfo->getMetaInfoVariant(SORT_CHINESE_FIRST).toBool(): true; } else { qDebug()<<"can not get file meta info"<getValue(SORT_CHINESE_FIRST).isValid()? settings->getValue(SORT_CHINESE_FIRST).toBool(): true; } } } bool MainWindow::getWindowSortFolderFirst() { auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { return settings->getValue(SORT_FOLDER_FIRST).isValid()? settings->getValue(SORT_FOLDER_FIRST).toBool(): true; } else { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { return metaInfo->getMetaInfoVariant(SORT_FOLDER_FIRST).isValid()? metaInfo->getMetaInfoVariant(SORT_FOLDER_FIRST).toBool(): true; } else { qDebug()<<"can not get file meta info"<getValue(SORT_FOLDER_FIRST).isValid()? settings->getValue(SORT_FOLDER_FIRST).toBool(): true; } } } int MainWindow::currentViewZoomLevel() { if (getCurrentPage()) { if (auto view = getCurrentPage()->getView()) { return view->currentZoomLevel(); } } int defaultZoomLevel = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ZOOM_LEVEL).toInt(); if (defaultZoomLevel >= 0 && defaultZoomLevel <= 100) { return defaultZoomLevel; } return m_tab->m_status_bar->m_slider->value(); } bool MainWindow::currentViewSupportZoom() { if (getCurrentPage()) { if (auto view = getCurrentPage()->getView()) { return view->supportZoom(); } } return m_tab->m_status_bar->m_slider->isEnabled(); } void MainWindow::maximizeOrRestore() { if (!this->isMaximized()) { this->showMaximized(); } else { this->showNormal(); } //maybe not need update icons? comment to try fix bug#77966 //m_header_bar->updateIcons(); m_header_bar->updateMaximizeState(); } void MainWindow::syncControlsLocation(const QString &uri) { m_tab->goToUri(uri, false, false); } void MainWindow::updateHeaderBar() { m_header_bar->setLocation(getCurrentUri()); m_header_bar->updateIcons(); //fix bug#82685 m_header_bar->updateSortTypeEnable(); //fix bug#66336, 83711 m_header_bar->updateViewTypeEnable(); //m_status_bar->update(); } void MainWindow::updateWindowIcon() { auto currentUri = getCurrentUri(); if (currentUri.startsWith("trash://")) { QIcon icon = QIcon::fromTheme("user-trash"); qApp->setWindowIcon(icon); } else if (currentUri.startsWith("computer://")) { QIcon icon = QIcon::fromTheme("computer"); qApp->setWindowIcon(icon); } else { QIcon icon = QIcon::fromTheme("system-file-manager"); qApp->setWindowIcon(icon); } } void MainWindow::goToUri(const QString &uri, bool addHistory, bool force) { QUrl url(uri); auto realUri = uri; if (uri == "computer:///ukui-data-volume") { realUri = "file:///data"; } //process open symbolic link auto info = Peony::FileInfo::fromUri(uri); if (info->isSymbolLink() && info->symlinkTarget().length() >0 && (uri.startsWith("file://") || uri.startsWith("favorite://"))) realUri = "file://" + info->symlinkTarget(); //try to fix bug#174666, part phone mtp mode access wrong issue if (url.scheme().isEmpty() && ! uri.startsWith("mtp://") && ! uri.startsWith("gphoto2://")) { qDebug() << "transform special uri:"<searchButtonClicked(); } if (getCurrentUri() == realUri) { if (!force) { refresh(); return; } } locationChangeStart(); m_tab->goToUri(realUri, addHistory, force); m_header_bar->setLocation(uri); m_label_box->clearSelection(); Q_EMIT m_label_box->leftClickOnBlank(); } void MainWindow::updateSearch(const QString &uri, const QString &key, bool updateKey) { qDebug() << "updateSearch:" <enableSearchBar(key.length() != 0); if (m_last_search_path == "" || ! Peony::FileUtils::isSamePath(uri, m_last_search_path)) { //qDebug() << "updateSearch:" <m_status_bar->updateSearchProgress(false); m_searching = false; } else { bool isSearchEngine = true; const QByteArray id(UKUI_SEARCH_SCHEMAS); if (QGSettings::isSchemaInstalled(id)) { QGSettings *searchSettings = new QGSettings(id, QByteArray(), this); if (!searchSettings || !searchSettings->keys().contains(SEARCH_METHOD_KEY)) { isSearchEngine = false; } } else { isSearchEngine = false; } if (!m_last_search_path.startsWith("file:///") && !m_last_search_path.startsWith("computer:///")) { isSearchEngine = false; } auto targetUri = Peony::SearchVFSUriParser::parseSearchKey(m_last_search_path, m_last_key, true, false, "", true); targetUri = Peony::SearchVFSUriParser::addSearchKey(targetUri, isSearchEngine); //qDebug() << "updateSearch targetUri:" <m_status_bar->updateSearchProgress(true); m_searching = true; } } } void MainWindow::addNewTabs(const QStringList &uris) { //fix search path add new tab,page title show abnormal issue if (uris.count() == 1) { m_tab->addPage(uris.first(), true); return; } for (auto uri : uris) { m_tab->addPage(uri, false); } } void MainWindow::beginSwitchView(const QString &viewId) { //not allow change to other view when in computer, link to bug#83711 if (getCurrentUri() == "computer:///") return; auto selection = getCurrentSelections(); // int sortType = getCurrentSortColumn(); // Qt::SortOrder sortOrder = getCurrentSortOrder(); m_tab->switchViewType(viewId); // save zoom level Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ZOOM_LEVEL, currentViewZoomLevel()); m_tab->setCurrentSelections(selection); bool supportZoom = m_tab->currentPage()->getView()->supportZoom(); m_tab->m_status_bar->m_slider->setEnabled(supportZoom); m_tab->m_status_bar->m_slider->setVisible(supportZoom); //fix slider value not update issue m_tab->m_status_bar->m_slider->setValue(currentViewZoomLevel()); } void MainWindow::refresh() { locationChangeStart(); m_tab->refresh(); //fix refresh clear copy files issue, link to bug#109247 if (Peony::ClipboardUtils::isPeonyFilesBeCut()) Peony::ClipboardUtils::clearClipboard();/* Refresh clear cut status */ //goToUri(getCurrentUri(), false, true); } void MainWindow::setLabelNameFilter(QString name) { if (!getCurrentPage()) { return; } //update filter flag if (name == "") m_filter_working = false; else m_filter_working = true; m_header_bar->updateHeaderState(); getCurrentPage()->setFilterLabelConditions(name); } void MainWindow::setShowHidden(bool showHidden) { if (!getCurrentPage()) { return; } getCurrentPage()->setShowHidden(showHidden); //显示隐藏文件,更新项目个数 Q_EMIT m_tab->updateItemsNum(); } void MainWindow::setShowFileExtensions(bool checked) { if (!getCurrentPage()) { return; } getCurrentPage()->setShowFileExtensions(checked); } void MainWindow::setUseDefaultNameSortOrder(bool use) { if (!getCurrentPage()) { return; } getCurrentPage()->setUseDefaultNameSortOrder(use); } void MainWindow::setSortFolderFirst(bool set) { if (!getCurrentPage()) { return; } getCurrentPage()->setSortFolderFirst(set); } void MainWindow::forceStopLoading() { m_tab->stopLoading(); //Key_escape also use as cancel if (Peony::ClipboardUtils::isClipboardHasFiles()) { Peony::ClipboardUtils::clearClipboard(); this->getCurrentPage()->getView()->repaintView(); } } void MainWindow::setCurrentSelectionUris(const QStringList &uris) { m_tab->setCurrentSelections(uris); //move scrollToSelection to m_tab to try fix new unzip file show two same icon issue //Fix me, unknow caused reason // if (uris.isEmpty()) // return; // getCurrentPage()->getView()->scrollToSelection(uris.first()); } void MainWindow::setCurrentSortOrder(Qt::SortOrder order) { m_tab->setSortOrder(order); } void MainWindow::setCurrentSortColumn(int sortColumn) { m_tab->setSortType(sortColumn); } void MainWindow::editUri(const QString &uri) { m_tab->editUri(uri); } void MainWindow::editUris(const QStringList &uris) { m_tab->editUris(uris); } void MainWindow::setCurrentViewZoomLevel(int zoomLevel) { if (currentViewSupportZoom()) m_tab->m_status_bar->m_slider->setValue(zoomLevel); } QString MainWindow::getLastSearchKey() { return m_last_key; } void MainWindow::resizeEvent(QResizeEvent *e) { QMainWindow::resizeEvent(e); //may not need update? comment to try fix bug#77966 //m_header_bar->updateMaximizeState(); update(); if (!isMaximized()) { // set save window size flag last_resize_window = this; } } /*! * \note * The window has a noticeable tearing effect due to the drawing of shadow effects. * I should consider do not painting a shadow when resizing. */ void MainWindow::paintEvent(QPaintEvent *e) { QColor color = qApp->palette().color(QPalette::Window); QColor colorBase = color; auto sidebarOpacity = Peony::GlobalSettings::getInstance()->getValue(SIDEBAR_BG_OPACITY).toInt(); if (m_is_blur_window) { colorBase.setAlphaF(sidebarOpacity/100.0); } QPainter p(this); p.fillRect(this->rect(), color); p.setCompositionMode(QPainter::CompositionMode_SourceIn); p.fillRect(sideBarRect(), colorBase); QMainWindow::paintEvent(e); } void MainWindow::mousePressEvent(QMouseEvent *e) { //qDebug()<<"mouse pressed"<button() == Qt::LeftButton && !e->isAccepted()) { m_is_draging = true; m_offset = mapFromGlobal(QCursor::pos()); } } void MainWindow::mouseMoveEvent(QMouseEvent *e) { //NOTE: when starting a X11 window move, the mouse move event //will unreachable when draging, and after draging we could not //get the release event correctly. //qDebug()<<"mouse move"; QMainWindow::mouseMoveEvent(e); // if (!m_is_draging) // return; // qreal dpiRatio = qApp->devicePixelRatio(); // if (QX11Info::isPlatformX11()) { // Display *display = QX11Info::display(); // Atom netMoveResize = XInternAtom(display, "_NET_WM_MOVERESIZE", False); // XEvent xEvent; // const auto pos = QCursor::pos(); // memset(&xEvent, 0, sizeof(XEvent)); // xEvent.xclient.type = ClientMessage; // xEvent.xclient.message_type = netMoveResize; // xEvent.xclient.display = display; // xEvent.xclient.window = this->winId(); // xEvent.xclient.format = 32; // xEvent.xclient.data.l[0] = pos.x() * dpiRatio; // xEvent.xclient.data.l[1] = pos.y() * dpiRatio; // xEvent.xclient.data.l[2] = 8; // xEvent.xclient.data.l[3] = Button1; // xEvent.xclient.data.l[4] = 0; // XUngrabPointer(display, CurrentTime); // XSendEvent(display, QX11Info::appRootWindow(QX11Info::appScreen()), // False, SubstructureNotifyMask | SubstructureRedirectMask, // &xEvent); // //XFlush(display); // XEvent xevent; // memset(&xevent, 0, sizeof(XEvent)); // xevent.type = ButtonRelease; // xevent.xbutton.button = Button1; // xevent.xbutton.window = this->winId(); // xevent.xbutton.x = e->pos().x() * dpiRatio; // xevent.xbutton.y = e->pos().y() * dpiRatio; // xevent.xbutton.x_root = pos.x() * dpiRatio; // xevent.xbutton.y_root = pos.y() * dpiRatio; // xevent.xbutton.display = display; // XSendEvent(display, this->effectiveWinId(), False, ButtonReleaseMask, &xevent); // XFlush(display); // if (e->source() == Qt::MouseEventSynthesizedByQt) { // if (!this->mouseGrabber()) { // this->grabMouse(); // this->releaseMouse(); // } // } // m_is_draging = false; // } else { // this->move((QCursor::pos() - m_offset) * dpiRatio); // } } void MainWindow::mouseReleaseEvent(QMouseEvent *e) { /*! * \bug * release event sometimes "disappear" when we request * X11 window manager for movement. */ QMainWindow::mouseReleaseEvent(e); //qDebug()<<"mouse released"; m_is_draging = false; } void MainWindow::validBorder() { //deprecated } #include "file-utils.h" void MainWindow::initUI(const QString &uri) { auto size = sizeHint(); resize(size); m_searching = false; connect(this, &MainWindow::locationChangeStart, this, [=]() { //comment to fix bug 33527 //m_side_bar->blockSignals(true); m_header_bar->blockSignals(true); QCursor c; c.setShape(Qt::BusyCursor); this->setCursor(c); m_tab->setCursor(c); m_side_bar->setCursor(c); //m_status_bar->update(); }); connect(this, &MainWindow::locationChangeEnd, this, [=]() { //comment to fix bug 33527 //m_side_bar->blockSignals(false); m_header_bar->blockSignals(false); QCursor c; c.setShape(Qt::ArrowCursor); this->setCursor(c); m_tab->setCursor(c); m_side_bar->setCursor(c); updateHeaderBar(); //function for UKUI3.1, update window icon //updateWindowIcon(); //m_status_bar->update(); if (m_searching) { m_tab->m_status_bar->updateSearchProgress(false); Q_EMIT m_header_bar->updateSearchProgress(false); m_searching = false; } setShortCuts(); }); //HeaderBar auto headerBar = new HeaderBar(this); m_header_bar = headerBar; auto headerBarContainer = new HeaderBarContainer(this); headerBarContainer->addHeaderBar(headerBar); addToolBar(headerBarContainer); //m_header_bar->setVisible(false); connect(m_header_bar, &HeaderBar::updateLocationRequest, this, &MainWindow::goToUri); connect(m_header_bar, &HeaderBar::viewTypeChangeRequest, this, &MainWindow::beginSwitchView); connect(m_header_bar, &HeaderBar::updateZoomLevelHintRequest, this, [=](int zoomLevelHint) { if (zoomLevelHint >= 0) { m_tab->m_status_bar->m_slider->setEnabled(true); m_tab->m_status_bar->m_slider->setValue(zoomLevelHint); } else { m_tab->m_status_bar->m_slider->setEnabled(false); } }); //SideBar QDockWidget *sidebarContainer = new QDockWidget(this); sidebarContainer->setFeatures(QDockWidget::NoDockWidgetFeatures); auto palette = sidebarContainer->palette(); palette.setColor(QPalette::Window, Qt::transparent); sidebarContainer->setPalette(palette); // sidebarContainer->setStyleSheet("{" // "background-color: transparent;" // "border: 0px solid transparent" // "}"); sidebarContainer->setTitleBarWidget(new QWidget(this)); sidebarContainer->titleBarWidget()->setFixedHeight(0); sidebarContainer->setAttribute(Qt::WA_TranslucentBackground); sidebarContainer->setContentsMargins(0, 0, 0, 0); NavigationSideBar *sidebar = new NavigationSideBar(this); m_side_bar = sidebar; auto navigationSidebarContainer = new NavigationSideBarContainer(this); navigationSidebarContainer->addSideBar(m_side_bar); m_transparent_area_widget = navigationSidebarContainer; connect(m_side_bar, &NavigationSideBar::updateWindowLocationRequest, this, &MainWindow::goToUri); auto labelDialog = new FileLabelBox(this); labelDialog->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); labelDialog->hide(); m_label_box = labelDialog; connect(labelDialog->selectionModel(), &QItemSelectionModel::selectionChanged, [=]() { auto selected = labelDialog->selectionModel()->selectedIndexes(); //qDebug() << "FileLabelBox selectionChanged:" < 0) { auto name = selected.first().data().toString(); setLabelNameFilter(name); } }); //when clicked in blank, currentChanged may not triggered connect(labelDialog, &FileLabelBox::leftClickOnBlank, [=]() { setLabelNameFilter(""); }); sidebarContainer->setWidget(navigationSidebarContainer); addDockWidget(Qt::LeftDockWidgetArea, sidebarContainer); // m_status_bar = new Peony::StatusBar(this, this); // setStatusBar(m_status_bar); auto views = new TabWidget; m_tab = views; if (uri.isNull()) { auto home = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); m_tab->addPage(home, true); } else { m_tab->addPage(uri, true); //m_header_bar->setLocation(uri); } QTimer::singleShot(1, this, [=]() { // FIXME: // it is strange that if we set size hint by qsettings, // the tab bar will "shrink" until we update geometry // after a while (may resize window or move splitter). // we should find out the reason and remove this dirty // code. m_tab->updateTabBarGeometry(); m_tab->updateStatusBarGeometry(); }); // auto view = getCurrentPage()->getView(); // Q_EMIT Peony::DirectoryViewHelper::globalInstance()->setLabelAlignment(0); Peony::GlobalSettings::getInstance()->setValue(LABLE_ALIGNMENT, 0); connect(views->tabBar(), &QTabBar::tabBarDoubleClicked, this, [=](int index) { if (index == -1) maximizeOrRestore(); }); connect(views, &TabWidget::closeWindowRequest, this, &QWidget::close); //connect(m_header_bar, &HeaderBar::updateSearchRequest, this, &MainWindow::updateSearchStatus); connect(m_header_bar, &HeaderBar::updateSearch, this, &MainWindow::updateSearch); X11WindowManager *tabBarHandler = X11WindowManager::getInstance(); tabBarHandler->registerWidget(views->tabBar()); tabBarHandler->registerWidget(m_header_bar); auto paneAndViews = new FloatPaneWidget(views, labelDialog, this); connect(sidebar, &NavigationSideBar::labelButtonClicked, this, [=](bool checked) { bool visible = checked; //quit label filter, clear conditions if (visible) { setLabelNameFilter(""); m_label_box->clearSelection(); } else { setLabelNameFilter(""); } paneAndViews->setFloatWidgetVisible(visible); }); setCentralWidget(paneAndViews); // // check slider zoom level // if (currentViewSupportZoom()) // setCurrentViewZoomLevel(currentViewZoomLevel()); //bind signals connect(m_tab, &TabWidget::searchRecursiveChanged, headerBar, &HeaderBar::updateSearchRecursive); connect(m_tab, &TabWidget::closeSearch, headerBar, &HeaderBar::closeSearch); connect(m_tab, &TabWidget::clearTrash, this, &MainWindow::cleanTrash); connect(this, &MainWindow::trashcleaned, m_tab, [=](){ m_tab->updateTabPageTitle(); }); connect(this, &MainWindow::trashcleaned, headerBar, &HeaderBar::clearTrash); connect(m_tab, &TabWidget::recoverFromTrash, this, &MainWindow::recoverFromTrash); connect(m_tab, &TabWidget::updateWindowLocationRequest, this, &MainWindow::goToUri); connect(m_tab, &TabWidget::updateSearch, this, &MainWindow::updateSearch); connect(m_tab, &TabWidget::activePageLocationChanged, this, &MainWindow::locationChangeEnd); connect(m_tab, &TabWidget::activePageViewTypeChanged, this, &MainWindow::updateHeaderBar); connect(m_tab, &TabWidget::activePageChanged, this, &MainWindow::updateHeaderBar); connect(m_tab, &TabWidget::activePageChanged, this, [=](){ // check slider zoom level setCurrentViewZoomLevel(currentViewZoomLevel()); }); connect(m_tab, &TabWidget::signal_itemAdded, this, [=](const QString& uri){ /* 新建文件/文件夹,可编辑文件名,copy时不能编辑 */ if(this->m_uris_to_edit.isEmpty()) return; QString editUri = Peony::FileUtils::urlDecode(this->m_uris_to_edit.first()); QString infoUri = Peony::FileUtils::urlDecode(uri); if (editUri == infoUri ) { this->getCurrentPage()->getView()->scrollToSelection(uri); this->editUri(uri); } this->m_uris_to_edit.clear(); }); connect(m_tab, &TabWidget::menuRequest, this, [=](const QPoint &pos) { //fix bug#162775, show mutiple menu issue if (! m_is_show_menu){ m_is_show_menu = true; Peony::DirectoryViewMenu menu(this, this); menu.exec(pos); m_uris_to_edit = menu.urisToEdit(); m_is_show_menu = false; } }); connect(m_tab, &TabWidget::updateWindowSelectionRequest, this, [=](const QStringList &uris){ setCurrentSelectionUris(uris); }); // connect(m_tab, &TabWidget::currentSelectionChanged, this, [=](){ // m_status_bar->update(); // }); addFocusWidgetToFocusList(m_side_bar); addFocusWidgetToFocusList(m_tab); setTabOrder(nullptr, this); QWidget *oldWidget = this; for (auto widget : m_focus_list) { setTabOrder(oldWidget, widget); oldWidget = widget; if (m_focus_list.last() == widget) { setTabOrder(widget, m_focus_list.first()); } } } void MainWindow::updateSearchStatus(bool showSearch) { m_tab->updateSearchBar(showSearch); m_header_bar->setSearchMode(showSearch); m_is_search = showSearch; } void MainWindow::cleanTrash() { auto uris = getCurrentAllFileUris(); if (uris.count() >0) { auto removeop = Peony::FileOperationUtils::clearRecycleBinWithDialog(uris, this); qApp->setProperty("clearTrash",true); if(removeop){ removeop->connect(removeop,&Peony::FileDeleteOperation::operationFinished,this,[=](){ // Peony::SoundEffect::getInstance()->recycleBinClearMusic(); Q_EMIT trashcleaned(); }); } } else { /* 由于QMessageBox的setParent还不支持,暂先注释处理,link to bug#22692 【回收站】清空时,其他工作区的文件管理器会转到当前工作区 */ // QMessageBox::information(nullptr, tr("Tips info"), // tr("Trash has no file need to be cleaned.")); } } void MainWindow::recoverFromTrash() { auto m_selections = getCurrentSelections(); if (m_selections.isEmpty()) m_selections = getCurrentAllFileUris(); if (m_selections.count() == 1) { Peony::FileOperationUtils::restore(m_selections.first()); } else { Peony::FileOperationUtils::restore(m_selections); } } QRect MainWindow::sideBarRect() { auto pos = m_transparent_area_widget->mapTo(this, QPoint()); return QRect(pos, m_transparent_area_widget->size()); } void MainWindow::startMonitorThumbnailForbidStatus() { m_do_not_thumbnail = Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); m_thumbnail_watcher = new QFileSystemWatcher(this); QString peonySettingFile = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/.config/org.ukui/peony-qt-preferences.conf"; m_thumbnail_watcher->addPath(peonySettingFile); connect(m_thumbnail_watcher, &QFileSystemWatcher::fileChanged, [=](const QString &uri){ auto settings = Peony::GlobalSettings::getInstance(); if (m_do_not_thumbnail != settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()) { m_do_not_thumbnail = settings->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(); if (true == m_do_not_thumbnail) { Peony::ThumbnailManager::getInstance()->clearThumbnail(); } refresh(); } //qDebug()<<"peonySettingFile:"<addPath(uri); }); } void MainWindow::addFocusWidgetToFocusList(QWidget *widget) { m_focus_list<> MainWindow::getCurrentSelectionFileInfos() { const QStringList uris = getCurrentSelections(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<. * */ #ifndef DEVELCONTROL_GLOBAL_H #define DEVELCONTROL_GLOBAL_H #include #if defined(DEVELCONTROL_LIBRARY) # define DEVELCONTROL_EXPORT Q_DECL_EXPORT #else # define DEVELCONTROL_EXPORT Q_DECL_IMPORT #endif #endif // DEVELCONTROL_GLOBAL_H peony/stable/ukui3/windows/peony-main-window-style.h0000664000175000017500000000231615154271070021532 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef PEONYMAINWINDOWSTYLE_H #define PEONYMAINWINDOWSTYLE_H #include class PeonyMainWindowStyle : public QProxyStyle { Q_OBJECT public: static PeonyMainWindowStyle *getStyle(); private: explicit PeonyMainWindowStyle(QObject *parent = nullptr); int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; }; #endif // PEONYMAINWINDOWSTYLE_H peony/stable/ukui3/windows/main-window-factory.h0000664000175000017500000000340515154271070020711 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef STABLEMAINWINDOWFACTORY_H #define STABLEMAINWINDOWFACTORY_H #include #include "main-window-factory-iface.h" #include "windows_global.h" #include /*! * \brief The MainWindowFactory class * \deprecated */ class DEVELCONTROL_EXPORT StableMainWindowFactory : public QObject, public Peony::MainWindowFactoryIface { Q_OBJECT Q_PLUGIN_METADATA(IID MainWindowFactoryIface_iid FILE "common.json") Q_INTERFACES(Peony::MainWindowFactoryIface) public: const QString name() { return "ukui3.0"; } static Peony::MainWindowFactoryIface *getInstance(); Peony::FMWindowIface *create(const QString &uri); Peony::FMWindowIface *create(const QStringList &uris); QWidget *createWindow(const QString &uri = nullptr); QWidget *createWindow(const QStringList &uris); QWidget *createWindow(const QString &uri, QStringList selectUris); explicit StableMainWindowFactory(QObject *parent = nullptr); }; #endif // STABLEMAINWINDOWFACTORY_H peony/stable/ukui3/windows/peony-main-window-style.cpp0000664000175000017500000000342115154271070022063 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "peony-main-window-style.h" static PeonyMainWindowStyle *global_instance = nullptr; PeonyMainWindowStyle *PeonyMainWindowStyle::getStyle() { if (!global_instance) { global_instance = new PeonyMainWindowStyle; } return global_instance; } PeonyMainWindowStyle::PeonyMainWindowStyle(QObject *parent) : QProxyStyle() { } int PeonyMainWindowStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric) { case PM_LayoutVerticalSpacing: case PM_LayoutTopMargin: case PM_LayoutLeftMargin: case PM_LayoutRightMargin: case PM_LayoutBottomMargin: case PM_LayoutHorizontalSpacing: case PM_DockWidgetFrameWidth: case PM_DockWidgetTitleMargin: case PM_DockWidgetTitleBarButtonMargin: return 0; case PM_DockWidgetHandleExtent: return 2; case PM_DockWidgetSeparatorExtent: return 2; default: return QProxyStyle::pixelMetric(metric, option, widget); } } peony/stable/ukui3/windows/main-window.h0000664000175000017500000001427615154271070017254 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELMAINWINDOW_H #define DEVELMAINWINDOW_H #include #include "FMWindowIface.h" #include "file-label-box.h" #include "main-window-factory-iface.h" #include #include #include "windows_global.h" class MainWindowPrivate; class BorderShadowEffect; class HeaderBar; class NavigationSideBar; class TabWidget; class QWidgetResizeHandler; class QStackedWidget; class QGSettins; namespace Peony { class DirectoryViewContainer; class FileInfo; class StatusBar; } class MainWindow : public QMainWindow, public Peony::FMWindowIface { friend class HeaderBar; Q_OBJECT public: explicit MainWindow(const QString &uri = nullptr, QWidget *parent = nullptr); ~MainWindow(); const QString name() { return "ukui3.0"; } bool eventFilter(QObject *watched, QEvent *event); QSize sizeHint() const; Peony::FMWindowIface *create(const QString &uri); Peony::FMWindowIface *create(const QStringList &uris); Peony::FMWindowIface *createWithZoomLevel(const QString &uri, int zoomLevel); Peony::FMWindowIface *createWithZoomLevel(const QStringList &uris, int zoomLevel); Peony::FMWindowFactory *getFactory(); Peony::DirectoryViewContainer *getCurrentPage(); const QString getCurrentUri(); const QStringList getCurrentSelections(); const QStringList getCurrentAllFileUris(); const QList> getCurrentSelectionFileInfos(); Qt::SortOrder getCurrentSortOrder(); int getCurrentSortColumn(); bool getWindowShowHidden(); bool getWindowUseDefaultNameSortOrder(); bool getWindowSortFolderFirst(); int currentViewZoomLevel(); bool currentViewSupportZoom(); void addFocusWidgetToFocusList(QWidget *widget); QWidgetList focusWidgetsList(); Q_SIGNALS: void windowSelectionChanged(); void locationChanged(const QString &uri); void viewLoaded(bool successed = true); void trashcleaned(); /*! * \brief locationChangeStart * \details * This signal is used to tell the window doing a location change. * When a window is excuting a location change, it should not excute another * one util the location change finished. */ void locationChangeStart(); /*! * \brief endLocationChange * \details * This signal is used to tell the window that a location change finished. * Once a location change finished, we can start a new location change. */ void locationChangeEnd(); void signal_itemAdded(const QString& uri);/* 新增文件(夹),item创建完成 */ void setSelection(QStringList selectionUris); public Q_SLOTS: void maximizeOrRestore(); void syncControlsLocation(const QString &uri); void updateHeaderBar(); void updateWindowIcon(); void updateSearchStatus(bool showSearch); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void createFolderOperation(); void goToUri(const QString &uri, bool addHistory = false, bool force = false); void addNewTabs(const QStringList &uris); void beginSwitchView(const QString &viewId); void refresh(); void forceStopLoading(); void setShowHidden(bool showHidden); void setShowFileExtensions(bool checked); void setUseDefaultNameSortOrder(bool use); void setSortFolderFirst(bool set); void setShortCuts(); void checkSettings(); void setLabelNameFilter(QString name); void updateTabPageTitle(); //trash quick operations void cleanTrash(); void recoverFromTrash(); bool getFilterWorking(){return m_filter_working;} void setCurrentSelectionUris(const QStringList &uris); void setCurrentSortOrder (Qt::SortOrder order); void setCurrentSortColumn (int sortColumn); void editUri(const QString &uri); void editUris(const QStringList &uris); void setCurrentViewZoomLevel(int zoomLevel); QString getLastSearchKey(); void updateDateFormat(QString dateFormat); protected: void resizeEvent(QResizeEvent *e); void paintEvent(QPaintEvent *e); void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); void keyPressEvent(QKeyEvent *e); void validBorder(); void initUI(const QString &uri); QRect sideBarRect(); void startMonitorThumbnailForbidStatus(); private: BorderShadowEffect *m_effect; HeaderBar *m_header_bar; NavigationSideBar *m_side_bar; QWidget *m_transparent_area_widget; QStackedWidget *m_side_bar_container; TabWidget *m_tab; Peony::StatusBar *m_status_bar; FileLabelBox *m_label_box; QString m_last_search_path = ""; QString m_last_key = ""; bool m_is_draging = false; bool m_is_search = false; bool m_is_clear_serach = false; bool m_filter_working = false; bool m_should_save_side_bar_width = false; bool m_should_save_window_size = false; bool m_searching = false; QPoint m_offset; QWidgetList m_focus_list; bool m_shortcuts_set = false; QFileSystemWatcher *m_thumbnail_watcher; bool m_do_not_thumbnail = false; //change minimum width to avoid bug#90366 const int WINDOW_MINIMUM_WIDTH = 740; QStringList m_uris_to_edit;/* 新建文件/文件夹,可编辑文件名list */ bool m_is_blur_window = false; bool m_is_show_menu = false; QString m_date_format = ""; QDBusInterface *mDbusDateServer; }; #endif // DEVELMAINWINDOW_H peony/stable/ukui3/windows/main-window-factory.cpp0000664000175000017500000000463715154271070021254 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "main-window-factory.h" #include "main-window.h" #include "plugin-manager.h" #ifdef KYLIN_COMMON #include #endif #include "global-settings.h" #include #include StableMainWindowFactory *global_instance = nullptr; Peony::MainWindowFactoryIface *StableMainWindowFactory::getInstance() { if (!global_instance) global_instance = new StableMainWindowFactory; return global_instance; } Peony::FMWindowIface *StableMainWindowFactory::create(const QString &uri) { auto window = new MainWindow(uri); return window; } Peony::FMWindowIface *StableMainWindowFactory::create(const QStringList &uris) { if (uris.isEmpty()) return new MainWindow; auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); window->addNewTabs(l); return window; } QWidget *StableMainWindowFactory::createWindow(const QString &uri) { auto window = new MainWindow(uri); return window; } QWidget *StableMainWindowFactory::createWindow(const QStringList &uris) { if (uris.isEmpty()) return new MainWindow; auto uri = uris.first(); auto l = uris; l.removeAt(0); auto window = new MainWindow(uri); window->addNewTabs(l); return window; } QWidget *StableMainWindowFactory::createWindow(const QString &uri, QStringList selectUris) { auto window = new MainWindow(uri); connect(window, &MainWindow::locationChangeEnd, [=]() { Q_EMIT window->setSelection(selectUris); }); return window; } StableMainWindowFactory::StableMainWindowFactory(QObject *parent) : Peony::MainWindowFactoryIface() { } peony/stable/ukui3/ukui3.pro0000664000175000017500000000044315154271070014731 0ustar fengfeng###################################################################### # Automatically generated by qmake (3.1) Wed Dec 13 16:02:06 2023 ###################################################################### TEMPLATE = subdirs # Directories SUBDIRS += properties-window SUBDIRS += windows peony/stable/ukui3/control/0000775000175000017500000000000015154271106014626 5ustar fengfengpeony/stable/ukui3/control/control.pri0000664000175000017500000000132115154271070017017 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/file-label-box.h \ $$PWD/float-pane-widget.h \ $$PWD/header-bar.h \ $$PWD/label-box-delegate.h \ $$PWD/navigation-tab-bar.h \ $$PWD/operation-menu.h \ $$PWD/sort-type-menu.h \ $$PWD/tab-status-bar.h \ $$PWD/tab-widget.h \ $$PWD/view-type-menu.h \ $$PWD/navigation-side-bar.h SOURCES += \ $$PWD/file-label-box.cpp \ $$PWD/float-pane-widget.cpp \ $$PWD/header-bar.cpp \ $$PWD/label-box-delegate.cpp \ $$PWD/navigation-tab-bar.cpp \ $$PWD/operation-menu.cpp \ $$PWD/sort-type-menu.cpp \ $$PWD/tab-status-bar.cpp \ $$PWD/tab-widget.cpp \ $$PWD/view-type-menu.cpp \ $$PWD/navigation-side-bar.cpp peony/stable/ukui3/control/navigation-tab-bar.h0000664000175000017500000000616515154271070020454 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELNAVIGATIONTABBAR_H #define DEVELNAVIGATIONTABBAR_H #include #include #include #include class QToolButton; class QDrag; namespace Peony { class FileInfo; } class NavigationTabBar : public QTabBar { Q_OBJECT public: explicit NavigationTabBar(QWidget *parent = nullptr); Q_SIGNALS: void pageAdded(const QString &uri); void pageRemoved(const QString &uri); void closeWindowRequest(); void addPageRequest(const QString &uri, bool jumpTo); void locationUpdated(const QString &uri); public Q_SLOTS: void addPage(const QString &uri = nullptr, bool jumpToNewTab = false); void addPages(const QStringList &uri); void updateLocation(int index, const QString &uri); protected: void tabRemoved(int index) override; void tabInserted(int index) override; void dragEnterEvent(QDragEnterEvent *e) override; void dragMoveEvent(QDragMoveEvent *e) override; void dragLeaveEvent(QDragLeaveEvent *e) override; void dropEvent(QDropEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; private: QTimer m_drag_timer; bool m_start_drag = false; QPoint m_press_pos; QDrag *m_drag = nullptr; bool m_should_trigger_drop = false; const int ELIDE_TEXT_LENGTH = 16; std::shared_ptr m_info; }; class TabBarStyle : public QProxyStyle { friend class NavigationTabBar; friend class TabWidget; static TabBarStyle *getStyle(); TabBarStyle() {} void polish(QWidget *widget) override; int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const override; void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; }; #endif // DEVELNAVIGATIONTABBAR_H peony/stable/ukui3/control/operation-menu.cpp0000664000175000017500000003726415154271106020310 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "../peony-application.h" #include "main-window.h" #include "operation-menu.h" #include #include #include #include #include #include //#include #include #include #include #include #include #include #include "global-settings.h" #include "clipboard-utils.h" #include "file-operation-utils.h" #include "file-operation-manager.h" #include "directory-view-widget.h" #include "directory-view-container.h" #include "file-meta-info.h" #include "file-utils.h" OperationMenu::OperationMenu(MainWindow *window, QWidget *parent) : QMenu(parent) { m_window = window; connect(this, &QMenu::aboutToShow, this, &OperationMenu::updateMenu); //FIXME: implement all actions. auto editWidgetContainer = new QWidgetAction(this); auto editWidget = new OperationMenuEditWidget(window, this); m_edit_widget = editWidget; editWidgetContainer->setDefaultWidget(editWidget); addAction(editWidgetContainer); connect(m_edit_widget, &OperationMenuEditWidget::operationAccepted, this, &QMenu::hide); addSeparator(); //addAction(tr("Conditional Filter")); // auto advanceSearch = addAction(tr("Advance Search"), this, [=]() // { // m_window->advanceSearch(); // }); // addSeparator(); auto keepAllow = addAction(tr("Keep Allow"), this, [=](bool checked) { //use kf5 interface to fix set on top has no effect issue // if (checked) // KWindowSystem::setState(m_window->winId(), KWindowSystem::KeepAbove); // else // KWindowSystem::clearState(m_window->winId(), KWindowSystem::KeepAbove); setWindowFlag(Qt::WindowStaysOnTopHint, checked); }); keepAllow->setCheckable(true); auto showHidden = addAction(tr("Show Hidden"), this, [=](bool checked) { //window set show hidden m_window->setShowHidden(checked); }); m_show_hidden = showHidden; showHidden->setCheckable(true); m_showFileExtension = addAction(tr("Show File Extension"), this, [=](bool checked) { m_window->setShowFileExtensions(checked); }); m_showFileExtension->setCheckable(true); auto forbidThumbnailing = addAction(tr("Forbid thumbnailing"), this, [=](bool checked) { //FIXME: Peony::GlobalSettings::getInstance()->setValue(FORBID_THUMBNAIL_IN_VIEW, checked); //m_window->refresh(); }); m_forbid_thumbnailing = forbidThumbnailing; forbidThumbnailing->setCheckable(true); forbidThumbnailing->setChecked(Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool()); auto residentInBackend = addAction(tr("Resident in Backend"), this, [=](bool checked) { //FIXME: Peony::GlobalSettings::getInstance()->setValue(RESIDENT_IN_BACKEND, checked); qApp->setQuitOnLastWindowClosed(!checked); }); m_resident_in_backend = residentInBackend; residentInBackend->setCheckable(true); residentInBackend->setChecked(Peony::GlobalSettings::getInstance()->getValue(RESIDENT_IN_BACKEND).toBool()); auto allowFileOpParallel = addAction(tr("Parallel Operations"), this, [=](bool checked){ Peony::FileOperationManager::getInstance()->setAllowParallel(checked); }); allowFileOpParallel->setCheckable(true); allowFileOpParallel->setChecked(Peony::FileOperationManager::getInstance()->isAllowParallel()); addAction(tr("Set samba password"), this, [=]() { QDBusInterface *interFace = new QDBusInterface("org.ukui.samba.share.config", "/org/ukui/samba/share", "org.ukui.samba.share.config", QDBusConnection::systemBus()); QString username = g_get_user_name(); int pid = getpid(); int uid = getuid(); QDBusReply initReply = interFace->call("init", username, pid, uid); if (initReply.isValid()) { if (initReply.value()) { QDBusReply hasPasswdReply = interFace->call("hasPasswd"); if (hasPasswdReply.isValid()) { if (hasPasswdReply.value()) { auto result = QMessageBox::question(nullptr, tr("Tips"), tr("The user already has a samba password, do you need to reset the samba password?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (result == QMessageBox::Yes) { goto setPasswd; } } else { setPasswd: bool ok = false; QInputDialog dlg; dlg.setLabelText(tr("Samba password:")); dlg.setTextEchoMode(QLineEdit::Password); dlg.setWindowTitle(tr("Samba set user password")); dlg.setFixedSize(470,150); ok = dlg.exec(); QString text = dlg.textValue(); if (ok && !text.isNull() && !text.isEmpty()) { QDBusReply setPasswdReply = interFace->call("setPasswd", text); if (setPasswdReply.isValid()) { if (!setPasswdReply.value()) { QMessageBox::warning(nullptr, tr("Warning"), tr("Samba set password failed, Please re-enter!")); } } else { qDebug() << "setPasswd call failed!"; } } } } else { qDebug() << "hasPasswd call failed!"; } } else { QMessageBox::warning(nullptr, tr("Warning"), tr("Shared configuration service exception, please confirm if there is an ongoing shared configuration operation, or please reset the share!"), QMessageBox::Ok); } } else { qDebug() << "init call failed!"; } interFace->call("finished"); }); //task#147390 设置是否新建窗口打开文件夹 auto showFoldersInNewWindow = addAction(tr("Open each folder in a new window"), this, [=](bool checked) { Peony::GlobalSettings::getInstance()->setValue(SHOW_IN_NEW_WINDOW, checked); }); showFoldersInNewWindow->setCheckable(true); showFoldersInNewWindow->setChecked(Peony::GlobalSettings::getInstance()->getValue(SHOW_IN_NEW_WINDOW).toBool()); addSeparator(); //comment icon to design request addAction(/*QIcon::fromTheme("gtk-help"),*/ tr("Help"), this, [=]() { PeonyApplication::help(); }); addAction(/*QIcon::fromTheme("gtk-about"),*/ tr("About"), this, [=]() { //PeonyApplication::about(); AboutDialog dlg(m_window); dlg.setWindowModality(Qt::WindowModal); dlg.exec(); }); } void OperationMenu::updateMenu() { if (Peony::GlobalSettings::getInstance()->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { m_show_hidden->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_HIDDEN_PREFERENCE)? Peony::GlobalSettings::getInstance()->getValue(SHOW_HIDDEN_PREFERENCE).toBool(): false); } else { auto uri = m_window->getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (metaInfo) { bool checked = metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).isValid()? metaInfo->getMetaInfoVariant(SHOW_HIDDEN_PREFERENCE).toBool(): false; m_show_hidden->setChecked(checked); } else { m_show_hidden->setChecked(false); } } m_showFileExtension->setChecked(Peony::GlobalSettings::getInstance()->isExist(SHOW_FILE_EXTENSION)? Peony::GlobalSettings::getInstance()->getValue(SHOW_FILE_EXTENSION).toBool(): true); m_forbid_thumbnailing->setChecked(Peony::GlobalSettings::getInstance()->isExist(FORBID_THUMBNAIL_IN_VIEW)? Peony::GlobalSettings::getInstance()->getValue(FORBID_THUMBNAIL_IN_VIEW).toBool(): false); m_resident_in_backend->setChecked(Peony::GlobalSettings::getInstance()->isExist(RESIDENT_IN_BACKEND)? Peony::GlobalSettings::getInstance()->getValue(RESIDENT_IN_BACKEND).toBool(): false); //get window current directory and selections, then update ohter actions. m_edit_widget->updateActions(m_window->getCurrentUri(), m_window->getCurrentSelections()); } OperationMenuEditWidget::OperationMenuEditWidget(MainWindow *window, QWidget *parent) : QWidget(parent) { auto vbox = new QVBoxLayout; setLayout(vbox); auto title = new QLabel(this); title->setText(tr("Edit")); title->setAlignment(Qt::AlignCenter); vbox->addWidget(title); auto hbox = new QHBoxLayout; auto copy = new QToolButton(this); m_copy = copy; copy->setFixedSize(QSize(40, 40)); copy->setIcon(QIcon::fromTheme("edit-copy-symbolic")); copy->setIconSize(QSize(16, 16)); copy->setAutoRaise(false); copy->setToolTip(tr("copy")); hbox->addWidget(copy); auto paste = new QToolButton(this); m_paste = paste; paste->setFixedSize(QSize(40, 40)); paste->setIcon(QIcon::fromTheme("edit-paste-symbolic")); paste->setIconSize(QSize(16, 16)); paste->setAutoRaise(false); paste->setToolTip(tr("paste")); hbox->addWidget(paste); auto cut = new QToolButton(this); m_cut = cut; cut->setFixedSize(QSize(40, 40)); cut->setIcon(QIcon::fromTheme("edit-cut-symbolic")); cut->setIconSize(QSize(16, 16)); cut->setAutoRaise(false); cut->setToolTip(tr("cut")); hbox->addWidget(cut); auto trash = new QToolButton(this); m_trash = trash; trash->setFixedSize(QSize(40, 40)); trash->setIcon(QIcon::fromTheme("edit-delete-symbolic")); trash->setIconSize(QSize(16, 16)); trash->setAutoRaise(false); trash->setToolTip(tr("trash")); hbox->addWidget(trash); vbox->addLayout(hbox); connect(m_copy, &QToolButton::clicked, this, [=]() { if (!window->getCurrentSelections().isEmpty()) { // if (window->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } Peony::ClipboardUtils::setClipboardFiles(window->getCurrentSelections(), false); Q_EMIT operationAccepted(); } }); connect(m_cut, &QToolButton::clicked, this, [=]() { if (!window->getCurrentSelections().isEmpty()) { // if (window->getCurrentSelections().first().startsWith("trash://", Qt::CaseInsensitive)) { // return ; // } Peony::ClipboardUtils::setClipboardFiles(window->getCurrentSelections(), true); window->getCurrentPage()->getView()->repaintView(); Q_EMIT operationAccepted(); } }); connect(m_paste, &QToolButton::clicked, this, [=]() { auto op = Peony::ClipboardUtils::pasteClipboardFiles(window->getCurrentUri()); if (op) { connect(op, &Peony::FileOperation::operationFinished, window, [=](){ auto opInfo = op->getOperationInfo(); auto targetUirs = opInfo->dests(); window->setCurrentSelectionUris(targetUirs); }, Qt::BlockingQueuedConnection); } Q_EMIT operationAccepted(); }); connect(m_trash, &QToolButton::clicked, this, [=]() { if (window->getCurrentUri() == "trash:///") { Peony::FileOperationUtils::executeRemoveActionWithDialog(window->getCurrentSelections()); } else { Peony::FileOperationUtils::trash(window->getCurrentSelections(), true); } Q_EMIT operationAccepted(); }); copy->setProperty("useIconHighlightEffect", true); copy->setProperty("iconHighlightEffectMode", 1); copy->setProperty("fillIconSymbolicColor", true); paste->setProperty("useIconHighlightEffect", true); paste->setProperty("iconHighlightEffectMode", 1); paste->setProperty("fillIconSymbolicColor", true); cut->setProperty("useIconHighlightEffect", true); cut->setProperty("iconHighlightEffectMode", 1); cut->setProperty("fillIconSymbolicColor", true); trash->setProperty("useIconHighlightEffect", true); trash->setProperty("iconHighlightEffectMode", 1); trash->setProperty("fillIconSymbolicColor", true); } void OperationMenuEditWidget::updateActions(const QString ¤tDirUri, const QStringList &selections) { //FIXME: bool isSelectionEmpty = selections.isEmpty(); QString desktopPath = "file://" + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString desktopUri = Peony::FileUtils::getEncodedUri(desktopPath); QString homeUri = "file://" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation); bool isDesktop = selections.contains(desktopUri); bool isHome = selections.contains(homeUri); bool isSearch = currentDirUri.startsWith("search://"); bool isRecent = currentDirUri.startsWith("recent://"); bool isTrash = currentDirUri.startsWith("trash://"); bool isComputer = currentDirUri.startsWith("computer:///"); bool isFileBox = currentDirUri == "filesafe:///"; bool hasLongFileName = false; for (auto uri : selections) { if(Peony::FileUtils::isLongNameFileOfNotDel2Trash(uri)){/* 在家目录/下载/扩展目录下存放的长文件名文件使用永久删除,所以该菜单置灰,link bug#188864 */ hasLongFileName = true; break; } } //fix bug#183268, not allow paste in mtp, gphoto2 path or can not write path bool isDirectoryCanWrite = true; auto info = Peony::FileInfo::fromUri(currentDirUri); if (!info->isEmptyInfo()) { isDirectoryCanWrite = info->canWrite(); } //comment to fix bug#191108, huawei phone can paste file success // if (currentDirUri.startsWith("mtp://") || currentDirUri.startsWith("gphoto2://")){ // isDirectoryCanWrite = false; // } m_copy->setEnabled(!isSelectionEmpty && !isSearch && !isRecent && !isTrash && !isComputer); m_cut->setEnabled(!isSelectionEmpty && !isDesktop && !isHome && !isSearch && !isRecent && !isTrash && !isComputer && isDirectoryCanWrite); m_trash->setEnabled(!isSelectionEmpty && !isDesktop && !isHome && !isSearch && !isComputer && isDirectoryCanWrite && !hasLongFileName); Peony::ClipboardUtils::getInstance()->updateClipboardManually(); bool isClipboradHasFile = Peony::ClipboardUtils::isClipboardHasFiles(); m_paste->setEnabled(isClipboradHasFile && !isSearch && !isRecent && !isTrash && !isComputer && !isFileBox && isDirectoryCanWrite); } peony/stable/ukui3/control/view-type-menu.cpp0000664000175000017500000000621315154271070020227 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "view-type-menu.h" #include "view-factory-sort-filter-model.h" #include "directory-view-factory-manager.h" #include "directory-view-plugin-iface2.h" #include #include ViewTypeMenu::ViewTypeMenu(QWidget *parent) : QMenu(parent) { m_model = new Peony::ViewFactorySortFilterModel2(this); m_view_actions = new QActionGroup(this); m_view_actions->setExclusive(true); connect(m_view_actions, &QActionGroup::triggered, this, [=](QAction *action) { auto viewId = action->data().toString(); setCurrentView(viewId); }); connect(this, &QMenu::aboutToShow, this, [=]() { qDebug()<<"show menu"; updateMenuActions(); }); setCurrentDirectory("file:///"); } void ViewTypeMenu::setCurrentView(const QString &viewId, bool blockSignal) { if (viewId == m_current_view_id) return; if (isViewIdValid(viewId)) { m_current_view_id = viewId; } for (auto action : m_view_actions->actions()) { if (action->text() == viewId) { action->setChecked(true); } } Q_EMIT this->switchViewRequest(viewId, m_model->iconFromViewId(viewId)); if (!blockSignal) { auto factoryManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto factory = factoryManager->getFactory(viewId); int zoomLevelHint = factory->zoom_level_hint(); Q_EMIT this->updateZoomLevelHintRequest(zoomLevelHint); } } void ViewTypeMenu::setCurrentDirectory(const QString &uri) { m_current_uri = uri; m_model->setDirectoryUri(uri); } bool ViewTypeMenu::isViewIdValid(const QString &viewId) { return m_model->supportViewIds().contains(viewId); } void ViewTypeMenu::updateMenuActions() { auto supportViews = m_model->supportViewIds(); for (auto action : m_view_actions->actions()) { removeAction(action); m_view_actions->removeAction(action); action->deleteLater(); } for (auto id : supportViews) { auto action = new QAction(this); auto text = m_model->getViewDisplayNameFromId(id); action->setText(text); action->setData(id); action->setIcon(m_model->iconFromViewId(id)); m_view_actions->addAction(action); addAction(action); action->setCheckable(true); if (m_current_view_id == id) { action->setChecked(true); } } } peony/stable/ukui3/control/header-bar.cpp0000664000175000017500000006633115154271106017335 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "header-bar.h" #include "main-window.h" #include #include "view-type-menu.h" #include "sort-type-menu.h" #include "operation-menu.h" #include "directory-view-container.h" #include "directory-view-widget.h" #include "advanced-location-bar.h" #include "directory-view-factory-manager.h" #include "directory-view-plugin-iface2.h" #include "file-info.h" #include "file-info-job.h" #include "xatom-helper.h" #include #include #include #include #include #include #include #include #include #include //#include #include //#include #include #include static HeaderBarStyle *global_instance = nullptr; static QString terminal_cmd = nullptr; HeaderBar::HeaderBar(MainWindow *parent) : QToolBar(parent) { setAttribute(Qt::WA_AcceptTouchEvents); setMouseTracking(true); setStyle(HeaderBarStyle::getStyle()); setFocusPolicy(Qt::TabFocus); m_window = parent; //disable default menu setContextMenuPolicy(Qt::CustomContextMenu); //setAttribute(Qt::WA_OpaquePaintEvent); setStyleSheet(".HeaderBar{" "background-color: transparent;" "border: 0px solid transparent;" "margin: 4px 5px 4px 5px;" "}"); setMovable(false); // auto a = addAction(QIcon::fromTheme("folder-new-symbolic"), tr("Create Folder"), [=]() { // //use the same function // m_window->createFolderOperation(); // }); // auto createFolder = qobject_cast(widgetForAction(a)); // createFolder->setAutoRaise(false); // createFolder->setFixedSize(QSize(40, 40)); // createFolder->setIconSize(QSize(16, 16)); // m_create_folder = createFolder; //use theme buttons // auto createFolder = new HeadBarPushButton(this); // m_create_folder = createFolder; // createFolder->setFixedSize(QSize(40, 40)); // createFolder->setIconSize(QSize(16, 16)); // createFolder->setIcon(QIcon::fromTheme("folder-new-symbolic")); // createFolder->setToolTip(tr("Create Folder")); // addWidget(createFolder); // connect(createFolder, &QPushButton::clicked, m_window, [=]() { // //use the same function // m_window->createFolderOperation(); // }); // addSpacing(2); //find a terminal when init // findDefaultTerminal(); // a = addAction(QIcon::fromTheme("terminal-app-symbolic"), tr("Open Terminal"), [=]() { // //open the default terminal // openDefaultTerminal(); // }); // auto openTerminal = qobject_cast(widgetForAction(a)); // openTerminal->setAutoRaise(false); // openTerminal->setFixedSize(QSize(40, 40)); // openTerminal->setIconSize(QSize(16, 16)); //use theme buttons // auto openTerminal = new HeadBarPushButton(this); // openTerminal->setFixedSize(QSize(40, 40)); // openTerminal->setIconSize(QSize(16, 16)); // openTerminal->setIcon(QIcon::fromTheme("terminal-app-symbolic")); // openTerminal->setToolTip(tr("Open Terminal")); // addWidget(openTerminal); // connect(openTerminal, &QPushButton::clicked, m_window, [=]() { // //open the default terminal // openDefaultTerminal(); // }); // addSpacing(9 - 4); auto goBack = new QToolButton(this); m_go_back = goBack; goBack->setEnabled(false); goBack->setToolTip(tr("Go Back")); goBack->setIcon(QIcon::fromTheme("go-previous-symbolic")); addWidget(goBack); auto goForward = new QToolButton(this); m_go_forward = goForward; goForward->setEnabled(false); goForward->setToolTip(tr("Go Forward")); goForward->setIcon(QIcon::fromTheme("go-next-symbolic")); addWidget(goForward); connect(goForward, &QToolButton::clicked, m_window, [=]() { m_window->getCurrentPage()->goForward(); }); addSpacing(ADDRESS_BAR_LEFT_WIDTH); auto locationBar = new Peony::AdvancedLocationBar(this); locationBar->setMinimumWidth(ADDRESS_BAR_MINIMUN_WIDTH); m_location_bar = locationBar; m_location_bar->setFocusPolicy(Qt::FocusPolicy(m_location_bar->focusPolicy() & ~Qt::TabFocus)); addWidget(locationBar); connect(this, &HeaderBar::updateSearchProgress, m_location_bar, &Peony::AdvancedLocationBar::updateSearchProgress); connect(goBack, &QToolButton::clicked, m_window, [=]() { m_window->getCurrentPage()->goBack(); quitSerachMode(); }); connect(m_location_bar, &Peony::AdvancedLocationBar::refreshRequest, [=]() { m_window->updateTabPageTitle(); }); connect(m_location_bar, &Peony::AdvancedLocationBar::updateFileTypeFilter, [=](const int &index) { m_window->getCurrentPage()->setSortFilter(index); }); connect(m_location_bar, &Peony::AdvancedLocationBar::searchRequest, [=](const QString &path, const QString &key){ // m_window->forceStopLoading(); // //key is null, clean search content, show all files // if (key == "" || key.isNull()) // Q_EMIT this->updateLocationRequest(path, true); // else // { // auto targetUri = Peony::SearchVFSUriParser::parseSearchKey(path, key, true, false, "", m_search_recursive); // Q_EMIT this->updateLocationRequest(targetUri, true); // } //search update all in main window m_window->forceStopLoading(); Q_EMIT this->updateSearch(path, key, true); }); connect(m_location_bar, &Peony::AdvancedLocationBar::updateWindowLocationRequest, this, &HeaderBar::updateLocationRequest); // connect(this, &HeaderBar::clearTrash, m_location_bar, &Peony::AdvancedLocationBar::clearTrash); addSpacing(ADDRESS_BAR_RIGHT_WIDTH); // auto a = addAction(QIcon::fromTheme("edit-find-symbolic"), tr("Search")); // connect(a, &QAction::triggered, this, &HeaderBar::searchButtonClicked); // auto search = qobject_cast(widgetForAction(a)); // search->setAutoRaise(false); // search->setFixedSize(QSize(40, 40)); // setIconSize(QSize(16, 16)); // m_search_button = search; //use theme buttons auto search = new QToolButton(this); m_search_button = search; search->setIcon(QIcon::fromTheme("edit-find-symbolic")); search->setToolTip(tr("Search")); addWidget(search); connect(search, &QToolButton::clicked, this, &HeaderBar::searchButtonClicked); // createFolder->setFlat(true); // createFolder->setProperty("isWindowButton", 1); // createFolder->setProperty("useIconHighlightEffect", 2); // createFolder->setProperty("isIcon", true); // openTerminal->setFlat(true); // openTerminal->setProperty("isWindowButton", 1); // openTerminal->setProperty("useIconHighlightEffect", 2); // openTerminal->setProperty("isIcon", true); //fix:bug#93521,修改控件三态 search->setProperty("useIconHighlightEffect", true); search->setProperty("iconHighlightEffectMode", 1); goBack->setProperty("isWindowButton", 1); goBack->setProperty("useIconHighlightEffect", 2); goBack->setProperty("isIcon", true); goForward->setProperty("isWindowButton", 1); goForward->setProperty("useIconHighlightEffect", 2); goForward->setProperty("isIcon", true); addMenuButtons(); setMinimumWidth(GBACK_BTN_WIDTH * 2 + ADDRESS_BAR_LEFT_WIDTH + ADDRESS_BAR_MINIMUN_WIDTH + ADDRESS_BAR_RIGHT_WIDTH + SEARCH_BTN_WIDTH + DRAG_AREA_MINIMUN_WIDTH); // m_focus_list<<(createFolder); // m_focus_list<<(openTerminal); m_focus_list<<(goBack); m_focus_list<<(goForward); m_focus_list<<(search); } void HeaderBar::findDefaultTerminal() { QtConcurrent::run([](){ GList *infos = g_app_info_get_all(); GList *l = infos; while (l) { const char *cmd = g_app_info_get_executable(static_cast(l->data)); QString tmp = cmd; if (tmp.contains("terminal")) { terminal_cmd = tmp; if (tmp == "mate-terminal") { terminal_cmd = "/usr/bin/mate-terminal"; break; } } l = l->next; } g_list_free_full(infos, g_object_unref); }); } void HeaderBar::openDefaultTerminal() { //don't find any terminal if (terminal_cmd == nullptr) { QMessageBox *msgBox = new QMessageBox(this); msgBox->setWindowTitle(tr("Operate Tips")); msgBox->setText(tr("Don't find any terminal, please install at least one terminal!")); msgBox->exec(); return; } QUrl url = m_window->getCurrentUri(); auto directory = url.path().toUtf8().constData(); gchar **argv = nullptr; g_shell_parse_argv (terminal_cmd.toUtf8().constData(), nullptr, &argv, nullptr); GError *err = nullptr; g_spawn_async (directory, argv, nullptr, G_SPAWN_SEARCH_PATH, nullptr, nullptr, nullptr, &err); if (err) { qDebug()<message; g_error_free(err); err = nullptr; tryOpenAgain(); } g_strfreev (argv); } void HeaderBar::tryOpenAgain() { QUrl url = m_window->getCurrentUri(); auto absPath = url.path(); qDebug() << "tryOpenAgain url" <updateSearchStatus(m_search_mode); } void HeaderBar::setSearchMode(bool mode) { m_search_button->setCheckable(mode); m_search_button->setChecked(mode); m_search_button->setDown(mode); if (! mode) m_search_button->setFocusPolicy(Qt::NoFocus); else m_search_button->setFocusPolicy(Qt::ClickFocus); m_location_bar->switchEditMode(mode); } void HeaderBar::closeSearch() { m_search_mode = false; setSearchMode(false); } void HeaderBar::initFocus() { for (auto widget : m_focus_list) { widget->setFocusPolicy(Qt::StrongFocus); m_window->addFocusWidgetToFocusList(widget); } } void HeaderBar::updateSearchRecursive(bool recursive) { m_search_recursive = recursive; } void HeaderBar::addSpacing(int pixel) { QWidget *widget = new QWidget(this); widget->setFixedSize(QSize((pixel < 1 ? 1 : pixel), 40)); widget->setAttribute(Qt::WA_TranslucentBackground); addWidget(widget); // for (int i = 0; i < pixel; i++) { // addSeparator(); // } } void HeaderBar::addMenuButtons() { //占位widget,5个widget共同组成拖动区域,共宽150px for (int i = 1; i <= 5; ++i) { QWidget *widget = new QWidget(this); widget->setFixedSize(QSize(i * 10, 40)); widget->setAttribute(Qt::WA_TranslucentBackground); addWidget(widget); } QAction *action = addAction(QIcon::fromTheme("view-grid-symbolic"), tr("View Type")); QToolButton *viewType = qobject_cast(widgetForAction(action)); viewType->setAutoRaise(true); viewType->setFixedWidth(57); viewType->setPopupMode(QToolButton::InstantPopup); ViewTypeMenu* viewTypeMenu = new ViewTypeMenu(viewType); m_view_type_menu = viewTypeMenu; action->setMenu(viewTypeMenu); connect(viewTypeMenu, &ViewTypeMenu::switchViewRequest, this, [=](const QString &id, const QIcon &icon, bool resetToZoomLevel) { viewType->setText(id); viewType->setIcon(icon); viewTypeChangeRequest(id); if (resetToZoomLevel) { auto viewId = m_window->getCurrentPage()->getView()->viewId(); auto factoryManger = Peony::DirectoryViewFactoryManager2::getInstance(); auto factory = factoryManger->getFactory(viewId); int zoomLevelHint = factory->zoom_level_hint(); m_window->getCurrentPage()->setZoomLevelRequest(zoomLevelHint); } }); connect(viewTypeMenu, &ViewTypeMenu::updateZoomLevelHintRequest, this, &HeaderBar::updateZoomLevelHintRequest); action = addAction(QIcon::fromTheme("view-sort-ascending-symbolic"), tr("Sort Type")); QToolButton *sortType = qobject_cast(widgetForAction(action)); sortType->setAutoRaise(true); sortType->setFixedWidth(57); sortType->setPopupMode(QToolButton::InstantPopup); SortTypeMenu *sortTypeMenu = new SortTypeMenu(sortType); m_sort_type_menu = sortTypeMenu; action->setMenu(sortTypeMenu); connect(sortTypeMenu, &SortTypeMenu::switchSortTypeRequest, m_window, &MainWindow::setCurrentSortColumn); connect(sortTypeMenu, &SortTypeMenu::switchSortOrderRequest, m_window, [=](Qt::SortOrder order) { if (order == Qt::AscendingOrder) { sortType->setIcon(QIcon::fromTheme("view-sort-descending-symbolic")); } else { sortType->setIcon(QIcon::fromTheme("view-sort-ascending-symbolic")); } m_window->setCurrentSortOrder(order); }); connect(sortTypeMenu, &QMenu::aboutToShow, sortTypeMenu, [=]() { bool originPathVisible = m_window->getCurrentUri() == "trash:///"; sortTypeMenu->setOriginPathVisible(originPathVisible); sortTypeMenu->setSortType(m_window->getCurrentSortColumn()); sortTypeMenu->setSortOrder(m_window->getCurrentSortOrder()); }); connect(sortTypeMenu, &SortTypeMenu::globalSortingPolicyChanged, this, [=]{ auto sortType = m_window->getCurrentSortColumn(); auto sortOrder = m_window->getCurrentSortOrder(); sortTypeMenu->setSortType(sortType); sortTypeMenu->setSortOrder(sortOrder); m_window->setCurrentSortColumn(sortType); m_window->setCurrentSortOrder(sortOrder); }); action = addAction(QIcon::fromTheme("open-menu-symbolic"), tr("Option")); QToolButton *popMenu = qobject_cast(widgetForAction(action)); popMenu->setAutoRaise(false); popMenu->setProperty("isOptionButton", true); popMenu->setPopupMode(QToolButton::InstantPopup); OperationMenu *operationMenu = new OperationMenu(m_window, popMenu); m_operation_menu = operationMenu; action->setMenu(operationMenu); viewType->setProperty("isWindowButton", 1); viewType->setProperty("useIconHighlightEffect", 0x2); viewType->setAutoRaise(true); sortType->setProperty("isWindowButton", 1); sortType->setProperty("useIconHighlightEffect", 0x2); sortType->setAutoRaise(true); popMenu->setProperty("isWindowButton", 1); popMenu->setProperty("useIconHighlightEffect", 0x2); popMenu->setAutoRaise(true); m_focus_list << (viewType); m_focus_list << (sortType); m_focus_list << (popMenu); } void HeaderBar::mouseMoveEvent(QMouseEvent *e) { QToolBar::mouseMoveEvent(e); QCursor c; c.setShape(Qt::ArrowCursor); this->topLevelWidget()->setCursor(c); } //fix Right click in the blank space on the right side of the tab to quickly maximize and restore the window. link bug102455 void HeaderBar::mouseDoubleClickEvent(QMouseEvent *e) { QToolBar::mouseDoubleClickEvent(e); if(e->button() == Qt::LeftButton || e->button() == Qt::RightButton){ m_window->maximizeOrRestore(); } } void HeaderBar::setLocation(const QString &uri) { m_location_bar->updateLocation(uri); } void HeaderBar::cancelEdit() { m_location_bar->cancelEdit(); } void HeaderBar::startEdit(bool bSearch) { //qDebug() << "bSearch" <startEdit(); m_location_bar->switchEditMode(false); } } void HeaderBar::finishEdit() { m_location_bar->finishEdit(); } void HeaderBar::quitSerachMode() { if (m_search_mode) m_location_bar->clearSearchBox(); } void HeaderBar::updateIcons() { if(!m_window) return; qDebug()<<"updateIcons:" <getCurrentUri(); qDebug()<<"updateIcons:" <getCurrentSortColumn(); qDebug()<<"updateIcons:" <getCurrentSortOrder(); m_view_type_menu->setCurrentDirectory(m_window->getCurrentUri()); if(m_window->getCurrentPage() && m_window->getCurrentPage()->getView()) m_view_type_menu->setCurrentView(m_window->getCurrentPage()->getView()->viewId(), true); m_sort_type_menu->switchSortTypeRequest(m_window->getCurrentSortColumn()); m_sort_type_menu->switchSortOrderRequest(m_window->getCurrentSortOrder()); //go back & go forward if(m_window->getCurrentPage()){ m_go_back->setEnabled(m_window->getCurrentPage()->canGoBack()); m_go_forward->setEnabled(m_window->getCurrentPage()->canGoForward()); } //fix create folder fail issue in special path // auto curUri = m_window->getCurrentUri(); // auto info = Peony::FileInfo::fromUri(curUri); //Peony::FileInfoJob job(info); //job.querySync(); // if (info->canWrite()) // m_create_folder->setEnabled(true); // else // m_create_folder->setEnabled(false); //maximize & restore //updateMaximizeState(); } void HeaderBar::updateViewTypeEnable() { auto url = m_window->getCurrentUri(); //qDebug() << "updateViewTypeEnable url:" << url; if(url == "computer:///"){ m_view_type_menu->setEnabled(false); m_view_type_menu->menuAction()->setVisible(false); }else{ m_view_type_menu->setEnabled(true); m_view_type_menu->menuAction()->setVisible(true); } } void HeaderBar::updateHeaderState() { // if (! m_window->getFilterWorking()) // m_create_folder->setEnabled(true); // else // m_create_folder->setEnabled(false); } void HeaderBar::updateSortTypeEnable() { auto url = m_window->getCurrentUri(); qDebug() << "url:" << url; if(url == "computer:///"){ m_sort_type_menu->setEnabled(false); m_sort_type_menu->menuAction()->setVisible(false); }else{ m_sort_type_menu->setEnabled(true); m_sort_type_menu->menuAction()->setVisible(true); } } void HeaderBar::updateMaximizeState() { //maximize & restore bool maximized = m_window->isMaximized(); if (maximized) { m_maximize_restore_button->setIcon(QIcon::fromTheme("window-restore-symbolic")); m_maximize_restore_button->setToolTip(tr("Restore")); } else { m_maximize_restore_button->setIcon(QIcon::fromTheme("window-maximize-symbolic")); m_maximize_restore_button->setToolTip(tr("Maximize")); } } //HeaderBarToolButton HeaderBarToolButton::HeaderBarToolButton(QWidget *parent) : QToolButton(parent) { setAutoRaise(false); setIconSize(QSize(16, 16)); } //HeadBarPushButton HeadBarPushButton::HeadBarPushButton(QWidget *parent) : QPushButton(parent) { setIconSize(QSize(16, 16)); } //HeaderBarStyle HeaderBarStyle *HeaderBarStyle::getStyle() { if (!global_instance) { global_instance = new HeaderBarStyle; } return global_instance; } int HeaderBarStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { if (qobject_cast(widget)) return 0; switch (metric) { case PM_ToolBarIconSize: return 16; case PM_ToolBarSeparatorExtent: return 1; case PM_ToolBarItemSpacing: { return 1; } default: return QProxyStyle::pixelMetric(metric, option, widget); } } void HeaderBarStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { //This is a "lie". We want to use instant popup menu for tool button, and we aslo //want use popup menu style with this tool button, so we change the related flags //to draw in our expected. if (control == CC_ToolButton) { QStyleOptionToolButton button = *qstyleoption_cast(option); if (button.features.testFlag(QStyleOptionToolButton::HasMenu)) { button.features = QStyleOptionToolButton::None; if (!widget->property("isOptionButton").toBool()) { button.features |= QStyleOptionToolButton::HasMenu; button.features |= QStyleOptionToolButton::MenuButtonPopup; button.subControls |= QStyle::SC_ToolButtonMenu; } return qApp->style()->drawComplexControl(control, &button, painter, widget); } } return qApp->style()->drawComplexControl(control, option, painter, widget); } void HeaderBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == PE_IndicatorToolBarSeparator) { return; } return qApp->style()->drawPrimitive(element, option, painter, widget); } HeaderBarContainer::HeaderBarContainer(QWidget *parent) : QToolBar(parent) { setStyle(HeaderBarStyle::getStyle()); setContextMenuPolicy(Qt::CustomContextMenu); setStyleSheet(".HeaderBarContainer" "{" "background-color: transparent;" "border: 0px solid transparent" "}"); setFixedHeight(50); setMovable(false); m_layout = new QHBoxLayout; m_layout->setSpacing(0); m_layout->setContentsMargins(0, 0, 0, 0); m_internal_widget = new QWidget(this); m_internal_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } bool HeaderBarContainer::eventFilter(QObject *obj, QEvent *e) { Q_UNUSED(obj) auto window = qobject_cast(obj); if (window) { //use updateMaximizeState function, comment those code if (e->type() == QEvent::Resize || QEvent::WindowStateChange == e->type()) { //fix bug#95419, drag change window to restore not change state issue m_header_bar->updateMaximizeState(); } //fix double click space window has no change issue, bug#38499 //fix Right click in the blank space on the right side of the tab to quickly maximize and restore the window. link bug102455 // if (e->type() == QEvent::MouseButtonDblClick) // { // m_header_bar->m_window->maximizeOrRestore(); // } return false; } else { if (e->type() == QEvent::MouseMove) { //auto w = qobject_cast(obj); QCursor c; c.setShape(Qt::ArrowCursor); //this->setCursor(c); //w->setCursor(c); this->topLevelWidget()->setCursor(c); } } return false; } void HeaderBarContainer::addHeaderBar(HeaderBar *headerBar) { if (m_header_bar) return; m_header_bar = headerBar; headerBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_layout->addWidget(headerBar); headerBar->initFocus(); addWindowButtons(); m_internal_widget->setLayout(m_layout); addWidget(m_internal_widget); m_header_bar->m_window->installEventFilter(this); } void HeaderBarContainer::addWindowButtons() { //m_window_buttons = new QWidget(this); auto layout = new QHBoxLayout; layout->setContentsMargins(0, 0, 4, 0); layout->setSpacing(4); //minimize, maximize and close auto minimize = new QToolButton(m_internal_widget); minimize->setIcon(QIcon::fromTheme("window-minimize-symbolic")); minimize->setToolTip(tr("Minimize")); minimize->setAutoRaise(false); connect(minimize, &QToolButton::clicked, this, [=]() { //KWindowSystem::minimizeWindow(m_header_bar->m_window->winId()); m_header_bar->m_window->showMinimized(); }); //window-maximize-symbolic //window-restore-symbolic auto maximizeAndRestore = new QToolButton(m_internal_widget); m_header_bar->m_maximize_restore_button = maximizeAndRestore; //switch tips with button status, fix bug#77604 m_header_bar->updateMaximizeState(); maximizeAndRestore->setAutoRaise(false); connect(maximizeAndRestore, &QToolButton::clicked, this, [=]() { m_header_bar->m_window->maximizeOrRestore(); }); m_max_or_restore = maximizeAndRestore; auto close = new QToolButton(m_internal_widget); close->setIcon(QIcon::fromTheme("window-close-symbolic")); close->setToolTip(tr("Close")); close->setAutoRaise(false); minimize->setProperty("isWindowButton", 1); minimize->setProperty("useIconHighlightEffect", 0x2); minimize->setAutoRaise(true); maximizeAndRestore->setProperty("isWindowButton", 1); maximizeAndRestore->setProperty("useIconHighlightEffect", 0x2); maximizeAndRestore->setAutoRaise(true); close->setProperty("isWindowButton", 2); close->setProperty("useIconHighlightEffect", 0x8); close->setAutoRaise(true); connect(close, &QToolButton::clicked, this, [=]() { m_header_bar->m_window->close(); }); //fix bug#98500, comment self change palette code, use platform-theme way // connect(qApp, &QApplication::paletteChanged, close, [=](){ // QTimer::singleShot(100, this, [=](){ // auto palette = qApp->palette(); // palette.setColor(QPalette::Highlight, QColor("#E54A50")); // close->setPalette(palette); // }); // }); // auto palette = qApp->palette(); // palette.setColor(QPalette::Highlight, QColor("#E54A50")); // close->setPalette(palette); layout->addWidget(minimize); layout->addWidget(maximizeAndRestore); layout->addWidget(close); m_layout->addLayout(layout); minimize->setMouseTracking(true); minimize->installEventFilter(this); maximizeAndRestore->setMouseTracking(true); maximizeAndRestore->installEventFilter(this); close->setMouseTracking(true); close->installEventFilter(this); if (!XAtomHelper::isPlatformX11()) { minimize->setVisible(false); maximizeAndRestore->setVisible(false); close->setVisible(false); m_layout->removeItem(layout); } m_header_bar->m_window->addFocusWidgetToFocusList(minimize); m_header_bar->m_window->addFocusWidgetToFocusList(maximizeAndRestore); m_header_bar->m_window->addFocusWidgetToFocusList(close); } void HeaderBarContainer::paintEvent(QPaintEvent *e) { QPainter p(this); QStyleOptionToolBar opt; initStyleOption(&opt); bool isEnable = opt.state & QStyle::State_Enabled; bool isActive = opt.state & QStyle::State_Active; auto color = qApp->palette().color(isEnable? isActive? QPalette::Active: QPalette::Inactive: QPalette::Disabled, QPalette::Base); p.fillRect(this->rect(), color); } peony/stable/ukui3/control/navigation-tab-bar.cpp0000664000175000017500000003044415154271106021004 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "navigation-tab-bar.h" #include "x11-window-manager.h" #include "file-utils.h" #include "search-vfs-uri-parser.h" #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include "FMWindowIface.h" #include "main-window.h" #include "file-info.h" #include "file-info-job.h" static TabBarStyle *global_instance = nullptr; NavigationTabBar::NavigationTabBar(QWidget *parent) : QTabBar(parent) { setProperty("isWindowButton", 0x1); setProperty("useIconHighlightEffect", 0x2); setFocusPolicy(Qt::StrongFocus); setAcceptDrops(true); m_drag_timer.setInterval(750); m_drag_timer.setSingleShot(true); setStyle(TabBarStyle::getStyle()); setContentsMargins(0, 0, 0, 0); //setUsesScrollButtons(false); //setFixedHeight(36); setProperty("useStyleWindowManager", false); setMovable(true); setExpanding(false); setTabsClosable(true); setUsesScrollButtons(true); X11WindowManager::getInstance()->registerWidget(this); connect(this, &QTabBar::currentChanged, this, [=](int index) { //qDebug()<<"current changed"<setAutoDelete(); setTabData(index, uri); connect(infoJob, &Peony::FileInfoJob::queryAsyncFinished, this, [=](){ infoJob->deleteLater(); if (uri != tabData(index).toString()) return; auto iconName = Peony::FileUtils::getFileIconName(uri); auto displayName = Peony::FileUtils::getFileDisplayName(uri); //qDebug() << "updateLocation text:" < ELIDE_TEXT_LENGTH) // { // int charWidth = fontMetrics().averageCharWidth(); // displayName = fontMetrics().elidedText(displayName, Qt::ElideRight, ELIDE_TEXT_LENGTH * charWidth); // } if (displayName.contains("&")) { displayName = Peony::FileUtils::handleSpecialSymbols(displayName); } setElideMode(Qt::ElideRight); setTabText(index, displayName); setTabIcon(index, QIcon::fromTheme(iconName)); setTabData(index, uri); setTabToolTip(index, displayName); Q_EMIT this->locationUpdated(uri); }); infoJob->queryAsync(); } void NavigationTabBar::addPage(const QString &uri, bool jumpToNewTab) { setFocus(); if (uri.isEmpty()) return; m_info = Peony::FileInfo::fromUri(uri); if (!uri.isNull()) { auto iconName = Peony::FileUtils::getFileIconName(uri); auto displayName = Peony::FileUtils::getFileDisplayName(uri); if (displayName.contains("&")) { displayName = Peony::FileUtils::handleSpecialSymbols(displayName); } addTab(QIcon::fromTheme(iconName), displayName); setTabData(count() - 1, uri); if (jumpToNewTab) setCurrentIndex(count() - 1); Q_EMIT this->pageAdded(uri); } else { if (currentIndex() == -1) { addPage("file:///", true); } else { QString uri = tabData(currentIndex()).toString(); addPage(uri, jumpToNewTab); } } } void NavigationTabBar::tabRemoved(int index) { //qDebug()<<"tab removed"<source() != this) { QPoint pos = e->pos(); int index = tabAt(pos); if (index >= 0) { setCurrentIndex(index); } } e->accept(); return; } void NavigationTabBar::dragMoveEvent(QDragMoveEvent *e) { if (e->source() == this) { m_should_trigger_drop = false; m_drag->cancel(); grabMouse(); } e->accept(); return; } void NavigationTabBar::dragLeaveEvent(QDragLeaveEvent *e) { QTabBar::dragLeaveEvent(e); } void NavigationTabBar::dropEvent(QDropEvent *e) { m_start_drag = false; if (e->source() != this) { if (e->mimeData()->hasUrls()) { for (auto url : e->mimeData()->urls()) { if (Peony::FileUtils::isFileDirectory(url.url())) { addPageRequest(url.url(), true); } } } else if (e->mimeData()->hasFormat("peony/tab-index")) { auto uri = e->mimeData()->data("peony/tab-index"); if (Peony::FileUtils::isFileDirectory(uri)) { addPageRequest(uri, true); } } //finish the drag, remove old tab page from old tab. if (auto oldTab = qobject_cast(e->source())) { oldTab->removeTab(oldTab->currentIndex()); } } releaseMouse(); } void NavigationTabBar::mousePressEvent(QMouseEvent *e) { QTabBar::mousePressEvent(e); m_press_pos = e->pos(); if (tabAt(e->pos()) >= 0) m_start_drag = true; else m_start_drag = false; } void NavigationTabBar::mouseMoveEvent(QMouseEvent *e) { QTabBar::mouseMoveEvent(e); if (e->source() != Qt::MouseEventNotSynthesized) { return; } auto offset = e->pos() - m_press_pos; auto offsetX = qAbs(offset.x()); auto offsetY = qAbs(offset.y()); if (e->pos().y() >= 0 && e->pos().y() <= this->height()) { return; } if (!m_start_drag) return; //start a drag //note that we should remove this tab from the window //at other tab's drop event. auto pixmap = this->topLevelWidget()->grab().scaledToWidth(this->topLevelWidget()->width()/2, Qt::SmoothTransformation); auto thisWindow = this->topLevelWidget(); //KWindowSystem::lowerWindow(this->topLevelWidget()->winId()); for (auto win : qApp->allWidgets()) { if (auto mainWin = qobject_cast(win)) { if (thisWindow != mainWin && win->isVisible()) { QWindow *window = win->windowHandle(); if (window) { window->raise(); } } } } QDrag *d = new QDrag(this); m_drag = d; QMimeData *data = new QMimeData(); auto uri = tabData(currentIndex()).toString(); //data->setText(uri); data->setData("peony/tab-index", uri.toUtf8()); d->setMimeData(data); d->setPixmap(pixmap); d->setHotSpot(pixmap.rect().center()); m_should_trigger_drop = true; d->exec(); qApp->restoreOverrideCursor(); m_drag = nullptr; if (m_should_trigger_drop) { if (auto tab = qobject_cast(d->target())) { //do nothing for target tab bar helped us handling yet. } else { auto window = dynamic_cast(this->topLevelWidget()); auto newWindow = dynamic_cast(window->create(this->tabData(currentIndex()).toString())); newWindow->show(); //KWindowSystem::raiseWindow(newWindow->winId()); newWindow->raise(); newWindow->move(QCursor::pos() - newWindow->rect().center()); removeTab(currentIndex()); } delete d; releaseMouse(); m_start_drag = false; } else { d->deleteLater(); } } void NavigationTabBar::mouseReleaseEvent(QMouseEvent *e) { QTabBar::mouseReleaseEvent(e); m_start_drag = false; releaseMouse(); } void NavigationTabBar::resizeEvent(QResizeEvent *e) { QTabBar::resizeEvent(e); } TabBarStyle *TabBarStyle::getStyle() { if (!global_instance) { global_instance = new TabBarStyle; } return global_instance; } void TabBarStyle::polish(QWidget *widget) { QProxyStyle::polish(widget); widget->setProperty("isWindowButton", 0x1); //bug#167146 useIconHighlightEffect=2 导致打开预览框的图标不反白 //widget->setProperty("useIconHighlightEffect", 0x2); } int TabBarStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { return QProxyStyle::pixelMetric(metric, option, widget); } QRect TabBarStyle::subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_TabBarScrollLeftButton: case SE_TabBarTearIndicatorLeft: { QRect tabRect = option->rect; tabRect.setRight(tabRect.left() + 8); return tabRect; } case SE_TabBarScrollRightButton: case SE_TabBarTearIndicatorRight: { QRect tabRect = option->rect; tabRect.setLeft(tabRect.right() - 8); return tabRect; } default: return QProxyStyle::subElementRect(element, option, widget); } } void TabBarStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { if (widget && (widget->objectName() == "addPageButton" || widget->objectName() == "toolButton")) { painter->save(); painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); QPainterPath path; path.addEllipse(widget->rect().adjusted(2, 2, -2, -2)); painter->setClipPath(path); qApp->style()->drawComplexControl(control, option, painter, widget); painter->restore(); } else { qApp->style()->drawComplexControl(control, option, painter, widget); } } void TabBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (widget && widget->objectName() == "previewButtons") { return; } qApp->style()->drawControl(element, option, painter, widget); } void TabBarStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case PE_IndicatorArrowLeft: case PE_IndicatorArrowRight: { QStyleOption tmp = *option; tmp.palette.setColor(QPalette::HighlightedText, qApp->palette().buttonText().color()); return qApp->style()->drawPrimitive(element, &tmp, painter, widget); } default: return qApp->style()->drawPrimitive(element, option, painter, widget); } } peony/stable/ukui3/control/ui_about-dialog.h0000664000175000017500000002255115154271070020050 0ustar fengfeng/******************************************************************************** ** Form generated from reading UI file 'about-dialog.ui' ** ** Created by: Qt User Interface Compiler version 5.12.12 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ #ifndef UI_ABOUT_2D_DIALOG_H #define UI_ABOUT_2D_DIALOG_H #include #include #include #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class Ui_AboutDialog { public: QGridLayout *gridLayout; QVBoxLayout *verticalLayout_3; QTextEdit *briefTextedit; QSpacerItem *verticalSpacer_6; QLabel *openlinkLabel; QSpacerItem *verticalSpacer_5; QHBoxLayout *horizontalLayout_4; QVBoxLayout *verticalLayout_6; QLabel *logoLabel; QLabel *titleLabel; QPushButton *closeBtn; QHBoxLayout *horizontalLayout; QSpacerItem *horizontalSpacer_2; QVBoxLayout *verticalLayout_2; QLabel *iconLabel; QSpacerItem *horizontalSpacer_3; QHBoxLayout *horizontalLayout_3; QSpacerItem *horizontalSpacer_4; QVBoxLayout *verticalLayout_4; QVBoxLayout *verticalLayout; QLabel *nameLabel; QLabel *versionLabel; QSpacerItem *horizontalSpacer_5; void setupUi(QDialog *AboutDialog) { if (AboutDialog->objectName().isEmpty()) AboutDialog->setObjectName(QString::fromUtf8("AboutDialog")); AboutDialog->resize(420, 492); QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(AboutDialog->sizePolicy().hasHeightForWidth()); AboutDialog->setSizePolicy(sizePolicy); AboutDialog->setMinimumSize(QSize(420, 324)); AboutDialog->setMaximumSize(QSize(420, 560)); gridLayout = new QGridLayout(AboutDialog); gridLayout->setSpacing(0); gridLayout->setObjectName(QString::fromUtf8("gridLayout")); gridLayout->setContentsMargins(0, 0, 0, 0); verticalLayout_3 = new QVBoxLayout(); verticalLayout_3->setSpacing(0); verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3")); verticalLayout_3->setContentsMargins(32, -1, 32, -1); briefTextedit = new QTextEdit(AboutDialog); briefTextedit->setObjectName(QString::fromUtf8("briefTextedit")); sizePolicy.setHeightForWidth(briefTextedit->sizePolicy().hasHeightForWidth()); briefTextedit->setSizePolicy(sizePolicy); briefTextedit->setMinimumSize(QSize(0, 0)); briefTextedit->setMaximumSize(QSize(16777215, 16777215)); briefTextedit->setFocusPolicy(Qt::NoFocus); briefTextedit->setFrameShape(QFrame::NoFrame); verticalLayout_3->addWidget(briefTextedit); verticalSpacer_6 = new QSpacerItem(20, 24, QSizePolicy::Minimum, QSizePolicy::Fixed); verticalLayout_3->addItem(verticalSpacer_6); openlinkLabel = new QLabel(AboutDialog); openlinkLabel->setObjectName(QString::fromUtf8("openlinkLabel")); verticalLayout_3->addWidget(openlinkLabel); verticalSpacer_5 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Fixed); verticalLayout_3->addItem(verticalSpacer_5); gridLayout->addLayout(verticalLayout_3, 3, 0, 1, 1); horizontalLayout_4 = new QHBoxLayout(); horizontalLayout_4->setSpacing(8); horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4")); horizontalLayout_4->setContentsMargins(4, 4, 4, 4); verticalLayout_6 = new QVBoxLayout(); verticalLayout_6->setSpacing(0); verticalLayout_6->setObjectName(QString::fromUtf8("verticalLayout_6")); verticalLayout_6->setContentsMargins(4, 4, -1, -1); logoLabel = new QLabel(AboutDialog); logoLabel->setObjectName(QString::fromUtf8("logoLabel")); logoLabel->setMinimumSize(QSize(24, 24)); logoLabel->setMaximumSize(QSize(24, 24)); verticalLayout_6->addWidget(logoLabel); horizontalLayout_4->addLayout(verticalLayout_6); titleLabel = new QLabel(AboutDialog); titleLabel->setObjectName(QString::fromUtf8("titleLabel")); titleLabel->setMinimumSize(QSize(0, 28)); titleLabel->setMaximumSize(QSize(16777215, 24)); horizontalLayout_4->addWidget(titleLabel); closeBtn = new QPushButton(AboutDialog); closeBtn->setObjectName(QString::fromUtf8("closeBtn")); closeBtn->setMinimumSize(QSize(30, 30)); closeBtn->setMaximumSize(QSize(30, 30)); closeBtn->setLayoutDirection(Qt::RightToLeft); horizontalLayout_4->addWidget(closeBtn); gridLayout->addLayout(horizontalLayout_4, 0, 0, 1, 1); horizontalLayout = new QHBoxLayout(); horizontalLayout->setSpacing(0); horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); horizontalSpacer_2 = new QSpacerItem(118, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer_2); verticalLayout_2 = new QVBoxLayout(); verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2")); verticalLayout_2->setContentsMargins(-1, 38, -1, -1); iconLabel = new QLabel(AboutDialog); iconLabel->setObjectName(QString::fromUtf8("iconLabel")); iconLabel->setMinimumSize(QSize(96, 96)); iconLabel->setMaximumSize(QSize(96, 96)); iconLabel->setStyleSheet(QString::fromUtf8("")); iconLabel->setAlignment(Qt::AlignBottom|Qt::AlignHCenter); verticalLayout_2->addWidget(iconLabel); horizontalLayout->addLayout(verticalLayout_2); horizontalSpacer_3 = new QSpacerItem(118, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer_3); gridLayout->addLayout(horizontalLayout, 1, 0, 1, 1); horizontalLayout_3 = new QHBoxLayout(); horizontalLayout_3->setSpacing(0); horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3")); horizontalLayout_3->setContentsMargins(-1, 0, -1, 0); horizontalSpacer_4 = new QSpacerItem(88, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout_3->addItem(horizontalSpacer_4); verticalLayout_4 = new QVBoxLayout(); verticalLayout_4->setSpacing(0); verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4")); verticalLayout_4->setContentsMargins(-1, 16, -1, 12); verticalLayout = new QVBoxLayout(); verticalLayout->setSpacing(12); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); nameLabel = new QLabel(AboutDialog); nameLabel->setObjectName(QString::fromUtf8("nameLabel")); nameLabel->setMinimumSize(QSize(0, 28)); nameLabel->setMaximumSize(QSize(16777215, 28)); QFont font; font.setPointSize(11); nameLabel->setFont(font); nameLabel->setLayoutDirection(Qt::LeftToRight); nameLabel->setAlignment(Qt::AlignCenter); verticalLayout->addWidget(nameLabel); versionLabel = new QLabel(AboutDialog); versionLabel->setObjectName(QString::fromUtf8("versionLabel")); versionLabel->setMinimumSize(QSize(0, 24)); versionLabel->setMaximumSize(QSize(16777215, 24)); versionLabel->setFont(font); versionLabel->setAlignment(Qt::AlignCenter); verticalLayout->addWidget(versionLabel); verticalLayout_4->addLayout(verticalLayout); horizontalLayout_3->addLayout(verticalLayout_4); horizontalSpacer_5 = new QSpacerItem(88, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout_3->addItem(horizontalSpacer_5); gridLayout->addLayout(horizontalLayout_3, 2, 0, 1, 1); retranslateUi(AboutDialog); QMetaObject::connectSlotsByName(AboutDialog); } // setupUi void retranslateUi(QDialog *AboutDialog) { AboutDialog->setWindowTitle(QApplication::translate("AboutDialog", "Dialog", nullptr)); briefTextedit->setHtml(QApplication::translate("AboutDialog", "\n" "\n" "


", nullptr)); openlinkLabel->setText(QApplication::translate("AboutDialog", "TextLabel", nullptr)); logoLabel->setText(QString()); titleLabel->setText(QString()); closeBtn->setText(QString()); iconLabel->setText(QString()); nameLabel->setText(QString()); versionLabel->setText(QString()); } // retranslateUi }; namespace Ui { class AboutDialog: public Ui_AboutDialog {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_ABOUT_2D_DIALOG_H peony/stable/ukui3/control/float-pane-widget.h0000664000175000017500000000301115154271070020301 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #ifndef DEVELFLOATPANEWIDGET_H #define DEVELFLOATPANEWIDGET_H #include class QVariantAnimation; class FloatPaneWidget : public QWidget { Q_OBJECT public: explicit FloatPaneWidget(QWidget *mainWidget, QWidget *floatWidget, QWidget *parent = nullptr); void setFloatWidgetWidthHint(int widthHint); QSize sizeHint() const override; public Q_SLOTS: void setFloatWidgetVisible(bool visible); protected: void resizeEvent(QResizeEvent *event) override; private: QWidget *m_mainWidget = nullptr; QWidget *m_floatWidget = nullptr; QVariantAnimation *m_floatWidgetWidthAnimation = nullptr; int m_floatWidgetWidthHint = 200; const int FLOAT_WIDGET_MIN_WIDTH = 596/*296*/; }; #endif // DEVELFLOATPANEWIDGET_H peony/stable/ukui3/control/navigation-side-bar.h0000664000175000017500000000672715154271106020636 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELNAVIGATIONSIDEBAR_H #define DEVELNAVIGATIONSIDEBAR_H #include #include #include namespace Peony { class SideBarModel; class SideBarProxyFilterSortModel; class SideBarAbstractItem; } class QPushButton; class QVBoxLayout; class NavigationSideBar : public QTreeView { Q_OBJECT public: explicit NavigationSideBar(QWidget *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); void updateGeometries(); void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible); void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *e); void dropEvent(QDropEvent *e); QSize sizeHint() const; void JumpDirectory(const QString& uri);/* 跳转目录 */ Q_SIGNALS: void updateWindowLocationRequest(const QString &uri, bool addHistory = true, bool force = false); void labelButtonClicked(bool checked); protected: void keyPressEvent(QKeyEvent *event); void focusInEvent(QFocusEvent *event); void wheelEvent(QWheelEvent *event); void dragEnterEvent(QDragEnterEvent *event) override; int sizeHintForColumn(int column) const override; //QStyleOptionViewItem viewOptions() const override; void initViewItemOption(QStyleOptionViewItem *option) const override; private: Peony::SideBarProxyFilterSortModel *m_proxy_model = nullptr; Peony::SideBarModel *m_model = nullptr; Peony::SideBarAbstractItem* m_currSelectedItem = nullptr; bool m_notAllowHorizontalMove = false;/* 按下左右键不可使侧边栏内容左右平移显示 */ }; class NavigationSideBarContainer : public QWidget { Q_OBJECT public: explicit NavigationSideBarContainer(QWidget *parent = nullptr); void addSideBar(NavigationSideBar *sidebar); QSize sizeHint() const override; private: NavigationSideBar *m_sidebar = nullptr; QVBoxLayout *m_layout = nullptr; QPushButton *m_label_button = nullptr; }; class NavigationSideBarItemDelegate : public QStyledItemDelegate { friend class NavigationSideBar; explicit NavigationSideBarItemDelegate(QObject *parent = nullptr); QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class NavigationSideBarStyle : public QProxyStyle { public: explicit NavigationSideBarStyle(); void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; }; #endif // DEVELNAVIGATIONSIDEBAR_H peony/stable/ukui3/control/file-label-box.cpp0000664000175000017500000001362315154271070020121 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "file-label-box.h" #include "file-label-model.h" #include "label-box-delegate.h" #include #include #include #include #include #include #include #include #include #include static LabelBoxStyle *global_instance = nullptr; static QMap color_icons; FileLabelBox::FileLabelBox(QWidget *parent) : QListView(parent) { setItemDelegate(new LabelBoxDelegate(this)); setStyle(LabelBoxStyle::getStyle()); viewport()->setStyle(LabelBoxStyle::getStyle()); viewport()->setAutoFillBackground(true); viewport()->setBackgroundRole(QPalette::AlternateBase); setModel(FileLabelModel::getGlobalModel()); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &QWidget::customContextMenuRequested, this, [=](const QPoint &pos) { auto index = indexAt(pos); //bool labelRemovable = false; QMenu menu(this); if (index.isValid()) { auto item = FileLabelModel::getGlobalModel()->itemFormIndex(index); int id = item->id(); // if (id > TOTAL_DEFAULT_COLOR) // labelRemovable = true; menu.addAction(tr("Rename"), [=]() { //FIXME: edit edit(index); }); menu.addAction(tr("Edit Color"), [=]() { QColorDialog d; d.setStyleSheet("QSpinBox{" "min-width: 2em;" "}"); if (d.exec()) { auto color = d.selectedColor(); FileLabelModel::getGlobalModel()->setLabelColor(item->id(), color); } }); auto a = menu.addAction(tr("Delete"), [=]() { FileLabelModel::getGlobalModel()->removeLabel(id); }); //a->setEnabled(labelRemovable); } else { menu.addAction(tr("Create New Label"), [=]() { QColorDialog dialog; dialog.setStyleSheet("QSpinBox{" "min-width: 2em;" "}"); if (dialog.exec()) { auto color = dialog.selectedColor(); auto name = color.name(); FileLabelModel::getGlobalModel()->addLabel(name, color); } }); } menu.exec(mapToGlobal(pos)); }); } QSize FileLabelBox::sizeHint() const { auto w = this->topLevelWidget()->width(); auto size = QListView::sizeHint(); size.setWidth(w/5); return size; } void FileLabelBox::mousePressEvent(QMouseEvent *e) { QModelIndex index = indexAt(e->pos()); //qDebug() << "mousePressEvent:"<pos() <type(); if (!index.isValid() && e->button() == Qt::LeftButton) { this->clearSelection(); Q_EMIT leftClickOnBlank(); } else { QListView::mousePressEvent(e); } } void FileLabelBox::paintEvent(QPaintEvent *e) { QListView::paintEvent(e); } //LabelBoxStyle LabelBoxStyle *LabelBoxStyle::getStyle() { if (!global_instance) { global_instance = new LabelBoxStyle; } return global_instance; } void LabelBoxStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == QStyle::PE_Frame) return; return QApplication::style()->drawPrimitive(element, option, painter, widget); } void LabelBoxStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { if (element == CE_ItemViewItem) { if (auto tmp = qstyleoption_cast(option)) { QStyleOptionViewItem opt = *tmp; auto color = qvariant_cast(opt.index.data(Qt::DecorationRole)); auto icon = color_icons.value(color.name()); if (icon.isNull()) { QPixmap pic(QSize(12, 12)); pic.fill(Qt::transparent); QPainter p(&pic); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); p.setPen(QPen(Qt::gray, 0.5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); p.setBrush(color); p.drawEllipse(QRect(0, 0, 12, 12)); p.end(); icon.addPixmap(pic); color_icons.insert(color.name(), icon); } opt.icon = icon; return QApplication::style()->drawControl(element, &opt, painter, widget); } } return QApplication::style()->drawControl(element, option, painter, widget); } QSize LabelBoxStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const { if (type == CT_ItemViewItem) { QSize size = QApplication::style()->sizeFromContents(type, option, size, widget); size += QSize(0, 8); return size; } return QApplication::style()->sizeFromContents(type, option, size, widget); } peony/stable/ukui3/control/float-pane-widget.cpp0000664000175000017500000000704615154271070020650 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2021, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: Yue Lan * */ #include "float-pane-widget.h" #include FloatPaneWidget::FloatPaneWidget(QWidget *mainWidget, QWidget *floatWidget, QWidget *parent) : QWidget(parent) { m_mainWidget = mainWidget; mainWidget->setParent(this); m_floatWidget = floatWidget; floatWidget->setParent(this); floatWidget->setVisible(false); m_floatWidgetWidthAnimation = new QVariantAnimation(this); m_floatWidgetWidthAnimation->setStartValue(qreal(0.0)); m_floatWidgetWidthAnimation->setEndValue(qreal(1.0)); m_floatWidgetWidthAnimation->setDuration(500); m_floatWidgetWidthAnimation->setEasingCurve(QEasingCurve::OutCubic); connect(m_floatWidgetWidthAnimation, &QVariantAnimation::valueChanged, this, [=](){ if (m_floatWidgetWidthAnimation->state() == QVariantAnimation::Running) { qreal currentValue = m_floatWidgetWidthAnimation->currentValue().toReal(); int floatWidgetWidth = m_floatWidgetWidthHint * currentValue; m_floatWidget->move(0, 0); m_floatWidget->resize(floatWidgetWidth, this->height()); } }); connect(m_floatWidgetWidthAnimation, &QVariantAnimation::finished, this, [=](){ if (m_floatWidgetWidthAnimation->currentValue().toReal() == 0) { m_floatWidget->setVisible(false); m_mainWidget->setGeometry(this->rect()); } else { m_floatWidget->setVisible(true); } }); setMinimumWidth(FLOAT_WIDGET_MIN_WIDTH); } void FloatPaneWidget::setFloatWidgetWidthHint(int widthHint) { m_floatWidgetWidthHint = widthHint; } QSize FloatPaneWidget::sizeHint() const { if (m_floatWidget->isVisible()) { return QSize(m_mainWidget->sizeHint().width() + m_floatWidgetWidthHint, m_mainWidget->sizeHint().height()); } else { return QSize(m_mainWidget->sizeHint()); } } void FloatPaneWidget::setFloatWidgetVisible(bool visible) { if (visible) { m_floatWidget->setVisible(true); // resize(this->width() + m_floatWidgetWidthHint, this->height()); m_mainWidget->move(m_floatWidgetWidthHint, 0); m_mainWidget->resize(size().width() - m_floatWidgetWidthHint, size().height()); } m_floatWidgetWidthAnimation->setDirection(visible? QVariantAnimation::Forward: QVariantAnimation::Backward); m_floatWidgetWidthAnimation->start(); } void FloatPaneWidget::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); if (m_floatWidget->isVisible()) { m_mainWidget->move(m_floatWidgetWidthHint, 0); m_mainWidget->resize(this->width() - m_floatWidgetWidthHint, this->height()); m_floatWidget->move(0, 0); m_floatWidget->resize(m_floatWidget->width(), this->height()); } else { m_mainWidget->move(0, 0); m_mainWidget->resize(this->size()); } } peony/stable/ukui3/control/sort-type-menu.cpp0000664000175000017500000000715315154271070020250 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "sort-type-menu.h" #include "global-settings.h" #include SortTypeMenu::SortTypeMenu(QWidget *parent) : QMenu(parent) { auto sortTypeGroup = new QActionGroup(this); m_sort_types = sortTypeGroup; sortTypeGroup->setExclusive(true); auto fileName = addAction(tr("File Name")); fileName->setCheckable(true); sortTypeGroup->addAction(fileName); auto modifiedDate = addAction(tr("Modified Date")); modifiedDate->setCheckable(true); sortTypeGroup->addAction(modifiedDate); auto fileType = addAction(tr("File Type")); fileType->setCheckable(true); sortTypeGroup->addAction(fileType); auto fileSize = addAction(tr("File Size")); fileSize->setCheckable(true); sortTypeGroup->addAction(fileSize); auto originalPath = addAction(tr("Original Path")); m_origin_path = originalPath; originalPath->setCheckable(true); sortTypeGroup->addAction(originalPath); connect(sortTypeGroup, &QActionGroup::triggered, this, [=](QAction *action) { int index = sortTypeGroup->actions().indexOf(action); switchSortTypeRequest(index); }); addSeparator(); auto sortOrderGroup = new QActionGroup(this); m_sort_orders = sortOrderGroup; sortOrderGroup->setExclusive(true); auto descending = addAction(tr("Descending")); descending->setCheckable(true); sortOrderGroup->addAction(descending); //switch defautl Descending Ascending order, fix bug#99924 auto ascending = addAction(tr("Ascending")); ascending->setCheckable(true); sortOrderGroup->addAction(ascending); connect(sortOrderGroup, &QActionGroup::triggered, this, [=](QAction *action) { int index = sortOrderGroup->actions().indexOf(action); switchSortOrderRequest(Qt::SortOrder(index)); }); addSeparator(); auto useGlobalSortAction = new QAction(tr("Use global sorting"), this); useGlobalSortAction->setCheckable(true); useGlobalSortAction->setChecked(Peony::GlobalSettings::getInstance()->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()); connect(useGlobalSortAction, &QAction::triggered, this, [=](bool checked){ Peony::GlobalSettings::getInstance()->setGSettingValue(USE_GLOBAL_DEFAULT_SORTING, checked); Q_EMIT globalSortingPolicyChanged(); }); addAction(useGlobalSortAction); } void SortTypeMenu::setOriginPathVisible(bool visible) { m_origin_path->setVisible(visible); } void SortTypeMenu::setSortType(int type) { m_sort_types->actions().at(type)->setChecked(true); qDebug()<actions().at(order)->setChecked(true); if (m_sort_order != order) { m_sort_order = order; } } peony/stable/ukui3/control/tab-status-bar.cpp0000664000175000017500000002270015154271070020164 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: MeihongHe * */ #include "tab-status-bar.h" #include "file-info.h" #include "file-utils.h" #include "search-vfs-uri-parser.h" #include "tab-widget.h" #include "file-info.h" #include "global-settings.h" #include #include #include #include #include #include #include #include #include #include TabStatusBar::TabStatusBar(TabWidget *tab, QWidget *parent) : QStatusBar(parent) { setAttribute(Qt::WA_TranslucentBackground); m_styled_toolbar = new QToolBar; setContentsMargins(0, 0, 0, 0); setStyleSheet("padding: 0;"); setSizeGripEnabled(false); setMinimumHeight(30); m_tab = tab; m_label = new ElidedLabel(this); m_label->setContentsMargins(25, 0, 0, 0); addWidget(m_label, 1); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setFocusPolicy(Qt::FocusPolicy(Qt::WheelFocus & ~Qt::TabFocus)); m_slider->setRange(0, 100); //设置状态栏下的搜索进度 m_animation = new QVariantAnimation(this); m_animation->setDuration(1000); m_animation->setStartValue(0.0); m_animation->setEndValue(360.0); connect(m_animation,&QVariantAnimation::valueChanged, m_label, [=](){ m_label->setValue(m_animation->currentValue().toDouble()); }); connect(m_animation, &QVariantAnimation::finished, this, [=](){ if(m_searching) { m_animation->start(); } }); auto mainWindow = qobject_cast(this->topLevelWidget()); auto settings = Peony::GlobalSettings::getInstance(); int defaultZoomLevel = settings->getValue(DEFAULT_VIEW_ID).toInt(); if (mainWindow) { defaultZoomLevel = mainWindow->currentViewZoomLevel(); } m_slider->setValue(defaultZoomLevel); connect(m_slider, &QSlider::valueChanged, this, &TabStatusBar::zoomLevelChangedRequest); connect(qApp, &QApplication::paletteChanged, this, [=]() { this->update(); }); } TabStatusBar::~TabStatusBar() { m_styled_toolbar->deleteLater(); } int TabStatusBar::currentZoomLevel() { if (m_slider->isEnabled()) { m_slider->value(); } return -1; } void TabStatusBar::update() { if (!m_tab) return; if (m_searching) { m_label->setText(tr("Searching for files ...")); return; } //qDebug() << "TabStatusBar::update"; auto selections = m_tab->getCurrentSelectionFileInfos(); //show current path files count if (selections.count() ==0) { auto uris = m_tab->getCurrentAllFileInfos(); if (uris.count() == 0) m_label->setText(""); else m_label->setText(tr(" \%1 items ").arg(uris.count())); return; } //fix select special item issue if (selections.count() == 1 && (selections.first()->uri().isNull() || (selections.first()->uri() == "network:///" || selections.first()->uri() == "computer:///"))) { m_label->setText(""); return; } int specialCount = 0; goffset size = 0; for (auto selection : selections) { //not count special path if (selection->uri() == "network:///" || selection->uri() == "computer:///") { specialCount++; continue; } if(! selection->isDir() && ! selection->isVolume()){ size += selection->size(); } } //Calculated by 1024 bytes auto format_size_GIB = g_format_size_full(size, G_FORMAT_SIZE_IEC_UNITS); QString format_size(format_size_GIB); //状态栏以GB为显示单位 format_size.replace("iB", "B"); if (size > 0) m_label->setText(tr(" selected \%1 items \%2").arg(selections.count()).arg(format_size)); else m_label->setText(tr(" selected \%1 items").arg(selections.count()- specialCount)); g_free(format_size_GIB); } void TabStatusBar::update(const QString &message) { m_label->setText(message); } void TabStatusBar::updateZoomLevelState(int zoomLevel) { m_slider->setValue(zoomLevel); } void TabStatusBar::onZoomRequest(bool zoomIn) { int value = m_slider->value(); if (zoomIn) { value++; } else { value--; } m_slider->setValue(value); } //显示隐藏文件,更新项目个数 void TabStatusBar::updateItemsNum() { this->update(); } void TabStatusBar::paintEvent(QPaintEvent *e) { return; } void TabStatusBar::mousePressEvent(QMouseEvent *e) { return; } void TabStatusBar::resizeEvent(QResizeEvent *e) { QStatusBar::resizeEvent(e); auto pos = this->rect().topRight(); auto size = m_slider->size(); m_slider->move(pos.x() - size.width() - 20, this->size().height()/2 - size.height()/2); } void TabStatusBar::updateSearchProgress(bool searching) { m_searching = searching; if(m_searching) { if(m_animation->state() != QAbstractAnimation::Running) { m_animation->start(); } m_label->setText(tr("Searching for files ...")); } else { m_animation->stop(); update(); } m_label->setSearch(searching); } ElidedLabel::ElidedLabel(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_TranslucentBackground); setContentsMargins(30, 0, 120, 0); QIcon icon = QIcon::fromTheme("ukui-loading-2.symbolic"); m_disc = icon.pixmap(QSize(16,16)); } void ElidedLabel::setText(const QString &text) { m_text = text; this->update(); } void ElidedLabel::setValue(double value) { m_val = value; this->update(); } void ElidedLabel::setSearch(bool searching) { m_searching = searching; } void ElidedLabel::paintEvent(QPaintEvent *event) { /*! * \note * paint status bar background and text. * * designer want to layout status bar into the view, however the status bar belongs to main window now. * that means status bar will be layout over the view. it is not possible to archive the ui desginer goals untils we * destroy the current directory view frameworks. * * it is a complex problem, not an easy one. so do not think about changing the layout here to solve the problem easily. */ QStyleOption opt; opt.initFrom(this); bool active = opt.state &QStyle::State_Active; QColor base = active? qApp->palette().color(QPalette::Active, QPalette::Base): qApp->palette().color(QPalette::Inactive, QPalette::Base); QFontMetrics fm(this->font()); auto elidedText = fm.elidedText(m_text, Qt::TextElideMode::ElideRight, this->size().width() - 150); QPainter p(this); // //p.setCompositionMode(QPainter::CompositionMode_SourceIn); // QLinearGradient linearGradient; // linearGradient.setStart(QPoint(10, this->height())); // linearGradient.setFinalStop(QPoint(10, 0)); // linearGradient.setColorAt(0, base); // linearGradient.setColorAt(0.75, base); // linearGradient.setColorAt(1, Qt::transparent); int overlap = qApp->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarOverlap); int layoutWidth = qApp->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); int adjustedY2 = qMin(0, overlap - layoutWidth); QPainterPath path; path.addRect(this->rect().adjusted(0, 0, adjustedY2 - this->height() + 14, 0)); p.fillPath(path, base); if (m_searching) { p.save(); QRect rect = this->rect().adjusted(0, 0, adjustedY2 - this->height() + 14, 0); QRect adjustedRect = rect.adjusted(30, 0, -120, 0); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); p.translate(adjustedRect.topLeft().x(), this->rect().height()/2 - m_disc.height()/2); p.translate(m_disc.width()/2,m_disc.height()/2); /* 旋转的角度 */ p.rotate(m_val); /* 恢复中心点 */ p.translate(-m_disc.width()/2,-m_disc.height()/2); /* 画图操作 */ p.drawPixmap(0,0 ,m_disc.width(),m_disc.height(), m_disc); p.restore(); p.translate(m_disc.width()+5 , 0); } // QPainterPath path2; // int radius = this->height(); // QPoint pos = QPoint(this->width() + adjustedY2 - this->height(), this->height()); // QRect targetRect = QRect(pos.x() - radius, pos.y() - radius, radius*2, radius*2); // path2.moveTo(pos); // path2.arcTo(targetRect, 0, 90); // QRadialGradient radialGradient; // radialGradient.setCenter(pos); // radialGradient.setFocalPoint(pos); // radialGradient.setRadius(radius); // radialGradient.setColorAt(0, base); // radialGradient.setColorAt(0.75, base); // radialGradient.setColorAt(1, Qt::transparent); // p.fillPath(path2, radialGradient); style()->drawItemText(&p, this->rect().adjusted(30, 0, -120, 0), Qt::AlignLeft | Qt::AlignVCenter, qApp->palette(), this->isEnabled(), elidedText, QPalette::WindowText); } peony/stable/ukui3/control/tab-widget.h0000664000175000017500000002427115154271070017034 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELTABWIDGET_H #define DEVELTABWIDGET_H #include #include #include #include #include #include #include #include #include #include #include "navigation-tab-bar.h" #include "file-info.h" #include "tab-status-bar.h" class NavigationTabBar; class QStackedWidget; class PreviewPageButtonGroups; class QHBoxLayout; class QVBoxLayout; namespace Peony { class PreviewPageIface; class DirectoryViewContainer; class FileInfo; } /*! * \brief The TabWidget class * \details * TabWidget is different with QTabWidget, it contains 4 parts. * 1. tabbar * 2. stackwidget * 3. preview button group * 4. preview page *
* Tabbar and statck is simmilar to QTabWidget's. Preview page is a docked page * which can be added or removed by preview button group. */ class TabWidget : public QMainWindow { friend class MainWindow; Q_OBJECT public: explicit TabWidget(QWidget *parent = nullptr); QTabBar *tabBar(); Peony::DirectoryViewContainer *currentPage(); const QString getCurrentUri(); const QStringList getCurrentSelections(); const QStringList getAllFileUris(); const QList> getCurrentSelectionFileInfos(); /* Function:Get all file information under the current path */ const QList> getCurrentAllFileInfos(); const QStringList getBackList(); const QStringList getForwardList(); bool canGoBack(); bool canGoForward(); bool canCdUp(); int getSortType(); Qt::SortOrder getSortOrder(); bool eventFilter(QObject *obj, QEvent *e); Q_SIGNALS: void currentIndexChanged(int index); void tabMoved(int from, int to); void tabInserted(int index); void tabRemoved(int index); void searchRecursiveChanged(bool recursive); void activePageSelectionChanged(); void activePageChanged(); void activePageLocationChanged(); void activePageViewTypeChanged(); void activePageViewSortTypeChanged(); void viewDoubleClicked(const QString &uri); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void updateWindowLocationRequest(const QString &uri, bool addHistory, bool forceUpdate = false); void updateWindowSelectionRequest(const QStringList &uris); void menuRequest(const QPoint &pos); void zoomRequest(bool zoomIn); void closeWindowRequest(); void clearTrash(); void closeSearch(); void recoverFromTrash(); void currentSelectionChanged(); void signal_itemAdded(const QString& uri);/* 新增文件(夹),item创建完成 */ void updateItemsNum(); /*显示隐藏文件,更新项目个数*/ public Q_SLOTS: void setCurrentIndex(int index); void setPreviewPage(Peony::PreviewPageIface *previewPage = nullptr); void addPage(const QString &uri, bool jumpTo = false); void goToUri(const QString &uri, bool addHistory, bool forceUpdate = false); void switchViewType(const QString &viewId); void updateTabPageTitle(); void goBack(); void goForward(); void cdUp(); void refresh(); void stopLoading(); void tryJump(int index); void clearHistory(); void setSortType(int type); void setSortOrder(Qt::SortOrder order); void setSortFilter(int FileTypeIndex, int FileMTimeIndex, int FileSizeIndex); void setShowHidden(bool showHidden = false); void setUseDefaultNameSortOrder(bool use); void setSortFolderFirst(bool folderFirst); //multiple filter conditions for new advance search void addFilterCondition(int option, int classify, bool updateNow = false); void removeFilterCondition(int option, int classify, bool updateNow = false); void clearConditions(); void updateFilter(); void updateAdvanceConditions(); void setCurrentSelections(const QStringList &uris); void editUri(const QString &uri); void editUris(const QStringList &uris); void onViewDoubleClicked(const QString &uri); bool getTriggeredPreviewPage() { return m_triggered_preview_page; } void setTriggeredPreviewPage(bool trigger) { m_triggered_preview_page = trigger; } int count(); int currentIndex(); void removeTab(int index); void updateTrashBarVisible(const QString &uri = ""); void updateSearchPathButton(const QString &uri = ""); void updateSearchBar(bool showSearch); void updateSearchList(); void updateButtons(); void addNewConditionBar(); void removeConditionBar(int index); void searchUpdate(); void searchChildUpdate(); void browsePath(); void handleZoomLevel(int zoomLevel); void enableSearchBar(bool enable); /* 当设备(U盘、硬盘、光盘、文件保护箱等)在一个或多个文件管理器中打开一个或多个tab页时,设备卸载/弹出/文件保护箱锁定后, * 属于该设备:文件管理器的当前标签页跳转到计算机页(保护箱标签除外),其余标签页均关闭;不属于该设备的tab页不处理 */ void slot_responseUnmounted(const QString &destUri, const QString &sourceUri); protected: void changeCurrentIndex(int index); void moveTab(int from, int to); void bindContainerSignal(Peony::DirectoryViewContainer *container); void updatePreviewPage(); void resizeEvent(QResizeEvent *e); void updateTabBarGeometry(); void updateStatusBarGeometry(); void initAdvanceSearch(); QStringList getCurrentClassify(int rowCount); void updatePreviewPageVisible(); void updateStatusBarSliderState(); void updatePreviewButtonStatus(bool status); void updateTrashButtonSize(); bool isMultFile(std::shared_ptr info); private: NavigationTabBar *m_tab_bar; QToolButton *m_add_page_button; QWidget *m_tab_bar_bg; QStackedWidget *m_stack; PreviewPageButtonGroups *m_buttons; QToolBar *m_tool_bar; Peony::PreviewPageIface *m_preview_page = nullptr; QStackedWidget *m_preview_page_container; QAction *m_current_preview_action = nullptr; QAction *m_preview_action = nullptr; QActionGroup *m_preview_action_group = nullptr; QToolBar *m_trash_bar; QToolBar *m_search_bar; QVBoxLayout *m_top_layout; QHBoxLayout *m_trash_bar_layout; QHBoxLayout *m_search_bar_layout; QLabel *m_trash_label; QPushButton *m_clear_button; QPushButton *m_recover_button; QPushButton *m_search_path; QPushButton *m_search_close; QPushButton *m_search_child; QPushButton *m_search_more; QLabel *m_search_title; //use qlist for dynamic generated search conditions list QList m_layout_list; QList m_conditions_list; QList m_classify_list; QList m_link_label_list; QList m_add_button_list; QList m_remove_button_list; QList m_search_bar_list; QList m_input_list; QList m_add_mappper_list; QList m_remove_mapper_list; int m_search_bar_count = 0; const int ELIDE_TEXT_LENGTH = 5; TabStatusBar *m_status_bar = nullptr; bool m_triggered_preview_page = false; bool m_show_search_list = false; bool m_show_search_bar = false; bool m_search_child_flag = false; //Button size macro definition //change height to 36 to ensure max size font can show complete, link to bug#58824 const int TRASH_BUTTON_HEIGHT = 36; const int TRASH_BUTTON_WIDTH = 65; int m_trash_button_height = 36; int m_trash_button_width = 65; //advance search filter options QStringList m_option_list = {tr("type"), tr("file size"), tr("modify time"), tr("name")}; QStringList m_file_type_list = {tr("all"), tr("file folder"), tr("image"), tr("video"), tr("text file"), tr("audio"), tr("wps file"), tr("others")}; QStringList m_file_mtime_list = {tr("all"), tr("today"), tr("this week"), tr("this month"), tr("this year"), tr("year ago")}; QStringList m_file_size_list = {tr("all"),tr("empty(0K)"), tr("tiny(0-16K)"), tr("small(16k-1M)"), tr("medium(1M-128M)"), tr("big(128M-1G)"),tr("large(1-4G)"),tr("great(>4G)")}; bool m_first_add_page = true; std::shared_ptr m_search_button_info; }; class PreviewPageContainer : public QStackedWidget { friend class TabWidget; Q_OBJECT explicit PreviewPageContainer(QWidget *parent = nullptr); //QSize sizeHint() const {return QSize(200, QStackedWidget::sizeHint().height());} }; class PreviewPageButtonGroups : public QButtonGroup { Q_OBJECT public: explicit PreviewPageButtonGroups(QWidget *parent = nullptr); Q_SIGNALS: void previewPageButtonTrigger(bool trigger, const QString &pluginId); }; class PushButtonStyle : public QProxyStyle { public: static PushButtonStyle *getStyle(); PushButtonStyle() : QProxyStyle() {} void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const; int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget = nullptr) const; }; #endif // DEVELTABWIDGET_H peony/stable/ukui3/control/tab-widget.cpp0000664000175000017500000020055015154271106017363 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #include "tab-widget.h" //#include "navigation-tab-bar.h" #include "preview-page-factory-manager.h" #include "preview-page-plugin-iface.h" #include "directory-view-widget.h" #include "file-info.h" #include "file-utils.h" #include "file-info-job.h" #include "file-launch-manager.h" #include "search-vfs-uri-parser.h" #include "properties-window.h" #include "file-enumerator.h" #include #include #include #include #include #include #include #include #include #include #include "directory-view-container.h" #include "file-utils.h" #include "../peony-main-window-style.h" #include "directory-view-factory-manager.h" #include "global-settings.h" #include "main-window.h" #include "volume-manager.h" #include "file-info-job.h" #include "file-meta-info.h" #include "global-settings.h" #include "location-bar.h" #include #include #include #include #define PUSH_BUTTON_TOTAL_PADDING 14 static PushButtonStyle *global_instance = nullptr; PushButtonStyle *PushButtonStyle::getStyle() { if (!global_instance) { global_instance = new PushButtonStyle; } return global_instance; } void PushButtonStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case CE_PushButton: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { proxy()->drawControl(CE_PushButtonBevel, option, painter, widget); QStyleOptionButton subopt = *button; subopt.rect = proxy()->subElementRect(SE_PushButtonContents, option, widget); proxy()->drawControl(CE_PushButtonLabel, &subopt, painter, widget); return; } break; } default: break; } qApp->style()->drawControl(element, option, painter, widget); } int PushButtonStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric) { case PM_ButtonMargin: { return 0; } default: return QProxyStyle::pixelMetric(metric, option, widget); } } QRect PushButtonStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_PushButtonContents: { if (const QStyleOptionButton *button = qstyleoption_cast(option)) { const bool icon = !button->icon.isNull(); const bool text = !button->text.isEmpty(); QRect rect = option->rect; int Margin_Height = 2; int ToolButton_MarginWidth = 10; int Button_MarginWidth = proxy()->pixelMetric(PM_ButtonMargin, option, widget); if (text && !icon && !(button->features & QStyleOptionButton::HasMenu)) { rect.adjust(Button_MarginWidth, 0, -Button_MarginWidth, 0); } else if (!text && icon && !(button->features & QStyleOptionButton::HasMenu)) { } else { rect.adjust(ToolButton_MarginWidth, Margin_Height, -ToolButton_MarginWidth, -Margin_Height); } if (button->features & (QStyleOptionButton::AutoDefaultButton | QStyleOptionButton::DefaultButton)) { int dbw = proxy()->pixelMetric(PM_ButtonDefaultIndicator, option, widget); rect.adjust(dbw, dbw, -dbw, -dbw); } return rect; } break; } default: break; } return QProxyStyle::subElementRect(element, option, widget); } TabWidget::TabWidget(QWidget *parent) : QMainWindow(parent) { setStyle(PeonyMainWindowStyle::getStyle()); setAttribute(Qt::WA_TranslucentBackground); m_tab_bar = new NavigationTabBar(this); m_tab_bar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_stack = new QStackedWidget(this); m_stack->setContentsMargins(0, 0, 0, 0); m_buttons = new PreviewPageButtonGroups(this); m_preview_page_container = new QStackedWidget(this); m_preview_page_container->setContentsMargins(0, 2, 0, 0); m_preview_page_container->setMinimumWidth(300); //status bar m_status_bar = new TabStatusBar(this, this); connect(this, &TabWidget::updateItemsNum, m_status_bar, &TabStatusBar::updateItemsNum); connect(this, &TabWidget::zoomRequest, m_status_bar, &TabStatusBar::onZoomRequest); connect(m_status_bar, &TabStatusBar::zoomLevelChangedRequest, this, &TabWidget::handleZoomLevel); //setStatusBar(m_status_bar); connect(m_buttons, &PreviewPageButtonGroups::previewPageButtonTrigger, [=](bool trigger, const QString &id) { setTriggeredPreviewPage(trigger); if (trigger) { auto plugin = Peony::PreviewPageFactoryManager::getInstance()->getPlugin(id); setPreviewPage(plugin->createPreviewPage()); } else { bool isSetPreviewPageNull = true; for(auto action : m_preview_action_group->actions()){ if(action->isChecked() && action->isVisible()){ isSetPreviewPageNull = false; break; } } if(isSetPreviewPageNull){ setPreviewPage(nullptr); } } }); connect(m_tab_bar, &QTabBar::currentChanged, this, &TabWidget::changeCurrentIndex); connect(m_tab_bar, &QTabBar::tabMoved, this, &TabWidget::moveTab); connect(m_tab_bar, &QTabBar::tabCloseRequested, this, &TabWidget::removeTab); connect(m_tab_bar, &NavigationTabBar::pageRemoved, this, [this]{ updateTabBarGeometry(); }); connect(m_tab_bar, &NavigationTabBar::addPageRequest, this, &TabWidget::addPage); connect(m_tab_bar, &NavigationTabBar::locationUpdated, this, &TabWidget::updateSearchPathButton); connect(m_tab_bar, &NavigationTabBar::locationUpdated, this, [this]{ updateTabBarGeometry(); }); connect(m_tab_bar, &NavigationTabBar::closeWindowRequest, this, &TabWidget::closeWindowRequest); QHBoxLayout *t = new QHBoxLayout(); QActionGroup *group = new QActionGroup(this); group->setExclusive(true); m_tab_bar_bg = new QWidget(this); m_tab_bar_bg->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QToolBar *previewButtons = new QToolBar(this); previewButtons->setMovable(false); previewButtons->setAttribute(Qt::WA_TranslucentBackground); previewButtons->setAutoFillBackground(false); previewButtons->setObjectName("previewButtons"); previewButtons->setStyle(TabBarStyle::getStyle()); m_tool_bar = previewButtons; // previewButtons->setFixedSize(QSize(40, 40)); previewButtons->setIconSize(QSize(16,16)); t->setContentsMargins(0, 0, 5, 0); t->addWidget(m_tab_bar_bg); auto spacer = new QWidget(this); spacer->setFixedWidth(qApp->style()->pixelMetric(QStyle::PM_ToolBarItemSpacing) * 2 + 36); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); t->addWidget(spacer); auto addPageButton = new QToolButton(this); m_add_page_button = addPageButton; addPageButton->setObjectName("addPageButton"); addPageButton->setProperty("isWindowButton", 1); addPageButton->setStyle(TabBarStyle::getStyle()); addPageButton->setIcon(QIcon::fromTheme("list-add-symbolic")); spacer->setVisible(false); addPageButton->setFixedSize(m_tab_bar->height() + 2, m_tab_bar->height() + 2); addPageButton->setProperty("useIconHighlightEffect", 2); // addPageButton->setProperty("iconHighlightEffectMode", 1); // addPageButton->setProperty("fillIconSymbolicColor", true); connect(addPageButton, &QPushButton::clicked, this, [=](){ m_tab_bar->addPageRequest(m_tab_bar->tabData(m_tab_bar->currentIndex()).toString(), true); }); updateTabBarGeometry(); auto manager = Peony::PreviewPageFactoryManager::getInstance(); auto pluginNames = manager->getPluginNames(); for (auto name : pluginNames) { auto factory = manager->getPlugin(name); auto action = group->addAction(factory->icon(), factory->name()); action->setCheckable(true); m_preview_action = action; connect(action, &QAction::triggered, [=](/*bool checked*/) { if (!m_current_preview_action) { m_current_preview_action = action; action->setChecked(true); Q_EMIT m_buttons->previewPageButtonTrigger(true, factory->name()); } else { if (m_current_preview_action == action) { m_current_preview_action = nullptr; action->setChecked(false); Q_EMIT m_buttons->previewPageButtonTrigger(false, factory->name()); } else { m_current_preview_action = action; action->setChecked(true); Q_EMIT m_buttons->previewPageButtonTrigger(true, factory->name()); } } }); } previewButtons->addActions(group->actions()); m_preview_action_group = group; for (auto action : group->actions()) { auto button = qobject_cast(previewButtons->widgetForAction(action)); button->setFixedSize(26, 26); button->setIconSize(QSize(16, 16)); //bug#167146 useIconHighlightEffect=2 导致打开预览框的图标不反白 //button->setProperty("useIconHighlightEffect", 0x2); button->setProperty("isWindowButton", 1); button->setProperty("fillIconSymbolicColor", true); //use theme buttons // auto button = new QPushButton(this); // button->setFixedSize(QSize(26, 26)); // button->setIconSize(QSize(16, 16)); // button->setFlat(true); // button->setProperty("isWindowButton", 1); // button->setProperty("useIconHighlightEffect", 2); // button->setProperty("isIcon", true); } m_tool_bar->setFixedWidth(m_tool_bar->sizeHint().width()); //trash quick operate buttons QHBoxLayout *trash = new QHBoxLayout(); m_trash_bar_layout = trash; QToolBar *trashButtons = new QToolBar(this); m_trash_bar = trashButtons; this->updateTrashButtonSize(); QLabel *Label = new QLabel(tr("Trash"), trashButtons); Label->setFixedHeight(m_trash_button_height); Label->setFixedWidth(m_trash_button_width); m_trash_label = Label; QPushButton *clearAll = new QPushButton(tr("Clear"), trashButtons); clearAll->setFixedWidth(m_trash_button_width); clearAll->setFixedHeight(m_trash_button_height);/* Fix the bug:62841,the font of the clear button is not displayed completely */ clearAll->setStyle(PushButtonStyle::getStyle()); m_clear_button = clearAll; QPushButton *recover = new QPushButton(tr("Recover"), trashButtons); recover->setFixedWidth(m_trash_button_width); recover->setFixedHeight(m_trash_button_height); m_recover_button = recover; //hide trash button to fix bug 31322, according to designer advice m_recover_button->hide(); //trash->addSpacing(10); trash->addWidget(Label, Qt::AlignLeft); trash->setContentsMargins(10, 0, 10, 0); trash->addWidget(trashButtons); trash->addWidget(recover, Qt::AlignLeft); trash->addSpacing(10); trash->addWidget(clearAll, Qt::AlignLeft); updateTrashBarVisible(); connect(clearAll, &QPushButton::clicked, this, [=]() { Q_EMIT this->clearTrash(); }); connect(recover, &QPushButton::clicked, this, [=]() { Q_EMIT this->recoverFromTrash(); }); //advance search ui init initAdvanceSearch(); QWidget *w = new QWidget(); w->setAttribute(Qt::WA_TranslucentBackground); auto vbox = new QVBoxLayout(); m_top_layout = vbox; vbox->setSpacing(0); vbox->setContentsMargins(0, 0, 0, 0); vbox->addLayout(t); vbox->addLayout(trash); vbox->addLayout(m_search_bar_layout); QSplitter *s = new QSplitter(this); s->setChildrenCollapsible(false); s->setContentsMargins(0, 0, 0, 0); s->setHandleWidth(1); s->addWidget(m_stack); m_stack->installEventFilter(this); //s->addWidget(m_preview_page_container); m_preview_page_container->hide(); s->setStretchFactor(0, 3); s->setStretchFactor(1, 2); vbox->addWidget(s); w->setLayout(vbox); setCentralWidget(w); //bind preview page connect(this, &TabWidget::activePageSelectionChanged, this, [=]() { updatePreviewPage(); m_status_bar->update(); Q_EMIT this->currentSelectionChanged(); }); connect(this, &TabWidget::activePageChanged, this, [=]() { QTimer::singleShot(100, this, [=]() { m_status_bar->update(); this->updatePreviewPage(); }); }); connect(this, &TabWidget::activePageLocationChanged, m_status_bar, [=]() { if (m_first_add_page) { previewButtons->setEnabled(true); s->addWidget(m_preview_page_container); m_first_add_page = false; } m_status_bar->update(); }); connect(this, &TabWidget::activePageLocationChanged, this, [=]{ auto settings = Peony::GlobalSettings::getInstance(); if (!settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto uri = getCurrentUri(); auto metaInfo = Peony::FileMetaInfo::fromUri(uri); if (!metaInfo) { qCritical()<<"can not get meta info"<getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; auto sortOrder = metaInfo->getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; currentPage()->setSortType(Peony::FileItemModel::ColumnType(sortType)); currentPage()->setSortOrder(Qt::SortOrder(sortOrder)); } } }); previewButtons->setEnabled(false); //fix bug#166060, 将监听字体变化的处理放在构造函数中,避免重复调用或者闪退等问题 //监听字体大小改变 if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); connect(fontSetting, &QGSettings::changed, this, [=](const QString &key) { double fontSize = fontSetting->get("systemFontSize").toDouble(); for(int index=0;indexsetFixedWidth(TRASH_BUTTON_WIDTH *2); //fix bug#166969, Tibetan language not show complete issue if ("bo_CN" == QLocale::system().name()) m_conditions_list[index]->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 20); }else{ m_classify_list[index]->setFixedWidth(TRASH_BUTTON_WIDTH *2 +45); if ("bo_CN" == QLocale::system().name()) m_conditions_list[index]->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 50); } } //fix #185743 auto realDisplayName = m_search_path->property("realDisplayName").toString(); auto displayName = fontMetrics().elidedText(realDisplayName, Qt::ElideMiddle, m_search_path->width() - m_search_bar->iconSize().width() - PUSH_BUTTON_TOTAL_PADDING); m_search_path->setText(displayName); }); } } void TabWidget::updatePreviewButtonStatus(bool status) { Q_EMIT m_preview_action->triggered(status); } void TabWidget::updateTrashButtonSize() { if ("bo_CN" == QLocale::system().name()) { m_trash_button_width += 15; m_trash_button_height += 22; } } bool TabWidget::isMultFile(std::shared_ptr info) { if (!info) { qDebug() << "file info not valid"; return false; } QString uri = info->uri(); if (uri.startsWith("mult:///") && (!info->isDir())) { return true; } return false; } void TabWidget::initAdvanceSearch() { //advance search bar QHBoxLayout *search = new QHBoxLayout(); m_search_bar_layout = search; QToolBar *searchButtons = new QToolBar(this); m_search_bar = searchButtons; QPushButton *closeButton = new QPushButton(QIcon::fromTheme("window-close-symbolic"), "", searchButtons); m_search_close = closeButton; closeButton->setFixedHeight(20); closeButton->setFixedWidth(20); closeButton->setToolTip(tr("Close Filter.")); closeButton->setFlat(true); closeButton->setProperty("isWindowButton", 1); closeButton->setProperty("useIconHighlightEffect", 2); closeButton->setProperty("isIcon", true); connect(closeButton, &QPushButton::clicked, [=]() { updateSearchBar(false); Q_EMIT this->closeSearch(); }); QLabel *title = new QLabel(tr("Filter"), searchButtons); m_search_title = title; title->setFixedWidth(TRASH_BUTTON_WIDTH); title->setFixedHeight(TRASH_BUTTON_HEIGHT); QPushButton *tabButton = new QPushButton(searchButtons); m_search_path = tabButton; m_search_path->setProperty("isWindowButton", 0x1); m_search_path->setProperty("useIconHighlightEffect", 0x2); tabButton->setFixedHeight(TRASH_BUTTON_HEIGHT); tabButton->setFixedWidth(TRASH_BUTTON_WIDTH * 2); tabButton->setToolTip(tr("Choose other path to search.")); connect(tabButton, &QPushButton::clicked, this, &TabWidget::browsePath); QPushButton *childButton = new QPushButton(searchButtons); m_search_child = childButton; childButton->setFixedHeight(TRASH_BUTTON_HEIGHT); childButton->setFixedWidth(TRASH_BUTTON_HEIGHT); //qDebug() << QIcon(":/custom/icons/child-folder").name(); childButton->setIcon(QIcon(":/custom/icons/child-folder")); childButton->setToolTip(tr("Search recursively")); m_search_child->setVisible(false); connect(childButton, &QPushButton::clicked, this, &TabWidget::searchChildUpdate); //set default select recursive m_search_child_flag = true; Q_EMIT this->searchRecursiveChanged(m_search_child_flag); m_search_child->setCheckable(m_search_child_flag); m_search_child->setChecked(m_search_child_flag); m_search_child->setDown(m_search_child_flag);; // QPushButton *moreButton = new QPushButton(tr("more options"),searchButtons); // m_search_more = moreButton; // moreButton->setFixedHeight(TRASH_BUTTON_HEIGHT); // moreButton->setFixedWidth(TRASH_BUTTON_WIDTH *2); // moreButton->setToolTip(tr("Show/hide advance search")); // connect(moreButton, &QPushButton::clicked, this, &TabWidget::updateSearchList); search->addWidget(closeButton, Qt::AlignLeft); search->addSpacing(10); search->addWidget(title, Qt::AlignLeft); search->addSpacing(10); search->addWidget(tabButton, Qt::AlignLeft); search->addSpacing(10); search->addWidget(childButton, Qt::AlignLeft); // search->addSpacing(10); // search->addWidget(moreButton, Qt::AlignLeft); search->addSpacing(10); search->addWidget(searchButtons); search->setContentsMargins(10, 0, 10, 0); searchButtons->setVisible(false); tabButton->setVisible(false); closeButton->setVisible(false); title->setVisible(false); childButton->setVisible(false); // moreButton->setVisible(false); } //search conditions changed, update filter void TabWidget::searchUpdate() { qDebug() <<"searchUpdate:" <setCheckable(m_search_child_flag); m_search_child->setChecked(m_search_child_flag); m_search_child->setDown(m_search_child_flag); searchUpdate(); Q_EMIT this->searchRecursiveChanged(m_search_child_flag); } void TabWidget::browsePath() { // use window modal dialog, fix #56549 QFileDialog f(this->topLevelWidget()); f.setStyle(nullptr); f.setWindowTitle(tr("Select Path")); f.setDirectoryUrl(QUrl(getCurrentUri())); f.setWindowModality(Qt::WindowModal); f.setAcceptMode(QFileDialog::AcceptOpen); f.setOption(QFileDialog::ShowDirsOnly); f.setFileMode(QFileDialog::Directory); f.setFilter(QDir::System|QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot); auto result = f.exec(); if (result != QDialog::Accepted) { return; } //Gets the URI of the selected directory. link bug#92521 QList urls = f.selectedUrls(); if(urls.isEmpty()){ return; } QString target_path = urls.at(0).toString(); // QString target_path = f.directoryUrl().toString(); // QString target_path = QFileDialog::getExistingDirectory(this, tr("Select path"), getCurrentUri(), QFileDialog::ShowDirsOnly); qDebug()<<"browsePath Opened:"<(this->topLevelWidget()); QString key=mainWindow->getLastSearchKey(); Q_EMIT this->updateSearch(target_path,key); } } void TabWidget::addNewConditionBar() { QHBoxLayout *layout = new QHBoxLayout(); m_layout_list.append(layout); QToolBar *optionBar = new QToolBar(this); m_search_bar_list.append(optionBar); QComboBox *conditionCombox = new QComboBox(optionBar); m_conditions_list.append(conditionCombox); conditionCombox->setFixedHeight(TRASH_BUTTON_HEIGHT); conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2); if ("bo_CN" == QLocale::system().name()) conditionCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 20); auto conditionModel = new QStringListModel(optionBar); conditionModel->setStringList(m_option_list); conditionCombox->setModel(conditionModel); auto index = m_search_bar_count; if (index > m_option_list.count()-1) index = m_option_list.count()-1; conditionCombox->setCurrentIndex(index); //qDebug() << "addNewConditionBar:" <setFixedHeight(TRASH_BUTTON_HEIGHT); linkLabel->setFixedWidth(TRASH_BUTTON_HEIGHT); QComboBox *classifyCombox = new QComboBox(optionBar); m_classify_list.append(classifyCombox); classifyCombox->setFixedHeight(TRASH_BUTTON_HEIGHT); if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *fontSetting = new QGSettings(FONT_SETTINGS, QByteArray(), this); double fontSize = fontSetting->get("systemFontSize").toDouble(); if(fontSize < 12){ classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2); if ("bo_CN" == QLocale::system().name()) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 20); }else{ //最大字体最长字符串所需宽度 classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2+45); if ("bo_CN" == QLocale::system().name()) classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2 + 50); } } else{ classifyCombox->setFixedWidth(TRASH_BUTTON_WIDTH *2+45); } auto classifyModel = new QStringListModel(optionBar); auto list = getCurrentClassify(index); classifyModel->setStringList(list); classifyCombox->setModel(classifyModel); QLineEdit *inputBox = new QLineEdit(optionBar); m_input_list.append(inputBox); inputBox->setFixedHeight(TRASH_BUTTON_HEIGHT); inputBox->setFixedWidth(TRASH_BUTTON_WIDTH *4); inputBox->setPlaceholderText(tr("Please input key words...")); inputBox->setText(""); //fix bug#180920, contents and icon overlap issue inputBox->setTextMargins(0, 0, 20, 0); //bug#93521 添加清除按钮 QToolButton* clearButton = new QToolButton(inputBox); clearButton->setAttribute(Qt::WA_TranslucentBackground); clearButton->setObjectName("toolButton"); clearButton->installEventFilter(this); clearButton->setAutoRaise(true); clearButton->setStyle(TabBarStyle::getStyle()); clearButton->setFixedSize(inputBox->height() - 4, inputBox->height() - 4); QHBoxLayout* clearlayout = new QHBoxLayout(inputBox); clearlayout->addStretch(); clearlayout->addWidget(clearButton,Qt::AlignRight); clearlayout->setContentsMargins(2, 2, 2, 2); inputBox->setLayout(clearlayout); clearButton->setIcon(QIcon::fromTheme("edit-clear-symbolic")); clearButton->setProperty("isWindowButton", 1); clearButton->setProperty("useIconHighlightEffect", 0x2); //clearButton->setAutoRaise(true); clearButton->hide(); connect(clearButton, &QPushButton::clicked, this, [=](){ inputBox->clear(); }); connect(inputBox, &QLineEdit::textChanged, this, [=](const QString &text){ if(text.isEmpty()) { clearButton->hide(); } else { clearButton->show(); } }); QPushButton *addButton = new QPushButton(QIcon::fromTheme("list-add-symbolic"), "", optionBar); m_add_button_list.append(addButton); addButton->setFixedHeight(20); addButton->setFixedWidth(20); addButton->setFlat(true); addButton->setProperty("isWindowButton", 1); addButton->setProperty("useIconHighlightEffect", 2); addButton->setProperty("isIcon", true); connect(addButton, &QPushButton::clicked, this, &TabWidget::addNewConditionBar); QPushButton *removeButton = new QPushButton(QIcon::fromTheme("list-remove-symbolic"), "", optionBar); m_remove_button_list.append(removeButton); removeButton->setFixedHeight(20); removeButton->setFixedWidth(20); removeButton->setFlat(true); removeButton->setProperty("isWindowButton", 1); removeButton->setProperty("useIconHighlightEffect", 2); removeButton->setProperty("isIcon", true); //mapper for button clicked parse index auto signalMapper = new QSignalMapper(this); connect(removeButton, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(removeButton, index); connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(removeConditionBar(int))); m_remove_mapper_list.append(signalMapper); layout->addWidget(addButton, Qt::AlignRight); layout->addSpacing(10); layout->addWidget(removeButton, Qt::AlignRight); layout->addSpacing(10); layout->addSpacing(TRASH_BUTTON_WIDTH - 20); layout->addWidget(conditionCombox, Qt::AlignLeft); layout->addSpacing(10); layout->addWidget(linkLabel, Qt::AlignLeft); layout->addSpacing(10); layout->addWidget(classifyCombox, Qt::AlignLeft); layout->addWidget(inputBox, Qt::AlignLeft); layout->addWidget(optionBar); layout->setContentsMargins(10, 0, 10, 5); if (index%4 >= 3) { classifyCombox->hide(); linkLabel->setText(tr("contains")); //adjust label width to language //use 1.5 rate width to fix big size font issue, link to bug#58824 QLocale locale; if (locale.language() == QLocale::Chinese) linkLabel->setFixedWidth(1.5 * TRASH_BUTTON_HEIGHT); else linkLabel->setFixedWidth(TRASH_BUTTON_WIDTH); } else { inputBox->hide(); } connect(conditionCombox, &QComboBox::currentTextChanged, [=]() { auto cur = conditionCombox->currentIndex(); if (cur%4 >= 3) { classifyCombox->setCurrentIndex(0); classifyCombox->hide(); inputBox->show(); linkLabel->setText(tr("contains")); //adjust label width to language //use 1.5 rate width to fix big size font issue, link to bug#58824 QLocale locale; if (locale.language() == QLocale::Chinese) linkLabel->setFixedWidth(1.5 * TRASH_BUTTON_HEIGHT); else linkLabel->setFixedWidth(TRASH_BUTTON_WIDTH); } else { classifyCombox->show(); //clear old filter conditions, fix bug#83559 inputBox->setText(""); inputBox->hide(); linkLabel->setFixedWidth(TRASH_BUTTON_HEIGHT); linkLabel->setText(tr("is")); auto classifyList = getCurrentClassify(cur); classifyModel->setStringList(classifyList); classifyCombox->setModel(classifyModel); classifyCombox->setCurrentIndex(0); } }); connect(classifyCombox, &QComboBox::currentTextChanged, this, &TabWidget::updateAdvanceConditions); connect(inputBox, &QLineEdit::textChanged, this, &TabWidget::updateAdvanceConditions); m_top_layout->insertLayout(m_top_layout->count()-1, layout); m_search_bar_count++; updateAdvanceConditions(); updateButtons(); } void TabWidget::removeConditionBar(int index) { //disconnect signals after index search bars for(int cur=0; curdeleteLater(); m_conditions_list[index]->deleteLater(); m_link_label_list[index]->deleteLater(); m_classify_list[index]->deleteLater(); m_input_list[index]->deleteLater(); m_search_bar_list[index]->deleteLater(); m_add_button_list[index]->deleteLater(); m_remove_button_list[index]->deleteLater(); m_remove_mapper_list[index]->deleteLater(); m_layout_list.removeAt(index); m_conditions_list.removeAt(index); //qDebug() << "removeConditionBar:"<setMapping(m_remove_button_list[cur], cur); connect(m_remove_mapper_list[cur], SIGNAL(mapped(int)), this, SLOT(removeConditionBar(int))); } m_search_bar_count--; updateAdvanceConditions(); updateButtons(); } QStringList TabWidget::getCurrentClassify(int rowCount) { QStringList currentList; currentList.clear(); switch (rowCount%4) { case 0: return m_file_type_list; case 1: return m_file_size_list; case 2: return m_file_mtime_list; default: break; } return currentList; } void TabWidget::updatePreviewPageVisible() { auto currentUri = getCurrentUri(); if(currentUri.startsWith("computer://")){ m_preview_action_group->setVisible(false); }else{ m_preview_action_group->setVisible(true); } auto manager = Peony::PreviewPageFactoryManager::getInstance(); auto pluginNames = manager->getPluginNames(); for (auto name : pluginNames) { auto factory = manager->getPlugin(name); for (auto action : m_preview_action_group->actions()){ if(!action->text().compare(name)){ if(action->isChecked() && action->isVisible()){ Q_EMIT m_buttons->previewPageButtonTrigger(true, factory->name()); }else{ Q_EMIT m_buttons->previewPageButtonTrigger(false, factory->name()); } } } } } void TabWidget::updateStatusBarSliderState() { if (currentPage() && currentPage()->getView()) { bool enable = currentPage()->getView()->supportZoom(); m_status_bar->m_slider->setEnabled(enable); m_status_bar->m_slider->setVisible(enable); } } void TabWidget::updateTrashBarVisible(const QString &uri) { bool visible = false; m_trash_bar_layout->setContentsMargins(10, 0, 10, 0); if (uri.indexOf("trash:///") >= 0) { visible = true; m_trash_bar_layout->setContentsMargins(10, 5, 10, 5); } m_trash_bar->setVisible(visible); m_trash_label->setVisible(visible); m_clear_button->setVisible(visible); //m_recover_button->setVisible(visible); if (uri.startsWith("trash://") || uri.startsWith("recent://")) m_tool_bar->setVisible(false); else m_tool_bar->setVisible(true); } void TabWidget::handleZoomLevel(int zoomLevel) { currentPage()->getView()->clearIndexWidget(); int currentViewZoomLevel = currentPage()->getView()->currentZoomLevel(); int currentViewMimZoomLevel = currentPage()->getView()->minimumZoomLevel(); int currentViewMaxZoomLevel = currentPage()->getView()->maximumZoomLevel(); if (zoomLevel == currentViewZoomLevel) { return; } // save default zoom level Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ZOOM_LEVEL, zoomLevel); if (zoomLevel <= currentViewMaxZoomLevel && zoomLevel >= currentViewMimZoomLevel) { currentPage()->getView()->setCurrentZoomLevel(zoomLevel); } else { //check which view to switch. auto directoryViewManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto viewId = directoryViewManager->getDefaultViewId(zoomLevel, getCurrentUri()); switchViewType(viewId); currentPage()->getView()->setCurrentZoomLevel(zoomLevel); } } #include"windows/FMWindowIface.h" void TabWidget::enableSearchBar(bool enable) { //qDebug() << "enable:" <setEnabled(enable); //m_search_close->setEnabled(enable); m_search_title->setEnabled(enable); m_search_bar->setEnabled(enable); if (m_search_bar_count >0) { //already had a list,just set to show for(int i=0; isetEnabled(enable); m_link_label_list[i]->setEnabled(enable); if (m_conditions_list[i]->currentIndex()%4 < 3) m_classify_list[i]->setEnabled(enable); else m_input_list[i]->setEnabled(enable); m_search_bar_list[i]->setEnabled(enable); m_add_button_list[i]->setEnabled(enable); /* When there is only one filter item,remove button set disable */ if(m_search_bar_count==1) m_remove_button_list[0]->setEnabled(false); else m_remove_button_list[i]->setEnabled(enable); } } } //#include void TabWidget::slot_responseUnmounted(const QString &destUri, const QString &sourceUri) { for(int index = 0; index < m_stack->count(); index++) { int currentIndex = this->currentIndex(); QString decodedSrcUri = Peony::FileUtils::urlDecode(sourceUri); QString uri = qobject_cast(m_stack->widget(index))->getCurrentUri(); uri = Peony::FileUtils::urlDecode(uri); qDebug()<<"decodedSrcUri:"<count()<<" index:"<getValue("LAST_FOCUS_PEONY_WINID") == dynamic_cast(this->topLevelWidget())->winId() /* ||KWindowSystem::hasWId(dynamic_cast(this->topLevelWidget())->winId())*/) && index == currentIndex){ qDebug()<<"sourceUri:"<goToUri("filesafe:///", true, true); /* 跳转到文件保护箱路径 */ else this->goToUri(destUri, true, true);/* 跳转到计算机页 */ } else{/* 其余tab页关闭 */ qDebug()<<"remove tab uri:"<show(); m_search_close->show(); m_search_title->show(); m_search_bar->show(); //m_search_child->show(); //m_search_more->show(); m_search_bar_layout->setContentsMargins(10, 5, 10, 5); //m_search_more->setIcon(QIcon::fromTheme("go-down")); updateSearchPathButton(); } else { m_search_path->hide(); m_search_close->hide(); m_search_title->hide(); m_search_bar->hide(); //m_search_child->hide(); //m_search_more->hide(); m_search_bar_layout->setContentsMargins(10, 0, 10, 0); } if (m_search_bar_count >0) updateSearchList(); if (! showSearch) { //exit advance search, clear search conditions clearConditions(); updateFilter(); } //9X0 changes, set default as true, fix bug#70916 enableSearchBar(true); } void TabWidget::updateButtons() { //only one condition, set disabled if (m_search_bar_count ==1) m_remove_button_list[0]->setDisabled(true); else m_remove_button_list[0]->setDisabled(false); //limit total number to 10 if (m_search_bar_count >= 10) { for(int i=0;isetDisabled(true); } } else { for(int i=0;isetDisabled(false); } } } void TabWidget::updateSearchPathButton(const QString &uri) { //search path not update //qDebug() << "updateSearchPathButton:" <isEmptyInfo()) { // TODO: use async method. Peony::FileInfoJob j(info); j.querySync(); } auto iconName = Peony::FileUtils::getFileIconName(curUri); auto displayName = Peony::FileUtils::getFileDisplayName(curUri); qDebug() << "iconName:" <setIcon(QIcon::fromTheme(iconName)); m_search_path->setToolTip(tr("Current path: %1, %2").arg(displayName).arg(tr("click to select other search path."))); if (displayName.contains("&")) { displayName = Peony::FileUtils::handleSpecialSymbols(displayName); } //elide text if it is too long, Use ElideMiddle mode to design //related bug#155126, #185743 m_search_path->setProperty("realDisplayName", displayName); displayName = fontMetrics().elidedText(displayName, Qt::ElideMiddle, m_search_path->width() - m_search_bar->iconSize().width() - PUSH_BUTTON_TOTAL_PADDING); m_search_path->setText(displayName); } void TabWidget::updateSearchList() { m_show_search_list = !m_show_search_list; //if not show search bar, then don't show search list qDebug() << "updateSearchList:" <setIcon(QIcon::fromTheme("go-up")); //first click to show advance serach if(m_search_bar_list.count() ==0) { addNewConditionBar(); return; } //already had a list,just set to show for(int i=0; ishow(); m_link_label_list[i]->show(); if (m_conditions_list[i]->currentIndex()%4 < 3) m_classify_list[i]->show(); else m_input_list[i]->show(); m_search_bar_list[i]->show(); m_add_button_list[i]->show(); m_remove_button_list[i]->show(); m_layout_list[i]->setContentsMargins(10, 0, 10, 5); } } else { //hide search list //m_search_more->setIcon(QIcon::fromTheme("go-down")); for(int i=0; ihide(); m_conditions_list[i]->setCurrentIndex(0); m_link_label_list[i]->hide(); m_classify_list[i]->hide(); m_classify_list[i]->setCurrentIndex(0); m_input_list[i]->hide(); m_input_list[i]->setText(""); m_search_bar_list[i]->hide(); m_add_button_list[i]->hide(); m_remove_button_list[i]->hide(); m_layout_list[i]->setContentsMargins(10, 0, 10, 0); } } } Peony::DirectoryViewContainer *TabWidget::currentPage() { return qobject_cast(m_stack->currentWidget()); } const QString TabWidget::getCurrentUri() { if (!currentPage()) return nullptr; return currentPage()->getCurrentUri(); } const QStringList TabWidget::getCurrentSelections() { if (!currentPage()) return QStringList(); return currentPage()->getCurrentSelections(); } const QStringList TabWidget::getAllFileUris() { if (!currentPage()) return QStringList(); return currentPage()->getAllFileUris(); } const QStringList TabWidget::getBackList() { if (!currentPage()) return QStringList(); return currentPage()->getBackList(); } const QStringList TabWidget::getForwardList() { if (!currentPage()) return QStringList(); return currentPage()->getForwardList(); } bool TabWidget::canGoBack() { if (!currentPage()) return false; return currentPage()->canGoBack(); } bool TabWidget::canGoForward() { if (!currentPage()) return false; return currentPage()->canGoForward(); } bool TabWidget::canCdUp() { if (!currentPage()) return false; return currentPage()->canCdUp(); } int TabWidget::getSortType() { //fix switch to computer view and back change to default sort issue, link to bug#92261 auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortType = settings->isExist(SORT_COLUMN)? settings->getValue(SORT_COLUMN).toInt() : 0; if (getCurrentUri() != "trash:///" && sortType == 4) { sortType = 0; } return sortType; } else { auto metaInfo = Peony::FileMetaInfo::fromUri(getCurrentUri()); if (!metaInfo) { qWarning()<<"no meta info"<getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; return sortType; } // if (!currentPage()) // return 0; // return currentPage()->getSortType(); } Qt::SortOrder TabWidget::getSortOrder() { //fix switch to computer view and back change to default sort issue, link to bug#92261 auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortOrder = settings->isExist(SORT_ORDER)? settings->getValue(SORT_ORDER).toInt() : 1; return Qt::SortOrder(sortOrder); } else { auto metaInfo = Peony::FileMetaInfo::fromUri(getCurrentUri()); if (!metaInfo) { qWarning()<<"no meta info"<getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; return Qt::SortOrder(sortOrder); } // if (!currentPage()) // return Qt::AscendingOrder; // return currentPage()->getSortOrder(); } bool TabWidget::eventFilter(QObject *obj, QEvent *e) { if (e->type() == QEvent::Resize) { updateStatusBarGeometry(); } return false; } void TabWidget::setCurrentIndex(int index) { m_tab_bar->setCurrentIndex(index); m_stack->setCurrentIndex(index); } void TabWidget::setPreviewPage(Peony::PreviewPageIface *previewPage) { bool visible = false; auto previewPageWidget = dynamic_cast(previewPage); if (previewPageWidget) visible = true; if (m_preview_page) { m_preview_page_container->removeWidget(m_preview_page_container->widget(0)); m_preview_page->closePreviewPage(); } m_preview_page = previewPage; if (m_preview_page) { previewPageWidget->setParent(m_preview_page_container); m_preview_page_container->addWidget(previewPageWidget); updatePreviewPage(); } m_preview_page_container->blockSignals(!visible); m_preview_page_container->setVisible(visible); } void TabWidget::addPage(const QString &uri, bool jumpTo) { setCursor(QCursor(Qt::WaitCursor)); auto info = Peony::FileInfo::fromUri(uri); auto infoJob = new Peony::FileInfoJob(info); //infoJob->setAutoDelete(); connect(infoJob, &Peony::FileInfoJob::queryAsyncFinished, this, [=](){ infoJob->deleteLater(); QString rootDir = info.get()->uri(); if (info.get()->uri().startsWith("file:///") && !info.get()->isDir()) { rootDir = Peony::FileUtils::getParentUri(rootDir); } auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(rootDir); enumerator->setAutoDelete(); connect(enumerator, &Peony::FileEnumerator::enumerateFinished, this, [=](bool successed){ if (!successed) { if (!currentPage()) { QTimer::singleShot(100, topLevelWidget(), &QWidget::close); } return; } }); connect(enumerator, &Peony::FileEnumerator::cancelled, this, [=](){ if (!currentPage()) { QTimer::singleShot(100, topLevelWidget(), &QWidget::close); }else{ this->refresh(); } }); connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (critical) { QMessageBox::critical(0, 0, err.get()->message()); setCursor(QCursor(Qt::ArrowCursor)); // if there is no active page, window should be closed to avoid crash. link to: #48031 if (!currentPage()) { this->topLevelWidget()->close(); } return; } auto viewContainer = new Peony::DirectoryViewContainer(m_stack); viewContainer->setProperty("statusBarHeight", qApp->fontMetrics().height() + 10); bool hasCurrentPage = currentPage(); bool hasView = false; if (hasCurrentPage) hasView = currentPage()->getView(); int zoomLevel = -1; if (hasCurrentPage) { // perfer to use current page view type auto internalViews = Peony::DirectoryViewFactoryManager2::getInstance()->internalViews(); //fix continuously click add button quickly crash issue, bug #41425 if (hasView && internalViews.contains(currentPage()->getView()->viewId())) viewContainer->switchViewType(currentPage()->getView()->viewId()); if (hasView && hasCurrentPage) { hasCurrentPage = true; zoomLevel = currentPage()->getView()->currentZoomLevel(); } } else { viewContainer->switchViewType(Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ID).toString()); } viewContainer->setMinimumWidth(300); m_stack->addWidget(viewContainer); if (jumpTo) { m_stack->setCurrentWidget(viewContainer); } //process open symbolic link auto realUri = uri; if (info->isSymbolLink() && info->symlinkTarget().length() >0 && uri.startsWith("file://")) { realUri = "file://" + info->symlinkTarget(); } else if (!info->isDir() && !realUri.startsWith("smb://") ) { realUri = Peony::FileUtils::getParentUri(uri); } //Fix bug#132638, special # character use in symbolic link open fail issue if (realUri.contains("\#") && ! realUri.startsWith("filesafe:///")) realUri = Peony::FileUtils::urlEncode(realUri); // fix #174653 if (realUri.isEmpty()) { realUri = "file:///"; } //m_stack->addWidget(viewContainer); viewContainer->goToUri(realUri, false, true); if (!info->isDir() && Peony::FileUtils::isFileExsit(uri)) { QTimer::singleShot(500, [=] { viewContainer->getView()->setSelections(QStringList() << uri); }); } bindContainerSignal(viewContainer); updateTrashBarVisible(uri); if (zoomLevel > 0) viewContainer->getView()->setCurrentZoomLevel(zoomLevel); else viewContainer->getView()->setCurrentZoomLevel(Peony::GlobalSettings::getInstance()->getValue(DEFAULT_VIEW_ZOOM_LEVEL).toInt()); //auto viewContainer = new Peony::DirectoryViewContainer(m_stack); auto settings = Peony::GlobalSettings::getInstance(); if (settings->getValue(USE_GLOBAL_DEFAULT_SORTING).toBool()) { auto sortType = settings->isExist(SORT_COLUMN)? settings->getValue(SORT_COLUMN).toInt(): 0; auto sortOrder = settings->isExist(SORT_ORDER)? settings->getValue(SORT_ORDER).toInt(): 1; viewContainer->setSortType(Peony::FileItemModel::ColumnType(sortType)); viewContainer->setSortOrder(Qt::SortOrder(sortOrder)); } else { auto metaInfo = Peony::FileMetaInfo::fromUri(uri); auto sortType = metaInfo->getMetaInfoVariant(SORT_COLUMN).isValid()? metaInfo->getMetaInfoInt(SORT_COLUMN): 0; auto sortOrder = metaInfo->getMetaInfoVariant(SORT_ORDER).isValid()? metaInfo->getMetaInfoInt(SORT_ORDER): 1; viewContainer->setSortType(Peony::FileItemModel::ColumnType(sortType)); viewContainer->setSortOrder(Qt::SortOrder(sortOrder)); } m_tab_bar->addPage(realUri, jumpTo); updateTabBarGeometry(); }); enumerator->prepare(); }); infoJob->queryAsync(); } void TabWidget::goToUri(const QString &uri, bool addHistory, bool forceUpdate) { if (!currentPage()) { // do not trigger go to uri if there is no active page, avoid crash. link to: #45684 return; } qDebug() << "goToUri:" << uri; currentPage()->goToUri(uri, addHistory, forceUpdate); m_tab_bar->updateLocation(m_tab_bar->currentIndex(), uri); updateTrashBarVisible(uri); updatePreviewPage(); } void TabWidget::updateTabPageTitle() { qDebug() << "updateTabPageTitle:" < &volume){ // refresh(); // }); // connect(vm,&Peony::VolumeManager::volumeAdded,this,[=](const std::shared_ptr &volume){ // refresh(); // }); // } m_tab_bar->updateLocation(m_tab_bar->currentIndex(), getCurrentUri().toLocal8Bit()); //m_tab_bar->updateLocation(m_tab_bar->currentIndex(), QUrl::fromPercentEncoding(getCurrentUri().toLocal8Bit())); updateTrashBarVisible(getCurrentUri()); updatePreviewPageVisible(); updateStatusBarSliderState(); } void TabWidget::switchViewType(const QString &viewId) { if(!currentPage()||!(currentPage()->getView())) return; if (currentPage()->getView()->viewId() == viewId) return; currentPage()->switchViewType(viewId); // change default view id auto factoryManager = Peony::DirectoryViewFactoryManager2::getInstance(); auto internalViews = factoryManager->internalViews(); if (internalViews.contains(viewId)) Peony::GlobalSettings::getInstance()->setValue(DEFAULT_VIEW_ID, viewId); bool supportZoom = this->currentPage()->getView()->supportZoom(); this->m_status_bar->m_slider->setEnabled(this->currentPage()->getView()->supportZoom()); } void TabWidget::goBack() { if(!currentPage()) return; currentPage()->goBack(); } void TabWidget::goForward() { if(!currentPage()) return; currentPage()->goForward(); } void TabWidget::cdUp() { if(!currentPage()) return; currentPage()->cdUp(); } void TabWidget::refresh() { if(!currentPage()) return; currentPage()->refresh(); } void TabWidget::stopLoading() { if(!currentPage()) return; currentPage()->stopLoading(); } void TabWidget::tryJump(int index) { if(!currentPage()) return; currentPage()->tryJump(index); } void TabWidget::clearHistory() { if(!currentPage()) return; currentPage()->clearHistory(); } void TabWidget::setSortType(int type) { if(!currentPage()) return; currentPage()->setSortType(Peony::FileItemModel::ColumnType(type)); } void TabWidget::setSortOrder(Qt::SortOrder order) { if(!currentPage()) return; currentPage()->setSortOrder(order); } void TabWidget::setSortFilter(int FileTypeIndex, int FileMTimeIndex, int FileSizeIndex) { if(!currentPage()) return; currentPage()->setSortFilter(FileTypeIndex, FileMTimeIndex, FileSizeIndex); } void TabWidget::setShowHidden(bool showHidden) { if(!currentPage()) return; currentPage()->setShowHidden(showHidden); } void TabWidget::setUseDefaultNameSortOrder(bool use) { if(!currentPage()) return; currentPage()->setUseDefaultNameSortOrder(use); } void TabWidget::setSortFolderFirst(bool folderFirst) { if(!currentPage()) return; currentPage()->setSortFolderFirst(folderFirst); } void TabWidget::addFilterCondition(int option, int classify, bool updateNow) { if(!currentPage()) return; currentPage()->addFilterCondition(option, classify, updateNow); } void TabWidget::removeFilterCondition(int option, int classify, bool updateNow) { if(!currentPage()) return; currentPage()->removeFilterCondition(option, classify, updateNow); } void TabWidget::clearConditions() { if(!currentPage()) return; currentPage()->clearConditions(); } void TabWidget::updateFilter() { if(!currentPage()) return; currentPage()->updateFilter(); } void TabWidget::updateAdvanceConditions() { clearConditions(); //get key list for proxy-filter //input name not show, must be empty QStringList keyList; for(int i=0; itext(); if(input != "" && ! keyList.contains(input)) { keyList.append(input); } else { addFilterCondition(m_conditions_list[i]->currentIndex(), m_classify_list[i]->currentIndex()); } } //update file name filter for(auto key : keyList) { if(!currentPage()) continue; currentPage()->addFileNameFilter(key); } updateFilter(); } void TabWidget::setCurrentSelections(const QStringList &uris) { if (!currentPage() || !currentPage()->getView()) { qWarning()<<"can not set current selection, current page is invalid. maybe not ready?"; return; } currentPage()->getView()->setSelections(uris); if (uris.count() >0) currentPage()->getView()->scrollToSelection(uris.first()); } void TabWidget::editUri(const QString &uri) { currentPage()->getView()->editUri(uri); } void TabWidget::editUris(const QStringList &uris) { currentPage()->getView()->editUris(uris); } void TabWidget::onViewDoubleClicked(const QString &uri) { qDebug()<<"tab widget double clicked"<uri().startsWith("trash://")) { auto w = new Peony::PropertiesWindow(QStringList()<show(); return; } if (info->isDir() || info->isVolume() || info->isVirtual()) { if(info->uri().startsWith("file://") && !info->canExecute()){ QMessageBox::critical(nullptr, tr("Open failed"), tr("Open directory failed, you have no permission!")); return; } bool check = Peony::GlobalSettings::getInstance()->getValue(SHOW_IN_NEW_WINDOW).toBool(); if (check && info->isDir()) { //task#147390 新建窗口来打开文件夹 auto window = dynamic_cast(this->topLevelWidget()); auto newWindow = dynamic_cast(window->create(uri)); newWindow->show(); } else { Q_EMIT this->updateWindowLocationRequest(uri, true); } } else { Peony::FileLaunchManager::openAsync(uri, false, false); } } void TabWidget::changeCurrentIndex(int index) { m_tab_bar->setCurrentIndex(index); m_stack->setCurrentIndex(index); Q_EMIT currentIndexChanged(index); Q_EMIT activePageChanged(); } int TabWidget::count() { return m_stack->count(); } int TabWidget::currentIndex() { return m_stack->currentIndex(); } void TabWidget::moveTab(int from, int to) { auto w = m_stack->widget(from); if (!w) return; m_stack->removeWidget(w); m_stack->insertWidget(to, w); Q_EMIT tabMoved(from, to); } void TabWidget::removeTab(int index) { auto widget = m_stack->widget(index); m_stack->removeWidget(widget); widget->deleteLater(); // if (m_stack->count() > 0) // Q_EMIT activePageChanged(); m_tab_bar->removeTab(index); //updateTabBarGeometry(); } //#include void TabWidget::bindContainerSignal(Peony::DirectoryViewContainer *container) { connect(container, &Peony::DirectoryViewContainer::signal_responseUnmounted, this,&TabWidget::slot_responseUnmounted); connect(container, &Peony::DirectoryViewContainer::updateWindowLocationRequest, this, &TabWidget::updateWindowLocationRequest); connect(container, &Peony::DirectoryViewContainer::directoryChanged, this, &TabWidget::activePageLocationChanged); connect(container, &Peony::DirectoryViewContainer::selectionChanged, this, &TabWidget::activePageSelectionChanged); connect(container, &Peony::DirectoryViewContainer::viewTypeChanged, this, &TabWidget::activePageViewTypeChanged); connect(container, &Peony::DirectoryViewContainer::viewDoubleClicked, this, &TabWidget::onViewDoubleClicked); connect(container, &Peony::DirectoryViewContainer::menuRequest, this, &TabWidget::menuRequest); connect(container, &Peony::DirectoryViewContainer::zoomRequest, this, &TabWidget::zoomRequest); connect(container, &Peony::DirectoryViewContainer::setZoomLevelRequest, m_status_bar, &TabStatusBar::updateZoomLevelState); connect(container, &Peony::DirectoryViewContainer::updateStatusBarSliderStateRequest, this, [=]() { this->updateStatusBarSliderState(); }); connect(container, &Peony::DirectoryViewContainer::updateWindowSelectionRequest, this, [=](const QStringList &uris){ if (container == currentPage()) { Q_EMIT this->updateWindowSelectionRequest(uris); } }); connect(container, &Peony::DirectoryViewContainer::signal_itemAdded, this, [=](const QString& uri){ if (container == currentPage()) Q_EMIT this->signal_itemAdded(uri); }); connect(container, &Peony::DirectoryViewContainer::updatePreviewPageRequest, this, [=](){ this->updatePreviewPageVisible(); }); connect(container, &Peony::DirectoryViewContainer::statusBarChanged, this, [=](){ m_status_bar->update(); }); } void TabWidget::updatePreviewPage() { if (!m_preview_page) return; auto selection = getCurrentSelections(); m_preview_page->cancel(); if (selection.isEmpty()) return ; m_preview_page->prepare(selection.first()); m_preview_page->startPreview(); } void TabWidget::resizeEvent(QResizeEvent *e) { QMainWindow::resizeEvent(e); updateTabBarGeometry(); //updateStatusBarGeometry(); } void TabWidget::updateTabBarGeometry() { int minRightPadding = m_tool_bar->width() + m_add_page_button->width() + 12; int tabBarWidth = qMin(m_tab_bar->sizeHint().width() + 4, m_tab_bar_bg->width() - minRightPadding - 5); m_tool_bar->move(m_tab_bar_bg->width() - m_tool_bar->width() - 10, 6); m_tool_bar->raise(); m_tab_bar->setGeometry(2, 2, m_tab_bar_bg->width() - m_tool_bar->width() - m_add_page_button->width() - 20, m_tab_bar->sizeHint().height()); m_tab_bar_bg->setFixedHeight(m_tab_bar->height()); m_tab_bar->raise(); m_add_page_button->move(tabBarWidth + 8, 5); m_add_page_button->raise(); } void TabWidget::updateStatusBarGeometry() { auto font = qApp->font(); QFontMetrics fm(font); m_status_bar->setGeometry(0, this->height() - fm.height() - 10, m_stack->width(), fm.height() + 10); m_status_bar->raise(); } QTabBar *TabWidget::tabBar() { return m_tab_bar; } const QList> TabWidget::getCurrentSelectionFileInfos() { const QStringList uris = getCurrentSelections(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<> TabWidget::getCurrentAllFileInfos() { const QStringList uris = getAllFileUris(); QList> infos; for(auto uri : uris) { auto info = Peony::FileInfo::fromUri(uri); infos<. * * Authors: Yue Lan * */ #include "navigation-side-bar.h" #include "side-bar-model.h" #include "side-bar-proxy-filter-sort-model.h" #include "side-bar-abstract-item.h" #include "volume-manager.h" #include "volumeManager.h" #include "side-bar-menu.h" #include "side-bar-abstract-item.h" #include "bookmark-manager.h" #include "file-info.h" #include "file-info-job.h" #include "main-window.h" #include "global-settings.h" #include "file-enumerator.h" #include "gerror-wrapper.h" #include "file-utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS 4 #define MINIMUM_COLUMN_SIZE 2 using namespace Peony; NavigationSideBar::NavigationSideBar(QWidget *parent) : QTreeView(parent) { static NavigationSideBarStyle *global_style = new NavigationSideBarStyle; setSortingEnabled(true); setIconSize(QSize(16, 16)); setProperty("useIconHighlightEffect", true); //both default and highlight. setProperty("iconHighlightEffectMode", 1); this->verticalScrollBar()->setProperty("drawScrollBarGroove", false); setDragDropMode(QTreeView::DropOnly); setProperty("doNotBlur", true); viewport()->setProperty("doNotBlur", true); auto delegate = new NavigationSideBarItemDelegate(this); setItemDelegate(delegate); installEventFilter(this); setStyleSheet(".NavigationSideBar" "{" "border: 0px solid transparent" "}"); #if QT_VERSION < QT_VERSION_CHECK(5,13,0) setStyle(global_style); #endif setAttribute(Qt::WA_TranslucentBackground); viewport()->setAttribute(Qt::WA_TranslucentBackground); header()->setSectionResizeMode(QHeaderView::Fixed); header()->setStretchLastSection(true); header()->setMinimumSectionSize(MINIMUM_COLUMN_SIZE); header()->hide(); setContextMenuPolicy(Qt::CustomContextMenu); setExpandsOnDoubleClick(false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_model = new Peony::SideBarModel(this); m_proxy_model = new Peony::SideBarProxyFilterSortModel(this); m_proxy_model->setSourceModel(m_model); this->setModel(m_proxy_model); setMouseTracking(true);//追踪鼠标 setAutoScrollMargin(0); VolumeManager *volumeManager = VolumeManager::getInstance(); connect(volumeManager,&Peony::VolumeManager::volumeAdded,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//display DVD device in real time. }); connect(volumeManager,&Peony::VolumeManager::volumeRemoved,this,[=](const std::shared_ptr &volume){ m_proxy_model->invalidate();//The drive does not display when the DVD device is removed. //qDebug() << "volumeRemoved:" < &drive){ m_proxy_model->invalidate();//Multiple udisk eject display problem }); connect(volumeManager,&Peony::VolumeManager::mountAdded,this,[=](const std::shared_ptr &mount){ m_proxy_model->invalidate();//display udisk in real time after format it. }); connect(this, &QTreeView::expanded, [=](const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); qDebug()<uri(); /*! \bug can not expanded? enumerator can not get prepared signal, why? */ bool isShowNetwork = Peony::GlobalSettings::getInstance()->isExist(SHOW_NETWORK) ? Peony::GlobalSettings::getInstance()->getValue(SHOW_NETWORK).toBool() : true; if (item->type() == SideBarAbstractItem::NetWorkItem && !isShowNetwork) { this->setRowHidden(index.row(), index.parent(), true); return; } item->findChildrenAsync(); }); connect(this, &QTreeView::collapsed, [=](const QModelIndex &index) { auto item = m_proxy_model->itemFromIndex(index); item->clearChildren(); }); connect(Experimental_Peony::VolumeManager::getInstance(), &Experimental_Peony::VolumeManager::signal_mountFinished,this,[=](){ //fix open mutiple peony window, mount in side bar crash issue, link to bug#116201,116589 if(!m_currSelectedItem) return; //规避182166的情况 // JumpDirectory(m_currSelectedItem->uri()); // qDebug()<<"挂载后跳转路径:"<uri(); }); connect(this, &QTreeView::clicked, [=](const QModelIndex &index) { switch (index.column()) { case 0: { m_currSelectedItem = m_proxy_model->itemFromIndex(index); //fix open mutiple peony window, mount in side bar crash issue, link to bug#116201,116589 if (! m_currSelectedItem) break; //continue to fix crash issue, related to bug#116201,116589 m_currSelectedItem->connect(m_currSelectedItem, &SideBarAbstractItem::destroyed, this, [=]{ m_currSelectedItem = nullptr; }); if(m_currSelectedItem->isMountable()&&!m_currSelectedItem->isMounted()) m_currSelectedItem->mount(); else{ JumpDirectory(m_currSelectedItem->uri()); } break; } case 1: { auto item = m_proxy_model->itemFromIndex(index); if (item->isMounted() || item->isEjectable()||item->isStopable()) { if(item->getDevice().contains("/dev/sr") && FileUtils::isBusyDevice(item->getDevice())){/* 光盘在刻录数据、镜像等操作时,若处于busy状态时,不可弹出。link to bug#143293 */ QMessageBox::information(this, tr("Tips"), tr("The device is in busy state, please perform this operation later.")); break; } auto leftIndex = m_proxy_model->index(index.row(), 0, index.parent()); this->collapse(leftIndex); item->ejectOrUnmount(); } else { // if item is not unmountable, just be same with first column. // fix #39716 if (!item->uri().isNull()) Q_EMIT this->updateWindowLocationRequest(item->uri()); } break; } default: break; } }); connect(this, &QTreeView::customContextMenuRequested, this, [=](const QPoint &pos) { auto index = indexAt(pos); auto item = m_proxy_model->itemFromIndex(index); if (item) { if (item->type() != Peony::SideBarAbstractItem::SeparatorItem) { Peony::SideBarMenu menu(item, nullptr, this); QList actionList; MainWindow *window = dynamic_cast(this->topLevelWidget()); QAction *addAction = new QAction(QIcon::fromTheme("window-new-symbolic"), tr("Open In New Window")); connect(addAction, &QAction::triggered, this, [=](){ auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(item->uri()); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ auto targetUri = Peony::FileUtils::getTargetUri(item->uri()); if (!targetUri.isEmpty()) { auto enumerator2 = new Peony::FileEnumerator; enumerator2->setEnumerateDirectory(targetUri); enumerator2->connect(enumerator2, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (!critical) { auto newWindow = window->create(targetUri); dynamic_cast(newWindow)->show(); } else { auto info = FileInfo::fromUri(targetUri); QMessageBox::critical(0, 0, tr("Can not open %1, %2").arg(info.get()->displayName()).arg(err.get()->message())); } enumerator2->deleteLater(); }); enumerator2->prepare(); } else if (!err.get() && !critical) { auto newWindow = window->create(item->uri()); dynamic_cast(newWindow)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); actionList << addAction; addAction = new QAction(QIcon::fromTheme("tab-new-symbolic"), tr("Open In New Tab")); connect(addAction, &QAction::triggered, this, [=](){ auto enumerator = new Peony::FileEnumerator; enumerator->setEnumerateDirectory(item->uri()); enumerator->setAutoDelete(); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ auto targetUri = Peony::FileUtils::getTargetUri(item->uri()); if (!targetUri.isEmpty()) { auto enumerator2 = new Peony::FileEnumerator; enumerator2->setEnumerateDirectory(targetUri); enumerator2->connect(enumerator2, &Peony::FileEnumerator::prepared, this, [=](const std::shared_ptr &err = nullptr, const QString &t = nullptr, bool critical = false){ if (!critical) { window->addNewTabs(QStringList()<(window)->show(); } else { auto info = FileInfo::fromUri(targetUri); QMessageBox::critical(0, 0, tr("Can not open %1, %2").arg(info.get()->displayName()).arg(err.get()->message())); } enumerator2->deleteLater(); }); enumerator2->prepare(); } else if (!err.get() && !critical) { window->addNewTabs(QStringList()<uri()); dynamic_cast(window)->show(); } }); enumerator->connect(enumerator, &Peony::FileEnumerator::prepared, [=](){ enumerator->deleteLater(); }); enumerator->prepare(); }); actionList << addAction; QAction *beforeAction = nullptr; const QString netWorkUri="network:///"; if(netWorkUri != item->uri()){ QList menuActionList = menu.actions(); beforeAction = menuActionList.isEmpty() ? nullptr : menuActionList.last(); } menu.insertActions(beforeAction, actionList); if (item->type() == SideBarAbstractItem::FileSystemItem) { if ((0 != QString::compare(item->uri(), "computer:///")) && (0 != QString::compare(item->uri(), "filesafe:///"))) { for (const auto &actionItem : actionList) { if(item->isVolume()){/* 分区才去需要判断是否已挂载 */ actionItem->setEnabled(item->isMounted()); if(item->getDevice().contains("/dev/sr")){/* 光盘在刻录数据、镜像等操作时,即若处于busy状态时,该菜单置灰不可用。 */ actionItem->setDisabled(FileUtils::isBusyDevice(item->getDevice())); } } } } } menu.exec(mapToGlobal(pos)); } } }); connect(m_model, &QAbstractItemModel::dataChanged, this, [=](){ this->viewport()->update(); m_proxy_model->invalidate(); }); connect(Peony::GlobalSettings::getInstance(), &GlobalSettings::valueChanged, this, [=](const QString& key){ if (SHOW_NETWORK == key) { for (int i = 0; i < m_proxy_model->rowCount(); ++i) { auto index = m_proxy_model->index(i, 0); auto item = m_proxy_model->itemFromIndex(index); bool isShowNetwork = Peony::GlobalSettings::getInstance()->isExist(SHOW_NETWORK) ? Peony::GlobalSettings::getInstance()->getValue(SHOW_NETWORK).toBool() : true; if (item->type() == SideBarAbstractItem::NetWorkItem) { this->setRowHidden(index.row(), index.parent(), !isShowNetwork); if (!isShowNetwork) { item->findChildrenAsync(); } return; } } this->viewport()->update(); } }); expandToDepth(1);/* 快速访问、计算机、网络 各模块往下展开一层 */ } bool NavigationSideBar::eventFilter(QObject *obj, QEvent *e) { return false; } void NavigationSideBar::updateGeometries() { setViewportMargins(8, 0, 4, 0); QTreeView::updateGeometries(); if(m_notAllowHorizontalMove){ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } m_notAllowHorizontalMove = false; } void NavigationSideBar::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint) { //skip unmount indicator index if (index.isValid()) { if (index.column() == 0) { QTreeView::scrollTo(index, hint); } } } void NavigationSideBar::paintEvent(QPaintEvent *event) { QTreeView::paintEvent(event); } void NavigationSideBar::resizeEvent(QResizeEvent *e) { QTreeView::resizeEvent(e); if (header()->count() > 0) { setColumnWidth(0, this->viewport()->width() - MINIMUM_COLUMN_SIZE - viewportMargins().left() - viewportMargins().right() - verticalScrollBar()->width()); setColumnWidth(1, MINIMUM_COLUMN_SIZE); } } void NavigationSideBar::dropEvent(QDropEvent *e) { //fix invalid index cause crash issue if (! indexAt(e->pos()).isValid()) return; QString destUri = m_proxy_model->itemFromIndex(indexAt(e->pos()))->uri(); auto data = e->mimeData(); auto bookmark = Peony::BookMarkManager::getInstance(); if (bookmark->isLoaded()) { for (auto url : data->urls()) { if(url.toString().startsWith("filesafe:///")){ QMessageBox::warning(this, tr("warn"), tr("This operation is not supported.")); continue; } if (dropIndicatorPosition() == QAbstractItemView::AboveItem || dropIndicatorPosition() == QAbstractItemView::BelowItem || "favorite:///" == destUri) { // add to bookmark e->setAccepted(true); //FIXME: replace BLOCKING api in ui thread. auto info = Peony::FileInfo::fromUri(url.toDisplayString()); if (info->displayName().isNull()) { Peony::FileInfoJob j(info); j.querySync(); } if (info->isDir()) { bookmark->addBookMark(url.url()); } } } } if (e->keyboardModifiers() == Qt::ControlModifier) { m_model->dropMimeData(e->mimeData(), Qt::CopyAction, 0, 0, QModelIndex()); e->accept(); return; } QTreeView::dropEvent(e); } QSize NavigationSideBar::sizeHint() const { return QTreeView::sizeHint(); } void NavigationSideBar::JumpDirectory(const QString &uri) { if(uri=="" && m_currSelectedItem && m_currSelectedItem->getDevice().startsWith("/dev/sd")) {/* 异常U盘 */ QMessageBox::information(nullptr, tr("Tips"), tr("This is an abnormal Udisk, please fix it or format it")); return; } auto info = FileInfo::fromUri(uri); // try fix #174128, peony stucked when click sidebar network item sometimes. if (!uri.startsWith("network:///")) { if (info.get()->isEmptyInfo()) { FileInfoJob j(info); j.querySync(); } } auto targetUri = FileUtils::getTargetUri(uri); if (targetUri == "" && uri== "burn://") { qDebug() << "empty drive"<updateWindowLocationRequest(targetUri); return; } // try fixing #133429. if (m_currSelectedItem->getDevice().startsWith("/dev/sr") && uri.startsWith("computer://")) { return; } //some side bar item doesn't have a uri. //do not emit signal with a null uri to window. if (!uri.isNull()) Q_EMIT this->updateWindowLocationRequest(uri); } void NavigationSideBar::keyPressEvent(QKeyEvent *event) { if(event->key() == Qt::Key_Left||event->key()==Qt::Key_Right) { m_notAllowHorizontalMove = true; } QTreeView::keyPressEvent(event); if (event->key() == Qt::Key_Return) { if (!selectedIndexes().isEmpty()) { auto index = selectedIndexes().first(); auto uri = index.data(Qt::UserRole).toString(); Q_EMIT this->updateWindowLocationRequest(uri, true); } } if(event->key() == Qt::Key_Left||event->key()==Qt::Key_Right) {/* 按下左右键不可使侧边栏内容左右平移显示 */ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } } void NavigationSideBar::focusInEvent(QFocusEvent *event) { QTreeView::focusInEvent(event); if (event->reason() == Qt::TabFocus) { if (selectedIndexes().isEmpty()) { selectionModel()->select(model()->index(0, 0), QItemSelectionModel::Select); selectionModel()->select(model()->index(0, 1), QItemSelectionModel::Select); } else { scrollTo(selectedIndexes().first(), QTreeView::PositionAtCenter); auto selections = selectedIndexes(); clearSelection(); QTimer::singleShot(100, this, [=](){ for (auto index : selections) { selectionModel()->select(index, QItemSelectionModel::Select); } }); } } GlobalSettings::getInstance()->setValue("LAST_FOCUS_PEONY_WINID", dynamic_cast(this->topLevelWidget())->winId()); } void NavigationSideBar::wheelEvent(QWheelEvent *event) { QTreeView::wheelEvent(event); // if (event->orientation()==Qt::Horizontal) { // /* 触摸板左右滑动不可使侧边栏内容左右平移显示 */ // horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ // } if (event->angleDelta().x() != 0) { /* 触摸板左右滑动不可使侧边栏内容左右平移显示 */ horizontalScrollBar()->setValue(0);/* hotfix bug#93557 */ } } int NavigationSideBar::sizeHintForColumn(int column) const { if (column == 1) return MINIMUM_COLUMN_SIZE; if (column == 0) return viewport()->width() - MINIMUM_COLUMN_SIZE - viewportMargins().left() - viewportMargins().right() - verticalScrollBar()->width(); return QTreeView::sizeHintForColumn(column); } void NavigationSideBar::initViewItemOption(QStyleOptionViewItem *option) const { QTreeView::initViewItemOption(option); auto hoverColor = option->palette.color(QPalette::BrightText); hoverColor.setAlphaF(0.05); option->palette.setBrush(QPalette::Disabled, QPalette::Midlight, hoverColor); } // QStyleOptionViewItem NavigationSideBar::viewOptions() const // { // auto opt = QTreeView::viewOptions(); // auto hoverColor = opt.palette.color(QPalette::BrightText); // hoverColor.setAlphaF(0.05); // opt.palette.setBrush(QPalette::Disabled, QPalette::Midlight, hoverColor); // return opt; // } void NavigationSideBar::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { if ((event->dropAction() == Qt::MoveAction) && FileUtils::containsStandardPath(event->mimeData()->urls())) { event->ignore(); return; } } QAbstractItemView::dragEnterEvent(event); } NavigationSideBarItemDelegate::NavigationSideBarItemDelegate(QObject *parent) { } QSize NavigationSideBarItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { auto size = QStyledItemDelegate::sizeHint(option, index); int height = qMax(size.height(), 36); size.setHeight(height); return size; } void NavigationSideBarItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { painter->save(); // if (index.column() == 1) { // QPainterPath rightRoundedRegion; // rightRoundedRegion.setFillRule(Qt::WindingFill); // auto rect = option.rect; // auto view = qobject_cast(option.widget); // if (view) { // rect.setRight(view->viewport()->rect().right()); // } // rightRoundedRegion.addRoundedRect(rect, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS); // rightRoundedRegion.addRect(rect.adjusted(0, 0, -NAVIGATION_SIDEBAR_ITEM_BORDER_RADIUS, 0)); // //painter->setClipPath(rightRoundedRegion); // } painter->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); QStyledItemDelegate::paint(painter, option, index); painter->restore(); } NavigationSideBarContainer::NavigationSideBarContainer(QWidget *parent) { setMinimumWidth(144); /* 设计要求侧边栏最小宽度为144px */ setAttribute(Qt::WA_TranslucentBackground); m_layout = new QVBoxLayout; m_layout->setContentsMargins(0, 4, 0, 0); m_layout->setSpacing(0); } void NavigationSideBarContainer::addSideBar(NavigationSideBar *sidebar) { if (m_sidebar) return; m_sidebar = sidebar; m_layout->addWidget(sidebar); QWidget *w = new QWidget(this); QVBoxLayout *l = new QVBoxLayout; l->setContentsMargins(4, 4, 2, 4); m_label_button = new QPushButton(QIcon(":/icons/sign"), tr("All tags..."), this); m_label_button->setProperty("useIconHighlightEffect", 0x2); m_label_button->setProperty("iconHighlightEffectMode", 1); m_label_button->setProperty("fillIconSymbolicColor", true); m_label_button->setProperty("isWindowButton", 0x1); m_label_button->setCheckable(true); m_label_button->setFocusPolicy(Qt::FocusPolicy(m_label_button->focusPolicy() & ~Qt::TabFocus)); l->addWidget(m_label_button); connect(m_label_button, &QPushButton::clicked, m_sidebar, &NavigationSideBar::labelButtonClicked); w->setLayout(l); m_layout->addWidget(w); setLayout(m_layout); } QSize NavigationSideBarContainer::sizeHint() const { auto size = QWidget::sizeHint(); auto width = Peony::GlobalSettings::getInstance()->getValue(DEFAULT_SIDEBAR_WIDTH).toInt(); qDebug() << "sizeHint set DEFAULT_SIDEBAR_WIDTH:"<style()->drawPrimitive(element, option, painter, widget); } void NavigationSideBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { return qApp->style()->drawControl(element, option, painter, widget); } peony/stable/ukui3/control/view-type-menu.h0000664000175000017500000000312515154271070017673 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELVIEWTYPEMENU_H #define DEVELVIEWTYPEMENU_H #include namespace Peony { class ViewFactorySortFilterModel2; } class ViewTypeMenu : public QMenu { Q_OBJECT public: explicit ViewTypeMenu(QWidget *parent = nullptr); Q_SIGNALS: void switchViewRequest(const QString &viewId, const QIcon &icon, bool resetToZoomLevelHint = false); void updateZoomLevelHintRequest(int zoomLevelHint); public Q_SLOTS: void setCurrentView(const QString &viewId, bool blockSignal = false); void setCurrentDirectory(const QString &uri); protected: bool isViewIdValid(const QString &viewId); void updateMenuActions(); private: QString m_current_uri; QString m_current_view_id; Peony::ViewFactorySortFilterModel2 *m_model; QActionGroup *m_view_actions; }; #endif // DEVELVIEWTYPEMENU_H peony/stable/ukui3/control/label-box-delegate.h0000664000175000017500000000222415154271070020414 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: MeihongHe * */ #ifndef DEVELLABELBOXDELEGATE_H #define DEVELLABELBOXDELEGATE_H #include class LabelBoxDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit LabelBoxDelegate(QObject *parent = nullptr); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index); Q_SIGNALS: }; #endif // DEVELLABELBOXDELEGATE_H peony/stable/ukui3/control/tab-status-bar.h0000664000175000017500000000450615154271070017635 0ustar fengfeng/* * Peony-Qt's Library * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see . * * Authors: MeihongHe * */ #ifndef DEVELTABSTATUSBAR_H #define DEVELTABSTATUSBAR_H #include #include class QLabel; class QToolBar; class TabWidget; class ElidedLabel; class QSlider; class QVariantAnimation; class TabStatusBar : public QStatusBar { friend class MainWindow; friend class TabWidget; Q_OBJECT public: explicit TabStatusBar(TabWidget *tab, QWidget *parent = nullptr); ~TabStatusBar() override; int currentZoomLevel(); Q_SIGNALS: void zoomLevelChangedRequest(int zoomLevel); public Q_SLOTS: void update(); void update(const QString &message); void updateZoomLevelState(int zoomLevel); void onZoomRequest(bool zoomIn); //显示隐藏文件,更新项目个数 void updateItemsNum(); void updateSearchProgress(bool searching); protected: void paintEvent(QPaintEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; private: TabWidget *m_tab = nullptr; ElidedLabel *m_label = nullptr; QToolBar *m_styled_toolbar = nullptr; QSlider *m_slider; bool m_searching = false; QVariantAnimation* m_animation; }; class ElidedLabel : public QWidget { Q_OBJECT public: explicit ElidedLabel(QWidget *parent); void setText(const QString &text); void setSearch(bool searching); void setValue(double value); protected: void paintEvent(QPaintEvent *event) override; private: QString m_text; QPixmap m_disc; bool m_searching = false; double m_val = 0.0; }; #endif // DEVELTABSTATUSBAR_H peony/stable/ukui3/control/sort-type-menu.h0000664000175000017500000000274715154271106017721 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELSORTTYPEMENU_H #define DEVELSORTTYPEMENU_H #include #include class SortTypeMenu : public QMenu { Q_OBJECT public: explicit SortTypeMenu(QWidget *parent = nullptr); void setOriginPathVisible(bool visible); Q_SIGNALS: void switchSortTypeRequest(int type); void switchSortOrderRequest(Qt::SortOrder order); void globalSortingPolicyChanged(); public Q_SLOTS: void setSortType(int type); void setSortOrder(Qt::SortOrder order); private: int m_sort_type = 0; Qt::SortOrder m_sort_order = Qt::AscendingOrder; QAction *m_origin_path = nullptr; QActionGroup *m_sort_types; QActionGroup *m_sort_orders; }; #endif // DEVELSORTTYPEMENU_H peony/stable/ukui3/control/file-label-box.h0000664000175000017500000000360115154271070017561 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELFILELABELBOX_H #define DEVELFILELABELBOX_H #include #include #include class PEONYCORESHARED_EXPORT FileLabelBox : public QListView { Q_OBJECT public: explicit FileLabelBox(QWidget *parent = nullptr); QSize sizeHint() const; int getTotalDefaultColor() { return TOTAL_DEFAULT_COLOR; } const int TOTAL_DEFAULT_COLOR = 7; Q_SIGNALS: void leftClickOnBlank(); protected: void mousePressEvent(QMouseEvent *e); void paintEvent(QPaintEvent *e); }; class LabelBoxStyle : public QProxyStyle { static LabelBoxStyle *getStyle(); friend class FileLabelBox; LabelBoxStyle() {} void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override; void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const override; }; #endif // DEVELFILELABELBOX_H peony/stable/ukui3/control/operation-menu.h0000664000175000017500000000360415154271070017744 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELOPERATIONMENU_H #define DEVELOPERATIONMENU_H #include "about-dialog.h" #include class MainWindow; class QToolButton; class OperationMenuEditWidget; class OperationMenu : public QMenu { Q_OBJECT public: explicit OperationMenu(MainWindow *window, QWidget *parent = nullptr); public Q_SLOTS: void updateMenu(); private: QAction *m_show_hidden = nullptr; QAction *m_forbid_thumbnailing = nullptr; QAction *m_resident_in_backend = nullptr; QAction *m_showFileExtension = nullptr; private: MainWindow *m_window = nullptr; OperationMenuEditWidget *m_edit_widget = nullptr; }; class OperationMenuEditWidget : public QWidget { public: friend class OperationMenu; Q_OBJECT Q_SIGNALS: void operationAccepted(); private: explicit OperationMenuEditWidget(MainWindow *window, QWidget *parent = nullptr); void updateActions(const QString ¤tDirUri, const QStringList &selections); QToolButton *m_copy = nullptr; QToolButton *m_paste = nullptr; QToolButton *m_cut = nullptr; QToolButton *m_trash = nullptr; }; #endif // DEVELOPERATIONMENU_H peony/stable/ukui3/control/header-bar.h0000664000175000017500000001110715154271070016771 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: Yue Lan * */ #ifndef DEVELHEADERBAR_H #define DEVELHEADERBAR_H #include #include #include #include class MainWindow; class ViewTypeMenu; class SortTypeMenu; class OperationMenu; namespace Peony { class AdvancedLocationBar; } class HeaderBar; class QHBoxLayout; class HeaderBarContainer : public QToolBar { Q_OBJECT public: explicit HeaderBarContainer(QWidget *parent = nullptr); bool eventFilter(QObject *obj, QEvent *e); void addHeaderBar(HeaderBar *headerBar); protected: void addWindowButtons(); void paintEvent(QPaintEvent *e); private: QWidget *m_internal_widget; QHBoxLayout *m_layout; HeaderBar *m_header_bar = nullptr; QToolButton *m_max_or_restore = nullptr; }; class HeaderBar : public QToolBar { friend class HeaderBarContainer; friend class MainWindow; Q_OBJECT private: explicit HeaderBar(MainWindow *parent = nullptr); Q_SIGNALS: void updateLocationRequest(const QString &uri, bool addHistory = true, bool force = true); void updateSearch(const QString &uri, const QString &key="", bool updateKey=false); void viewTypeChangeRequest(const QString &viewId); void updateZoomLevelHintRequest(int zoomLevelHint); void updateSearchRequest(bool showSearch); void clearTrash(); void updateSearchProgress(bool searching); protected: void addSpacing(int pixel); void mouseMoveEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent *e); void addMenuButtons(); private Q_SLOTS: void setLocation(const QString &uri); void cancelEdit(); void updateIcons(); void updateSearchRecursive(bool recursive); void updateMaximizeState(); void startEdit(bool bSearch = false); void finishEdit(); void searchButtonClicked(); void openDefaultTerminal(); void findDefaultTerminal(); void tryOpenAgain(); void setSearchMode(bool mode); void closeSearch(); void initFocus(); void updateHeaderState(); void updateSortTypeEnable(); void updateViewTypeEnable(); void quitSerachMode(); private: const QString m_uri; MainWindow *m_window; Peony::AdvancedLocationBar *m_location_bar; ViewTypeMenu *m_view_type_menu; SortTypeMenu *m_sort_type_menu; OperationMenu *m_operation_menu; QPushButton *m_create_folder; QToolButton *m_go_back; QToolButton *m_go_forward; QToolButton *m_maximize_restore_button; QToolButton *m_search_button; bool m_search_mode = false; bool m_search_recursive = true; QWidgetList m_focus_list; const int GBACK_BTN_WIDTH = 36; const int SEARCH_BTN_WIDTH = 36; const int ADDRESS_BAR_LEFT_WIDTH = 9; const int ADDRESS_BAR_RIGHT_WIDTH = 2; const int ADDRESS_BAR_MINIMUN_WIDTH = 250; const int DRAG_AREA_MINIMUN_WIDTH = 80; const int DRAG_AREA_DEFAULT_WIDTH = 120; }; class HeaderBarToolButton : public QToolButton { friend class HeaderBar; friend class MainWindow; Q_OBJECT; explicit HeaderBarToolButton(QWidget *parent = nullptr); }; class HeadBarPushButton : public QPushButton { friend class HeaderBar; friend class MainWindow; Q_OBJECT explicit HeadBarPushButton(QWidget *parent = nullptr); }; class HeaderBarStyle : public QProxyStyle { friend class HeaderBar; friend class HeaderBarContainer; static HeaderBarStyle *getStyle(); HeaderBarStyle() {} int pixelMetric(PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const override; void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override; }; #endif // DEVELHEADERBAR_H peony/stable/ukui3/control/label-box-delegate.cpp0000664000175000017500000000237115154271070020752 0ustar fengfeng/* * Peony-Qt * * Copyright (C) 2020, Tianjin KYLIN Information Technology Co., Ltd. * * This program 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. * * This program 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 . * * Authors: MeihongHe * */ #include "label-box-delegate.h" #include #include LabelBoxDelegate::LabelBoxDelegate(QObject *parent) : QStyledItemDelegate(parent) { qDebug() << "LabelBoxDelegate enter"; } void LabelBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) { qDebug() << "LabelBoxDelegate paint"; auto opt = option; opt.decorationSize = QSize(); QStyledItemDelegate::paint(painter, opt, index); } peony/doxygen/0000775000175000017500000000000015154271070012311 5ustar fengfengpeony/doxygen/Doxyfile.in0000664000175000017500000033427215154271070014437 0ustar fengfeng# Doxyfile 1.8.17 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "Peony Qt" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "Poeny Qt 是基于qt前端和gio后端的文件管理器,除了peony-qt文件管理本身,它也将提供一个libpeony-qt的文件管理器开发包用于文件管理器的二次开发。整个项目开源,目前项目地址为:https://github.com/ukui/peony。注:peony-qt基于GPLv3发布,而libpeony-qt基于LGPLv3发布。" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = ./out # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = YES # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = YES # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = Chinese # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all generated output in the proper direction. # Possible values are: None, LTR, RTL and Context. # The default value is: None. OUTPUT_TEXT_DIRECTION = None # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines (in the resulting output). You can put ^^ in the value part of an # alias to insert a newline as if a physical newline was in the original file. # When you need a literal { or } or , in the value part of an alias you have to # escape them by means of a backslash (\), this can lead to conflicts with the # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files), VHDL, tcl. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is # Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = YES # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = YES # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = YES # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = YES # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = YES # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. If # EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = ../ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), # *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen # C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.idl \ *.ddl \ *.odl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.cs \ *.d \ *.php \ *.php4 \ *.php5 \ *.phtml \ *.inc \ *.m \ *.markdown \ *.md \ *.mm \ *.dox \ *.py \ *.pyw \ *.f90 \ *.f95 \ *.f03 \ *.f08 \ *.f \ *.for \ *.tcl \ *.vhd \ *.vhdl \ *.ucf \ *.qsf # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the compilation database (see: # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files # were built. This is equivalent to specifying the "-p" option to a clang tool, # such as clang-check. These options will then be passed to the parser. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: https://developer.apple.com/xcode/), introduced with OSX # 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. # The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /