Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ai_diffusion/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from abc import ABC, abstractmethod
from enum import Enum
from typing import Any, AsyncGenerator, Iterable, NamedTuple
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt6.QtCore import QObject, pyqtSignal

from .api import WorkflowInput
from .image import ImageCollection
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/connection.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations
from enum import Enum
from PyQt5.QtCore import QObject, pyqtSignal, QUrl
from PyQt5.QtGui import QDesktopServices
from PyQt6.QtCore import QObject, pyqtSignal, QUrl
from PyQt6.QtGui import QDesktopServices
import asyncio

from .client import Client, ClientMessage, ClientEvent, DeviceInfo, SharedWorkflow, MissingResources
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/control.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from __future__ import annotations
from PyQt5.QtCore import QObject, pyqtSignal, QUuid, Qt
from PyQt6.QtCore import QObject, pyqtSignal, QUuid, Qt
from typing import Any, NamedTuple
from pathlib import Path
import json
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/custom_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from dataclasses import dataclass
from typing import Any, Awaitable, Callable, NamedTuple, Literal, TYPE_CHECKING
from pathlib import Path
from PyQt5.QtCore import Qt, QObject, QUuid, QAbstractListModel, QSortFilterProxyModel, QModelIndex
from PyQt5.QtCore import QMetaObject, QTimer, pyqtSignal
from PyQt6.QtCore import Qt, QObject, QUuid, QAbstractListModel, QSortFilterProxyModel, QModelIndex
from PyQt6.QtCore import QMetaObject, QTimer, pyqtSignal

from .api import WorkflowInput
from .client import TextOutput, ClientOutput
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from weakref import WeakValueDictionary
import krita
from krita import Krita
from PyQt5.QtCore import QObject, QUuid, QByteArray, QTimer, pyqtSignal
from PyQt6.QtCore import QObject, QUuid, QByteArray, QTimer, pyqtSignal

from .image import Extent, Bounds, Mask, Image
from .layer import Layer, LayerManager, LayerType
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/eventloop.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import asyncio
import threading
from typing import Callable
from PyQt5.QtCore import QTimer
from PyQt6.QtCore import QTimer

_loop = asyncio.new_event_loop()
_timer = QTimer()
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/extension.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sys
from pathlib import Path
from typing import Callable
from PyQt5.QtWidgets import QAction
from PyQt6.QtGui import QAction
from krita import Extension, Krita, DockWidgetFactory, DockWidgetFactoryBase, Window # type: ignore

from . import eventloop, __version__
Expand Down Expand Up @@ -79,5 +79,5 @@ def createActions(self, window):

Krita.instance().addExtension(AIToolsExtension(Krita.instance()))
Krita.instance().addDockWidgetFactory(
DockWidgetFactory("imageDiffusion", DockWidgetFactoryBase.DockRight, ImageDiffusionWidget) # type: ignore
DockWidgetFactory("imageDiffusion", DockWidgetFactoryBase.DockPosition.DockRight, ImageDiffusionWidget) # type: ignore
)
4 changes: 2 additions & 2 deletions ai_diffusion/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from dataclasses import dataclass, asdict
from pathlib import Path
from typing import Any, NamedTuple, Sequence, cast
from PyQt5.QtCore import QAbstractListModel, QSortFilterProxyModel, QModelIndex, Qt
from PyQt5.QtGui import QIcon
from PyQt6.QtCore import QAbstractListModel, QSortFilterProxyModel, QModelIndex, Qt
from PyQt6.QtGui import QIcon

from .util import encode_json, read_json_with_comments, user_data_dir, client_logger as log

Expand Down
10 changes: 5 additions & 5 deletions ai_diffusion/image.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from __future__ import annotations
from enum import Enum
from math import sqrt
from PyQt5.QtGui import QImage, QImageWriter, QImageReader, QPixmap, QIcon, QPainter, QColorSpace
from PyQt5.QtGui import qRgba, qRed, qGreen, qBlue, qAlpha, qGray
from PyQt5.QtCore import Qt, QByteArray, QBuffer, QRect, QSize, QFile, QIODevice
from PyQt6.QtGui import QImage, QImageWriter, QImageReader, QPixmap, QIcon, QPainter, QColorSpace
from PyQt6.QtGui import qRgba, qRed, qGreen, qBlue, qAlpha, qGray
from PyQt6.QtCore import Qt, QByteArray, QBuffer, QRect, QSize, QFile, QIODevice
from typing import Callable, Iterable, SupportsIndex, Tuple, NamedTuple, Union, Optional
from itertools import product
from pathlib import Path
Expand Down Expand Up @@ -484,11 +484,11 @@ def data(self):
return buffer
else:
ptr = ensure(self._qimage.constBits(), "Accessing data of invalid image")
return QByteArray(ptr.asstring(self._qimage.byteCount()))
return QByteArray(ptr.asstring(self._qimage.sizeInBytes()))

@property
def size(self): # in bytes
return self._qimage.byteCount()
return self._qimage.sizeInBytes()

def to_array(self):
import numpy as np
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from datetime import datetime
from enum import Enum, Flag
from typing import Any, NamedTuple, TYPE_CHECKING
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt6.QtCore import QObject, pyqtSignal

from .image import Bounds, ImageCollection
from .settings import settings
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
from contextlib import contextmanager, nullcontext
from enum import Enum
import krita
from PyQt5.QtCore import QObject, QUuid, QByteArray, QTimer, pyqtSignal
from PyQt5.QtGui import QImage
from PyQt6.QtCore import QObject, QUuid, QByteArray, QTimer, pyqtSignal
from PyQt6.QtGui import QImage

from .image import Extent, Bounds, Image, ImageCollection
from .util import acquire_elements, ensure, maybe, client_logger as log
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from tempfile import TemporaryDirectory
import time
from typing import Any, NamedTuple
from PyQt5.QtCore import QObject, QUuid, pyqtSignal, Qt
from PyQt5.QtGui import QPainter, QColor, QBrush
from PyQt6.QtCore import QObject, QUuid, pyqtSignal, Qt
from PyQt6.QtGui import QPainter, QColor, QBrush
import uuid

from . import eventloop, workflow, util
Expand Down
20 changes: 10 additions & 10 deletions ai_diffusion/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from datetime import datetime
from pathlib import Path
from typing import NamedTuple
from PyQt5.QtCore import QByteArray, QUrl, QFile, QBuffer
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply, QSslError
from PyQt6.QtCore import QByteArray, QUrl, QFile, QBuffer
from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply, QSslError

from .localization import translate as _
from .util import client_logger as log
Expand Down Expand Up @@ -35,7 +35,7 @@ def __str__(self):

@staticmethod
def from_reply(reply: QNetworkReply):
code: QNetworkReply.NetworkError = reply.error() # type: ignore (bug in PyQt5-stubs)
code: QNetworkReply.NetworkError = reply.error() # type: ignore (bug in PyQt6-stubs)
url = reply.url().toString()
status = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute)
if reply.isReadable():
Expand Down Expand Up @@ -96,7 +96,7 @@ def http(
self._cleanup()

request = QNetworkRequest(QUrl(url))
request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
request.setAttribute(QNetworkRequest.Attribute.RedirectPolicyAttribute, True)
request.setRawHeader(b"ngrok-skip-browser-warning", b"69420")
if bearer:
request.setRawHeader(b"Authorization", f"Bearer {bearer}".encode("utf-8"))
Expand Down Expand Up @@ -146,7 +146,7 @@ async def upload(self, url: str, data: QByteArray | bytes, sha256: str | None =
assert isinstance(data, QByteArray)

request = QNetworkRequest(QUrl(url))
request.setAttribute(QNetworkRequest.Attribute.FollowRedirectsAttribute, True)
request.setAttribute(QNetworkRequest.Attribute.RedirectPolicyAttribute, True)
if sha256:
request.setRawHeader(b"x-amz-checksum-sha256", sha256.encode("utf-8"))
request.setHeader(
Expand All @@ -173,7 +173,7 @@ async def upload(self, url: str, data: QByteArray | bytes, sha256: str | None =
def download(self, url: str):
self._cleanup()
request = QNetworkRequest(QUrl(url))
request.setAttribute(QNetworkRequest.Attribute.FollowRedirectsAttribute, True)
request.setAttribute(QNetworkRequest.Attribute.RedirectPolicyAttribute, True)
reply = self._net.get(request)
assert reply is not None, f"Network request for {url} failed: reply is None"

Expand Down Expand Up @@ -201,7 +201,7 @@ def _upload_progress(self, bytes_sent: int, bytes_total: int):
def _finished(self, reply: QNetworkReply):
future = None
try:
code = reply.error() # type: ignore (bug in PyQt5-stubs)
code = reply.error() # type: ignore (bug in PyQt6-stubs)
tracker = self._requests[reply]
future = tracker.future
if future.cancelled():
Expand Down Expand Up @@ -274,13 +274,13 @@ def final(self):

async def _try_download(network: QNetworkAccessManager, url: str, path: Path):
out_file = QFile(str(path) + ".part")
if not out_file.open(QFile.ReadWrite | QFile.Append): # type: ignore
if not out_file.open(QFile.OpenModeFlag.ReadWrite | QFile.OpenModeFlag.Append): # type: ignore
raise Exception(
_("Error during download: could not open {path} for writing", path=out_file.fileName())
)

request = QNetworkRequest(QUrl(_map_host(url)))
request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
request.setAttribute(QNetworkRequest.Attribute.RedirectPolicyAttribute, True)
if out_file.size() > 0:
log.info(f"Found {path}.part, resuming download from {out_file.size()} bytes")
request.setRawHeader(b"Range", f"bytes={out_file.size()}-".encode("utf-8"))
Expand All @@ -302,7 +302,7 @@ def handle_finished():
out_file.close()
if finished_future.cancelled():
return # operation was cancelled, discard result
if reply.error() == QNetworkReply.NetworkError.NoError: # type: ignore (bug in PyQt5-stubs)
if reply.error() == QNetworkReply.NetworkError.NoError: # type: ignore (bug in PyQt6-stubs)
finished_future.set_result(path)
elif reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) == 416:
# 416 = Range Not Satisfiable
Expand Down
6 changes: 3 additions & 3 deletions ai_diffusion/persistence.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
from enum import Enum
from typing import Any
from time import time
from PyQt5.QtCore import QObject, QByteArray
from PyQt5.QtGui import QImageReader
from PyQt5.QtWidgets import QMessageBox
from PyQt6.QtCore import QObject, QByteArray
from PyQt6.QtGui import QImageReader
from PyQt6.QtWidgets import QMessageBox

from .api import InpaintMode, FillMode
from .image import ImageCollection
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/pose.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from functools import reduce
import operator
from typing import Dict, List, NamedTuple, Optional
from PyQt5.QtCore import QPointF
from PyQt6.QtCore import QPointF

from .image import Extent
from .util import batched
Expand Down
4 changes: 2 additions & 2 deletions ai_diffusion/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
from enum import Enum
from typing import Any, NamedTuple, Sequence, TypeVar, Generic

from PyQt5.QtCore import QObject, QMetaObject, QUuid, pyqtBoundSignal
from PyQt5.QtWidgets import QComboBox
from PyQt6.QtCore import QObject, QMetaObject, QUuid, pyqtBoundSignal
from PyQt6.QtWidgets import QComboBox


T = TypeVar("T")
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/region.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations
from enum import Enum
from PyQt5.QtCore import QObject, QUuid, pyqtSignal
from PyQt6.QtCore import QObject, QUuid, pyqtSignal

from . import eventloop, model, workflow
from .api import ConditioningInput, RegionInput
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/root.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations
from dataclasses import dataclass
from typing import Callable
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt6.QtCore import QObject, pyqtSignal

from .connection import Connection, ConnectionState
from .client import ClientMessage
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import os
import time
from typing import Callable, NamedTuple, Optional, Union
from PyQt5.QtNetwork import QNetworkAccessManager
from PyQt6.QtNetwork import QNetworkAccessManager

from .settings import settings, ServerBackend
from . import eventloop, resources
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from enum import Enum
from pathlib import Path
from typing import NamedTuple, Optional, Any
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt6.QtCore import QObject, pyqtSignal

from .util import is_macos, is_windows, user_data_dir, client_logger as log
from .util import encode_json, read_json_with_comments
Expand Down
2 changes: 1 addition & 1 deletion ai_diffusion/style.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from typing import Iterable, NamedTuple
import json
from pathlib import Path
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt6.QtCore import QObject, pyqtSignal

from .api import CheckpointInput, LoraInput
from .settings import Setting, settings
Expand Down
8 changes: 4 additions & 4 deletions ai_diffusion/ui/animation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations
from PyQt5.QtCore import Qt, QMetaObject
from PyQt5.QtWidgets import (
from PyQt6.QtCore import Qt, QMetaObject
from PyQt6.QtWidgets import (
QWidget,
QVBoxLayout,
QHBoxLayout,
Expand Down Expand Up @@ -102,12 +102,12 @@ def __init__(self):
self.target_layer = QComboBox(self)
self.target_layer.setMinimumContentsLength(20)
self.target_layer.setSizeAdjustPolicy(
QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLength
QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
)
layout.addWidget(self.target_layer)

self.preview_area = QLabel(self)
self.preview_area.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.preview_area.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.preview_area.setAlignment(
Qt.AlignmentFlag(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
)
Expand Down
6 changes: 3 additions & 3 deletions ai_diffusion/ui/autocomplete.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import csv
from typing import cast

from PyQt5.QtWidgets import QApplication, QCompleter, QPlainTextEdit, QStyledItemDelegate, QStyle
from PyQt5.QtGui import QFont, QPalette, QPen, QColor, QFontMetrics, QTextCursor
from PyQt5.QtCore import Qt, QStringListModel, QSize, QRect, QAbstractProxyModel
from PyQt6.QtWidgets import QApplication, QCompleter, QPlainTextEdit, QStyledItemDelegate, QStyle
from PyQt6.QtGui import QFont, QPalette, QPen, QColor, QFontMetrics, QTextCursor
from PyQt6.QtCore import Qt, QStringListModel, QSize, QRect, QAbstractProxyModel

from ..root import root
from ..settings import settings
Expand Down
8 changes: 4 additions & 4 deletions ai_diffusion/ui/control.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from __future__ import annotations

from PyQt5.QtGui import QResizeEvent
from PyQt5.QtWidgets import QWidget, QLabel, QSlider, QToolButton, QCheckBox
from PyQt5.QtWidgets import QComboBox, QHBoxLayout, QVBoxLayout, QGridLayout, QFrame
from PyQt5.QtCore import Qt, QMetaObject, pyqtSignal
from PyQt6.QtGui import QResizeEvent
from PyQt6.QtWidgets import QWidget, QLabel, QSlider, QToolButton, QCheckBox
from PyQt6.QtWidgets import QComboBox, QHBoxLayout, QVBoxLayout, QGridLayout, QFrame
from PyQt6.QtCore import Qt, QMetaObject, pyqtSignal

from ..resources import ControlMode
from ..properties import Binding, bind, bind_combo, bind_toggle
Expand Down
12 changes: 6 additions & 6 deletions ai_diffusion/ui/custom_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
from typing import Any, Callable

from krita import Krita
from PyQt5.QtCore import Qt, pyqtSignal, QMetaObject, QUuid, QUrl, QPoint, QSize
from PyQt5.QtGui import QFontMetrics, QIcon, QDesktopServices, QPalette
from PyQt5.QtWidgets import QComboBox, QFileDialog, QFrame, QGridLayout, QHBoxLayout, QMenu
from PyQt5.QtWidgets import QLabel, QLineEdit, QListWidgetItem, QMessageBox, QSpinBox, QAction
from PyQt5.QtWidgets import QToolButton, QVBoxLayout, QWidget, QSlider, QDoubleSpinBox
from PyQt5.QtWidgets import QScrollArea, QTextEdit, QSplitter
from PyQt6.QtCore import Qt, pyqtSignal, QMetaObject, QUuid, QUrl, QPoint, QSize
from PyQt6.QtGui import QFontMetrics, QIcon, QDesktopServices, QPalette, QAction
from PyQt6.QtWidgets import QComboBox, QFileDialog, QFrame, QGridLayout, QHBoxLayout, QMenu
from PyQt6.QtWidgets import QLabel, QLineEdit, QListWidgetItem, QMessageBox, QSpinBox
from PyQt6.QtWidgets import QToolButton, QVBoxLayout, QWidget, QSlider, QDoubleSpinBox
from PyQt6.QtWidgets import QScrollArea, QTextEdit, QSplitter

from ..custom_workflow import CustomParam, ParamKind, SortedWorkflows, WorkflowSource
from ..custom_workflow import CustomGenerationMode
Expand Down
6 changes: 3 additions & 3 deletions ai_diffusion/ui/diffusion.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QStackedWidget
from PyQt5.QtWidgets import QCheckBox
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QStackedWidget
from PyQt6.QtWidgets import QCheckBox
from krita import Krita, DockWidget
import krita

Expand Down
Loading