├── .github └── workflows │ └── schedule_run.yml ├── CNAME ├── README.md ├── README └── README.html ├── fetch_streams.py ├── final_streams.txt ├── img ├── alpha.png ├── background.jpg ├── foreground.jpg └── shine.png ├── index.html ├── resource └── style.xml └── static ├── 1 ├── main.js └── pixi.min.js /.github/workflows/schedule_run.yml: -------------------------------------------------------------------------------- 1 | name: Fetch and Organize Streams 2 | 3 | # 触发条件 4 | on: 5 | schedule: 6 | # 每天 UTC 时间 00:00 和 12:00 运行 7 | - cron: '0 0,12 * * *' 8 | workflow_dispatch: # 允许手动触发 9 | 10 | permissions: 11 | contents: write # 确保 GITHUB_TOKEN 具有写入权限 12 | 13 | jobs: 14 | fetch_streams: 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | # 1. 检出项目仓库 19 | - name: Checkout repository 20 | uses: actions/checkout@v4 21 | 22 | # 2. 设置 Python 环境 23 | - name: Set up Python 24 | uses: actions/setup-python@v5 25 | with: 26 | python-version: '3.x' 27 | 28 | # 3. 安装依赖 29 | - name: Install dependencies 30 | run: | 31 | python -m pip install --upgrade pip 32 | pip install pandas requests 33 | 34 | # 4. 运行 Python 脚本 35 | - name: Run script 36 | run: | 37 | python fetch_streams.py 38 | 39 | # 5. 列出当前目录中的文件,确保 final_streams.txt 存在 40 | - name: List files in workspace 41 | run: ls -la 42 | 43 | # 6. 检查 Git 状态,确保文件已经被添加 44 | - name: Git status 45 | run: git status 46 | 47 | # 7. 配置 Git 信息 48 | - name: Configure Git 49 | run: | 50 | git config --global user.name "GitHub Actions" 51 | git config --global user.email "actions@github.com" 52 | 53 | # 8. 提交并推送文件到项目仓库 54 | - name: Commit and Push changes 55 | run: | 56 | git add $(pwd)/final_streams.txt # 使用绝对路径确保路径正确 57 | git commit -m "Update final_streams.txt with new streams" --allow-empty 58 | git push origin HEAD:main # 如果使用的是其他分支,请修改 59 | 60 | # 9. 上传输出文件作为 GitHub Action 的工件 (artifact) 61 | - name: Upload streams file 62 | uses: actions/upload-artifact@v4 63 | with: 64 | name: final_streams 65 | path: final_streams.txt 66 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | www.254950134.xyz -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # my-tv 2 | 3 | my-tv 是一个用于个人托管和管理直播源的项目,旨在自动从多个网站获取最新的直播源,并对这些直播源进行整理、分类和去重处理。该项目适合用于个人学习、探索自动化脚本和 IPTV 直播源管理。 4 | 项目主页: [点击访问](https://www.254950134.xyz) 5 | 6 | 直播源地址:https://www.254950134.xyz/final_streams.txt 7 | 8 | ## 功能介绍 9 | 10 | - **自动获取直播源**:项目从多个指定的网站自动获取最新的直播源,支持 M3U 和 TXT 格式的源文件。 11 | - **分类与整理**:自动根据节目名称对直播源进行分组整理,并对重复的源链接进行去重。 12 | - **支持 IPv4 和 IPv6**:可以识别并分类不同类型的 IP 源地址,分为 IPv4 和 IPv6 进行整理。 13 | - **输出格式**:抓取和整理后的直播源保存为 `final_streams.txt` 文件,方便进一步处理和使用。 14 | 15 | ## 项目结构 16 | 17 | ```bash 18 | my-tv/ 19 | ├── .github/ 20 | │ └── workflows/ 21 | │ └── schedule_run.yml # 定时任务的 GitHub Actions 工作流 22 | ├── fetch_streams.py # 主要的直播源抓取和整理脚本 23 | ├── final_streams.txt # 保存抓取和整理后的直播源文件 24 | └── README.md # 项目介绍文件 25 | 26 | 27 | ``` 28 | 29 | ## GitHub Actions 定时任务 30 | 31 | 项目已经配置了 GitHub Actions 工作流(`.github/workflows/schedule_run.yml`),它会每天 UTC 时间的 00:00 和 12:00 自动运行脚本抓取最新的直播源,并将结果推送到仓库。 32 | 33 | ### **法律声明** 34 | 35 | **此项目仅用于学习和研究目的。使用者在使用该项目时应遵守当地法律法规。请勿将此项目用于任何违反法律的活动。项目作者不对因使用此项目造成的任何法律问题负责。** 36 | -------------------------------------------------------------------------------- /README/README.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | my-tv 7 | 35 | 36 | 37 | 38 |

my-iptv

39 |

my-tv 是一个用于个人托管和管理直播源的项目,旨在自动从多个网站获取最新的直播源,并对这些直播源进行整理、分类和去重处理。该项目适合用于个人学习、探索自动化脚本和 IPTV 直播源管理。

40 | 41 |

功能介绍

42 | 48 | 49 |

项目结构

50 |
my-tv/
51 |   ├── .github/
52 |   │   └── workflows/
53 |   │       └── schedule_run.yml  # 定时任务的 GitHub Actions 工作流
54 |   ├── fetch_streams.py           # 主要的直播源抓取和整理脚本
55 |   ├── final_streams.txt          # 保存抓取和整理后的直播源文件
56 |   └── README.md                  # 项目介绍文件
57 | 
58 | 59 |

GitHub Actions 定时任务

60 |

项目已经配置了 GitHub Actions 工作流(.github/workflows/schedule_run.yml),它会每天 UTC 时间的 00:00 和 12:00 自动运行脚本抓取最新的直播源,并将结果推送到仓库。

61 | 62 |

法律声明

63 |

此项目仅用于学习和研究目的。使用者在使用该项目时应遵守当地法律法规。请勿将此项目用于任何违反法律的活动。项目作者不对因使用此项目造成的任何法律问题负责。

64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /fetch_streams.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import pandas as pd 3 | import re 4 | import os 5 | 6 | # 多个网站 URL 列表 7 | urls = [ 8 | "http://8.138.7.223/live.txt", 9 | "https://7337.kstore.space/twkj/tvzb.txt", 10 | "https://ghfast.top/https://raw.githubusercontent.com/tianya7981/jiekou/refs/heads/main/%E9%87%8E%E7%81%AB959", 11 | "http://tot.totalh.net/tttt.txt", 12 | "https://raw.githubusercontent.com/YanG-1989/m3u/main/Gather.m3u", 13 | "https://raw.githubusercontent.com/YueChan/Live/refs/heads/main/APTV.m3u", 14 | "https://raw.githubusercontent.com/Kimentanm/aptv/master/m3u/iptv.m3u", 15 | 'https://raw.githubusercontent.com/BurningC4/Chinese-IPTV/master/TV-IPV4.m3u', 16 | "https://raw.githubusercontent.com/Ftindy/IPTV-URL/main/IPV6.m3u", 17 | ] 18 | 19 | # 区分IPv4和IPv6的正则表达式 20 | ipv4_pattern = re.compile(r'^http://(\d{1,3}\.){3}\d{1,3}') 21 | ipv6_pattern = re.compile(r'^http://\[([a-fA-F0-9:]+)\]') 22 | 23 | # 提示信息和容错处理 24 | def fetch_streams_from_url(url): 25 | print(f"正在爬取网站源: {url}") 26 | try: 27 | response = requests.get(url, timeout=10) # 增加超时处理 28 | response.encoding = 'utf-8' # 确保使用utf-8编码 29 | if response.status_code == 200: 30 | content = response.text 31 | print(f"成功获取源自: {url}") 32 | return content 33 | else: 34 | print(f"从 {url} 获取数据失败,状态码: {response.status_code}") 35 | return None 36 | except requests.exceptions.RequestException as e: 37 | print(f"请求 {url} 时发生错误: {e}") 38 | return None 39 | 40 | # 获取所有源,并处理错误 41 | def fetch_all_streams(): 42 | all_streams = [] 43 | for url in urls: 44 | content = fetch_streams_from_url(url) 45 | if content: 46 | all_streams.append(content) 47 | else: 48 | print(f"跳过来源: {url}") 49 | return "\n".join(all_streams) 50 | 51 | # 处理M3U文件的内容 52 | def parse_m3u(content): 53 | lines = content.splitlines() 54 | streams = [] 55 | current_program = None 56 | 57 | for line in lines: 58 | if line.startswith("#EXTINF"): 59 | # 提取节目名称(假设tvg-name="节目名") 60 | program_match = re.search(r'tvg-name="([^"]+)"', line) 61 | if program_match: 62 | current_program = program_match.group(1).strip() 63 | elif line.startswith("http"): # 流地址 64 | stream_url = line.strip() 65 | if current_program: 66 | streams.append({"program_name": current_program, "stream_url": stream_url}) 67 | 68 | return streams 69 | 70 | # 处理普通TXT格式的内容 71 | def parse_txt(content): 72 | lines = content.splitlines() 73 | streams = [] 74 | 75 | for line in lines: 76 | match = re.match(r"(.+?),\s*(http.+)", line) 77 | if match: 78 | program_name = match.group(1).strip() 79 | stream_url = match.group(2).strip() 80 | streams.append({"program_name": program_name, "stream_url": stream_url}) 81 | 82 | return streams 83 | 84 | def organize_streams(content): 85 | # 检查是否是 M3U 格式并解析 86 | if content.startswith("#EXTM3U"): 87 | streams = parse_m3u(content) 88 | else: 89 | # 非 M3U 格式处理 90 | streams = parse_txt(content) 91 | 92 | # 使用 pandas 整理相同节目的源,并去除重复链接 93 | df = pd.DataFrame(streams) 94 | df = df.drop_duplicates(subset=['program_name', 'stream_url']) # 删除重复的节目和链接 95 | grouped = df.groupby('program_name')['stream_url'].apply(list).reset_index() 96 | 97 | return grouped 98 | 99 | def save_to_txt(grouped_streams, filename="final_streams.txt"): 100 | filepath = os.path.join(os.getcwd(), filename) # 使用绝对路径 101 | print(f"保存文件的路径是: {filepath}") # 输出文件保存路径 102 | ipv4_lines = [] 103 | ipv6_lines = [] 104 | 105 | for _, row in grouped_streams.iterrows(): 106 | program_name = row['program_name'] 107 | stream_urls = row['stream_url'] 108 | 109 | for url in stream_urls: 110 | if ipv4_pattern.match(url): 111 | ipv4_lines.append(f"{program_name},{url}") 112 | elif ipv6_pattern.match(url): 113 | ipv6_lines.append(f"{program_name},{url}") 114 | 115 | with open(filepath, 'w', encoding='utf-8') as output_file: 116 | output_file.write("# IPv4 Streams\n") 117 | output_file.write("\n".join(ipv4_lines)) 118 | output_file.write("\n\n# IPv6 Streams\n") 119 | output_file.write("\n".join(ipv6_lines)) 120 | 121 | print(f"所有源已保存到 {filepath}") 122 | 123 | if __name__ == "__main__": 124 | print("开始抓取所有源...") 125 | all_content = fetch_all_streams() 126 | if all_content: 127 | print("开始整理源...") 128 | organized_streams = organize_streams(all_content) 129 | save_to_txt(organized_streams) 130 | else: 131 | print("未能抓取到任何源。") 132 | -------------------------------------------------------------------------------- /final_streams.txt: -------------------------------------------------------------------------------- 1 | # IPv4 Streams 2 | AMC電影台,http://61.221.215.25:8800/hls/43/index.m3u8 3 | CCTV-10科教,http://117.144.58.42:35455/gaoma/cctv10.m3u8 4 | CCTV-10科教,http://171.88.145.30:4022/rtp/239.93.1.28:5140 5 | CCTV-10科教,http://106.53.99.30/dl/bjyd.php?id=6 6 | CCTV-10科教,http://39.134.65.175/PLTV/88888888/224/3221225677/1.m3u8 7 | CCTV-11戏曲,http://117.144.58.42:35455/gaoma/cctv11.m3u8 8 | CCTV-11戏曲,http://171.88.145.30:4022/rtp/239.93.0.102:5140 9 | CCTV-11戏曲,http://106.53.99.30/dl/bjyd.php?id=7 10 | CCTV-11戏曲,http://39.134.65.175/PLTV/88888888/224/3221225517/1.m3u8 11 | CCTV-12社会与法,http://117.144.58.42:35455/gaoma/cctv12.m3u8 12 | CCTV-12社会与法,http://171.88.145.30:4022/rtp/239.93.1.30:8124 13 | CCTV-12社会与法,http://106.53.99.30/dl/bjyd.php?id=8 14 | CCTV-12社会与法,http://39.134.65.175/PLTV/88888888/224/3221225669/1.m3u8 15 | CCTV-13新闻,http://117.144.58.42:35455/gaoma/cctv13.m3u8 16 | CCTV-13新闻,http://171.88.145.30:4022/rtp/239.93.0.66:5140 17 | CCTV-13新闻,http://106.53.99.30/dl/bjyd.php?id=9 18 | CCTV-13新闻,http://39.134.65.175/PLTV/88888888/224/3221225812/1.m3u8 19 | CCTV-14少儿,http://117.144.58.42:35455/gaoma/cctv14.m3u8 20 | CCTV-14少儿,http://171.88.145.30:4022/rtp/239.93.1.29:6000 21 | CCTV-14少儿,http://106.53.99.30/dl/bjyd.php?id=10 22 | CCTV-14少儿,http://39.134.65.175/PLTV/88888888/224/3221225674/1.m3u8 23 | CCTV-15音乐,http://117.144.58.42:35455/gaoma/cctv15.m3u8 24 | CCTV-15音乐,http://171.88.145.30:4022/rtp/239.93.0.103:5140 25 | CCTV-15音乐,http://106.53.99.30/dl/bjyd.php?id=11 26 | CCTV-15音乐,http://39.134.65.175/PLTV/88888888/224/3221225513/1.m3u8 27 | CCTV-16奥林匹克,http://117.144.58.42:35455/gaoma/cctv16.m3u8 28 | CCTV-16奥林匹克,http://171.88.145.30:4022/rtp/239.93.42.54:5140 29 | CCTV-16奥林匹克,http://39.134.65.173/PLTV/88888888/224/3221225893/1.m3u8 30 | CCTV-17农业农村,http://117.144.58.42:35455/gaoma/cctv17.m3u8 31 | CCTV-17农业农村,http://171.88.145.30:4022/rtp/239.93.0.92:5140 32 | CCTV-17农业农村,http://106.53.99.30/dl/bjyd.php?id=12 33 | CCTV-17农业农村,http://39.134.67.108/PLTV/88888888/224/3221225708/1.m3u8 34 | CCTV-1综合,http://117.144.58.42:35455/gaoma/cctv1.m3u8 35 | CCTV-1综合,http://171.88.145.30:4022/rtp/239.93.0.58:5140 36 | CCTV-1综合,http://106.53.99.30/dl/bjyd.php?id=1 37 | CCTV-1综合,http://39.134.65.175/PLTV/88888888/224/3221225816/1.m3u8 38 | CCTV-2财经,http://117.144.58.42:35455/gaoma/cctv2.m3u8 39 | CCTV-2财经,http://171.88.145.30:4022/rtp/239.93.1.23:6000 40 | CCTV-2财经,http://106.53.99.30/dl/bjyd.php?id=2 41 | CCTV-2财经,http://39.134.65.175/PLTV/88888888/224/3221225599/1.m3u8 42 | CCTV-3综艺,http://117.144.58.42:35455/gaoma/cctv3.m3u8 43 | CCTV-3综艺,http://171.88.145.30:4022/rtp/239.93.0.109:5140 44 | CCTV-3综艺,http://39.134.65.175/PLTV/88888888/224/3221225799/1.m3u8 45 | CCTV-4K超高清,http://117.144.58.42:35455/gaoma/cctv4k.m3u8 46 | CCTV-4中文国际,http://117.144.58.42:35455/gaoma/cctv4.m3u8 47 | CCTV-4中文国际,http://171.88.145.30:4022/rtp/239.93.1.105:5140 48 | CCTV-4中文国际,http://106.53.99.30/dl/bjyd.php?id=3 49 | CCTV-4中文国际,http://39.134.65.175/PLTV/88888888/224/3221225797/1.m3u8 50 | CCTV-5+体育赛事,http://117.144.58.42:35455/gaoma/cctv5p.m3u8 51 | CCTV-5+体育赛事,http://171.88.145.30:4022/rtp/239.93.1.36:8004 52 | CCTV-5+体育赛事,http://39.134.65.175/PLTV/88888888/224/3221225507/1.m3u8 53 | CCTV-5体育,http://117.144.58.42:35455/gaoma/cctv5.m3u8 54 | CCTV-5体育,http://171.88.145.30:4022/rtp/239.93.42.37:5140 55 | CCTV-5体育,http://39.134.65.175/PLTV/88888888/224/3221225818/1.m3u8 56 | CCTV-6电影,http://117.144.58.42:35455/gaoma/cctv6.m3u8 57 | CCTV-6电影,http://171.88.145.30:4022/rtp/239.93.42.38:5140 58 | CCTV-6电影,http://39.134.65.175/PLTV/88888888/224/3221225814/1.m3u8 59 | CCTV-7国防军事,http://117.144.58.42:35455/gaoma/cctv7.m3u8 60 | CCTV-7国防军事,http://171.88.145.30:4022/rtp/239.93.1.67:5140 61 | CCTV-7国防军事,http://106.53.99.30/dl/bjyd.php?id=4 62 | CCTV-7国防军事,http://39.134.65.175/PLTV/88888888/224/3221225671/1.m3u8 63 | CCTV-8电视剧,http://117.144.58.42:35455/gaoma/cctv8.m3u8 64 | CCTV-8电视剧,http://171.88.145.30:4022/rtp/239.93.42.39:5140 65 | CCTV-8电视剧,http://39.134.65.175/PLTV/88888888/224/3221225795/1.m3u8 66 | CCTV-9纪录,http://117.144.58.42:35455/gaoma/cctv9.m3u8 67 | CCTV-9纪录,http://171.88.145.30:4022/rtp/239.93.1.24:5140 68 | CCTV-9纪录,http://106.53.99.30/dl/bjyd.php?id=5 69 | CCTV-9纪录,http://39.134.65.175/PLTV/88888888/224/3221225676/1.m3u8 70 | CGTN,http://39.134.67.108/PLTV/88888888/224/3221225510/1.m3u8 71 | CGTN纪录,http://39.134.67.108/PLTV/88888888/224/3221225509/1.m3u8 72 | CHC动作电影,http://58.19.38.162:9901/tsfile/live/1005_1.m3u8?key=txiptv&playlive=1&authid=0 73 | CHC动作电影,http://171.88.145.30:4022/udp/239.93.42.7:5140 74 | CHC动作电影,http://113.195.172.192:808/hls/114/index.m3u8 75 | CHC家庭影院,http://58.19.38.162:9901/tsfile/live/1006_1.m3u8?key=txiptv&playlive=1&authid=0 76 | CHC家庭影院,http://171.88.145.30:4022/udp/239.93.42.6:5140 77 | CHC家庭影院,http://113.195.172.192:808/hls/113/index.m3u8 78 | CHC影迷电影,http://58.19.38.162:9901/tsfile/live/1004_1.m3u8?key=txiptv&playlive=1&authid=0 79 | CHC影迷电影,http://171.88.145.30:4022/udp/239.93.42.5:5140 80 | CHC影迷电影,http://113.195.172.192:808/hls/112/index.m3u8 81 | MBC体育,http://211.33.246.4:32954/cj_live/myStream.sdp/chunklist_w517347500.m3u8 82 | NHK WORLD,http://61.221.215.25:8800/hls/51/index.m3u8 83 | TVBS,http://125.229.9.67:8544/http/220.130.87.218:8081/hls/75/817/ch058.m3u8 84 | TVBS,http://50.7.234.10:8278/tvbs/playlist.m3u8?tid=MF7F4816296948162969&ct=19669&tsum=8410a43db059b92d8109cc06c5b88bc0 85 | TVBS歡樂台,http://125.229.9.67:8531/http/220.130.87.218:8081/hls/65/807/ch017.m3u8 86 | 三沙卫视,http://171.88.145.30:4022/rtp/239.93.42.58:5140 87 | 三立戲劇台,http://61.221.215.25:8800/hls/41/index.m3u8 88 | 东南卫视,http://117.144.58.42:35455/itv/1000000005000265033.m3u8?cdn=ystenlive&Contentid=1000000005000265033 89 | 东南卫视,http://171.88.145.30:4022/rtp/239.93.0.42:5140 90 | 东南卫视,http://39.134.65.173/PLTV/88888888/224/3221225950/1.m3u8 91 | 东方卫视,http://117.144.58.42:35455/itv/1000000005000265018.m3u8?cdn=ystenlive&Contentid=1000000005000265018 92 | 东方卫视,http://171.88.145.30:4022/rtp/239.93.0.123:5140 93 | 东方卫视,http://39.134.65.173/PLTV/88888888/224/3221225942/1.m3u8 94 | 中国教育1台,http://39.134.67.108/PLTV/88888888/224/3221225563/1.m3u8 95 | 中国教育4台,http://39.134.67.108/PLTV/88888888/224/3221225750/1.m3u8 96 | 中天亞洲台,http://50.7.234.10:8278/ctiasia_twn/playlist.m3u8?tid=MBDB2043146120431461&ct=19234&tsum=ba6deb1dd785ef48ec39eda87a905fb6 97 | 中天娛樂台,http://125.229.9.67:8526/http/220.130.87.218:8081/hls/67/809/ch026.m3u8 98 | 中天娛樂台,http://61.221.215.25:8800/hls/47/index.m3u8 99 | 中天新聞台,http://125.229.9.67:8540/http/220.130.87.218:8081/hls/78/80/ch063max.m3u8 100 | 中天新聞台,http://50.7.234.10:8278/ctinews/playlist.m3u8?tid=MFAF1058269310582693&ct=19669&tsum=5849200b0c11c44f0f6778ccc08842d8 101 | 中天綜合台,http://125.229.9.67:8525/http/220.130.87.218:8081/hls/67/809/ch025.m3u8 102 | 中華小當家,http://61.221.215.25:8800/hls/40/index.m3u8 103 | 云南卫视,http://117.144.58.42:35455/itv/5000000011000031120.m3u8?cdn=bestzb&Contentid=5000000011000031120 104 | 云南卫视,http://171.88.145.30:4022/rtp/239.93.1.174:5140 105 | 云南卫视,http://39.134.67.108/PLTV/88888888/224/3221225957/1.m3u8 106 | 人間衛視,http://61.216.67.119:1935/bltvhd/bltv1/chunklist_w1266569526.m3u8 107 | 佳木斯新闻综合,http://39.134.67.108/PLTV/88888888/224/3221225993/1.m3u8 108 | 八大戲劇台,http://61.221.215.25:8800/hls/39/index.m3u8 109 | 八大第一台,http://61.221.215.25:8800/hls/55/index.m3u8 110 | 八大綜合台,http://61.221.215.25:8800/hls/56/index.m3u8 111 | 兵团卫视,http://171.88.145.30:4022/rtp/239.93.42.43:5140 112 | 兵团卫视,http://39.134.67.108/PLTV/88888888/224/3221226005/1.m3u8 113 | 内蒙古卫视,http://171.88.145.30:4022/rtp/239.93.0.8:5140 114 | 内蒙古卫视,http://39.134.67.108/PLTV/88888888/224/3221226017/1.m3u8 115 | 動物星球,http://61.221.215.25:8800/hls/57/index.m3u8 116 | 北京卫视,http://117.144.58.42:35455/itv/1000000005000265027.m3u8?cdn=ystenlive&Contentid=1000000005000265027 117 | 北京卫视,http://171.88.145.30:4022/rtp/239.93.0.180:5140 118 | 北京卫视,http://39.134.65.162/PLTV/88888888/224/3221225931/1.m3u8 119 | 厦门卫视,http://171.88.145.30:4022/rtp/239.93.42.57:5140 120 | 吉林卫视,http://117.144.58.42:35455/itv/5000000011000031117.m3u8?cdn=bestzb&Contentid=5000000011000031117 121 | 吉林卫视,http://171.88.145.30:4022/rtp/239.93.0.248:5140 122 | 吉林卫视,http://39.134.65.173/PLTV/88888888/224/3221226013/1.m3u8 123 | 四川卫视,http://117.144.58.42:35455/itv/5000000004000006119.m3u8?cdn=bestzb&Contentid=5000000004000006119 124 | 四川卫视,http://171.88.145.30:4022/rtp/239.93.0.20:1235 125 | 四川卫视,http://39.134.67.108/PLTV/88888888/224/3221225970/1.m3u8 126 | 天津卫视,http://117.144.58.42:35455/itv/1000000005000265026.m3u8?cdn=ystenlive&Contentid=1000000005000265026 127 | 天津卫视,http://171.88.145.30:4022/rtp/239.93.0.167:5140 128 | 天津卫视,http://39.134.67.108/PLTV/88888888/224/3221225972/1.m3u8 129 | 宁夏卫视,http://171.88.145.30:4022/rtp/239.93.0.247:5140 130 | 宁夏卫视,http://39.134.67.108/PLTV/88888888/224/3221226028/1.m3u8 131 | 安徽卫视,http://117.144.58.42:35455/itv/1000000001000030159.m3u8?cdn=ystenlive&Contentid=1000000001000030159 132 | 安徽卫视,http://171.88.145.30:4022/rtp/239.93.1.106:5140 133 | 安徽卫视,http://39.134.67.108/PLTV/88888888/224/3221225925/1.m3u8 134 | 安徽综艺体育,http://112.30.194.221:20080/live/c41f112b83f644ddb082669501c8ecd3/hls.m3u8 135 | 寰宇新聞台,http://125.229.9.67:8548/http/220.130.87.218:8081/hls/76/818/ch062.m3u8 136 | 山东卫视,http://117.144.58.42:35455/itv/1000000005000265019.m3u8?cdn=ystenlive&Contentid=1000000005000265019 137 | 山东卫视,http://171.88.145.30:4022/rtp/239.93.0.168:5140 138 | 山东卫视,http://39.134.67.108/PLTV/88888888/224/3221225952/1.m3u8 139 | 山西卫视,http://171.88.145.30:4022/rtp/239.93.0.6:5140 140 | 山西卫视,http://39.134.67.108/PLTV/88888888/224/3221226009/1.m3u8 141 | 广东卫视,http://117.144.58.42:35455/itv/1000000001000014176.m3u8?cdn=ystenlive&Contentid=1000000001000014176 142 | 广东卫视,http://171.88.145.30:4022/rtp/239.93.0.181:5140 143 | 广东卫视,http://39.134.67.108/PLTV/88888888/224/3221225966/1.m3u8 144 | 广西卫视,http://117.144.58.42:35455/itv/5000000011000031118.m3u8?cdn=bestzb&Contentid=5000000011000031118 145 | 广西卫视,http://171.88.145.30:4022/rtp/239.93.42.46:5140 146 | 广西卫视,http://39.134.65.141/PLTV/88888888/224/3221226024/1.m3u8 147 | 延边卫视,http://171.88.145.30:4022/rtp/239.93.0.249:5140 148 | 延边卫视,http://39.134.65.181/PLTV/88888888/224/3221226040/1.m3u8 149 | 惠州公共,http://113.101.119.94:808/hls/203/index.m3u8 150 | 探索亞洲,http://61.221.215.25:8800/hls/50/index.m3u8 151 | 探索頻道,http://61.221.215.25:8800/hls/1/index.m3u8 152 | 接口更新,http://8.138.7.223/tv/ptbtv.php?id=27 153 | 新疆卫视,http://171.88.145.30:4022/rtp/239.93.0.194:5140 154 | 新疆卫视,http://39.134.67.108/PLTV/88888888/224/3221225999/1.m3u8 155 | 時尚台FTV,http://80.94.54.42/fashiontv/stream/playlist.m3u8 156 | 東森新聞台,http://125.229.9.67:8539/http/220.130.87.218:8081/hls/63/805/ch010.m3u8 157 | 東森新聞台,http://50.7.234.10:8278/ettvnews/playlist.m3u8?tid=MDCD7908242379082423&ct=19669&tsum=50ace53accfe96e223d6e9f09f51485a 158 | 江苏卫视,http://117.144.58.42:35455/itv/1000000001000001828.m3u8?cdn=ystenlive&Contentid=1000000001000001828 159 | 江苏卫视,http://171.88.145.30:4022/rtp/239.93.0.89:5140 160 | 江苏卫视,http://39.134.65.177/PLTV/88888888/224/3221225938/1.m3u8 161 | 江西卫视,http://117.144.58.42:35455/itv/1000000006000268001.m3u8?cdn=ystenlive&Contentid=1000000006000268001 162 | 江西卫视,http://171.88.145.30:4022/rtp/239.93.0.134:5140 163 | 江西卫视,http://39.134.67.108/PLTV/88888888/224/3221225935/1.m3u8 164 | 江阴新闻综合,http://221.228.70.101:8080/live/xinwen.m3u8 165 | 河北卫视,http://117.144.58.42:35455/itv/5000000006000040016.m3u8?cdn=bestzb&Contentid=5000000006000040016 166 | 河北卫视,http://171.88.145.30:4022/rtp/239.93.0.132:5140 167 | 河北卫视,http://39.134.67.108/PLTV/88888888/224/3221225961/1.m3u8 168 | 河南卫视,http://117.144.58.42:35455/itv/5000000011000031119.m3u8?cdn=bestzb&Contentid=5000000011000031119 169 | 河南卫视,http://171.88.145.30:4022/rtp/239.93.42.45:5140 170 | 河南卫视,http://39.134.67.108/PLTV/88888888/224/3221226023/1.m3u8 171 | 浙江卫视,http://117.144.58.42:35455/itv/1000000001000014260.m3u8?cdn=ystenlive&Contentid=1000000001000014260 172 | 浙江卫视,http://171.88.145.30:4022/rtp/239.93.0.124:5140 173 | 浙江卫视,http://39.134.65.175/PLTV/88888888/224/3221225959/1.m3u8 174 | 海南卫视,http://117.144.58.42:35455/itv/5000000004000006211.m3u8?cdn=bestzb&Contentid=5000000004000006211 175 | 海南卫视,http://171.88.145.30:4022/rtp/239.93.0.80:5140 176 | 海南卫视,http://39.134.67.108/PLTV/88888888/224/3221226026/1.m3u8 177 | 深圳卫视,http://117.144.58.42:35455/itv/1000000005000265028.m3u8?cdn=ystenlive&Contentid=1000000005000265028 178 | 深圳卫视,http://171.88.145.30:4022/rtp/239.93.0.182:5140 179 | 深圳卫视,http://39.134.67.108/PLTV/88888888/224/3221225943/1.m3u8 180 | 湖北卫视,http://117.144.58.42:35455/itv/1000000001000024621.m3u8?cdn=ystenlive&Contentid=1000000001000024621 181 | 湖北卫视,http://171.88.145.30:4022/rtp/239.93.0.250:5140 182 | 湖北卫视,http://39.134.65.173/PLTV/88888888/224/3221225975/1.m3u8 183 | 湖南卫视,http://117.144.58.42:35455/itv/1000000005000265024.m3u8?cdn=ystenlive&Contentid=1000000005000265024 184 | 湖南卫视,http://171.88.145.30:4022/rtp/239.93.0.88:5140 185 | 湖南卫视,http://39.134.65.173/PLTV/88888888/224/3221225506/1.m3u8 186 | 甘肃卫视,http://117.144.58.42:35455/itv/5000000011000031121.m3u8?cdn=bestzb&Contentid=5000000011000031121 187 | 甘肃卫视,http://171.88.145.30:4022/rtp/239.93.0.81:5140 188 | 番薯,http://61.216.67.119:1935/TWHG/E1/chunklist_w705811302.m3u8 189 | 番薯,http://61.216.67.119:1935/TWHG/E1/chunklist_w7058102.m3u8 190 | 緯來精采台,http://61.221.215.25:8800/hls/48/index.m3u8 191 | 耀才財經台,http://202.69.67.66:443/webcast/bshdlive-pc/playlist.m3u8 192 | 西藏卫视,http://171.88.145.30:4022/rtp/239.93.0.175:5140 193 | 西藏卫视,http://39.134.67.108/PLTV/88888888/224/3221225951/1.m3u8 194 | 贵州卫视,http://117.144.58.42:35455/itv/5000000004000025843.m3u8?cdn=bestzb&Contentid=5000000004000025843 195 | 贵州卫视,http://171.88.145.30:4022/rtp/239.93.0.131:5140 196 | 贵州卫视,http://39.134.67.108/PLTV/88888888/224/3221225974/1.m3u8 197 | 辽宁卫视,http://117.144.58.42:35455/itv/1000000005000265022.m3u8?cdn=ystenlive&Contentid=1000000005000265022 198 | 辽宁卫视,http://171.88.145.30:4022/rtp/239.93.1.108:5140 199 | 辽宁卫视,http://39.134.67.108/PLTV/88888888/224/3221225944/1.m3u8 200 | 重庆卫视,http://117.144.58.42:35455/itv/1000000001000001096.m3u8?cdn=ystenlive&Contentid=1000000001000001096 201 | 重庆卫视,http://171.88.145.30:4022/rtp/239.93.1.107:5140 202 | 重庆卫视,http://39.134.67.108/PLTV/88888888/224/3221225963/1.m3u8 203 | 陕西卫视,http://171.88.145.30:4022/rtp/239.93.0.143:5140 204 | 陕西卫视,http://39.134.67.108/PLTV/88888888/224/3221225989/1.m3u8 205 | 青海卫视,http://117.144.58.42:35455/itv/1000000002000013359.m3u8?cdn=ystenlive&Contentid=1000000002000013359 206 | 青海卫视,http://171.88.145.30:4022/rtp/239.93.0.192:5140 207 | 青海卫视,http://39.134.67.108/PLTV/88888888/224/3221225948/1.m3u8 208 | 靖江电视,http://58.222.151.43:1935/live/xwzhpc/playlist.m3u8 209 | 非凡新聞台,http://50.7.234.10:8278/feifannews_twn/playlist.m3u8?ct=17874&tid=m050e7aad65f614336734&tsum=4ea1b829d195ac69a6c2ca51b21ae378 210 | 黑龙江农业科教,http://39.134.67.108/PLTV/88888888/224/3221225994/1.m3u8 211 | 黑龙江卫视,http://117.144.58.42:35455/itv/1000000001000001925.m3u8?cdn=ystenlive&Contentid=1000000001000001925 212 | 黑龙江卫视,http://171.88.145.30:4022/rtp/239.93.0.183:5140 213 | 黑龙江卫视,http://39.134.65.173/PLTV/88888888/224/3221225994/1.m3u8 214 | 黑龙江卫视,http://39.134.67.108/PLTV/88888888/224/3221225994/1.m3u8 215 | 黑龙江少儿,http://39.134.67.108/PLTV/88888888/224/3221225979/1.m3u8 216 | 黑龙江影视,http://39.134.67.108/PLTV/88888888/224/3221225973/1.m3u8 217 | 黑龙江文体,http://39.134.67.108/PLTV/88888888/224/3221225965/1.m3u8 218 | 黑龙江新闻法治,http://39.134.67.108/PLTV/88888888/224/3221225967/1.m3u8 219 | 黑龙江都市,http://39.134.67.108/PLTV/88888888/224/3221225969/1.m3u8 220 | 龍華洋片台,http://50.7.234.10:8278/lunghuawestern_twn/playlist.m3u8?tid=MF7F3761146937611469&ct=19234&tsum=e8b375d0c73fff5a34a7e3b4de2f53bb 221 | 222 | # IPv6 Streams 223 | -------------------------------------------------------------------------------- /img/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq254950134/my-iptv/9e193577aa915cafe1979a765b13a3f76ba87950/img/alpha.png -------------------------------------------------------------------------------- /img/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq254950134/my-iptv/9e193577aa915cafe1979a765b13a3f76ba87950/img/background.jpg -------------------------------------------------------------------------------- /img/foreground.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq254950134/my-iptv/9e193577aa915cafe1979a765b13a3f76ba87950/img/foreground.jpg -------------------------------------------------------------------------------- /img/shine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq254950134/my-iptv/9e193577aa915cafe1979a765b13a3f76ba87950/img/shine.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | MJ 13 | 180 | 181 | 182 | 183 | 184 | 185 |
186 | 187 | avatar 188 |

MJ

189 |

闲来无事 打发时间

190 | 191 | 197 | 198 |
199 | 200 | 229 | 230 | -------------------------------------------------------------------------------- /resource/style.xml: -------------------------------------------------------------------------------- 1 | /* --------------------------------------------------------------------------- 2 | 3 | WARNING! File created programmatically. All changes made in this file will be lost! 4 | 5 | Created by the qtsass compiler v0.4.0 6 | 7 | The definitions are in the "qdarkstyle.qss._styles.scss" module 8 | 9 | --------------------------------------------------------------------------- */ 10 | /* Light Style - QDarkStyleSheet ------------------------------------------ */ 11 | /* 12 | 13 | See Qt documentation: 14 | 15 | - https://doc.qt.io/qt-5/stylesheet.html 16 | - https://doc.qt.io/qt-5/stylesheet-reference.html 17 | - https://doc.qt.io/qt-5/stylesheet-examples.html 18 | 19 | --------------------------------------------------------------------------- */ 20 | /* Reset elements ------------------------------------------------------------ 21 | 22 | Resetting everything helps to unify styles across different operating systems 23 | 24 | --------------------------------------------------------------------------- */ 25 | * { 26 | padding: 0px; 27 | margin: 0px; 28 | border: 0px; 29 | border-style: none; 30 | border-image: none; 31 | outline: 0; 32 | } 33 | 34 | /* specific reset for elements inside QToolBar */ 35 | QToolBar * { 36 | margin: 0px; 37 | padding: 0px; 38 | } 39 | 40 | /* QWidget ---------------------------------------------------------------- 41 | 42 | --------------------------------------------------------------------------- */ 43 | QWidget { 44 | background-color: #19232D; 45 | border: 0px solid #455364; 46 | padding: 0px; 47 | color: #DFE1E2; 48 | selection-background-color: #346792; 49 | selection-color: #DFE1E2; 50 | } 51 | 52 | QWidget:disabled { 53 | background-color: #19232D; 54 | color: #788D9C; 55 | selection-background-color: #26486B; 56 | selection-color: #788D9C; 57 | } 58 | 59 | QWidget::item:selected { 60 | background-color: #346792; 61 | } 62 | 63 | QWidget::item:hover:!selected { 64 | background-color: #1A72BB; 65 | } 66 | 67 | /* QMainWindow ------------------------------------------------------------ 68 | 69 | This adjusts the splitter in the dock widget, not qsplitter 70 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow 71 | 72 | --------------------------------------------------------------------------- */ 73 | QMainWindow::separator { 74 | background-color: #455364; 75 | border: 0px solid #19232D; 76 | spacing: 0px; 77 | padding: 2px; 78 | } 79 | 80 | QMainWindow::separator:hover { 81 | background-color: #60798B; 82 | border: 0px solid #1A72BB; 83 | } 84 | 85 | QMainWindow::separator:horizontal { 86 | width: 5px; 87 | margin-top: 2px; 88 | margin-bottom: 2px; 89 | image: url(":/qss_icons/dark/rc/toolbar_separator_vertical.png"); 90 | } 91 | 92 | QMainWindow::separator:vertical { 93 | height: 5px; 94 | margin-left: 2px; 95 | margin-right: 2px; 96 | image: url(":/qss_icons/dark/rc/toolbar_separator_horizontal.png"); 97 | } 98 | 99 | /* QToolTip --------------------------------------------------------------- 100 | 101 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip 102 | 103 | --------------------------------------------------------------------------- */ 104 | QToolTip { 105 | background-color: #346792; 106 | color: #DFE1E2; 107 | /* If you remove the border property, background stops working on Windows */ 108 | border: none; 109 | /* Remove padding, for fix combo box tooltip */ 110 | padding: 0px; 111 | /* Remove opacity, fix #174 - may need to use RGBA */ 112 | } 113 | 114 | /* QStatusBar ------------------------------------------------------------- 115 | 116 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar 117 | 118 | --------------------------------------------------------------------------- */ 119 | QStatusBar { 120 | border: 1px solid #455364; 121 | /* Fixes Spyder #9120, #9121 */ 122 | background: #455364; 123 | /* Fixes #205, white vertical borders separating items */ 124 | } 125 | 126 | QStatusBar::item { 127 | border: none; 128 | } 129 | 130 | QStatusBar QToolTip { 131 | background-color: #1A72BB; 132 | border: 1px solid #19232D; 133 | color: #19232D; 134 | /* Remove padding, for fix combo box tooltip */ 135 | padding: 0px; 136 | /* Reducing transparency to read better */ 137 | opacity: 230; 138 | } 139 | 140 | QStatusBar QLabel { 141 | /* Fixes Spyder #9120, #9121 */ 142 | background: transparent; 143 | } 144 | 145 | /* QCheckBox -------------------------------------------------------------- 146 | 147 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox 148 | 149 | --------------------------------------------------------------------------- */ 150 | QCheckBox { 151 | background-color: #19232D; 152 | color: #DFE1E2; 153 | spacing: 4px; 154 | outline: none; 155 | padding-top: 4px; 156 | padding-bottom: 4px; 157 | } 158 | 159 | QCheckBox:focus { 160 | border: none; 161 | } 162 | 163 | QCheckBox QWidget:disabled { 164 | background-color: #19232D; 165 | color: #788D9C; 166 | } 167 | 168 | QCheckBox::indicator { 169 | margin-left: 2px; 170 | height: 14px; 171 | width: 14px; 172 | } 173 | 174 | QCheckBox::indicator:unchecked { 175 | image: url(":/qss_icons/dark/rc/checkbox_unchecked.png"); 176 | } 177 | 178 | QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { 179 | border: none; 180 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_focus.png"); 181 | } 182 | 183 | QCheckBox::indicator:unchecked:disabled { 184 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_disabled.png"); 185 | } 186 | 187 | QCheckBox::indicator:checked { 188 | image: url(":/qss_icons/dark/rc/checkbox_checked.png"); 189 | } 190 | 191 | QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { 192 | border: none; 193 | image: url(":/qss_icons/dark/rc/checkbox_checked_focus.png"); 194 | } 195 | 196 | QCheckBox::indicator:checked:disabled { 197 | image: url(":/qss_icons/dark/rc/checkbox_checked_disabled.png"); 198 | } 199 | 200 | QCheckBox::indicator:indeterminate { 201 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate.png"); 202 | } 203 | 204 | QCheckBox::indicator:indeterminate:disabled { 205 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate_disabled.png"); 206 | } 207 | 208 | QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { 209 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate_focus.png"); 210 | } 211 | 212 | /* QGroupBox -------------------------------------------------------------- 213 | 214 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox 215 | 216 | --------------------------------------------------------------------------- */ 217 | QGroupBox { 218 | font-weight: bold; 219 | border: 1px solid #455364; 220 | border-radius: 4px; 221 | padding: 2px; 222 | margin-top: 6px; 223 | margin-bottom: 4px; 224 | } 225 | 226 | QGroupBox::title { 227 | subcontrol-origin: margin; 228 | subcontrol-position: top left; 229 | left: 4px; 230 | padding-left: 2px; 231 | padding-right: 4px; 232 | padding-top: -4px; 233 | } 234 | 235 | QGroupBox::indicator { 236 | margin-left: 2px; 237 | margin-top: 2px; 238 | padding: 0; 239 | height: 14px; 240 | width: 14px; 241 | } 242 | 243 | QGroupBox::indicator:unchecked { 244 | border: none; 245 | image: url(":/qss_icons/dark/rc/checkbox_unchecked.png"); 246 | } 247 | 248 | QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { 249 | border: none; 250 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_focus.png"); 251 | } 252 | 253 | QGroupBox::indicator:unchecked:disabled { 254 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_disabled.png"); 255 | } 256 | 257 | QGroupBox::indicator:checked { 258 | border: none; 259 | image: url(":/qss_icons/dark/rc/checkbox_checked.png"); 260 | } 261 | 262 | QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { 263 | border: none; 264 | image: url(":/qss_icons/dark/rc/checkbox_checked_focus.png"); 265 | } 266 | 267 | QGroupBox::indicator:checked:disabled { 268 | image: url(":/qss_icons/dark/rc/checkbox_checked_disabled.png"); 269 | } 270 | 271 | /* QRadioButton ----------------------------------------------------------- 272 | 273 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton 274 | 275 | --------------------------------------------------------------------------- */ 276 | QRadioButton { 277 | background-color: #19232D; 278 | color: #DFE1E2; 279 | spacing: 4px; 280 | padding-top: 4px; 281 | padding-bottom: 4px; 282 | border: none; 283 | outline: none; 284 | } 285 | 286 | QRadioButton:focus { 287 | border: none; 288 | } 289 | 290 | QRadioButton:disabled { 291 | background-color: #19232D; 292 | color: #788D9C; 293 | border: none; 294 | outline: none; 295 | } 296 | 297 | QRadioButton QWidget { 298 | background-color: #19232D; 299 | color: #DFE1E2; 300 | spacing: 0px; 301 | padding: 0px; 302 | outline: none; 303 | border: none; 304 | } 305 | 306 | QRadioButton::indicator { 307 | border: none; 308 | outline: none; 309 | margin-left: 2px; 310 | height: 14px; 311 | width: 14px; 312 | } 313 | 314 | QRadioButton::indicator:unchecked { 315 | image: url(":/qss_icons/dark/rc/radio_unchecked.png"); 316 | } 317 | 318 | QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { 319 | border: none; 320 | outline: none; 321 | image: url(":/qss_icons/dark/rc/radio_unchecked_focus.png"); 322 | } 323 | 324 | QRadioButton::indicator:unchecked:disabled { 325 | image: url(":/qss_icons/dark/rc/radio_unchecked_disabled.png"); 326 | } 327 | 328 | QRadioButton::indicator:checked { 329 | border: none; 330 | outline: none; 331 | image: url(":/qss_icons/dark/rc/radio_checked.png"); 332 | } 333 | 334 | QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { 335 | border: none; 336 | outline: none; 337 | image: url(":/qss_icons/dark/rc/radio_checked_focus.png"); 338 | } 339 | 340 | QRadioButton::indicator:checked:disabled { 341 | outline: none; 342 | image: url(":/qss_icons/dark/rc/radio_checked_disabled.png"); 343 | } 344 | 345 | /* QMenuBar --------------------------------------------------------------- 346 | 347 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar 348 | 349 | --------------------------------------------------------------------------- */ 350 | QMenuBar { 351 | background-color: #455364; 352 | padding: 2px; 353 | border: 1px solid #19232D; 354 | color: #DFE1E2; 355 | selection-background-color: #1A72BB; 356 | } 357 | 358 | QMenuBar:focus { 359 | border: 1px solid #346792; 360 | } 361 | 362 | QMenuBar::item { 363 | background: transparent; 364 | padding: 4px; 365 | } 366 | 367 | QMenuBar::item:selected { 368 | padding: 4px; 369 | background: transparent; 370 | border: 0px solid #455364; 371 | background-color: #1A72BB; 372 | } 373 | 374 | QMenuBar::item:pressed { 375 | padding: 4px; 376 | border: 0px solid #455364; 377 | background-color: #1A72BB; 378 | color: #DFE1E2; 379 | margin-bottom: 0px; 380 | padding-bottom: 0px; 381 | } 382 | 383 | /* QMenu ------------------------------------------------------------------ 384 | 385 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu 386 | 387 | --------------------------------------------------------------------------- */ 388 | QMenu { 389 | border: 0px solid #455364; 390 | color: #DFE1E2; 391 | margin: 0px; 392 | background-color: #37414F; 393 | selection-background-color: #1A72BB; 394 | } 395 | 396 | QMenu::separator { 397 | height: 1px; 398 | background-color: #60798B; 399 | color: #DFE1E2; 400 | } 401 | 402 | QMenu::item { 403 | background-color: #37414F; 404 | padding: 4px 24px 4px 28px; 405 | /* Reserve space for selection border */ 406 | border: 1px transparent #455364; 407 | } 408 | 409 | QMenu::item:selected { 410 | color: #DFE1E2; 411 | background-color: #1A72BB; 412 | } 413 | 414 | QMenu::item:pressed { 415 | background-color: #1A72BB; 416 | } 417 | 418 | QMenu::icon { 419 | padding-left: 10px; 420 | width: 14px; 421 | height: 14px; 422 | } 423 | 424 | QMenu::indicator { 425 | padding-left: 8px; 426 | width: 12px; 427 | height: 12px; 428 | /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ 429 | /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ 430 | } 431 | 432 | QMenu::indicator:non-exclusive:unchecked { 433 | image: url(":/qss_icons/dark/rc/checkbox_unchecked.png"); 434 | } 435 | 436 | QMenu::indicator:non-exclusive:unchecked:hover, QMenu::indicator:non-exclusive:unchecked:focus, QMenu::indicator:non-exclusive:unchecked:pressed { 437 | border: none; 438 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_focus.png"); 439 | } 440 | 441 | QMenu::indicator:non-exclusive:unchecked:disabled { 442 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_disabled.png"); 443 | } 444 | 445 | QMenu::indicator:non-exclusive:checked { 446 | image: url(":/qss_icons/dark/rc/checkbox_checked.png"); 447 | } 448 | 449 | QMenu::indicator:non-exclusive:checked:hover, QMenu::indicator:non-exclusive:checked:focus, QMenu::indicator:non-exclusive:checked:pressed { 450 | border: none; 451 | image: url(":/qss_icons/dark/rc/checkbox_checked_focus.png"); 452 | } 453 | 454 | QMenu::indicator:non-exclusive:checked:disabled { 455 | image: url(":/qss_icons/dark/rc/checkbox_checked_disabled.png"); 456 | } 457 | 458 | QMenu::indicator:non-exclusive:indeterminate { 459 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate.png"); 460 | } 461 | 462 | QMenu::indicator:non-exclusive:indeterminate:disabled { 463 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate_disabled.png"); 464 | } 465 | 466 | QMenu::indicator:non-exclusive:indeterminate:focus, QMenu::indicator:non-exclusive:indeterminate:hover, QMenu::indicator:non-exclusive:indeterminate:pressed { 467 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate_focus.png"); 468 | } 469 | 470 | QMenu::indicator:exclusive:unchecked { 471 | image: url(":/qss_icons/dark/rc/radio_unchecked.png"); 472 | } 473 | 474 | QMenu::indicator:exclusive:unchecked:hover, QMenu::indicator:exclusive:unchecked:focus, QMenu::indicator:exclusive:unchecked:pressed { 475 | border: none; 476 | outline: none; 477 | image: url(":/qss_icons/dark/rc/radio_unchecked_focus.png"); 478 | } 479 | 480 | QMenu::indicator:exclusive:unchecked:disabled { 481 | image: url(":/qss_icons/dark/rc/radio_unchecked_disabled.png"); 482 | } 483 | 484 | QMenu::indicator:exclusive:checked { 485 | border: none; 486 | outline: none; 487 | image: url(":/qss_icons/dark/rc/radio_checked.png"); 488 | } 489 | 490 | QMenu::indicator:exclusive:checked:hover, QMenu::indicator:exclusive:checked:focus, QMenu::indicator:exclusive:checked:pressed { 491 | border: none; 492 | outline: none; 493 | image: url(":/qss_icons/dark/rc/radio_checked_focus.png"); 494 | } 495 | 496 | QMenu::indicator:exclusive:checked:disabled { 497 | outline: none; 498 | image: url(":/qss_icons/dark/rc/radio_checked_disabled.png"); 499 | } 500 | 501 | QMenu::right-arrow { 502 | margin: 5px; 503 | padding-left: 12px; 504 | image: url(":/qss_icons/dark/rc/arrow_right.png"); 505 | height: 12px; 506 | width: 12px; 507 | } 508 | 509 | /* QAbstractItemView ------------------------------------------------------ 510 | 511 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox 512 | 513 | --------------------------------------------------------------------------- */ 514 | QAbstractItemView { 515 | alternate-background-color: #19232D; 516 | color: #DFE1E2; 517 | border: 1px solid #455364; 518 | border-radius: 4px; 519 | } 520 | 521 | QAbstractItemView QLineEdit { 522 | padding: 2px; 523 | } 524 | 525 | /* QAbstractScrollArea ---------------------------------------------------- 526 | 527 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea 528 | 529 | --------------------------------------------------------------------------- */ 530 | QAbstractScrollArea { 531 | background-color: #19232D; 532 | border: 1px solid #455364; 533 | border-radius: 4px; 534 | /* fix #159 */ 535 | padding: 2px; 536 | /* remove min-height to fix #244 */ 537 | color: #DFE1E2; 538 | } 539 | 540 | QAbstractScrollArea:disabled { 541 | color: #788D9C; 542 | } 543 | 544 | /* QScrollArea ------------------------------------------------------------ 545 | 546 | --------------------------------------------------------------------------- */ 547 | QScrollArea QWidget QWidget:disabled { 548 | background-color: #19232D; 549 | } 550 | 551 | /* QScrollBar ------------------------------------------------------------- 552 | 553 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar 554 | 555 | --------------------------------------------------------------------------- */ 556 | QScrollBar:horizontal { 557 | height: 16px; 558 | margin: 2px 16px 2px 16px; 559 | border: 1px solid #455364; 560 | border-radius: 4px; 561 | background-color: #19232D; 562 | } 563 | 564 | QScrollBar:vertical { 565 | background-color: #19232D; 566 | width: 16px; 567 | margin: 16px 2px 16px 2px; 568 | border: 1px solid #455364; 569 | border-radius: 4px; 570 | } 571 | 572 | QScrollBar::handle:horizontal { 573 | background-color: #60798B; 574 | border: 1px solid #455364; 575 | border-radius: 4px; 576 | min-width: 8px; 577 | } 578 | 579 | QScrollBar::handle:horizontal:hover { 580 | background-color: #346792; 581 | border: #346792; 582 | border-radius: 4px; 583 | min-width: 8px; 584 | } 585 | 586 | QScrollBar::handle:horizontal:focus { 587 | border: 1px solid #1A72BB; 588 | } 589 | 590 | QScrollBar::handle:vertical { 591 | background-color: #60798B; 592 | border: 1px solid #455364; 593 | min-height: 8px; 594 | border-radius: 4px; 595 | } 596 | 597 | QScrollBar::handle:vertical:hover { 598 | background-color: #346792; 599 | border: #346792; 600 | border-radius: 4px; 601 | min-height: 8px; 602 | } 603 | 604 | QScrollBar::handle:vertical:focus { 605 | border: 1px solid #1A72BB; 606 | } 607 | 608 | QScrollBar::add-line:horizontal { 609 | margin: 0px 0px 0px 0px; 610 | border-image: url(":/qss_icons/dark/rc/arrow_right_disabled.png"); 611 | height: 12px; 612 | width: 12px; 613 | subcontrol-position: right; 614 | subcontrol-origin: margin; 615 | } 616 | 617 | QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { 618 | border-image: url(":/qss_icons/dark/rc/arrow_right.png"); 619 | height: 12px; 620 | width: 12px; 621 | subcontrol-position: right; 622 | subcontrol-origin: margin; 623 | } 624 | 625 | QScrollBar::add-line:vertical { 626 | margin: 3px 0px 3px 0px; 627 | border-image: url(":/qss_icons/dark/rc/arrow_down_disabled.png"); 628 | height: 12px; 629 | width: 12px; 630 | subcontrol-position: bottom; 631 | subcontrol-origin: margin; 632 | } 633 | 634 | QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { 635 | border-image: url(":/qss_icons/dark/rc/arrow_down.png"); 636 | height: 12px; 637 | width: 12px; 638 | subcontrol-position: bottom; 639 | subcontrol-origin: margin; 640 | } 641 | 642 | QScrollBar::sub-line:horizontal { 643 | margin: 0px 3px 0px 3px; 644 | border-image: url(":/qss_icons/dark/rc/arrow_left_disabled.png"); 645 | height: 12px; 646 | width: 12px; 647 | subcontrol-position: left; 648 | subcontrol-origin: margin; 649 | } 650 | 651 | QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { 652 | border-image: url(":/qss_icons/dark/rc/arrow_left.png"); 653 | height: 12px; 654 | width: 12px; 655 | subcontrol-position: left; 656 | subcontrol-origin: margin; 657 | } 658 | 659 | QScrollBar::sub-line:vertical { 660 | margin: 3px 0px 3px 0px; 661 | border-image: url(":/qss_icons/dark/rc/arrow_up_disabled.png"); 662 | height: 12px; 663 | width: 12px; 664 | subcontrol-position: top; 665 | subcontrol-origin: margin; 666 | } 667 | 668 | QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { 669 | border-image: url(":/qss_icons/dark/rc/arrow_up.png"); 670 | height: 12px; 671 | width: 12px; 672 | subcontrol-position: top; 673 | subcontrol-origin: margin; 674 | } 675 | 676 | QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { 677 | background: none; 678 | } 679 | 680 | QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { 681 | background: none; 682 | } 683 | 684 | QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { 685 | background: none; 686 | } 687 | 688 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 689 | background: none; 690 | } 691 | 692 | /* QTextEdit -------------------------------------------------------------- 693 | 694 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets 695 | 696 | --------------------------------------------------------------------------- */ 697 | QTextEdit { 698 | background-color: #19232D; 699 | color: #DFE1E2; 700 | border-radius: 4px; 701 | border: 1px solid #455364; 702 | } 703 | 704 | QTextEdit:focus { 705 | border: 1px solid #1A72BB; 706 | } 707 | 708 | QTextEdit:selected { 709 | background: #346792; 710 | color: #455364; 711 | } 712 | 713 | /* QPlainTextEdit --------------------------------------------------------- 714 | 715 | --------------------------------------------------------------------------- */ 716 | QPlainTextEdit { 717 | background-color: #19232D; 718 | color: #DFE1E2; 719 | border-radius: 4px; 720 | border: 1px solid #455364; 721 | } 722 | 723 | QPlainTextEdit:focus { 724 | border: 1px solid #1A72BB; 725 | } 726 | 727 | QPlainTextEdit:selected { 728 | background: #346792; 729 | color: #455364; 730 | } 731 | 732 | /* QSizeGrip -------------------------------------------------------------- 733 | 734 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip 735 | 736 | --------------------------------------------------------------------------- */ 737 | QSizeGrip { 738 | background: transparent; 739 | width: 12px; 740 | height: 12px; 741 | image: url(":/qss_icons/dark/rc/window_grip.png"); 742 | } 743 | 744 | /* QStackedWidget --------------------------------------------------------- 745 | 746 | --------------------------------------------------------------------------- */ 747 | QStackedWidget { 748 | padding: 2px; 749 | border: 1px solid #455364; 750 | border: 1px solid #19232D; 751 | } 752 | 753 | /* QToolBar --------------------------------------------------------------- 754 | 755 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar 756 | 757 | --------------------------------------------------------------------------- */ 758 | QToolBar { 759 | background-color: #455364; 760 | border-bottom: 1px solid #19232D; 761 | padding: 1px; 762 | font-weight: bold; 763 | spacing: 2px; 764 | } 765 | 766 | QToolBar:disabled { 767 | /* Fixes #272 */ 768 | background-color: #455364; 769 | } 770 | 771 | QToolBar::handle:horizontal { 772 | width: 16px; 773 | image: url(":/qss_icons/dark/rc/toolbar_move_horizontal.png"); 774 | } 775 | 776 | QToolBar::handle:vertical { 777 | height: 16px; 778 | image: url(":/qss_icons/dark/rc/toolbar_move_vertical.png"); 779 | } 780 | 781 | QToolBar::separator:horizontal { 782 | width: 16px; 783 | image: url(":/qss_icons/dark/rc/toolbar_separator_horizontal.png"); 784 | } 785 | 786 | QToolBar::separator:vertical { 787 | height: 16px; 788 | image: url(":/qss_icons/dark/rc/toolbar_separator_vertical.png"); 789 | } 790 | 791 | QToolButton#qt_toolbar_ext_button { 792 | background: #455364; 793 | border: 0px; 794 | color: #DFE1E2; 795 | image: url(":/qss_icons/dark/rc/arrow_right.png"); 796 | } 797 | 798 | /* QAbstractSpinBox ------------------------------------------------------- 799 | 800 | --------------------------------------------------------------------------- */ 801 | QAbstractSpinBox { 802 | background-color: #19232D; 803 | border: 1px solid #455364; 804 | color: #DFE1E2; 805 | /* This fixes 103, 111 */ 806 | padding-top: 2px; 807 | /* This fixes 103, 111 */ 808 | padding-bottom: 2px; 809 | padding-left: 4px; 810 | padding-right: 4px; 811 | border-radius: 4px; 812 | /* min-width: 5px; removed to fix 109 */ 813 | } 814 | 815 | QAbstractSpinBox:up-button { 816 | background-color: transparent #19232D; 817 | subcontrol-origin: border; 818 | subcontrol-position: top right; 819 | border-left: 1px solid #455364; 820 | border-bottom: 1px solid #455364; 821 | border-top-left-radius: 0; 822 | border-bottom-left-radius: 0; 823 | margin: 1px; 824 | width: 12px; 825 | margin-bottom: -1px; 826 | } 827 | 828 | QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { 829 | image: url(":/qss_icons/dark/rc/arrow_up_disabled.png"); 830 | height: 8px; 831 | width: 8px; 832 | } 833 | 834 | QAbstractSpinBox::up-arrow:hover { 835 | image: url(":/qss_icons/dark/rc/arrow_up.png"); 836 | } 837 | 838 | QAbstractSpinBox:down-button { 839 | background-color: transparent #19232D; 840 | subcontrol-origin: border; 841 | subcontrol-position: bottom right; 842 | border-left: 1px solid #455364; 843 | border-top: 1px solid #455364; 844 | border-top-left-radius: 0; 845 | border-bottom-left-radius: 0; 846 | margin: 1px; 847 | width: 12px; 848 | margin-top: -1px; 849 | } 850 | 851 | QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { 852 | image: url(":/qss_icons/dark/rc/arrow_down_disabled.png"); 853 | height: 8px; 854 | width: 8px; 855 | } 856 | 857 | QAbstractSpinBox::down-arrow:hover { 858 | image: url(":/qss_icons/dark/rc/arrow_down.png"); 859 | } 860 | 861 | QAbstractSpinBox:hover { 862 | border: 1px solid #346792; 863 | color: #DFE1E2; 864 | } 865 | 866 | QAbstractSpinBox:focus { 867 | border: 1px solid #1A72BB; 868 | } 869 | 870 | QAbstractSpinBox:selected { 871 | background: #346792; 872 | color: #455364; 873 | } 874 | 875 | /* ------------------------------------------------------------------------ */ 876 | /* DISPLAYS --------------------------------------------------------------- */ 877 | /* ------------------------------------------------------------------------ */ 878 | /* QLabel ----------------------------------------------------------------- 879 | 880 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe 881 | 882 | --------------------------------------------------------------------------- */ 883 | QLabel { 884 | background-color: #19232D; 885 | border: 0px solid #455364; 886 | padding: 2px; 887 | margin: 0px; 888 | color: #DFE1E2; 889 | } 890 | 891 | QLabel:disabled { 892 | background-color: #19232D; 893 | border: 0px solid #455364; 894 | color: #788D9C; 895 | } 896 | 897 | /* QTextBrowser ----------------------------------------------------------- 898 | 899 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea 900 | 901 | --------------------------------------------------------------------------- */ 902 | QTextBrowser { 903 | background-color: #19232D; 904 | border: 1px solid #455364; 905 | color: #DFE1E2; 906 | border-radius: 4px; 907 | } 908 | 909 | QTextBrowser:disabled { 910 | background-color: #19232D; 911 | border: 1px solid #455364; 912 | color: #788D9C; 913 | border-radius: 4px; 914 | } 915 | 916 | QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { 917 | border: 1px solid #455364; 918 | } 919 | 920 | /* QGraphicsView ---------------------------------------------------------- 921 | 922 | --------------------------------------------------------------------------- */ 923 | QGraphicsView { 924 | background-color: #19232D; 925 | border: 1px solid #455364; 926 | color: #DFE1E2; 927 | border-radius: 4px; 928 | } 929 | 930 | QGraphicsView:disabled { 931 | background-color: #19232D; 932 | border: 1px solid #455364; 933 | color: #788D9C; 934 | border-radius: 4px; 935 | } 936 | 937 | QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { 938 | border: 1px solid #455364; 939 | } 940 | 941 | /* QCalendarWidget -------------------------------------------------------- 942 | 943 | --------------------------------------------------------------------------- */ 944 | QCalendarWidget { 945 | border: 1px solid #455364; 946 | border-radius: 4px; 947 | } 948 | 949 | QCalendarWidget:disabled { 950 | background-color: #19232D; 951 | color: #788D9C; 952 | } 953 | 954 | /* QLCDNumber ------------------------------------------------------------- 955 | 956 | --------------------------------------------------------------------------- */ 957 | QLCDNumber { 958 | background-color: #19232D; 959 | color: #DFE1E2; 960 | } 961 | 962 | QLCDNumber:disabled { 963 | background-color: #19232D; 964 | color: #788D9C; 965 | } 966 | 967 | /* QProgressBar ----------------------------------------------------------- 968 | 969 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar 970 | 971 | --------------------------------------------------------------------------- */ 972 | QProgressBar { 973 | background-color: #19232D; 974 | border: 1px solid #455364; 975 | color: #DFE1E2; 976 | border-radius: 4px; 977 | text-align: center; 978 | } 979 | 980 | QProgressBar:disabled { 981 | background-color: #19232D; 982 | border: 1px solid #455364; 983 | color: #788D9C; 984 | border-radius: 4px; 985 | text-align: center; 986 | } 987 | 988 | QProgressBar::chunk { 989 | background-color: #346792; 990 | color: #19232D; 991 | border-radius: 4px; 992 | } 993 | 994 | QProgressBar::chunk:disabled { 995 | background-color: #26486B; 996 | color: #788D9C; 997 | border-radius: 4px; 998 | } 999 | 1000 | /* ------------------------------------------------------------------------ */ 1001 | /* BUTTONS ---------------------------------------------------------------- */ 1002 | /* ------------------------------------------------------------------------ */ 1003 | /* QPushButton ------------------------------------------------------------ 1004 | 1005 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton 1006 | 1007 | --------------------------------------------------------------------------- */ 1008 | QPushButton { 1009 | background-color: #455364; 1010 | color: #DFE1E2; 1011 | border-radius: 4px; 1012 | padding: 2px; 1013 | outline: none; 1014 | border: none; 1015 | } 1016 | 1017 | QPushButton:disabled { 1018 | background-color: #455364; 1019 | color: #788D9C; 1020 | border-radius: 4px; 1021 | padding: 2px; 1022 | } 1023 | 1024 | QPushButton:checked { 1025 | background-color: #60798B; 1026 | border-radius: 4px; 1027 | padding: 2px; 1028 | outline: none; 1029 | } 1030 | 1031 | QPushButton:checked:disabled { 1032 | background-color: #60798B; 1033 | color: #788D9C; 1034 | border-radius: 4px; 1035 | padding: 2px; 1036 | outline: none; 1037 | } 1038 | 1039 | QPushButton:checked:selected { 1040 | background: #60798B; 1041 | } 1042 | 1043 | QPushButton:hover { 1044 | background-color: #54687A; 1045 | color: #DFE1E2; 1046 | } 1047 | 1048 | QPushButton:pressed { 1049 | background-color: #60798B; 1050 | } 1051 | 1052 | QPushButton:selected { 1053 | background: #60798B; 1054 | color: #DFE1E2; 1055 | } 1056 | 1057 | QPushButton::menu-indicator { 1058 | subcontrol-origin: padding; 1059 | subcontrol-position: bottom right; 1060 | bottom: 4px; 1061 | } 1062 | 1063 | QDialogButtonBox QPushButton { 1064 | /* Issue #194 #248 - Special case of QPushButton inside dialogs, for better UI */ 1065 | min-width: 80px; 1066 | } 1067 | 1068 | /* QToolButton ------------------------------------------------------------ 1069 | 1070 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton 1071 | 1072 | --------------------------------------------------------------------------- */ 1073 | QToolButton { 1074 | background-color: #455364; 1075 | color: #DFE1E2; 1076 | border-radius: 4px; 1077 | padding: 2px; 1078 | outline: none; 1079 | border: none; 1080 | /* The subcontrols below are used only in the DelayedPopup mode */ 1081 | /* The subcontrols below are used only in the MenuButtonPopup mode */ 1082 | /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ 1083 | } 1084 | 1085 | QToolButton:disabled { 1086 | background-color: #455364; 1087 | color: #788D9C; 1088 | border-radius: 4px; 1089 | padding: 2px; 1090 | } 1091 | 1092 | QToolButton:checked { 1093 | background-color: #60798B; 1094 | border-radius: 4px; 1095 | padding: 2px; 1096 | outline: none; 1097 | } 1098 | 1099 | QToolButton:checked:disabled { 1100 | background-color: #60798B; 1101 | color: #788D9C; 1102 | border-radius: 4px; 1103 | padding: 2px; 1104 | outline: none; 1105 | } 1106 | 1107 | QToolButton:checked:hover { 1108 | background-color: #54687A; 1109 | color: #DFE1E2; 1110 | } 1111 | 1112 | QToolButton:checked:pressed { 1113 | background-color: #60798B; 1114 | } 1115 | 1116 | QToolButton:checked:selected { 1117 | background: #60798B; 1118 | color: #DFE1E2; 1119 | } 1120 | 1121 | QToolButton:hover { 1122 | background-color: #54687A; 1123 | color: #DFE1E2; 1124 | } 1125 | 1126 | QToolButton:pressed { 1127 | background-color: #60798B; 1128 | } 1129 | 1130 | QToolButton:selected { 1131 | background: #60798B; 1132 | color: #DFE1E2; 1133 | } 1134 | 1135 | QToolButton[popupMode="0"] { 1136 | /* Only for DelayedPopup */ 1137 | padding-right: 2px; 1138 | } 1139 | 1140 | QToolButton[popupMode="1"] { 1141 | /* Only for MenuButtonPopup */ 1142 | padding-right: 20px; 1143 | } 1144 | 1145 | QToolButton[popupMode="1"]::menu-button { 1146 | border: none; 1147 | } 1148 | 1149 | QToolButton[popupMode="1"]::menu-button:hover { 1150 | border: none; 1151 | border-left: 1px solid #455364; 1152 | border-radius: 0; 1153 | } 1154 | 1155 | QToolButton[popupMode="2"] { 1156 | /* Only for InstantPopup */ 1157 | padding-right: 2px; 1158 | } 1159 | 1160 | QToolButton::menu-button { 1161 | padding: 2px; 1162 | border-radius: 4px; 1163 | width: 12px; 1164 | border: none; 1165 | outline: none; 1166 | } 1167 | 1168 | QToolButton::menu-button:hover { 1169 | border: 1px solid #346792; 1170 | } 1171 | 1172 | QToolButton::menu-button:checked:hover { 1173 | border: 1px solid #346792; 1174 | } 1175 | 1176 | QToolButton::menu-indicator { 1177 | image: url(":/qss_icons/dark/rc/arrow_down.png"); 1178 | height: 8px; 1179 | width: 8px; 1180 | top: 0; 1181 | /* Exclude a shift for better image */ 1182 | left: -2px; 1183 | /* Shift it a bit */ 1184 | } 1185 | 1186 | QToolButton::menu-arrow { 1187 | image: url(":/qss_icons/dark/rc/arrow_down.png"); 1188 | height: 8px; 1189 | width: 8px; 1190 | } 1191 | 1192 | QToolButton::menu-arrow:hover { 1193 | image: url(":/qss_icons/dark/rc/arrow_down_focus.png"); 1194 | } 1195 | 1196 | /* QCommandLinkButton ----------------------------------------------------- 1197 | 1198 | --------------------------------------------------------------------------- */ 1199 | QCommandLinkButton { 1200 | background-color: transparent; 1201 | border: 1px solid #455364; 1202 | color: #DFE1E2; 1203 | border-radius: 4px; 1204 | padding: 0px; 1205 | margin: 0px; 1206 | } 1207 | 1208 | QCommandLinkButton:disabled { 1209 | background-color: transparent; 1210 | color: #788D9C; 1211 | } 1212 | 1213 | /* ------------------------------------------------------------------------ */ 1214 | /* INPUTS - NO FIELDS ----------------------------------------------------- */ 1215 | /* ------------------------------------------------------------------------ */ 1216 | /* QComboBox -------------------------------------------------------------- 1217 | 1218 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox 1219 | 1220 | --------------------------------------------------------------------------- */ 1221 | QComboBox { 1222 | border: 1px solid #455364; 1223 | border-radius: 4px; 1224 | selection-background-color: #346792; 1225 | padding-left: 4px; 1226 | padding-right: 4px; 1227 | /* padding-right = 36; 4 + 16*2 See scrollbar size */ 1228 | /* changed to 4px to fix #239 */ 1229 | /* Fixes #103, #111 */ 1230 | min-height: 1.5em; 1231 | /* padding-top: 2px; removed to fix #132 */ 1232 | /* padding-bottom: 2px; removed to fix #132 */ 1233 | /* min-width: 75px; removed to fix #109 */ 1234 | /* Needed to remove indicator - fix #132 */ 1235 | } 1236 | 1237 | QComboBox QAbstractItemView { 1238 | border: 1px solid #455364; 1239 | border-radius: 0; 1240 | background-color: #19232D; 1241 | selection-background-color: #346792; 1242 | } 1243 | 1244 | QComboBox QAbstractItemView:hover { 1245 | background-color: #19232D; 1246 | color: #DFE1E2; 1247 | } 1248 | 1249 | QComboBox QAbstractItemView:selected { 1250 | background: #346792; 1251 | color: #455364; 1252 | } 1253 | 1254 | QComboBox QAbstractItemView:alternate { 1255 | background: #19232D; 1256 | } 1257 | 1258 | QComboBox:disabled { 1259 | background-color: #19232D; 1260 | color: #788D9C; 1261 | } 1262 | 1263 | QComboBox:hover { 1264 | border: 1px solid #346792; 1265 | } 1266 | 1267 | QComboBox:focus { 1268 | border: 1px solid #1A72BB; 1269 | } 1270 | 1271 | QComboBox:on { 1272 | selection-background-color: #346792; 1273 | } 1274 | 1275 | QComboBox::indicator { 1276 | border: none; 1277 | border-radius: 0; 1278 | background-color: transparent; 1279 | selection-background-color: transparent; 1280 | color: transparent; 1281 | selection-color: transparent; 1282 | /* Needed to remove indicator - fix #132 */ 1283 | } 1284 | 1285 | QComboBox::indicator:alternate { 1286 | background: #19232D; 1287 | } 1288 | 1289 | QComboBox::item { 1290 | /* Remove to fix #282, #285 and MR #288*/ 1291 | /*&:checked { 1292 | font-weight: bold; 1293 | } 1294 | 1295 | &:selected { 1296 | border: 0px solid transparent; 1297 | } 1298 | */ 1299 | } 1300 | 1301 | QComboBox::item:alternate { 1302 | background: #19232D; 1303 | } 1304 | 1305 | QComboBox::drop-down { 1306 | subcontrol-origin: padding; 1307 | subcontrol-position: top right; 1308 | width: 12px; 1309 | border-left: 1px solid #455364; 1310 | } 1311 | 1312 | QComboBox::down-arrow { 1313 | image: url("./qss_icons/dark/rc/arrow_down_disabled.png"); 1314 | height: 8px; 1315 | width: 8px; 1316 | } 1317 | 1318 | QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { 1319 | image: url("./qss_icons/dark/rc/arrow_down.png"); 1320 | } 1321 | 1322 | /* QSlider ---------------------------------------------------------------- 1323 | 1324 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider 1325 | 1326 | --------------------------------------------------------------------------- */ 1327 | QSlider:disabled { 1328 | background: #19232D; 1329 | } 1330 | 1331 | QSlider:focus { 1332 | border: none; 1333 | } 1334 | 1335 | QSlider::groove:horizontal { 1336 | background: #455364; 1337 | border: 1px solid #455364; 1338 | height: 4px; 1339 | margin: 0px; 1340 | border-radius: 4px; 1341 | } 1342 | 1343 | QSlider::groove:vertical { 1344 | background: #455364; 1345 | border: 1px solid #455364; 1346 | width: 4px; 1347 | margin: 0px; 1348 | border-radius: 4px; 1349 | } 1350 | 1351 | QSlider::add-page:vertical { 1352 | background: #346792; 1353 | border: 1px solid #455364; 1354 | width: 4px; 1355 | margin: 0px; 1356 | border-radius: 4px; 1357 | } 1358 | 1359 | QSlider::add-page:vertical :disabled { 1360 | background: #26486B; 1361 | } 1362 | 1363 | QSlider::sub-page:horizontal { 1364 | background: #346792; 1365 | border: 1px solid #455364; 1366 | height: 4px; 1367 | margin: 0px; 1368 | border-radius: 4px; 1369 | } 1370 | 1371 | QSlider::sub-page:horizontal:disabled { 1372 | background: #26486B; 1373 | } 1374 | 1375 | QSlider::handle:horizontal { 1376 | background: #9DA9B5; 1377 | border: 1px solid #455364; 1378 | width: 8px; 1379 | height: 8px; 1380 | margin: -8px 0px; 1381 | border-radius: 4px; 1382 | } 1383 | 1384 | QSlider::handle:horizontal:hover { 1385 | background: #346792; 1386 | border: 1px solid #346792; 1387 | } 1388 | 1389 | QSlider::handle:horizontal:focus { 1390 | border: 1px solid #1A72BB; 1391 | } 1392 | 1393 | QSlider::handle:vertical { 1394 | background: #9DA9B5; 1395 | border: 1px solid #455364; 1396 | width: 8px; 1397 | height: 8px; 1398 | margin: 0 -8px; 1399 | border-radius: 4px; 1400 | } 1401 | 1402 | QSlider::handle:vertical:hover { 1403 | background: #346792; 1404 | border: 1px solid #346792; 1405 | } 1406 | 1407 | QSlider::handle:vertical:focus { 1408 | border: 1px solid #1A72BB; 1409 | } 1410 | 1411 | /* QLineEdit -------------------------------------------------------------- 1412 | 1413 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit 1414 | 1415 | --------------------------------------------------------------------------- */ 1416 | QLineEdit { 1417 | background-color: #19232D; 1418 | padding-top: 2px; 1419 | /* This QLineEdit fix 103, 111 */ 1420 | padding-bottom: 2px; 1421 | /* This QLineEdit fix 103, 111 */ 1422 | padding-left: 4px; 1423 | padding-right: 4px; 1424 | border-style: solid; 1425 | border: 1px solid #455364; 1426 | border-radius: 4px; 1427 | color: #DFE1E2; 1428 | } 1429 | 1430 | QLineEdit:disabled { 1431 | background-color: #19232D; 1432 | color: #788D9C; 1433 | } 1434 | 1435 | QLineEdit:hover { 1436 | border: 1px solid #346792; 1437 | color: #DFE1E2; 1438 | } 1439 | 1440 | QLineEdit:focus { 1441 | border: 1px solid #1A72BB; 1442 | } 1443 | 1444 | QLineEdit:selected { 1445 | background-color: #346792; 1446 | color: #455364; 1447 | } 1448 | 1449 | /* QTabWiget -------------------------------------------------------------- 1450 | 1451 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar 1452 | 1453 | --------------------------------------------------------------------------- */ 1454 | QTabWidget { 1455 | padding: 2px; 1456 | selection-background-color: #455364; 1457 | } 1458 | 1459 | QTabWidget QWidget { 1460 | /* Fixes #189 */ 1461 | border-radius: 4px; 1462 | } 1463 | 1464 | QTabWidget::pane { 1465 | border: 1px solid #455364; 1466 | border-radius: 4px; 1467 | margin: 0px; 1468 | /* Fixes double border inside pane with pyqt5 */ 1469 | padding: 0px; 1470 | } 1471 | 1472 | QTabWidget::pane:selected { 1473 | background-color: #455364; 1474 | border: 1px solid #346792; 1475 | } 1476 | 1477 | /* QTabBar ---------------------------------------------------------------- 1478 | 1479 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar 1480 | 1481 | --------------------------------------------------------------------------- */ 1482 | QTabBar, QDockWidget QTabBar { 1483 | qproperty-drawBase: 0; 1484 | border-radius: 4px; 1485 | margin: 0px; 1486 | padding: 2px; 1487 | border: 0; 1488 | /* left: 5px; move to the right by 5px - removed for fix */ 1489 | } 1490 | 1491 | QTabBar::close-button, QDockWidget QTabBar::close-button { 1492 | border: 0; 1493 | margin: 0; 1494 | padding: 4px; 1495 | image: url(":/qss_icons/dark/rc/window_close.png"); 1496 | } 1497 | 1498 | QTabBar::close-button:hover, QDockWidget QTabBar::close-button:hover { 1499 | image: url(":/qss_icons/dark/rc/window_close_focus.png"); 1500 | } 1501 | 1502 | QTabBar::close-button:pressed, QDockWidget QTabBar::close-button:pressed { 1503 | image: url(":/qss_icons/dark/rc/window_close_pressed.png"); 1504 | } 1505 | 1506 | QTabBar::tab, QDockWidget QTabBar::tab { 1507 | /* !selected and disabled ----------------------------------------- */ 1508 | /* selected ------------------------------------------------------- */ 1509 | } 1510 | 1511 | QTabBar::tab:top:selected:disabled, QDockWidget QTabBar::tab:top:selected:disabled { 1512 | border-bottom: 3px solid #26486B; 1513 | color: #788D9C; 1514 | background-color: #455364; 1515 | } 1516 | 1517 | QTabBar::tab:bottom:selected:disabled, QDockWidget QTabBar::tab:bottom:selected:disabled { 1518 | border-top: 3px solid #26486B; 1519 | color: #788D9C; 1520 | background-color: #455364; 1521 | } 1522 | 1523 | QTabBar::tab:left:selected:disabled, QDockWidget QTabBar::tab:left:selected:disabled { 1524 | border-right: 3px solid #26486B; 1525 | color: #788D9C; 1526 | background-color: #455364; 1527 | } 1528 | 1529 | QTabBar::tab:right:selected:disabled, QDockWidget QTabBar::tab:right:selected:disabled { 1530 | border-left: 3px solid #26486B; 1531 | color: #788D9C; 1532 | background-color: #455364; 1533 | } 1534 | 1535 | QTabBar::tab:top:!selected:disabled, QDockWidget QTabBar::tab:top:!selected:disabled { 1536 | border-bottom: 3px solid #19232D; 1537 | color: #788D9C; 1538 | background-color: #19232D; 1539 | } 1540 | 1541 | QTabBar::tab:bottom:!selected:disabled, QDockWidget QTabBar::tab:bottom:!selected:disabled { 1542 | border-top: 3px solid #19232D; 1543 | color: #788D9C; 1544 | background-color: #19232D; 1545 | } 1546 | 1547 | QTabBar::tab:left:!selected:disabled, QDockWidget QTabBar::tab:left:!selected:disabled { 1548 | border-right: 3px solid #19232D; 1549 | color: #788D9C; 1550 | background-color: #19232D; 1551 | } 1552 | 1553 | QTabBar::tab:right:!selected:disabled, QDockWidget QTabBar::tab:right:!selected:disabled { 1554 | border-left: 3px solid #19232D; 1555 | color: #788D9C; 1556 | background-color: #19232D; 1557 | } 1558 | 1559 | QTabBar::tab:top:!selected, QDockWidget QTabBar::tab:top:!selected { 1560 | border-bottom: 2px solid #19232D; 1561 | margin-top: 2px; 1562 | } 1563 | 1564 | QTabBar::tab:bottom:!selected, QDockWidget QTabBar::tab:bottom:!selected { 1565 | border-top: 2px solid #19232D; 1566 | margin-bottom: 2px; 1567 | } 1568 | 1569 | QTabBar::tab:left:!selected, QDockWidget QTabBar::tab:left:!selected { 1570 | border-left: 2px solid #19232D; 1571 | margin-right: 2px; 1572 | } 1573 | 1574 | QTabBar::tab:right:!selected, QDockWidget QTabBar::tab:right:!selected { 1575 | border-right: 2px solid #19232D; 1576 | margin-left: 2px; 1577 | } 1578 | 1579 | QTabBar::tab:top, QDockWidget QTabBar::tab:top { 1580 | background-color: #455364; 1581 | margin-left: 2px; 1582 | padding-left: 4px; 1583 | padding-right: 4px; 1584 | padding-top: 2px; 1585 | padding-bottom: 2px; 1586 | min-width: 5px; 1587 | border-bottom: 3px solid #455364; 1588 | border-top-left-radius: 4px; 1589 | border-top-right-radius: 4px; 1590 | } 1591 | 1592 | QTabBar::tab:top:selected, QDockWidget QTabBar::tab:top:selected { 1593 | background-color: #54687A; 1594 | border-bottom: 3px solid #259AE9; 1595 | border-top-left-radius: 4px; 1596 | border-top-right-radius: 4px; 1597 | } 1598 | 1599 | QTabBar::tab:top:!selected:hover, QDockWidget QTabBar::tab:top:!selected:hover { 1600 | border: 1px solid #1A72BB; 1601 | border-bottom: 3px solid #1A72BB; 1602 | /* Fixes spyder-ide/spyder#9766 and #243 */ 1603 | padding-left: 3px; 1604 | padding-right: 3px; 1605 | } 1606 | 1607 | QTabBar::tab:bottom, QDockWidget QTabBar::tab:bottom { 1608 | border-top: 3px solid #455364; 1609 | background-color: #455364; 1610 | margin-left: 2px; 1611 | padding-left: 4px; 1612 | padding-right: 4px; 1613 | padding-top: 2px; 1614 | padding-bottom: 2px; 1615 | border-bottom-left-radius: 4px; 1616 | border-bottom-right-radius: 4px; 1617 | min-width: 5px; 1618 | } 1619 | 1620 | QTabBar::tab:bottom:selected, QDockWidget QTabBar::tab:bottom:selected { 1621 | background-color: #54687A; 1622 | border-top: 3px solid #259AE9; 1623 | border-bottom-left-radius: 4px; 1624 | border-bottom-right-radius: 4px; 1625 | } 1626 | 1627 | QTabBar::tab:bottom:!selected:hover, QDockWidget QTabBar::tab:bottom:!selected:hover { 1628 | border: 1px solid #1A72BB; 1629 | border-top: 3px solid #1A72BB; 1630 | /* Fixes spyder-ide/spyder#9766 and #243 */ 1631 | padding-left: 3px; 1632 | padding-right: 3px; 1633 | } 1634 | 1635 | QTabBar::tab:left, QDockWidget QTabBar::tab:left { 1636 | background-color: #455364; 1637 | margin-top: 2px; 1638 | padding-left: 2px; 1639 | padding-right: 2px; 1640 | padding-top: 4px; 1641 | padding-bottom: 4px; 1642 | border-top-left-radius: 4px; 1643 | border-bottom-left-radius: 4px; 1644 | min-height: 5px; 1645 | } 1646 | 1647 | QTabBar::tab:left:selected, QDockWidget QTabBar::tab:left:selected { 1648 | background-color: #54687A; 1649 | border-right: 3px solid #259AE9; 1650 | } 1651 | 1652 | QTabBar::tab:left:!selected:hover, QDockWidget QTabBar::tab:left:!selected:hover { 1653 | border: 1px solid #1A72BB; 1654 | border-right: 3px solid #1A72BB; 1655 | /* Fixes different behavior #271 */ 1656 | margin-right: 0px; 1657 | padding-right: -1px; 1658 | } 1659 | 1660 | QTabBar::tab:right, QDockWidget QTabBar::tab:right { 1661 | background-color: #455364; 1662 | margin-top: 2px; 1663 | padding-left: 2px; 1664 | padding-right: 2px; 1665 | padding-top: 4px; 1666 | padding-bottom: 4px; 1667 | border-top-right-radius: 4px; 1668 | border-bottom-right-radius: 4px; 1669 | min-height: 5px; 1670 | } 1671 | 1672 | QTabBar::tab:right:selected, QDockWidget QTabBar::tab:right:selected { 1673 | background-color: #54687A; 1674 | border-left: 3px solid #259AE9; 1675 | } 1676 | 1677 | QTabBar::tab:right:!selected:hover, QDockWidget QTabBar::tab:right:!selected:hover { 1678 | border: 1px solid #1A72BB; 1679 | border-left: 3px solid #1A72BB; 1680 | /* Fixes different behavior #271 */ 1681 | margin-left: 0px; 1682 | padding-left: 0px; 1683 | } 1684 | 1685 | QTabBar QToolButton, QDockWidget QTabBar QToolButton { 1686 | /* Fixes #136 */ 1687 | background-color: #455364; 1688 | height: 12px; 1689 | width: 12px; 1690 | } 1691 | 1692 | QTabBar QToolButton:pressed, QDockWidget QTabBar QToolButton:pressed { 1693 | background-color: #455364; 1694 | } 1695 | 1696 | QTabBar QToolButton:pressed:hover, QDockWidget QTabBar QToolButton:pressed:hover { 1697 | border: 1px solid #346792; 1698 | } 1699 | 1700 | QTabBar QToolButton::left-arrow:enabled, QDockWidget QTabBar QToolButton::left-arrow:enabled { 1701 | image: url(":/qss_icons/dark/rc/arrow_left.png"); 1702 | } 1703 | 1704 | QTabBar QToolButton::left-arrow:disabled, QDockWidget QTabBar QToolButton::left-arrow:disabled { 1705 | image: url(":/qss_icons/dark/rc/arrow_left_disabled.png"); 1706 | } 1707 | 1708 | QTabBar QToolButton::right-arrow:enabled, QDockWidget QTabBar QToolButton::right-arrow:enabled { 1709 | image: url(":/qss_icons/dark/rc/arrow_right.png"); 1710 | } 1711 | 1712 | QTabBar QToolButton::right-arrow:disabled, QDockWidget QTabBar QToolButton::right-arrow:disabled { 1713 | image: url(":/qss_icons/dark/rc/arrow_right_disabled.png"); 1714 | } 1715 | 1716 | /* QDockWiget ------------------------------------------------------------- 1717 | 1718 | --------------------------------------------------------------------------- */ 1719 | QDockWidget { 1720 | outline: 1px solid #455364; 1721 | background-color: #19232D; 1722 | border: 1px solid #455364; 1723 | border-radius: 4px; 1724 | titlebar-close-icon: url(":/qss_icons/dark/rc/transparent.png"); 1725 | titlebar-normal-icon: url(":/qss_icons/dark/rc/transparent.png"); 1726 | } 1727 | 1728 | QDockWidget::title { 1729 | /* Better size for title bar */ 1730 | padding: 3px; 1731 | spacing: 4px; 1732 | border: none; 1733 | background-color: #455364; 1734 | } 1735 | 1736 | QDockWidget::close-button { 1737 | icon-size: 12px; 1738 | border: none; 1739 | background: transparent; 1740 | background-image: transparent; 1741 | border: 0; 1742 | margin: 0; 1743 | padding: 0; 1744 | image: url(":/qss_icons/dark/rc/window_close.png"); 1745 | } 1746 | 1747 | QDockWidget::close-button:hover { 1748 | image: url(":/qss_icons/dark/rc/window_close_focus.png"); 1749 | } 1750 | 1751 | QDockWidget::close-button:pressed { 1752 | image: url(":/qss_icons/dark/rc/window_close_pressed.png"); 1753 | } 1754 | 1755 | QDockWidget::float-button { 1756 | icon-size: 12px; 1757 | border: none; 1758 | background: transparent; 1759 | background-image: transparent; 1760 | border: 0; 1761 | margin: 0; 1762 | padding: 0; 1763 | image: url(":/qss_icons/dark/rc/window_undock.png"); 1764 | } 1765 | 1766 | QDockWidget::float-button:hover { 1767 | image: url(":/qss_icons/dark/rc/window_undock_focus.png"); 1768 | } 1769 | 1770 | QDockWidget::float-button:pressed { 1771 | image: url(":/qss_icons/dark/rc/window_undock_pressed.png"); 1772 | } 1773 | 1774 | /* QTreeView QListView QTableView ----------------------------------------- 1775 | 1776 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview 1777 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview 1778 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview 1779 | 1780 | --------------------------------------------------------------------------- */ 1781 | QTreeView:branch:selected, QTreeView:branch:hover { 1782 | background: url(":/qss_icons/dark/rc/transparent.png"); 1783 | } 1784 | 1785 | QTreeView:branch:has-siblings:!adjoins-item { 1786 | border-image: url(":/qss_icons/dark/rc/branch_line.png") 0; 1787 | } 1788 | 1789 | QTreeView:branch:has-siblings:adjoins-item { 1790 | border-image: url(":/qss_icons/dark/rc/branch_more.png") 0; 1791 | } 1792 | 1793 | QTreeView:branch:!has-children:!has-siblings:adjoins-item { 1794 | border-image: url(":/qss_icons/dark/rc/branch_end.png") 0; 1795 | } 1796 | 1797 | QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { 1798 | border-image: none; 1799 | image: url(":/qss_icons/dark/rc/branch_closed.png"); 1800 | } 1801 | 1802 | QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { 1803 | border-image: none; 1804 | image: url(":/qss_icons/dark/rc/branch_open.png"); 1805 | } 1806 | 1807 | QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { 1808 | image: url(":/qss_icons/dark/rc/branch_closed_focus.png"); 1809 | } 1810 | 1811 | QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { 1812 | image: url(":/qss_icons/dark/rc/branch_open_focus.png"); 1813 | } 1814 | 1815 | QTreeView::indicator:checked, 1816 | QListView::indicator:checked, 1817 | QTableView::indicator:checked, 1818 | QColumnView::indicator:checked { 1819 | image: url(":/qss_icons/dark/rc/checkbox_checked.png"); 1820 | } 1821 | 1822 | QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, 1823 | QListView::indicator:checked:hover, 1824 | QListView::indicator:checked:focus, 1825 | QListView::indicator:checked:pressed, 1826 | QTableView::indicator:checked:hover, 1827 | QTableView::indicator:checked:focus, 1828 | QTableView::indicator:checked:pressed, 1829 | QColumnView::indicator:checked:hover, 1830 | QColumnView::indicator:checked:focus, 1831 | QColumnView::indicator:checked:pressed { 1832 | image: url(":/qss_icons/dark/rc/checkbox_checked_focus.png"); 1833 | } 1834 | 1835 | QTreeView::indicator:unchecked, 1836 | QListView::indicator:unchecked, 1837 | QTableView::indicator:unchecked, 1838 | QColumnView::indicator:unchecked { 1839 | image: url(":/qss_icons/dark/rc/checkbox_unchecked.png"); 1840 | } 1841 | 1842 | QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, 1843 | QListView::indicator:unchecked:hover, 1844 | QListView::indicator:unchecked:focus, 1845 | QListView::indicator:unchecked:pressed, 1846 | QTableView::indicator:unchecked:hover, 1847 | QTableView::indicator:unchecked:focus, 1848 | QTableView::indicator:unchecked:pressed, 1849 | QColumnView::indicator:unchecked:hover, 1850 | QColumnView::indicator:unchecked:focus, 1851 | QColumnView::indicator:unchecked:pressed { 1852 | image: url(":/qss_icons/dark/rc/checkbox_unchecked_focus.png"); 1853 | } 1854 | 1855 | QTreeView::indicator:indeterminate, 1856 | QListView::indicator:indeterminate, 1857 | QTableView::indicator:indeterminate, 1858 | QColumnView::indicator:indeterminate { 1859 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate.png"); 1860 | } 1861 | 1862 | QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, 1863 | QListView::indicator:indeterminate:hover, 1864 | QListView::indicator:indeterminate:focus, 1865 | QListView::indicator:indeterminate:pressed, 1866 | QTableView::indicator:indeterminate:hover, 1867 | QTableView::indicator:indeterminate:focus, 1868 | QTableView::indicator:indeterminate:pressed, 1869 | QColumnView::indicator:indeterminate:hover, 1870 | QColumnView::indicator:indeterminate:focus, 1871 | QColumnView::indicator:indeterminate:pressed { 1872 | image: url(":/qss_icons/dark/rc/checkbox_indeterminate_focus.png"); 1873 | } 1874 | 1875 | QTreeView, 1876 | QListView, 1877 | QTableView, 1878 | QColumnView { 1879 | background-color: #19232D; 1880 | border: 1px solid #455364; 1881 | color: #DFE1E2; 1882 | gridline-color: #455364; 1883 | border-radius: 4px; 1884 | } 1885 | 1886 | QTreeView:disabled, 1887 | QListView:disabled, 1888 | QTableView:disabled, 1889 | QColumnView:disabled { 1890 | background-color: #19232D; 1891 | color: #788D9C; 1892 | } 1893 | 1894 | QTreeView:selected, 1895 | QListView:selected, 1896 | QTableView:selected, 1897 | QColumnView:selected { 1898 | background-color: #346792; 1899 | color: #455364; 1900 | } 1901 | 1902 | QTreeView:focus, 1903 | QListView:focus, 1904 | QTableView:focus, 1905 | QColumnView:focus { 1906 | border: 1px solid #1A72BB; 1907 | } 1908 | 1909 | QTreeView::item:pressed, 1910 | QListView::item:pressed, 1911 | QTableView::item:pressed, 1912 | QColumnView::item:pressed { 1913 | background-color: #346792; 1914 | } 1915 | 1916 | QTreeView::item:selected:active, 1917 | QListView::item:selected:active, 1918 | QTableView::item:selected:active, 1919 | QColumnView::item:selected:active { 1920 | background-color: #346792; 1921 | } 1922 | 1923 | QTreeView::item:selected:!active, 1924 | QListView::item:selected:!active, 1925 | QTableView::item:selected:!active, 1926 | QColumnView::item:selected:!active { 1927 | color: #DFE1E2; 1928 | background-color: #37414F; 1929 | } 1930 | 1931 | QTreeView::item:!selected:hover, 1932 | QListView::item:!selected:hover, 1933 | QTableView::item:!selected:hover, 1934 | QColumnView::item:!selected:hover { 1935 | outline: 0; 1936 | color: #DFE1E2; 1937 | background-color: #37414F; 1938 | } 1939 | 1940 | QTableCornerButton::section { 1941 | background-color: #19232D; 1942 | border: 1px transparent #455364; 1943 | border-radius: 0px; 1944 | } 1945 | 1946 | /* QHeaderView ------------------------------------------------------------ 1947 | 1948 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview 1949 | 1950 | --------------------------------------------------------------------------- */ 1951 | QHeaderView { 1952 | background-color: #455364; 1953 | border: 0px transparent #455364; 1954 | padding: 0; 1955 | margin: 0; 1956 | border-radius: 0; 1957 | } 1958 | 1959 | QHeaderView:disabled { 1960 | background-color: #455364; 1961 | border: 1px transparent #455364; 1962 | } 1963 | 1964 | QHeaderView::section { 1965 | background-color: #455364; 1966 | color: #DFE1E2; 1967 | border-radius: 0; 1968 | text-align: left; 1969 | font-size: 13px; 1970 | } 1971 | 1972 | QHeaderView::section::horizontal { 1973 | padding-top: 0; 1974 | padding-bottom: 0; 1975 | padding-left: 4px; 1976 | padding-right: 4px; 1977 | border-left: 1px solid #19232D; 1978 | } 1979 | 1980 | QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { 1981 | border-left: 1px solid #455364; 1982 | } 1983 | 1984 | QHeaderView::section::horizontal:disabled { 1985 | color: #788D9C; 1986 | } 1987 | 1988 | QHeaderView::section::vertical { 1989 | padding-top: 0; 1990 | padding-bottom: 0; 1991 | padding-left: 4px; 1992 | padding-right: 4px; 1993 | border-top: 1px solid #19232D; 1994 | } 1995 | 1996 | QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { 1997 | border-top: 1px solid #455364; 1998 | } 1999 | 2000 | QHeaderView::section::vertical:disabled { 2001 | color: #788D9C; 2002 | } 2003 | 2004 | QHeaderView::down-arrow { 2005 | /* Those settings (border/width/height/background-color) solve bug */ 2006 | /* transparent arrow background and size */ 2007 | background-color: #455364; 2008 | border: none; 2009 | height: 12px; 2010 | width: 12px; 2011 | padding-left: 2px; 2012 | padding-right: 2px; 2013 | image: url(":/qss_icons/dark/rc/arrow_down.png"); 2014 | } 2015 | 2016 | QHeaderView::up-arrow { 2017 | background-color: #455364; 2018 | border: none; 2019 | height: 12px; 2020 | width: 12px; 2021 | padding-left: 2px; 2022 | padding-right: 2px; 2023 | image: url(":/qss_icons/dark/rc/arrow_up.png"); 2024 | } 2025 | 2026 | /* QToolBox -------------------------------------------------------------- 2027 | 2028 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox 2029 | 2030 | --------------------------------------------------------------------------- */ 2031 | QToolBox { 2032 | padding: 0px; 2033 | border: 0px; 2034 | border: 1px solid #455364; 2035 | } 2036 | 2037 | QToolBox:selected { 2038 | padding: 0px; 2039 | border: 2px solid #346792; 2040 | } 2041 | 2042 | QToolBox::tab { 2043 | background-color: #19232D; 2044 | border: 1px solid #455364; 2045 | color: #DFE1E2; 2046 | border-top-left-radius: 4px; 2047 | border-top-right-radius: 4px; 2048 | } 2049 | 2050 | QToolBox::tab:disabled { 2051 | color: #788D9C; 2052 | } 2053 | 2054 | QToolBox::tab:selected { 2055 | background-color: #60798B; 2056 | border-bottom: 2px solid #346792; 2057 | } 2058 | 2059 | QToolBox::tab:selected:disabled { 2060 | background-color: #455364; 2061 | border-bottom: 2px solid #26486B; 2062 | } 2063 | 2064 | QToolBox::tab:!selected { 2065 | background-color: #455364; 2066 | border-bottom: 2px solid #455364; 2067 | } 2068 | 2069 | QToolBox::tab:!selected:disabled { 2070 | background-color: #19232D; 2071 | } 2072 | 2073 | QToolBox::tab:hover { 2074 | border-color: #1A72BB; 2075 | border-bottom: 2px solid #1A72BB; 2076 | } 2077 | 2078 | QToolBox QScrollArea { 2079 | padding: 0px; 2080 | border: 0px; 2081 | background-color: #19232D; 2082 | } 2083 | 2084 | /* QFrame ----------------------------------------------------------------- 2085 | 2086 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe 2087 | https://doc.qt.io/qt-5/qframe.html#-prop 2088 | https://doc.qt.io/qt-5/qframe.html#details 2089 | https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color 2090 | 2091 | --------------------------------------------------------------------------- */ 2092 | /* (dot) .QFrame fix #141, #126, #123 */ 2093 | .QFrame { 2094 | border-radius: 4px; 2095 | border: 1px solid #455364; 2096 | /* No frame */ 2097 | /* HLine */ 2098 | /* HLine */ 2099 | } 2100 | 2101 | .QFrame[frameShape="0"] { 2102 | border-radius: 4px; 2103 | border: 1px transparent #455364; 2104 | } 2105 | 2106 | .QFrame[frameShape="4"] { 2107 | max-height: 2px; 2108 | border: none; 2109 | background-color: #455364; 2110 | } 2111 | 2112 | .QFrame[frameShape="5"] { 2113 | max-width: 2px; 2114 | border: none; 2115 | background-color: #455364; 2116 | } 2117 | 2118 | /* QSplitter -------------------------------------------------------------- 2119 | 2120 | https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter 2121 | 2122 | --------------------------------------------------------------------------- */ 2123 | QSplitter { 2124 | background-color: #455364; 2125 | spacing: 0px; 2126 | padding: 0px; 2127 | margin: 0px; 2128 | } 2129 | 2130 | QSplitter::handle { 2131 | background-color: #455364; 2132 | border: 0px solid #19232D; 2133 | spacing: 0px; 2134 | padding: 1px; 2135 | margin: 0px; 2136 | } 2137 | 2138 | QSplitter::handle:hover { 2139 | background-color: #9DA9B5; 2140 | } 2141 | 2142 | QSplitter::handle:horizontal { 2143 | width: 5px; 2144 | image: url(":/qss_icons/dark/rc/line_vertical.png"); 2145 | } 2146 | 2147 | QSplitter::handle:vertical { 2148 | height: 5px; 2149 | image: url(":/qss_icons/dark/rc/line_horizontal.png"); 2150 | } 2151 | 2152 | /* QDateEdit, QDateTimeEdit ----------------------------------------------- 2153 | 2154 | --------------------------------------------------------------------------- */ 2155 | QDateEdit, QDateTimeEdit { 2156 | selection-background-color: #346792; 2157 | border-style: solid; 2158 | border: 1px solid #455364; 2159 | border-radius: 4px; 2160 | /* This fixes 103, 111 */ 2161 | padding-top: 2px; 2162 | /* This fixes 103, 111 */ 2163 | padding-bottom: 2px; 2164 | padding-left: 4px; 2165 | padding-right: 4px; 2166 | min-width: 10px; 2167 | } 2168 | 2169 | QDateEdit:on, QDateTimeEdit:on { 2170 | selection-background-color: #346792; 2171 | } 2172 | 2173 | QDateEdit::drop-down, QDateTimeEdit::drop-down { 2174 | subcontrol-origin: padding; 2175 | subcontrol-position: top right; 2176 | width: 12px; 2177 | border-left: 1px solid #455364; 2178 | } 2179 | 2180 | QDateEdit::down-arrow, QDateTimeEdit::down-arrow { 2181 | image: url(":/qss_icons/dark/rc/arrow_down_disabled.png"); 2182 | height: 8px; 2183 | width: 8px; 2184 | } 2185 | 2186 | QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { 2187 | image: url(":/qss_icons/dark/rc/arrow_down.png"); 2188 | } 2189 | 2190 | QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { 2191 | background-color: #19232D; 2192 | border-radius: 4px; 2193 | border: 1px solid #455364; 2194 | selection-background-color: #346792; 2195 | } 2196 | 2197 | /* QAbstractView ---------------------------------------------------------- 2198 | 2199 | --------------------------------------------------------------------------- */ 2200 | QAbstractView:hover { 2201 | border: 1px solid #346792; 2202 | color: #DFE1E2; 2203 | } 2204 | 2205 | QAbstractView:selected { 2206 | background: #346792; 2207 | color: #455364; 2208 | } 2209 | 2210 | /* PlotWidget ------------------------------------------------------------- 2211 | 2212 | --------------------------------------------------------------------------- */ 2213 | PlotWidget { 2214 | /* Fix cut labels in plots #134 */ 2215 | padding: 0px; 2216 | } 2217 | 2218 | QMenu::item { 2219 | padding: 4px 24px 4px 6px; 2220 | } 2221 | -------------------------------------------------------------------------------- /static/1: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; var _createClass = function () { function d(a, c) { for (var b = 0; b < c.length; b++) { var e = c[b]; e.enumerable = e.enumerable || !1; e.configurable = !0; "value" in e && (e.writable = !0); Object.defineProperty(a, e.key, e) } } return function (a, c, b) { c && d(a.prototype, c); b && d(a, b); return a } }(); function _possibleConstructorReturn(d, a) { if (!d) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !a || "object" !== typeof a && "function" !== typeof a ? d : a } 2 | function _inherits(d, a) { if ("function" !== typeof a && null !== a) throw new TypeError("Super expression must either be null or a function, not " + typeof a); d.prototype = Object.create(a && a.prototype, { constructor: { value: d, enumerable: !1, writable: !0, configurable: !0 } }); a && (Object.setPrototypeOf ? Object.setPrototypeOf(d, a) : d.__proto__ = a) } function _classCallCheck(d, a) { if (!(d instanceof a)) throw new TypeError("Cannot call a class as a function"); } 3 | var shaderData = { uniforms: { iResolution: { type: "v2", value: [window.innerWidth, window.innerHeight] }, vTextureSize: { type: "v2", value: [0, 0] }, uTextureForeground: { type: "sampler2D", value: null }, uTextureBackground: { type: "sampler2D", value: null }, uTextureDropShine: { type: "sampler2D", value: null } }, fragment: '\n precision mediump float;\n \n //Textures\n uniform sampler2D uTextureForeground;\n uniform sampler2D uTextureBackground;\n uniform sampler2D uTextureDropShine;\n \n //Canvas image data\n uniform sampler2D uSampler;\n \n //The resolution and coordinates of the current pixel\n uniform vec2 iResolution;\n uniform vec2 vTextureSize;\n varying vec2 vTextureCoord;\n \n //Function to get the vec2 value of the current coordinate\n vec2 texCoord(){\n return vec2(gl_FragCoord.x, iResolution.y - gl_FragCoord.y) / iResolution;\n }\n\n //Scales the bg up and proportionally to fill the container\n vec2 scaledTextureCoordinate(){\n float ratioCanvas \x3d iResolution.x / iResolution.y;\n float ratioImage \x3d vTextureSize.x / vTextureSize.y;\n \n vec2 scale \x3d vec2(1, 1);\n vec2 offset \x3d vec2(0, 0);\n float ratioDelta \x3d ratioCanvas - ratioImage;\n\n if(ratioDelta \x3e\x3d 0.0){\n scale.y \x3d (1.0 + ratioDelta);\n offset.y \x3d ratioDelta / 2.0;\n }else{\n scale.x \x3d (1.0 - ratioDelta);\n offset.x \x3d -(ratioDelta / 2.0);\n }\n\n return (texCoord() + offset) / scale;\n }\n \n //Alpha-blends two colors\n vec4 blend(vec4 bg, vec4 fg){\n vec3 bgm \x3d bg.rgb * bg.a;\n vec3 fgm \x3d fg.rgb * fg.a;\n float ia \x3d 1.0 - fg.a;\n float a \x3d (fg.a + bg.a * ia);\n \n vec3 rgb;\n \n if(a !\x3d 0.0){\n rgb \x3d (fgm + bgm * ia) / a;\n }else{\n rgb \x3d vec3(0.0,0.0,0.0);\n }\n \n return vec4(rgb,a);\n }\n \n vec2 pixel(){\n return vec2(1.0, 1.0) / iResolution;\n }\n \n //Get color from fg\n vec4 fgColor(){\n return texture2D(uSampler, vTextureCoord);\n }\n \n void main(){\n vec4 bg \x3d texture2D(uTextureBackground, scaledTextureCoordinate());\n vec4 cur \x3d fgColor();\n\n float d \x3d cur.b; // "thickness"\n float x \x3d cur.g;\n float y \x3d cur.r;\n float a \x3d smoothstep(0.65, 0.7, cur.a);\n \n vec4 smoothstepped \x3d vec4(y, x, d, a);\n\n vec2 refraction \x3d (vec2(x, y) - 0.5) * 2.0;\n vec2 refractionPos \x3d scaledTextureCoordinate() + (pixel() * refraction * (256.0 + (d * 512.0)));\n vec4 tex \x3d texture2D(uTextureForeground, refractionPos);\n \n float maxShine \x3d 390.0;\n float minShine \x3d maxShine * 0.18;\n vec2 shinePos \x3d vec2(0.5, 0.5) + ((1.0 / 512.0) * refraction) * -(minShine + ((maxShine-minShine) * d));\n vec4 shine \x3d texture2D(uTextureDropShine, shinePos);\n tex \x3d blend(tex,shine);\n \n vec4 fg \x3d vec4(tex.rgb, a);\n gl_FragColor \x3d blend(bg, fg);\n }\n\t' }, 4 | Application = function () { 5 | function d() { var a = this; _classCallCheck(this, d); this.width = window.innerWidth; this.height = window.innerHeight; this.loader = PIXI.loader.add("/img/alpha.png").add("/img/shine.png").add("/img/background.jpg").add("/img/foreground.jpg").load(function () { return a.initialize() }) } _createClass(d, [{ 6 | key: "initialize", value: function () { 7 | var a = this; this.effectCanvas = new EffectCanvas(this.width, this.height, this.loader); window.addEventListener("resize", 8 | function () { return a.resizeCanvas() }, !1); this.loop() 9 | } 10 | }, { key: "resizeCanvas", value: function () { this.width = window.innerWidth; this.height = window.innerHeight; this.effectCanvas.resize(this.width, this.height) } }, { key: "loop", value: function () { var a = this; window.requestAnimationFrame(function () { return a.loop() }); this.effectCanvas.update(this.width, this.height); this.effectCanvas.render() } }]); return d 11 | }(), EffectCanvas = function () { 12 | function d(a, c, b) { 13 | _classCallCheck(this, d); this.renderer = new PIXI.autoDetectRenderer(a, 14 | c, { antialias: !1, transparent: !1 }); this.renderer.autoResize = !0; document.body.appendChild(this.renderer.view); this.stage = new PIXI.Container; this.background = new PIXI.Graphics; this.background.fillAlphanumber = 0; this.background.beginFill("0xffffff"); this.background.drawRect(0, 0, a, c); this.background.endFill(); this.background.alpha = 0; this.stage.addChild(this.background); this.dropletManager = new DropletManager(this.stage, b); shaderData.uniforms.uTextureDropShine.value = b.resources["/img/shine.png"].texture; 15 | shaderData.uniforms.uTextureBackground.value = b.resources["/img/background.jpg"].texture; shaderData.uniforms.uTextureForeground.value = b.resources["/img/foreground.jpg"].texture; shaderData.uniforms.vTextureSize.value = [b.resources["/img/background.jpg"].texture.width, b.resources["/img/background.jpg"].texture.height]; this.dropletShader = new PIXI.Filter("", shaderData.fragment, shaderData.uniforms); this.stage.filters = [this.dropletShader] 16 | } 17 | _createClass(d, [{ key: "resize", value: function (a, c) { this.renderer.resize(a, c); this.background.clear(); this.background.beginFill("0xffffff"); this.background.drawRect(0, 0, a, c); this.background.endFill() } }, { key: "update", value: function (a, c) { this.updateShader(a, c); this.dropletManager.update(a, c) } }, { key: "updateShader", value: function (a, c) { this.dropletShader.uniforms.iResolution = [a, c] } }, { key: "render", value: function () { this.renderer.render(this.stage) } }]); return d 18 | }(), DropletManager = function () { 19 | function d(a, c) { 20 | _classCallCheck(this, 21 | d); var b = 9E3, e = 200; 700 > a.width && (b = 3E3, e = 150); this.options = { spawnRate: { small: .6, large: .05 }, spawnsPerFrame: { small: 200, large: 5 }, spawnMass: { small: { min: 1, max: 2 }, large: { min: 7, max: 10 } }, poolDroplets: { small: { min: b - 500, max: b }, large: { min: e - 100, max: e } }, maximumMassGravity: 15, maximumMass: 15, dropletGrowSpeed: 1, dropletShrinkSpeed: 2, dropletContainerSize: 100 }; this.positionMatrix = [[-1, -1], [1, -1], [-1, 1], [1, 1]]; this.smallDroplets = []; this.largeDroplets = []; this.dropletSmallTexture = c.resources["/img/alpha.png"].texture; 22 | this.dropletLargeTexture = c.resources["/img/alpha.png"].texture; this.smallDropletContainer = new DropletPool(Droplet, this.dropletSmallTexture, this.options.poolDroplets.small.min, this.options.poolDroplets.small.max); this.largeDropletContainer = new DropletPool(LargeDroplet, this.dropletLargeTexture, this.options.poolDroplets.large.min, this.options.poolDroplets.large.max); a.addChild(this.largeDropletContainer); a.addChild(this.smallDropletContainer) 23 | } _createClass(d, [{ 24 | key: "update", value: function (a, 25 | c) { d.removeLargeOffscreenDroplets(a, c, this.largeDroplets, this.largeDropletContainer); for (var b = 0; b < this.options.spawnsPerFrame.small; b++)this.spawnNewSmallDroplet(a, c); for (b = 0; b < this.options.spawnsPerFrame.large; b++)this.spawnNewLargeDroplet(a, c); this.checkLargeDropletLogic() } 26 | }, { 27 | key: "checkLargeDropletLogic", value: function () { 28 | for (var a = this.largeDroplets.length - 1; 0 <= a; a--)this.updateLargeDropletSize(this.largeDroplets[a]), this.checkDropletMovement(this.largeDroplets[a]), this.checkLargeToSmallDropletCollision(this.largeDroplets[a]), 29 | this.checkLargeToLargeDropletCollision(this.largeDroplets[a]), this.removeLargeDroplets(a) 30 | } 31 | }, { key: "removeLargeDroplets", value: function (a) { 0 === this.largeDroplets[a].mass && !0 === this.largeDroplets[a].toBeRemoved && (this.largeDropletContainer.destroy(this.largeDroplets[a]), this.largeDroplets.splice(a, 1)) } }, { key: "updateLargeDropletSize", value: function (a) { !0 === a.toBeRemoved ? this.shrinkDropletSize(a) : this.growDropletSize(a); a.width = 6 * a.mass; a.height = 7 * a.mass } }, { 32 | key: "shrinkDropletSize", value: function (a) { 33 | a.mass = 34 | 0 >= a.mass - this.options.dropletShrinkSpeed ? 0 : a.mass - this.options.dropletShrinkSpeed 35 | } 36 | }, { key: "growDropletSize", value: function (a) { a.mass !== a.targetMass && (a.mass = a.mass + this.options.dropletGrowSpeed >= a.targetMass ? a.targetMass : a.mass + this.options.dropletGrowSpeed) } }, { 37 | key: "checkDropletMovement", value: function (a) { 38 | !0 !== a.toBeRemoved && (a.mass < this.options.maximumMassGravity && 0 === a.dropletVelocity.y && 0 === a.dropletVelocity.x ? .01 > Math.random() && (a.dropletVelocity.y = Utils.getRandomInt(.5, 3)) : a.mass < this.options.maximumMassGravity && 39 | 0 !== a.dropletVelocity.y ? (.1 > Math.random() && (a.x += Utils.getRandomInt(-10, 10) / 10), .1 > Math.random() && (a.dropletVelocity.y = 0)) : a.mass >= this.options.maximumMassGravity && 10 > a.dropletVelocity.y && (a.dropletVelocity.y = Utils.getRandomInt(10, 20), a.dropletVelocity.x = Utils.getRandomInt(-10, 10) / 10), a.y += a.dropletVelocity.y, a.x += a.dropletVelocity.x) 40 | } 41 | }, { 42 | key: "getDropletPresenceArray", value: function (a) { 43 | for (var c = [], b = this.positionMatrix.length, e = 0; e < b; e++) { 44 | var d = { 45 | x: Math.floor((a.x + a.width / 7 * this.positionMatrix[e][0]) / 46 | this.options.dropletContainerSize), y: Math.floor((a.y + a.height / 7 * this.positionMatrix[e][1]) / this.options.dropletContainerSize) 47 | }; 0 === e ? c.push(d) : c[0].x === d.x && c[0].y === d.y || c.push(d) 48 | } return c 49 | } 50 | }, { 51 | key: "checkLargeToLargeDropletCollision", value: function (a) { 52 | if (!0 !== a.toBeRemoved) for (var c = this.largeDroplets.length - 1; 0 <= c; c--)if (a.x !== this.largeDroplets[c].x || a.y !== this.largeDroplets[c].y) { 53 | var b = a.x - this.largeDroplets[c].x, d = a.y - this.largeDroplets[c].y; Math.sqrt(b * b + d * d) <= a.width / 7 + this.largeDroplets[c].width / 54 | 7 && (a.targetMass = a.mass + this.largeDroplets[c].mass <= this.options.maximumMass ? a.mass + this.largeDroplets[c].mass : this.options.maximumMass, this.largeDroplets[c].toBeRemoved = !0) 55 | } 56 | } 57 | }, { 58 | key: "checkLargeToSmallDropletCollision", value: function (a) { 59 | if (!0 !== a.toBeRemoved) for (var c = this.getDropletPresenceArray(a), b = 0; b < c.length; b++)if ("undefined" !== typeof this.smallDroplets[c[b].x] && "undefined" !== typeof this.smallDroplets[c[b].x][c[b].y]) for (var d = this.smallDroplets[c[b].x][c[b].y].length - 1; 0 <= d; d--) { 60 | var f = a.x - 61 | this.smallDroplets[c[b].x][c[b].y][d].x, g = a.y - this.smallDroplets[c[b].x][c[b].y][d].y; Math.sqrt(f * f + g * g) <= a.width / 7 + this.smallDroplets[c[b].x][c[b].y][d].width / 7 && (a.mass + this.smallDroplets[c[b].x][c[b].y][d].mass / 3 <= this.options.maximumMass && (a.targetMass = a.mass + this.smallDroplets[c[b].x][c[b].y][d].mass / 3), this.smallDropletContainer.destroy(this.smallDroplets[c[b].x][c[b].y][d]), this.smallDroplets[c[b].x][c[b].y].splice(d, 1)) 62 | } 63 | } 64 | }, { 65 | key: "spawnNewSmallDroplet", value: function (a, c) { 66 | if (!(Math.random() > 67 | this.options.spawnRate.small)) { 68 | var b = this.smallDropletContainer.get(); if (null !== b) { 69 | a = Utils.getRandomInt(0, a); c = Utils.getRandomInt(0, c); var d = Utils.getRandomInt(this.options.spawnMass.small.min, this.options.spawnMass.small.max), f = Math.floor(a / this.options.dropletContainerSize), g = Math.floor(c / this.options.dropletContainerSize); b.x = a; b.y = c; b.mass = d; b.width = 8 * b.mass; b.height = 8 * b.mass; "undefined" === typeof this.smallDroplets[f] && (this.smallDroplets[f] = []); "undefined" === typeof this.smallDroplets[f][g] && 70 | (this.smallDroplets[f][g] = []); this.smallDroplets[f][g].push(b) 71 | } 72 | } 73 | } 74 | }, { key: "spawnNewLargeDroplet", value: function (a, c) { if (!(Math.random() > this.options.spawnRate.large)) { var b = this.largeDropletContainer.get(); if (null !== b) { var d = Utils.getRandomInt(this.options.spawnMass.large.min, this.options.spawnMass.large.max); b.x = Utils.getRandomInt(0, a); b.y = Utils.getRandomInt(-100, c / 1.5); b.mass = d / 2; b.targetMass = d; b.width = 6 * b.mass; b.height = 7 * b.mass; b.dropletVelocity.x = 0; b.toBeRemoved = !1; this.largeDroplets.push(b) } } } }], 75 | [{ key: "removeLargeOffscreenDroplets", value: function (a, c, b, d) { for (var f = b.length - 1; 0 <= f; f--)if (b[f].x > a + 10 || -10 > b[f].x || b[f].y > c + 10 || -100 > b[f].y) d.destroy(b[f]), b.splice(f, 1) } }]); return d 76 | }(), DropletPool = function (d) { 77 | function a(c, b, d, f) { 78 | _classCallCheck(this, a); var e = _possibleConstructorReturn(this, (a.__proto__ || Object.getPrototypeOf(a)).call(this, f, { scale: !0, position: !0, rotation: !1, uvs: !1, alpha: !1 })); e.ObjectToCreate = c; e.objectTexture = b; e.pool = []; e.inUse = 0; e.startingSize = d; e.maximumSize = f; e.initialize(); 79 | return e 80 | } _inherits(a, d); _createClass(a, [{ key: "initialize", value: function () { for (var a = 0; a < this.startingSize; a += 1) { var b = new this.ObjectToCreate(this.objectTexture); b.x = -100; b.y = -100; b.anchor.set(.5); this.addChild(b); this.pool.push(b) } } }, { key: "get", value: function () { if (this.inUse >= this.maximumSize) return null; this.inUse++; if (0 < this.pool.length) return this.pool.pop(); var a = new this.ObjectToCreate(this.objectTexture); a.x = -100; a.y = -100; a.anchor.set(.5, .5); this.addChild(a); return a } }, { 81 | key: "destroy", value: function (a) { 82 | 0 > 83 | this.inUse - 1 ? console.error("Something went wrong, you cant remove more elements than there are in the total pool") : (a.x = -100, a.y = -100, --this.inUse, this.pool.push(a)) 84 | } 85 | }]); return a 86 | }(PIXI.particles.ParticleContainer), Droplet = function (d) { function a(c) { _classCallCheck(this, a); c = _possibleConstructorReturn(this, (a.__proto__ || Object.getPrototypeOf(a)).call(this, c)); c.mass = 0; return c } _inherits(a, d); return a }(PIXI.Sprite), LargeDroplet = function (d) { 87 | function a(c) { 88 | _classCallCheck(this, a); c = _possibleConstructorReturn(this, 89 | (a.__proto__ || Object.getPrototypeOf(a)).call(this, c)); c.dropletVelocity = new PIXI.Point(0, 0); c.toBeRemoved = !1; c.targetMass = 0; return c 90 | } _inherits(a, d); return a 91 | }(Droplet), Utils = function () { function d() { _classCallCheck(this, d) } _createClass(d, null, [{ key: "getRandomInt", value: function (a, c) { return Math.floor(Math.random() * (c - a + 1)) + a } }]); return d }(); new Application; --------------------------------------------------------------------------------