├── .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 |
43 | - 自动获取直播源:项目从多个指定的网站自动获取最新的直播源,支持 M3U 和 TXT 格式的源文件。
44 | - 分类与整理:自动根据节目名称对直播源进行分组整理,并对重复的源链接进行去重。
45 | - 支持 IPv4 和 IPv6:可以识别并分类不同类型的 IP 源地址,分为 IPv4 和 IPv6 进行整理。
46 | - 输出格式:抓取和整理后的直播源保存为
final_streams.txt
文件,方便进一步处理和使用。
47 |
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 |

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;
--------------------------------------------------------------------------------