mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2024-11-23 01:06:31 -06:00
8f146ebb4c
Added functionality to open different website link and load the website data to different tab. To achieve this, new customized QTabWidget and QWebView are added to render the data to WebView widget. All the widgets (New Tab, WebViewWinodw, and QToolButton) are added dynamically. QToolButton is used to traverse back and forward to web document opened in WebViewWindow. Introduced the New class called WebViewWindow which is derived from QWebView. Each tab of the QTabWidget contains the instance of WebViewWindow class. WebViewWindow class is useful to display the web document. Introduced New class called TabWindow which is derived from QTabWidget. This class is useful to achieve following functionality: - Customize the close button of tabbar so that it can only be visible other then main pgAdmin 4 window. - Enable/Disable the toolbutton added left side of tabbar depending on the web history traversed by the user in WebViewWindow. - Set the tooltip text of the tabbar depending on the title change event of WebViewWindow class. Modified the Qt project file to support the both the version of python 2 and python 3. Qt5 is recommended to test pgAdmin4 in dektop mode.
127 lines
3.1 KiB
C++
127 lines
3.1 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// pgAdmin 4 - PostgreSQL Tools
|
|
//
|
|
// Copyright (C) 2013 - 2016, The pgAdmin Development Team
|
|
// This software is released under the PostgreSQL Licence
|
|
//
|
|
// Server.cpp - Thread in which the web server will run.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "pgAdmin4.h"
|
|
|
|
// Must be before QT
|
|
#include <Python.h>
|
|
|
|
// QT headers
|
|
#include <QDebug>
|
|
#include <QDir>
|
|
#include <QMessageBox>
|
|
|
|
// App headers
|
|
#include "Server.h"
|
|
|
|
Server::Server(quint16 port)
|
|
{
|
|
// Appserver port
|
|
m_port = port;
|
|
m_wcAppName = NULL;
|
|
|
|
// Initialise Python
|
|
Py_NoSiteFlag=1;
|
|
|
|
// Python3 requires conversion of char * to wchar_t *, so...
|
|
#ifdef PYTHON2
|
|
Py_SetProgramName(PGA_APP_NAME.toUtf8().data());
|
|
#else
|
|
char *appName = PGA_APP_NAME.toUtf8().data();
|
|
const size_t cSize = strlen(appName)+1;
|
|
m_wcAppName = new wchar_t[cSize];
|
|
mbstowcs (m_wcAppName, appName, cSize);
|
|
Py_SetProgramName(m_wcAppName);
|
|
#endif
|
|
|
|
Py_Initialize();
|
|
|
|
// Setup the search path
|
|
QSettings settings;
|
|
QString python_path = settings.value("PythonPath").toString();
|
|
|
|
if (python_path.length() > 0)
|
|
{
|
|
// Split the path setting into individual entries
|
|
QStringList path_list = python_path.split(";", QString::SkipEmptyParts);
|
|
|
|
// Get the current path
|
|
PyObject* sysPath = PySys_GetObject((char*)"path");
|
|
|
|
// Add new additional path elements
|
|
for (int i = path_list.size() - 1; i >= 0 ; --i)
|
|
{
|
|
#ifdef PYTHON2
|
|
PyList_Append(sysPath, PyString_FromString(path_list.at(i).toUtf8().data()));
|
|
#else
|
|
PyList_Append(sysPath, PyBytes_FromString(path_list.at(i).toUtf8().data()));
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
Server::~Server()
|
|
{
|
|
if (m_wcAppName)
|
|
delete m_wcAppName;
|
|
|
|
// Shutdown Python
|
|
Py_Finalize();
|
|
}
|
|
|
|
bool Server::Init()
|
|
{
|
|
// Find the webapp
|
|
QStringList paths;
|
|
paths.append("../web/"); // Windows/Linux source tree
|
|
paths.append("../../../../web/"); // Mac source tree (in the app bundle)
|
|
paths.append(""); // Should be last!
|
|
|
|
for (int i = 0; i < paths.size(); ++i)
|
|
{
|
|
QDir dir(QCoreApplication::applicationDirPath() + "/" + paths[i]);
|
|
m_appfile = dir.canonicalPath() + "/pgAdmin4.py";
|
|
|
|
if (QFile::exists(m_appfile))
|
|
{
|
|
qDebug() << "Webapp path: " << m_appfile;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!QFile::exists(m_appfile))
|
|
{
|
|
setError(tr("Failed to locate pgAdmin4.py, terminating server thread."));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void Server::run()
|
|
{
|
|
// Open the application code and run it.
|
|
FILE *cp = fopen(m_appfile.toUtf8().data(), "r");
|
|
if (!cp)
|
|
{
|
|
setError(QString(tr("Failed to open the application file: %1, server thread exiting.")).arg(m_appfile));
|
|
return;
|
|
}
|
|
|
|
// Set the port number
|
|
PyRun_SimpleString(QString("PGADMIN_PORT = %1").arg(m_port).toLatin1());
|
|
|
|
if (PyRun_SimpleFile(cp, m_appfile.toUtf8().data()) != 0)
|
|
setError(tr("Failed to launch the application server, server thread exiting."));
|
|
|
|
fclose(cp);
|
|
}
|