diff --git a/assets.qrc b/assets.qrc index 2206a8a..4ef5956 100644 --- a/assets.qrc +++ b/assets.qrc @@ -4,7 +4,5 @@ assets/notificationAreaIcon.png assets/style.qss assets/logo.ico - assets/mute.svg - assets/unmute.svg diff --git a/bueno.bat b/bueno.bat index 540be60..37b5dec 100644 --- a/bueno.bat +++ b/bueno.bat @@ -1,7 +1,7 @@ taskkill /F /IM "MixerQ.exe" taskkill /F /IM "MixerQd.exe" qmake -o build\Makefile .\qtest.pro -REM mingw32-make.exe -C .\build -f Makefile.Release +mingw32-make.exe -C .\build -f Makefile.Release mingw32-make.exe -C .\build -f Makefile.Debug -REM makensis /DBUILDTYPE=release install\installer.nsi -REM makensis /DBUILDTYPE=debug install\installer.nsi +makensis /DBUILDTYPE=release install\installer.nsi +makensis /DBUILDTYPE=debug install\installer.nsi diff --git a/qtest.pro b/qtest.pro index 42a1165..0568bca 100644 --- a/qtest.pro +++ b/qtest.pro @@ -18,7 +18,7 @@ LIBS += -lWinmm -lodbc32 -lodbccp32 -luuid -loleaut32 -lole32 -lshell32 -ladvapi DEFINES += QT_LOGGING_TO_CONSOLE=1 WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0602 DEFINES_DEBUG += DEBUG -QT += widgets network svg +QT += widgets network INCLUDEPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\back\reimpl" "$$PWD\src\cont" VPATH += "$$PWD\src" "$$PWD\src\qt" "$$PWD\src\back" "$$PWD\src\back\reimpl" "$$PWD\src\cont" diff --git a/src/back/backlasses.cpp b/src/back/backlasses.cpp index 74af6a0..cead61f 100644 --- a/src/back/backlasses.cpp +++ b/src/back/backlasses.cpp @@ -234,7 +234,6 @@ HRESULT EndpointSituationCallback::OnDeviceRemoved(LPCWSTR pwstrDeviceId) { HRESULT EndpointSituationCallback::OnDeviceStateChanged(LPCWSTR pwstrDeviceId, DWORD dwNewState) { std::wstring endpointId = std::wstring(pwstrDeviceId); - log_wdebugcpp(L"Endpoint state change for " + endpointId); EndpointState newState; switch (dwNewState) { case DEVICE_STATE_ACTIVE: @@ -250,7 +249,7 @@ HRESULT EndpointSituationCallback::OnDeviceStateChanged(LPCWSTR pwstrDeviceId, D newState = EndpointState::ENDPOINT_UNPLUGGED; break; } - isEpStateChanging.exchange(true); + isEpStateChanging = true; std::thread newEndpointThread(&OverseerHandler::reviseEndpointShowing, osh, endpointId, newState); newEndpointThread.detach(); @@ -259,7 +258,7 @@ HRESULT EndpointSituationCallback::OnDeviceStateChanged(LPCWSTR pwstrDeviceId, D } HRESULT EndpointSituationCallback::OnPropertyValueChanged(LPCWSTR pwstrDeviceId, const PROPERTYKEY key) { - isEpStateChanging.exchange(true); + isEpStateChanging = true; std::thread propertyThread(&Overseer::updateEndpointInfo, os, std::wstring(pwstrDeviceId)); propertyThread.detach(); while(isEpStateChanging); @@ -267,8 +266,7 @@ HRESULT EndpointSituationCallback::OnPropertyValueChanged(LPCWSTR pwstrDeviceId, } void EndpointSituationCallback::reportFinishedStateChange() { - this->isEpStateChanging.exchange(false); - return; + this->isEpStateChanging = false; } Endpoint::Endpoint(IMMDevice* ep, IPolicyConfig7* policyConfig, uint64_t idx) { @@ -327,29 +325,23 @@ void Endpoint::activateEndpointSessions() { return; } - if (!sessionManager) { - if (FAILED(endpoint->Activate(__uuidof(IAudioSessionManager2), - CLSCTX_ALL, NULL, (void**) &sessionManager))) { - log_debugcpp("Couldn't open session manager2, huh"); - return; - } + if (FAILED(endpoint->Activate(__uuidof(IAudioSessionManager2), + CLSCTX_ALL, NULL, (void**) &sessionManager))) { + log_debugcpp("Couldn't open session manager2, huh"); + return; } - IAudioSessionEnumerator* sessionEnumerator = nullptr; - if (FAILED(sessionManager->GetSessionEnumerator(&sessionEnumerator))) { log_wdebugcpp(L"sesEnumeratorBros..."); exit(-5); return; } + if (FAILED(sessionManager->GetSessionEnumerator(&sessionEnumerator))) { log_wdebugcpp(L"sesEnumeratorBros..."); return; } endpointSessions.resize(1, nullptr); int sessionCount; sessionEnumerator->GetCount(&sessionCount); for (int i = 0; i < sessionCount; i++) { IAudioSessionControl* sessionControlTmp; - if (FAILED(sessionEnumerator->GetSession(i, (IAudioSessionControl**)&sessionControlTmp))) { - exit(-6); - } + sessionEnumerator->GetSession(i, (IAudioSessionControl**)&sessionControlTmp); IAudioSessionControl2* sessionControl; - if(FAILED(sessionControlTmp->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&sessionControl))){ - exit(-7); - } + sessionControlTmp->QueryInterface(__uuidof(IAudioSessionControl2), (void**)&sessionControl); + sessionControl->AddRef(); sessionControlTmp->Release(); Session* session = new Session(this, sessionControl, (size_t)i); if (sessionControl->IsSystemSoundsSession() == S_OK) endpointSessions[0] = session; @@ -358,13 +350,6 @@ void Endpoint::activateEndpointSessions() { sessionEnumerator->Release(); } -/* - * void Endpoint::deleteSessionManager() { - * sessionManager->Release(); - * sessionManager = nullptr; - * } - */ - void Endpoint::addSession(Session* session) { session->setIndex(this->getSessionCount()); endpointSessions.push_back(session); @@ -372,15 +357,9 @@ void Endpoint::addSession(Session* session) { void Endpoint::activateEndpointVolume() { //If this EP is created after init, COM won't be initialized on the executing thread. - HRESULT result = CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE); + HRESULT result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (this->endpointVolume == nullptr) { - if(FAILED(endpoint->Activate( - IID_IAudioEndpointVolume, - CLSCTX_ALL, - NULL, - (void**)&this->endpointVolume))) { - log_debugcpp("No volume, huh"); - } + endpoint->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&this->endpointVolume); //todo: check header if(FAILED(endpoint->Activate(__uuidof(IAudioMeterInformation), @@ -615,8 +594,8 @@ void Overseer::createEndpoints(Flows flow) { /* * Counting them */ - if(FAILED(deviceCollection->GetCount(&numEndpoints))) { log_debugcpp("si");}; - if(numEndpoints == 0) { log_debugcpp("si"); }; + if(FAILED(deviceCollection->GetCount(&numEndpoints))) { log_debugcpp("si");}; + if(numEndpoints == 0) { log_debugcpp("si"); }; /* * Retrieving actual endpoints and storing them on their own collection diff --git a/src/back/backlasses.h b/src/back/backlasses.h index 5acedba..9f79924 100644 --- a/src/back/backlasses.h +++ b/src/back/backlasses.h @@ -82,7 +82,6 @@ class Endpoint { void unregisterNewSessionNotification(EndpointNewSessionCallback* ensc); void deleteSessions(); void activateEndpointSessions(); - //void deleteSessionManager(); std::mutex endpointSessionsMutex; ~Endpoint(); @@ -92,13 +91,12 @@ class Endpoint { std::vector endpointSessions; uint32_t channelCount = 0; IMMDevice *endpoint; - IAudioEndpointVolume *endpointVolume = nullptr; - IPropertyStore *properties; - IAudioMeterInformation *endpointPeakMeter = nullptr; - //IAudioClient *audioClient; + IAudioClient *audioClient; int64_t defTime, minTime; IAudioSessionManager2 *sessionManager = nullptr; Flows flow; + IAudioEndpointVolume *endpointVolume = nullptr; + IPropertyStore *properties; std::wstring friendlyName; std::wstring descriptionName; std::wstring deviceName; @@ -107,6 +105,7 @@ class Endpoint { Roles endpointRoles = (Roles)0; uint64_t idx; //Not implemented in llvm-mingw. Sad! todo: mingw patch + IAudioMeterInformation *endpointPeakMeter = nullptr; IPolicyConfig7* policyConfig; }; @@ -126,7 +125,7 @@ class EndpointVolumeCallback : public IAudioEndpointVolumeCallback { private: ULONG ref = 1; Endpoint* ep; - std::atomic wait = false; + bool wait = false; }; class EndpointSituationCallback : public IMMNotificationClient { @@ -144,7 +143,7 @@ class EndpointSituationCallback : public IMMNotificationClient { private: ULONG ref = 1; Overseer* os; - std::atomic isEpStateChanging = false; + bool isEpStateChanging = false; }; class Overseer { @@ -205,7 +204,7 @@ class EndpointNewSessionCallback : public IAudioSessionNotification { void createSessionThread(SessionThreadParams params); private: - std::atomic wait = false; + bool wait = false; ULONG ref = 1; EndpointHandler *eph; diff --git a/src/back/backsessionclasses.cpp b/src/back/backsessionclasses.cpp index c9aaa85..5816ac5 100644 --- a/src/back/backsessionclasses.cpp +++ b/src/back/backsessionclasses.cpp @@ -39,7 +39,6 @@ HRESULT SessionStateCallback::QueryInterface(REFIID riid, VOID **ppvInterface) { HRESULT SessionStateCallback::OnDisplayNameChanged(LPCWSTR NewDisplayName, LPCGUID EventContext) { //TODO: Preguntar while(sh->getVolumeInfo()->isNameChanged == true); - sh->setName(std::wstring(NewDisplayName)); sh->getVolumeInfo()->isNameChanged = true; return S_OK; @@ -239,15 +238,13 @@ bool Session::fetchNameViaFD(std::wstring exePath, DWORD pid, std::wstring *sess void* fileVersionInfo = malloc(fileVersionInfoSize); if(!GetFileVersionInfoExW(FILE_VER_GET_LOCALISED | FILE_VER_GET_NEUTRAL, - exePath.c_str(),0,fileVersionInfoSize, fileVersionInfo)) { + exePath.c_str(),0,fileVersionInfoSize, fileVersionInfo)) return false; - } UINT translationArrayLen = 0; - if (!VerQueryValueW(fileVersionInfo, L"\\VarFileInfo\\Translation", (LPVOID*)&translationArray, &translationArrayLen)) { - free(fileVersionInfo); + if (!VerQueryValueW(fileVersionInfo, L"\\VarFileInfo\\Translation", (LPVOID*)&translationArray, &translationArrayLen)) return false; - } + //File descriptor parsing //TODO: https://learn.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getuserpreferreduilanguages /* It is possible to retrieve user languages and try to use one of those before falling back to whatever @@ -260,6 +257,7 @@ bool Session::fetchNameViaFD(std::wstring exePath, DWORD pid, std::wstring *sess int8_t syslangIdx = -1; wchar_t metadataStringKey[256]; wchar_t* metadataString = NULL; + //std::wstring name; for (UINT i = 0; i < availableLangs; i++) { LANGID defaultUILanguage = GetUserDefaultUILanguage(); if (defaultUILanguage != translationArray[i].wLanguage) @@ -342,6 +340,8 @@ bool Session::fetchNameViaMSIX(std::wstring exePath, DWORD pid, std::wstring *se if (sessionName->length() > 0) return true; else return false; + + } @@ -419,7 +419,4 @@ Session::~Session() { meterInformation->Release(); sessionControl->Release(); sessionVolume->Release(); - meterInformation = nullptr; - sessionControl = nullptr; - sessionVolume = nullptr; } diff --git a/src/cont/contclasses.cpp b/src/cont/contclasses.cpp index d2188f0..27ae4a6 100644 --- a/src/cont/contclasses.cpp +++ b/src/cont/contclasses.cpp @@ -28,6 +28,7 @@ EndpointHandler::EndpointHandler(uint64_t idx, Flows flow) { this->flow = flow; this->ep = (flow == Flows::FLOW_PLAYBACK ? osh->getPlaybackEndpoints().at(idx) : osh->getCaptureEndpoints().at(idx)); + epc = new EndpointVolumeCallback(ep); this->callbackInfo.caller = osh->getGuid(); //epName = ep->getName(); this->setBackEndpointVolumeCallbackInfoContent(this->getState()); @@ -114,10 +115,7 @@ void EndpointHandler::setBackEndpointVolumeCallbackInfoContent(uint8_t state) { callbackInfo.muted = this->getMute(); callbackInfo.mainVolume = this->getVolume(AudioChannel::CHANNEL_MAIN); callbackInfo.channels = this->getChannelCount(); - if (!epc) { - epc = new EndpointVolumeCallback(ep); - ep->setVolumeCallback(epc); - } + ep->setVolumeCallback(epc); callbackInfo.channelVolumes.resize(this->callbackInfo.channels); for(uint32_t i = 0; i < this->getChannelCount(); i++){ callbackInfo.channelVolumes.at(i) = this->getVolume(i); @@ -183,13 +181,13 @@ Endpoint* EndpointHandler::getEndpoint() { void EndpointHandler::addSessionSendFront(Session* session) { if(!ep->endpointSessionsMutex.try_lock()) return; - sessionHandlersMutex.lock(); this->ep->addSession(session); SessionHandler* sessionHandler = new SessionHandler(this, session, (getSessionCount() - 1)); - - sessionHandlers.push_back(sessionHandler); ep->endpointSessionsMutex.unlock(); + + sessionHandlersMutex.lock(); + sessionHandlers.push_back(sessionHandler); sessionHandlersMutex.unlock(); this->addSessionWidget(sessionHandler); } @@ -205,13 +203,11 @@ void EndpointHandler::removeSessionFromFront(SessionHandler* sh) { void EndpointHandler::deleteSessions() { ep->unregisterNewSessionNotification(ensc); ensc->Release(); - ensc = nullptr; for (auto sh : sessionHandlers) { delete sh; } sessionHandlers.resize(0); ep->deleteSessions(); - //ep->deleteSessionManager(); } void EndpointHandler::createSessionHandlers() { @@ -222,9 +218,6 @@ void EndpointHandler::createSessionHandlers() { sessionHandlers.push_back(sessionHandler); } } -} - -void EndpointHandler::createSessionHandlersCallback() { ensc = new EndpointNewSessionCallback(this); ep->registerNewSessionNotification(ensc); } @@ -239,12 +232,6 @@ void EndpointHandler::unlockSessionCollections() { this->ep->endpointSessionsMutex.unlock(); } -void EndpointHandler::removeVolumeCallback() { - ep->removeVolumeCallback(epc); - epc->Release(); - epc = nullptr; -} - EndpointHandler::~EndpointHandler() { ep->removeVolumeCallback(epc); ep->unregisterNewSessionNotification(ensc); @@ -424,13 +411,10 @@ void OverseerHandler::reviseEndpointShowing(std::wstring endpointId, EndpointSta if (flow == Flows::FLOW_CAPTURE) goto end; if (eph && EndpointState::ENDPOINT_ACTIVE & state) { - eph->setState(EndpointState::ENDPOINT_ACTIVE); this->addEndpointWidget(eph); } else if (eph && eph->getFrontVisibilityState() == EndpointState::ENDPOINT_ACTIVE) { - eph->removeVolumeCallback(); this->removeEndpointWidget(eph->getFrontVisibilityIndex()); } - end: handlersPlaybackMutex.unlock(); handlersCaptureMutex.unlock(); diff --git a/src/cont/contclasses.h b/src/cont/contclasses.h index cd0e03e..2034986 100644 --- a/src/cont/contclasses.h +++ b/src/cont/contclasses.h @@ -76,11 +76,9 @@ public: void removeSessionFromFront(SessionHandler* sh); void deleteSessions(); void createSessionHandlers(); - void createSessionHandlersCallback(); std::mutex sessionHandlersMutex; void lockSessionCollections(); void unlockSessionCollections(); - void removeVolumeCallback(); ~EndpointHandler(); private: diff --git a/src/cont/contsessionclasses.h b/src/cont/contsessionclasses.h index 24c0ba7..455bbe1 100644 --- a/src/cont/contsessionclasses.h +++ b/src/cont/contsessionclasses.h @@ -9,10 +9,10 @@ class SessionStateCallback; struct SessionVolumeInfo { //SessionVolumeInfo(bool muted, float mainVolume); - bool muted; - float mainVolume; - NGuid caller; - std::atomic isNameChanged = false; + bool muted; + float mainVolume; + NGuid caller; + bool isNameChanged = false; //size_t channels; //std::vector channelVolumes; }; diff --git a/src/qt/qtclasses.cpp b/src/qt/qtclasses.cpp index a9148b9..2e2a4b0 100644 --- a/src/qt/qtclasses.cpp +++ b/src/qt/qtclasses.cpp @@ -207,36 +207,6 @@ void ExtendedCheckBox::customEvent(QEvent* ev) { QCheckBox::customEvent(ev); } -void ExtendedCheckBox::paintEvent(QPaintEvent *event) { - QStylePainter p(this); - QStyleOptionButton opt; - initStyleOption(&opt); - opt.icon = this->icons; - p.drawControl((QStyle::ControlElement)CustomControlElement::CE_ExtendedCheckBox, opt); - //QStyle* style = QApplication::style(); - //style->drawComplexControl((QStyle::ComplexControl)CC_MeterSlider, &sliderComplex2, &painter, this); -} - -void ExtendedCheckBox::addIcon(char* const path, QIcon::State state) { - QString str(path); - QSvgRenderer rr(str); - QPixmap pixmap(64, 64); - pixmap.fill(Qt::transparent); - QPainter painter(&pixmap); - rr.render(&painter); - painter.setCompositionMode(QPainter::CompositionMode_SourceIn); - uint8_t a, r, g, b; - if (StylingHelper::argbToDiscreteValues(osh->getAccentColor(), &r, &g, &b, &a)) { - QColor color(r, g, b, a); - painter.fillRect(pixmap.rect(), color); - } - painter.end(); - icons.addPixmap(pixmap, QIcon::Normal, state); - //this->setIcon(icons); - //icons.addFile(":/Icons/images/second.svg",QSize(32,32),QIcon::Normal,QIcon::Off); -} - - QRect MainWindow::setSizePosition(QScreen* screen, int width, int height) { //setGeometry ignores decoration size, theres others for that QRect trayIconPos = this->trayIcon->geometry(); @@ -306,7 +276,7 @@ void MainWindow::compose(bool isVisible) { * Setting correct widget widths and heights */ log_to_file("[Compose]\n"); - screen = StylingHelper::getCurrentScreen(); + screen = this->getCurrentScreen(); log_debugcpp("Screen: " + screen->model().toStdString() + " " + screen->name().toStdString()); QRect screenRes = screen->geometry(); @@ -366,7 +336,7 @@ void MainWindow::compose(bool isVisible) { } QScreen* MainWindow::getCurrentScreen() { - //note: Using cursor pos as screen detector. Flawed. + //todo: Using cursor pos as screen detector. Flawed. QPoint cursorPos = QCursor::pos(); log_debugcpp("Cursor pos: " + std::to_string(cursorPos.ry()) + " " + std::to_string(cursorPos.rx())); @@ -393,9 +363,7 @@ SessionWidget::SessionWidget(uint64_t idx, SessionHandler* sh, QWidget *parent) widgetLayout->getContentsMargins(&left, &top, &right, &bottom); widgetLayout->setContentsMargins(0, top, 0, bottom); - muteButton = new ExtendedCheckBox(this); - muteButton->addIcon(":/assets/mute.svg", QIcon::On); - muteButton->addIcon(":/assets/unmute.svg", QIcon::Off); + muteButton = new QCheckBox(this); mainLabel = new QLabel(QString::fromStdWString(sh->getName()), this); mainLabel->setToolTip(QString::fromStdWString(sh->getName())); mainSlider = new MeterSlider(Qt::Horizontal, this); @@ -443,8 +411,7 @@ SessionWidget::SessionWidget(uint64_t idx, SessionHandler* sh, QWidget *parent) if (sh->getVolumeInfo()->isNameChanged) { mainLabel->setText(QString::fromStdWString(sh->getName())); mainLabel->setToolTip(QString::fromStdWString(sh->getName())); - sh->getVolumeInfo()->isNameChanged = false; - } + } const float roundingFactor = 0.005; mainSlider->blockSignals(true); muteButton->blockSignals(true); @@ -571,7 +538,7 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i eph->createSessionHandlers(); //todo: sussy - this->eph->setFrontVisibilityInfo(EndpointState::ENDPOINT_ACTIVE, idx); + this->eph->setState(EndpointState::ENDPOINT_ACTIVE, idx); this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); widgetLayout = new QGridLayout(this); //this->setContentsMargins(0, 0, 0, 0); @@ -731,9 +698,9 @@ EndpointWidget::EndpointWidget(EndpointHandler* eph, QWidget *parent, uint64_t i }); log_debugcpp("ENDPOINT_WIDGETED"); - eph->createSessionHandlersCallback(); } + void EndpointWidget::addSessionWidget(CustomWidgetEvent* ev){ this->setUpdatesEnabled(false); uint64_t index = this->sessionWidgets.size(); @@ -812,7 +779,7 @@ void MainWindow::customEvent(QEvent* ev) { } //__attribute__((optimize("O0", "unroll-loops"))) -void MainWindow::removeEndpointWidget(CustomWidgetEvent* ev) { +void MainWindow::removeEndpointWidget(CustomWidgetEvent* ev){ uint64_t i = ev->payload; this->ews.at(i)->setParent(nullptr); this->widgetLayout->removeWidget(ews.at(i)); @@ -825,7 +792,7 @@ void MainWindow::removeEndpointWidget(CustomWidgetEvent* ev) { return; } -void MainWindow::addEndpointWidget(CustomWidgetEvent* ev) { +void MainWindow::addEndpointWidget(CustomWidgetEvent* ev){ EndpointWidget* epw = new EndpointWidget(ev->payload, containerWidget, this->ews.size()); //epw->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); epw->setParent(this); @@ -957,9 +924,9 @@ EndpointHandler* EndpointWidget::getEndpointHandler(){ * } */ -void EndpointWidget::setIndex(uint64_t idx) { +void EndpointWidget::setIndex(uint64_t idx){ this->idx = idx; - this->eph->setFrontVisibilityInfo(EndpointState::ENDPOINT_ACTIVE, this->idx); + this->eph->setState(EndpointState::ENDPOINT_ACTIVE, this->idx); } uint64_t EndpointWidget::getIndex(){ diff --git a/src/qt/qtclasses.h b/src/qt/qtclasses.h index 1b2658b..0d5733f 100644 --- a/src/qt/qtclasses.h +++ b/src/qt/qtclasses.h @@ -40,17 +40,12 @@ public: class ExtendedCheckBox : public QCheckBox { Q_OBJECT -private: - QIcon icons; - protected: void customEvent(QEvent* ev) override; - void paintEvent(QPaintEvent* event) override; public: //c++11: this inherits all parent's constructors unconditionally using QCheckBox::QCheckBox; - void addIcon(char* const path, QIcon::State state); //alternative being calling parent ctor directly after declaring child ctor: //B(int x) : A(x) { } }; @@ -73,7 +68,7 @@ private: MeterSlider *mainSlider = nullptr; uint64_t idx; QHBoxLayout *widgetLayout = nullptr; - ExtendedCheckBox *muteButton = nullptr; + QCheckBox *muteButton = nullptr; SessionHandler* sh; QTimer* volumePoller = nullptr; QSpacerItem* widthSpacer; diff --git a/src/qt/qtcommon.h b/src/qt/qtcommon.h index 61873eb..b059504 100644 --- a/src/qt/qtcommon.h +++ b/src/qt/qtcommon.h @@ -44,7 +44,6 @@ #include #include #include -#include //#include //#include /* @@ -64,10 +63,6 @@ enum CustomComplexControl { CC_MeterSlider = 0xf0000001 }; -enum CustomControlElement { - CE_ExtendedCheckBox = 0xf0000001 -}; - namespace StylingHelper { static inline void setBackgroundColor(bool lightMode) { @@ -223,32 +218,5 @@ namespace StylingHelper { return pal.color(QPalette::Base); } - static inline QPixmap svg2Pixmap(const QString& svgContent, - const QSize& size, - QPainter::CompositionMode mode = QPainter::CompositionMode_SourceOver) - { - QSvgRenderer rr(svgContent); - QImage image(size.width(), size.height(), QImage::Format_ARGB32); - QPainter painter(&image); - painter.setCompositionMode(mode); - image.fill(Qt::transparent); - rr.render(&painter); - return QPixmap::fromImage(image); - } - - static inline QScreen* getCurrentScreen() { - //note: Using cursor pos as screen detector. Flawed. - QPoint cursorPos = QCursor::pos(); - - for (QScreen *screen : QGuiApplication::screens()) { - QRect screenRect = screen->geometry(); - if (screenRect.contains(cursorPos)) { - return screen; - } - } - - return QGuiApplication::primaryScreen(); - } - } diff --git a/src/qt/qtvisuals.h b/src/qt/qtvisuals.h index 8902ed1..0db58e8 100644 --- a/src/qt/qtvisuals.h +++ b/src/qt/qtvisuals.h @@ -20,10 +20,8 @@ public: return baseStyle()->styleHint(hint, option, widget, returnData); } - QRect subControlRect(ComplexControl control, - const QStyleOptionComplex *option, - SubControl subControl, - const QWidget *widget) const { + QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option, + SubControl subControl, const QWidget *widget) const { QRect rect = QCommonStyle::subControlRect(CC_Slider, option, subControl, widget); switch (control) { @@ -188,51 +186,6 @@ public: } - void drawControl(ControlElement element, const QStyleOption *opt, - QPainter *p, const QWidget *widget) const - { - switch(element) { - case CE_ExtendedCheckBox: - if (const QStyleOptionButton *btn = qstyleoption_cast(opt)) { - QStyleOptionButton subopt = *btn; - subopt.rect = subElementRect(SE_CheckBoxIndicator, btn, widget); - //proxy()->drawPrimitive(PE_IndicatorCheckBox, &subopt, p, widget); - subopt.rect = subElementRect(SE_CheckBoxContents, btn, widget); - - //proxy()->drawControl(CE_CheckBoxLabel, &subopt, p, widget); - int alignment = visualAlignment(btn->direction, Qt::AlignLeft | Qt::AlignVCenter); - - if (!proxy()->styleHint(SH_UnderlineShortcut, btn, widget)) - alignment |= Qt::TextHideMnemonic; - QPixmap pix; - QRect textRect = btn->rect; - if (!btn->icon.isNull()) { - pix = btn->icon.pixmap(btn->iconSize, StylingHelper::getCurrentScreen()->devicePixelRatio(), - QIcon::Mode::Normal, btn->state & State_On ? QIcon::On : QIcon::Off); - proxy()->drawItemPixmap(p, btn->rect, alignment, pix); - if (btn->direction == Qt::RightToLeft) - textRect.setRight(textRect.right() - btn->iconSize.width() - 4); - else - textRect.setLeft(textRect.left() + btn->iconSize.width() + 4); - } - if (!btn->text.isEmpty()){ - proxy()->drawItemText(p, textRect, alignment | Qt::TextShowMnemonic, - btn->palette, btn->state & State_Enabled, btn->text, QPalette::WindowText); - } - // - if (btn->state & State_HasFocus) { - QStyleOptionFocusRect fropt; - fropt.QStyleOption::operator=(*btn); - fropt.rect = subElementRect(SE_CheckBoxFocusRect, btn, widget); - proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p, widget); - } - } - default: - baseStyle()->drawControl(element, opt, p, widget); - break; - } - } - void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { QColor outline;