- enhancement: option "open files in the same red panda C++ instance", in options->environment->file associations
- enhancement: hide unsupported files in files view
This commit is contained in:
parent
08c285e55b
commit
cc0b209e2f
2
NEWS.md
2
NEWS.md
|
@ -1,5 +1,7 @@
|
||||||
Red Panda C++ Version 0.14.5
|
Red Panda C++ Version 0.14.5
|
||||||
- fix: the "gnu c++ 20" option in compiler set options is wrong
|
- fix: the "gnu c++ 20" option in compiler set options is wrong
|
||||||
|
- enhancement: option "open files in the same red panda C++ instance", in options->environment->file associations
|
||||||
|
- enhancement: hide unsupported files in files view
|
||||||
|
|
||||||
|
|
||||||
Red Panda C++ Version 0.14.4
|
Red Panda C++ Version 0.14.4
|
||||||
|
|
|
@ -10,7 +10,7 @@ isEmpty(APP_NAME) {
|
||||||
}
|
}
|
||||||
|
|
||||||
isEmpty(APP_VERSION) {
|
isEmpty(APP_VERSION) {
|
||||||
APP_VERSION=0.14.4
|
APP_VERSION=0.14.5
|
||||||
}
|
}
|
||||||
|
|
||||||
isEmpty(PREFIX) {
|
isEmpty(PREFIX) {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -95,6 +95,7 @@ void IconsManager::updateActionIcons(const QString& iconSet, int size)
|
||||||
mIconPixmaps.insert(ACTION_MISC_VALIDATE, createSVGIcon(iconFolder+"00Misc-10Check.svg",size,size));
|
mIconPixmaps.insert(ACTION_MISC_VALIDATE, createSVGIcon(iconFolder+"00Misc-10Check.svg",size,size));
|
||||||
mIconPixmaps.insert(ACTION_MISC_RENAME, createSVGIcon(iconFolder+"00Misc-11Rename.svg",size,size));
|
mIconPixmaps.insert(ACTION_MISC_RENAME, createSVGIcon(iconFolder+"00Misc-11Rename.svg",size,size));
|
||||||
mIconPixmaps.insert(ACTION_MISC_HELP, createSVGIcon(iconFolder+"00Misc-12Help.svg",size,size));
|
mIconPixmaps.insert(ACTION_MISC_HELP, createSVGIcon(iconFolder+"00Misc-12Help.svg",size,size));
|
||||||
|
mIconPixmaps.insert(ACTION_MISC_FILTER, createSVGIcon(iconFolder+"00Misc-13Filter.svg",size,size));
|
||||||
|
|
||||||
mIconPixmaps.insert(ACTION_FILE_NEW, createSVGIcon(iconFolder+"01File-01New.svg",size,size));
|
mIconPixmaps.insert(ACTION_FILE_NEW, createSVGIcon(iconFolder+"01File-01New.svg",size,size));
|
||||||
mIconPixmaps.insert(ACTION_FILE_OPEN, createSVGIcon(iconFolder+"01File-02Open.svg",size,size));
|
mIconPixmaps.insert(ACTION_FILE_OPEN, createSVGIcon(iconFolder+"01File-02Open.svg",size,size));
|
||||||
|
|
|
@ -112,6 +112,7 @@ public:
|
||||||
ACTION_MISC_VALIDATE,
|
ACTION_MISC_VALIDATE,
|
||||||
ACTION_MISC_RENAME,
|
ACTION_MISC_RENAME,
|
||||||
ACTION_MISC_HELP,
|
ACTION_MISC_HELP,
|
||||||
|
ACTION_MISC_FILTER,
|
||||||
|
|
||||||
ACTION_FILE_NEW,
|
ACTION_FILE_NEW,
|
||||||
ACTION_FILE_OPEN,
|
ACTION_FILE_OPEN,
|
||||||
|
|
|
@ -38,9 +38,14 @@
|
||||||
#include "widgets/choosethemedialog.h"
|
#include "widgets/choosethemedialog.h"
|
||||||
#include "thememanager.h"
|
#include "thememanager.h"
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
#include <QTemporaryFile>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <psapi.h>
|
||||||
|
#include <QSharedMemory>
|
||||||
|
#include <QBuffer>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
QString getSettingFilename(const QString& filepath, bool& firstRun);
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
class WindowLogoutEventFilter : public QAbstractNativeEventFilter {
|
class WindowLogoutEventFilter : public QAbstractNativeEventFilter {
|
||||||
|
|
||||||
|
@ -48,6 +53,61 @@ class WindowLogoutEventFilter : public QAbstractNativeEventFilter {
|
||||||
public:
|
public:
|
||||||
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
|
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
|
||||||
};
|
};
|
||||||
|
#define WM_USER_OPEN_FILE (WM_USER+1)
|
||||||
|
HWND prevAppInstance = NULL;
|
||||||
|
BOOL CALLBACK GetPreviousInstanceCallback(HWND hwnd, LPARAM param){
|
||||||
|
BOOL result = TRUE;
|
||||||
|
WCHAR buffer[4098];
|
||||||
|
HINSTANCE hWindowModule = (HINSTANCE)GetWindowLongPtr(hwnd,GWLP_HINSTANCE);
|
||||||
|
|
||||||
|
if (hWindowModule==0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
DWORD processID;
|
||||||
|
|
||||||
|
// Get the ID of the process that created this window
|
||||||
|
GetWindowThreadProcessId(hwnd,&processID);
|
||||||
|
if (processID==0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// Get the process associated with the ID
|
||||||
|
HANDLE hWindowProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
|
||||||
|
if (hWindowProcess == 0)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// Get its module filename
|
||||||
|
if (GetModuleFileNameExW(hWindowProcess, hWindowModule, buffer, sizeof(buffer)) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
CloseHandle(hWindowProcess); // not needed anymore
|
||||||
|
WCHAR * compareFilename=(WCHAR*)param;
|
||||||
|
QString s1=QString::fromWCharArray(compareFilename);
|
||||||
|
QString s2=QString::fromWCharArray(buffer);
|
||||||
|
|
||||||
|
//Is from the "same" application?
|
||||||
|
if (QString::compare(s1,s2,PATH_SENSITIVITY)==0) {
|
||||||
|
//found, stop EnumWindows loop
|
||||||
|
prevAppInstance = hwnd;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND getPreviousInstance() {
|
||||||
|
WCHAR buffer[4098];
|
||||||
|
//ShowMessage('ERROR_ALREADY_EXISTS');
|
||||||
|
// Store our own module filename
|
||||||
|
if (GetModuleFileNameW(GetModuleHandle(NULL), buffer, sizeof(buffer)) == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// If that's the case, walk all top level windows and find the previous instance
|
||||||
|
// At this point, the program that created the mutex might not have created its MainForm yet
|
||||||
|
if (EnumWindows(GetPreviousInstanceCallback, LPARAM(buffer))==0) {
|
||||||
|
return prevAppInstance;
|
||||||
|
} else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bool WindowLogoutEventFilter::nativeEventFilter(const QByteArray & /*eventType*/, void *message, long *result){
|
bool WindowLogoutEventFilter::nativeEventFilter(const QByteArray & /*eventType*/, void *message, long *result){
|
||||||
MSG * pMsg = static_cast<MSG *>(message);
|
MSG * pMsg = static_cast<MSG *>(message);
|
||||||
|
@ -72,6 +132,46 @@ bool WindowLogoutEventFilter::nativeEventFilter(const QByteArray & /*eventType*/
|
||||||
pMainWindow->updateDPI(oldDPI,newDPI);
|
pMainWindow->updateDPI(oldDPI,newDPI);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WM_USER_OPEN_FILE: {
|
||||||
|
QSharedMemory sharedMemory("RedPandaCpp/openfiles");
|
||||||
|
if (sharedMemory.attach()) {
|
||||||
|
QBuffer buffer;
|
||||||
|
QDataStream in(&buffer);
|
||||||
|
QStringList files;
|
||||||
|
sharedMemory.lock();
|
||||||
|
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
|
||||||
|
buffer.open(QBuffer::ReadOnly);
|
||||||
|
in >> files;
|
||||||
|
sharedMemory.unlock();
|
||||||
|
pMainWindow->openFiles(files);
|
||||||
|
sharedMemory.detach();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sendFilesToInstance() {
|
||||||
|
HWND prevInstance = getPreviousInstance();
|
||||||
|
if (prevInstance != NULL) {
|
||||||
|
QSharedMemory sharedMemory("RedPandaCpp/openfiles");
|
||||||
|
QBuffer buffer;
|
||||||
|
buffer.open(QBuffer::ReadWrite);
|
||||||
|
QDataStream out(&buffer);
|
||||||
|
QStringList filesToOpen = qApp->arguments();
|
||||||
|
filesToOpen.pop_front();
|
||||||
|
out<<filesToOpen;
|
||||||
|
int size = buffer.size();
|
||||||
|
if (sharedMemory.create(size)) {
|
||||||
|
sharedMemory.lock();
|
||||||
|
char *to = (char*)sharedMemory.data();
|
||||||
|
const char *from = buffer.data().data();
|
||||||
|
memcpy(to, from, qMin(sharedMemory.size(), size));
|
||||||
|
sharedMemory.unlock();
|
||||||
|
SendMessage(prevInstance,WM_USER_OPEN_FILE,0,0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +230,35 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
//QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
//QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
QFile tempFile(QDir::tempPath()+QDir::separator()+"RedPandaDevCppStartUp.lock");
|
||||||
|
|
||||||
|
{
|
||||||
|
bool firstRun;
|
||||||
|
QString settingFilename = getSettingFilename(QString(), firstRun);
|
||||||
|
bool openInSingleInstance = false;
|
||||||
|
if (!settingFilename.isEmpty() && !firstRun) {
|
||||||
|
Settings settings(settingFilename);
|
||||||
|
settings.load();
|
||||||
|
openInSingleInstance = settings.environment().openFilesInSingleInstance();
|
||||||
|
} else if (!settingFilename.isEmpty() && firstRun)
|
||||||
|
openInSingleInstance = false;
|
||||||
|
if (openInSingleInstance) {
|
||||||
|
while (true) {
|
||||||
|
if (tempFile.open(QFile::NewOnly))
|
||||||
|
break;
|
||||||
|
QThread::msleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app.arguments().length()>=2) {
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
if (sendFilesToInstance()) {
|
||||||
|
tempFile.remove();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Translation must be loaded first
|
//Translation must be loaded first
|
||||||
QTranslator trans,transQt;
|
QTranslator trans,transQt;
|
||||||
|
@ -138,8 +267,10 @@ int main(int argc, char *argv[])
|
||||||
if (!isGreenEdition()) {
|
if (!isGreenEdition()) {
|
||||||
QDir::setCurrent(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]);
|
QDir::setCurrent(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]);
|
||||||
}
|
}
|
||||||
if (settingFilename.isEmpty())
|
if (settingFilename.isEmpty()) {
|
||||||
|
tempFile.remove();
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
QSettings languageSetting(settingFilename,QSettings::IniFormat);
|
QSettings languageSetting(settingFilename,QSettings::IniFormat);
|
||||||
|
@ -230,6 +361,7 @@ int main(int argc, char *argv[])
|
||||||
WindowLogoutEventFilter filter;
|
WindowLogoutEventFilter filter;
|
||||||
app.installNativeEventFilter(&filter);
|
app.installNativeEventFilter(&filter);
|
||||||
#endif
|
#endif
|
||||||
|
tempFile.remove();
|
||||||
int retCode = app.exec();
|
int retCode = app.exec();
|
||||||
QString configDir = pSettings->dirs().config();
|
QString configDir = pSettings->dirs().config();
|
||||||
// save settings
|
// save settings
|
||||||
|
@ -242,6 +374,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
return retCode;
|
return retCode;
|
||||||
} catch (BaseError e) {
|
} catch (BaseError e) {
|
||||||
|
tempFile.remove();
|
||||||
QMessageBox::critical(nullptr,QApplication::tr("Error"),e.reason());
|
QMessageBox::critical(nullptr,QApplication::tr("Error"),e.reason());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,6 +296,9 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
ui->treeFiles->setModel(&mFileSystemModel);
|
ui->treeFiles->setModel(&mFileSystemModel);
|
||||||
mFileSystemModel.setReadOnly(false);
|
mFileSystemModel.setReadOnly(false);
|
||||||
mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
|
mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
|
||||||
|
|
||||||
|
mFileSystemModel.setNameFilters(pSystemConsts->defaultFileNameFilters());
|
||||||
|
mFileSystemModel.setNameFilterDisables(false);
|
||||||
setFilesViewRoot(pSettings->environment().currentFolder());
|
setFilesViewRoot(pSettings->environment().currentFolder());
|
||||||
for (int i=1;i<mFileSystemModel.columnCount();i++) {
|
for (int i=1;i<mFileSystemModel.columnCount();i++) {
|
||||||
ui->treeFiles->hideColumn(i);
|
ui->treeFiles->hideColumn(i);
|
||||||
|
@ -1366,6 +1369,7 @@ void MainWindow::updateActionIcons()
|
||||||
mFilesView_Open->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_OPEN));
|
mFilesView_Open->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_OPEN));
|
||||||
mFilesView_OpenInTerminal->setIcon(pIconsManager->getIcon(IconsManager::ACTION_MISC_TERM));
|
mFilesView_OpenInTerminal->setIcon(pIconsManager->getIcon(IconsManager::ACTION_MISC_TERM));
|
||||||
mFilesView_OpenInExplorer->setIcon(pIconsManager->getIcon(IconsManager::ACTION_MISC_FOLDER));
|
mFilesView_OpenInExplorer->setIcon(pIconsManager->getIcon(IconsManager::ACTION_MISC_FOLDER));
|
||||||
|
ui->actionFilesView_Hide_Non_Support_Files->setIcon(pIconsManager->getIcon(IconsManager::ACTION_MISC_FILTER));
|
||||||
|
|
||||||
//problem view
|
//problem view
|
||||||
pIconsManager->setIcon(ui->btnNewProblemSet, IconsManager::ACTION_PROBLEM_SET);
|
pIconsManager->setIcon(ui->btnNewProblemSet, IconsManager::ACTION_PROBLEM_SET);
|
||||||
|
@ -2796,7 +2800,7 @@ void MainWindow::buildContextMenus()
|
||||||
|
|
||||||
//toolbar for files view
|
//toolbar for files view
|
||||||
{
|
{
|
||||||
QHBoxLayout* hlayout = dynamic_cast<QHBoxLayout*>( ui->panelFiles->layout());
|
QHBoxLayout* hlayout = dynamic_cast<QHBoxLayout*>(ui->panelFiles->layout());
|
||||||
QToolButton * toolButton;
|
QToolButton * toolButton;
|
||||||
int size = pointToPixel(pSettings->environment().interfaceFontSize());
|
int size = pointToPixel(pSettings->environment().interfaceFontSize());
|
||||||
QSize iconSize(size,size);
|
QSize iconSize(size,size);
|
||||||
|
@ -2808,6 +2812,15 @@ void MainWindow::buildContextMenus()
|
||||||
toolButton->setIconSize(iconSize);
|
toolButton->setIconSize(iconSize);
|
||||||
toolButton->setDefaultAction(ui->actionLocate_in_Files_View);
|
toolButton->setDefaultAction(ui->actionLocate_in_Files_View);
|
||||||
hlayout->addWidget(toolButton);
|
hlayout->addWidget(toolButton);
|
||||||
|
QFrame * vLine = new QFrame();
|
||||||
|
vLine->setFrameShape(QFrame::VLine);
|
||||||
|
vLine->setFrameShadow(QFrame::Sunken);
|
||||||
|
hlayout->addWidget(vLine);
|
||||||
|
toolButton = new QToolButton;
|
||||||
|
toolButton->setIconSize(iconSize);
|
||||||
|
toolButton->setDefaultAction(ui->actionFilesView_Hide_Non_Support_Files);
|
||||||
|
ui->actionFilesView_Hide_Non_Support_Files->setChecked(pSettings->environment().hideNonSupportFilesInFileView());
|
||||||
|
hlayout->addWidget(toolButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
//context menu signal for class browser
|
//context menu signal for class browser
|
||||||
|
@ -3207,6 +3220,8 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.addAction(mFilesView_OpenInTerminal);
|
menu.addAction(mFilesView_OpenInTerminal);
|
||||||
menu.addAction(mFilesView_OpenInExplorer);
|
menu.addAction(mFilesView_OpenInExplorer);
|
||||||
|
menu.addSeparator();
|
||||||
|
menu.addAction(ui->actionFilesView_Hide_Non_Support_Files);
|
||||||
QString path = mFileSystemModel.filePath(ui->treeFiles->currentIndex());
|
QString path = mFileSystemModel.filePath(ui->treeFiles->currentIndex());
|
||||||
QFileInfo info(path);
|
QFileInfo info(path);
|
||||||
mFilesView_Open->setEnabled(info.isFile());
|
mFilesView_Open->setEnabled(info.isFile());
|
||||||
|
@ -7062,3 +7077,14 @@ void MainWindow::on_actionGit_Push_triggered()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::on_actionFilesView_Hide_Non_Support_Files_toggled(bool /* arg1 */)
|
||||||
|
{
|
||||||
|
mFileSystemModel.setNameFilterDisables(!ui->actionFilesView_Hide_Non_Support_Files->isChecked());
|
||||||
|
if (pSettings->environment().hideNonSupportFilesInFileView()
|
||||||
|
!= ui->actionFilesView_Hide_Non_Support_Files->isChecked()) {
|
||||||
|
pSettings->environment().setHideNonSupportFilesInFileView(ui->actionFilesView_Hide_Non_Support_Files->isChecked());
|
||||||
|
pSettings->environment().save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -604,6 +604,8 @@ private slots:
|
||||||
|
|
||||||
void on_actionGit_Push_triggered();
|
void on_actionGit_Push_triggered();
|
||||||
|
|
||||||
|
void on_actionFilesView_Hide_Non_Support_Files_toggled(bool arg1);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
EditorList *mEditorList;
|
EditorList *mEditorList;
|
||||||
|
|
|
@ -1422,7 +1422,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1114</width>
|
<width>1114</width>
|
||||||
<height>25</height>
|
<height>26</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
|
@ -2839,6 +2839,18 @@
|
||||||
<string>Push</string>
|
<string>Push</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionFilesView_Hide_Non_Support_Files">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="icons.qrc">
|
||||||
|
<normaloff>:/icons/images/newlook24/037-filter.png</normaloff>:/icons/images/newlook24/037-filter.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Hide Non Support Files</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
viewBox="0 0 26.458333 26.458333"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="00Misc-13Filter.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0230034"
|
||||||
|
inkscape:cx="-291.29913"
|
||||||
|
inkscape:cy="64.027158"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1001"
|
||||||
|
inkscape:window-x="-9"
|
||||||
|
inkscape:window-y="-9"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
units="px"
|
||||||
|
width="100px" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056"
|
||||||
|
inkscape:swatch="gradient">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop826" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#53e900;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop828" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056-2">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3052" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5fff07;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3054" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="图层 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-opacity:1;stroke:#1f74fe;stroke-width:2.38125;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 2.6246389,4.8265718 H 24.099988 L 16.708565,15.641624 v 5.216446 l -6.295705,2.032732 v -7.147477 z"
|
||||||
|
id="path2472"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
viewBox="0 0 26.458333 26.458333"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="00Misc-13Filter.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0230034"
|
||||||
|
inkscape:cx="-291.29913"
|
||||||
|
inkscape:cy="64.027158"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1001"
|
||||||
|
inkscape:window-x="-9"
|
||||||
|
inkscape:window-y="-9"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
units="px"
|
||||||
|
width="100px" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056"
|
||||||
|
inkscape:swatch="gradient">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop826" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#53e900;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop828" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056-2">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3052" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5fff07;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3054" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="图层 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.582084;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 1.4346825,3.7982842 H 25.296182 L 17.083489,15.815009 v 5.796051 l -6.995227,2.258591 V 15.92801 Z"
|
||||||
|
id="path2472"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,73 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
viewBox="0 0 26.458333 26.458333"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
sodipodi:docname="00Misc-13Filter.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.0230034"
|
||||||
|
inkscape:cx="-292.27664"
|
||||||
|
inkscape:cy="64.027157"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1001"
|
||||||
|
inkscape:window-x="-9"
|
||||||
|
inkscape:window-y="-9"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
units="px"
|
||||||
|
width="100px" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056"
|
||||||
|
inkscape:swatch="gradient">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop826" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#53e900;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop828" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3056-2">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#45c200;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3052" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5fff07;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3054" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="图层 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
style="fill:#cdf1ff;fill-opacity:1;stroke:#000000;stroke-width:0.582084;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 1.4346825,3.7982842 H 25.296182 L 17.083489,15.815009 v 5.796051 l -6.995227,2.258591 V 15.92801 Z"
|
||||||
|
id="path2472"
|
||||||
|
sodipodi:nodetypes="ccccccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -2937,6 +2937,8 @@ void Settings::Environment::doLoad()
|
||||||
mTerminalPath = stringValue("terminal_path","/usr/bin/x-terminal-emulator");
|
mTerminalPath = stringValue("terminal_path","/usr/bin/x-terminal-emulator");
|
||||||
mAStylePath = includeTrailingPathDelimiter(pSettings->dirs().appLibexecDir())+"astyle";
|
mAStylePath = includeTrailingPathDelimiter(pSettings->dirs().appLibexecDir())+"astyle";
|
||||||
#endif
|
#endif
|
||||||
|
mHideNonSupportFilesInFileView=boolValue("hide_non_support_files_file_view",true);
|
||||||
|
mOpenFilesInSingleInstance = boolValue("open_files_in_single_instance",false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Settings::Environment::interfaceFontSize() const
|
int Settings::Environment::interfaceFontSize() const
|
||||||
|
@ -3029,6 +3031,26 @@ void Settings::Environment::setUseCustomTheme(bool newUseCustomTheme)
|
||||||
mUseCustomTheme = newUseCustomTheme;
|
mUseCustomTheme = newUseCustomTheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Settings::Environment::hideNonSupportFilesInFileView() const
|
||||||
|
{
|
||||||
|
return mHideNonSupportFilesInFileView;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settings::Environment::setHideNonSupportFilesInFileView(bool newHideNonSupportFilesInFileView)
|
||||||
|
{
|
||||||
|
mHideNonSupportFilesInFileView = newHideNonSupportFilesInFileView;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Settings::Environment::openFilesInSingleInstance() const
|
||||||
|
{
|
||||||
|
return mOpenFilesInSingleInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settings::Environment::setOpenFilesInSingleInstance(bool newOpenFilesInSingleInstance)
|
||||||
|
{
|
||||||
|
mOpenFilesInSingleInstance = newOpenFilesInSingleInstance;
|
||||||
|
}
|
||||||
|
|
||||||
void Settings::Environment::doSave()
|
void Settings::Environment::doSave()
|
||||||
{
|
{
|
||||||
//Appearence
|
//Appearence
|
||||||
|
@ -3046,6 +3068,9 @@ void Settings::Environment::doSave()
|
||||||
saveValue("terminal_path",mTerminalPath);
|
saveValue("terminal_path",mTerminalPath);
|
||||||
saveValue("asyle_path",mAStylePath);
|
saveValue("asyle_path",mAStylePath);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
saveValue("hide_non_support_files_file_view",mHideNonSupportFilesInFileView);
|
||||||
|
saveValue("open_files_in_single_instance",mOpenFilesInSingleInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Settings::Environment::interfaceFont() const
|
QString Settings::Environment::interfaceFont() const
|
||||||
|
|
|
@ -528,6 +528,12 @@ public:
|
||||||
bool useCustomTheme() const;
|
bool useCustomTheme() const;
|
||||||
void setUseCustomTheme(bool newUseCustomTheme);
|
void setUseCustomTheme(bool newUseCustomTheme);
|
||||||
|
|
||||||
|
bool hideNonSupportFilesInFileView() const;
|
||||||
|
void setHideNonSupportFilesInFileView(bool newHideNonSupportFilesInFileView);
|
||||||
|
|
||||||
|
bool openFilesInSingleInstance() const;
|
||||||
|
void setOpenFilesInSingleInstance(bool newOpenFilesInSingleInstance);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
//Appearence
|
//Appearence
|
||||||
|
@ -543,6 +549,8 @@ public:
|
||||||
QString mDefaultOpenFolder;
|
QString mDefaultOpenFolder;
|
||||||
QString mTerminalPath;
|
QString mTerminalPath;
|
||||||
QString mAStylePath;
|
QString mAStylePath;
|
||||||
|
bool mHideNonSupportFilesInFileView;
|
||||||
|
bool mOpenFilesInSingleInstance;
|
||||||
// _Base interface
|
// _Base interface
|
||||||
protected:
|
protected:
|
||||||
void doSave() override;
|
void doSave() override;
|
||||||
|
|
|
@ -49,6 +49,10 @@ EnvironmentFileAssociationWidget::~EnvironmentFileAssociationWidget()
|
||||||
|
|
||||||
void EnvironmentFileAssociationWidget::doLoad()
|
void EnvironmentFileAssociationWidget::doLoad()
|
||||||
{
|
{
|
||||||
|
if (pSettings->environment().openFilesInSingleInstance())
|
||||||
|
ui->rbOpenInSingleApplication->setChecked(true);
|
||||||
|
else
|
||||||
|
ui->rbOpenInMultiApplication->setChecked(true);
|
||||||
mModel.updateAssociationStates();
|
mModel.updateAssociationStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +60,8 @@ void EnvironmentFileAssociationWidget::doSave()
|
||||||
{
|
{
|
||||||
mModel.saveAssociations();
|
mModel.saveAssociations();
|
||||||
mModel.updateAssociationStates();
|
mModel.updateAssociationStates();
|
||||||
|
pSettings->environment().setOpenFilesInSingleInstance(ui->rbOpenInSingleApplication->isChecked());
|
||||||
|
pSettings->environment().save();
|
||||||
}
|
}
|
||||||
|
|
||||||
FileAssociationModel::FileAssociationModel(QObject *parent) : QAbstractListModel(parent)
|
FileAssociationModel::FileAssociationModel(QObject *parent) : QAbstractListModel(parent)
|
||||||
|
|
|
@ -7,13 +7,36 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>708</width>
|
<width>708</width>
|
||||||
<height>350</height>
|
<height>459</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="title">
|
||||||
|
<string>Open Each File In</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="rbOpenInMultiApplication">
|
||||||
|
<property name="text">
|
||||||
|
<string>Independant Red Panda C++ applications</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="rbOpenInSingleApplication">
|
||||||
|
<property name="text">
|
||||||
|
<string>The same Red Panda C++ application</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
|
|
|
@ -59,6 +59,22 @@ SystemConsts::SystemConsts(): mDefaultFileFilters()
|
||||||
}
|
}
|
||||||
std::sort(codecNames.begin(),codecNames.end());
|
std::sort(codecNames.begin(),codecNames.end());
|
||||||
mCodecNames.append(codecNames);
|
mCodecNames.append(codecNames);
|
||||||
|
|
||||||
|
mDefaultFileNameFilters.append("*.c");
|
||||||
|
mDefaultFileNameFilters.append("*.cpp");
|
||||||
|
mDefaultFileNameFilters.append("*.cc");
|
||||||
|
mDefaultFileNameFilters.append("*.C");
|
||||||
|
mDefaultFileNameFilters.append("*.cxx");
|
||||||
|
mDefaultFileNameFilters.append("*.cxx");
|
||||||
|
mDefaultFileNameFilters.append("*.h");
|
||||||
|
mDefaultFileNameFilters.append("*.hpp");
|
||||||
|
mDefaultFileNameFilters.append("*.hxx");
|
||||||
|
mDefaultFileNameFilters.append(".gitignore");
|
||||||
|
mDefaultFileNameFilters.append("*.vs");
|
||||||
|
mDefaultFileNameFilters.append("*.fs");
|
||||||
|
mDefaultFileNameFilters.append("*.txt");
|
||||||
|
mDefaultFileNameFilters.append("*.md");
|
||||||
|
mDefaultFileNameFilters.append("*.dev");
|
||||||
}
|
}
|
||||||
|
|
||||||
const QStringList &SystemConsts::defaultFileFilters() const noexcept
|
const QStringList &SystemConsts::defaultFileFilters() const noexcept
|
||||||
|
@ -91,6 +107,11 @@ void SystemConsts::addFileFilter(QStringList& filters, const QString &name, cons
|
||||||
filters.append(name+ " (" + fileExtensions+")");
|
filters.append(name+ " (" + fileExtensions+")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QStringList &SystemConsts::defaultFileNameFilters() const
|
||||||
|
{
|
||||||
|
return mDefaultFileNameFilters;
|
||||||
|
}
|
||||||
|
|
||||||
const QStringList &SystemConsts::codecNames() const
|
const QStringList &SystemConsts::codecNames() const
|
||||||
{
|
{
|
||||||
return mCodecNames;
|
return mCodecNames;
|
||||||
|
|
|
@ -109,10 +109,13 @@ public:
|
||||||
|
|
||||||
const QStringList &codecNames() const;
|
const QStringList &codecNames() const;
|
||||||
|
|
||||||
|
const QStringList &defaultFileNameFilters() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void addFileFilter(QStringList& filters, const QString& name, const QString& fileExtensions);
|
void addFileFilter(QStringList& filters, const QString& name, const QString& fileExtensions);
|
||||||
QStringList mDefaultFileFilters;
|
QStringList mDefaultFileFilters;
|
||||||
QStringList mIconFileFilters;
|
QStringList mIconFileFilters;
|
||||||
|
QStringList mDefaultFileNameFilters;
|
||||||
QStringList mCodecNames;
|
QStringList mCodecNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ SUBDIRS += \
|
||||||
|
|
||||||
APP_NAME = RedPandaCPP
|
APP_NAME = RedPandaCPP
|
||||||
|
|
||||||
APP_VERSION = 0.14.4
|
APP_VERSION = 0.14.5
|
||||||
|
|
||||||
linux: {
|
linux: {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue