chat: temporarily revert some UI changes before next release (#2234)
* chat: revert PR #2187
Signed-off-by: Jared Van Bortel <jared@nomic.ai>
* chat: revert PR #2148
This reverts commit f571e7e450
.
Signed-off-by: Jared Van Bortel <jared@nomic.ai>
---------
Signed-off-by: Jared Van Bortel <jared@nomic.ai>
@ -103,11 +103,11 @@ qt_add_qml_module(chat
|
|||||||
qml/ChatDrawer.qml
|
qml/ChatDrawer.qml
|
||||||
qml/ChatView.qml
|
qml/ChatView.qml
|
||||||
qml/CollectionsDialog.qml
|
qml/CollectionsDialog.qml
|
||||||
qml/ModelDownloaderView.qml
|
qml/ModelDownloaderDialog.qml
|
||||||
qml/NetworkDialog.qml
|
qml/NetworkDialog.qml
|
||||||
qml/NewVersionDialog.qml
|
qml/NewVersionDialog.qml
|
||||||
qml/ThumbsDownDialog.qml
|
qml/ThumbsDownDialog.qml
|
||||||
qml/SettingsView.qml
|
qml/SettingsDialog.qml
|
||||||
qml/StartupDialog.qml
|
qml/StartupDialog.qml
|
||||||
qml/PopupDialog.qml
|
qml/PopupDialog.qml
|
||||||
qml/AboutDialog.qml
|
qml/AboutDialog.qml
|
||||||
@ -136,7 +136,6 @@ qt_add_qml_module(chat
|
|||||||
icons/send_message.svg
|
icons/send_message.svg
|
||||||
icons/stop_generating.svg
|
icons/stop_generating.svg
|
||||||
icons/regenerate.svg
|
icons/regenerate.svg
|
||||||
icons/chat.svg
|
|
||||||
icons/close.svg
|
icons/close.svg
|
||||||
icons/copy.svg
|
icons/copy.svg
|
||||||
icons/db.svg
|
icons/db.svg
|
||||||
@ -145,10 +144,6 @@ qt_add_qml_module(chat
|
|||||||
icons/eject.svg
|
icons/eject.svg
|
||||||
icons/edit.svg
|
icons/edit.svg
|
||||||
icons/image.svg
|
icons/image.svg
|
||||||
icons/info.svg
|
|
||||||
icons/local-docs.svg
|
|
||||||
icons/models.svg
|
|
||||||
icons/search.svg
|
|
||||||
icons/trash.svg
|
icons/trash.svg
|
||||||
icons/network.svg
|
icons/network.svg
|
||||||
icons/thumbs_up.svg
|
icons/thumbs_up.svg
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M26.1538 9.76H22.4615V5.92C22.4615 5.41078 22.267 4.92242 21.9208 4.56235C21.5746 4.20229 21.105 4 20.6154 4H5.84615C5.35652 4 4.88695 4.20229 4.54073 4.56235C4.1945 4.92242 4 5.41078 4 5.92V21.28C4.00054 21.4606 4.05006 21.6374 4.14287 21.79C4.23568 21.9427 4.36801 22.065 4.52467 22.143C4.68132 22.2209 4.85595 22.2513 5.02847 22.2307C5.201 22.2101 5.36444 22.1393 5.5 22.0264L9.53846 18.64V22.24C9.53846 22.7492 9.73297 23.2376 10.0792 23.5976C10.4254 23.9577 10.895 24.16 11.3846 24.16H22.1835L26.5 27.7864C26.6633 27.9238 26.8668 27.9991 27.0769 28C27.3217 28 27.5565 27.8989 27.7296 27.7188C27.9027 27.5388 28 27.2946 28 27.04V11.68C28 11.1708 27.8055 10.6824 27.4593 10.3224C27.1131 9.96229 26.6435 9.76 26.1538 9.76ZM8.90962 16.6936L5.84615 19.27V5.92H20.6154V16.48H9.49C9.27874 16.48 9.07387 16.5554 8.90962 16.6936ZM26.1538 25.03L23.0904 22.4536C22.9271 22.3162 22.7235 22.2408 22.5135 22.24H11.3846V18.4H20.6154C21.105 18.4 21.5746 18.1977 21.9208 17.8376C22.267 17.4776 22.4615 16.9892 22.4615 16.48V11.68H26.1538V25.03Z" fill="black"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,3 +1,5 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 448 512"><path d="M448 80v48c0 44.2-100.3 80-224 80S0 172.2 0 128V80C0 35.8 100.3 0 224 0S448 35.8 448 80zM393.2 214.7c20.8-7.4 39.9-16.9 54.8-28.6V288c0 44.2-100.3 80-224 80S0 332.2 0 288V186.1c14.9 11.8 34 21.2 54.8 28.6C99.7 230.7 159.5 240 224 240s124.3-9.3 169.2-25.3zM0 346.1c14.9 11.8 34 21.2 54.8 28.6C99.7 390.7 159.5 400 224 400s124.3-9.3 169.2-25.3c20.8-7.4 39.9-16.9 54.8-28.6V432c0 44.2-100.3 80-224 80S0 476.2 0 432V346.1z"/></svg>
|
||||||
<path d="M16 3C9.27125 3 4 6.075 4 10V22C4 25.925 9.27125 29 16 29C22.7288 29 28 25.925 28 22V10C28 6.075 22.7288 3 16 3ZM26 16C26 17.2025 25.015 18.4287 23.2987 19.365C21.3662 20.4187 18.7738 21 16 21C13.2262 21 10.6338 20.4187 8.70125 19.365C6.985 18.4287 6 17.2025 6 16V13.92C8.1325 15.795 11.7787 17 16 17C20.2213 17 23.8675 15.79 26 13.92V16ZM8.70125 6.635C10.6338 5.58125 13.2262 5 16 5C18.7738 5 21.3662 5.58125 23.2987 6.635C25.015 7.57125 26 8.7975 26 10C26 11.2025 25.015 12.4287 23.2987 13.365C21.3662 14.4187 18.7738 15 16 15C13.2262 15 10.6338 14.4187 8.70125 13.365C6.985 12.4287 6 11.2025 6 10C6 8.7975 6.985 7.57125 8.70125 6.635ZM23.2987 25.365C21.3662 26.4187 18.7738 27 16 27C13.2262 27 10.6338 26.4187 8.70125 25.365C6.985 24.4287 6 23.2025 6 22V19.92C8.1325 21.795 11.7787 23 16 23C20.2213 23 23.8675 21.79 26 19.92V22C26 23.2025 25.015 24.4287 23.2987 25.365Z" fill="black"/>
|
<!--
|
||||||
</svg>
|
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
||||||
|
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
-->
|
||||||
|
Before Width: | Height: | Size: 1001 B After Width: | Height: | Size: 689 B |
@ -1,3 +1,5 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 576 512"><path d="M402.6 83.2l90.2 90.2c3.8 3.8 3.8 10 0 13.8L274.4 405.6l-92.8 10.3c-12.4 1.4-22.9-9.1-21.5-21.5l10.3-92.8L388.8 83.2c3.8-3.8 10-3.8 13.8 0zm162-22.9l-48.8-48.8c-15.2-15.2-39.9-15.2-55.2 0l-35.4 35.4c-3.8 3.8-3.8 10 0 13.8l90.2 90.2c3.8 3.8 10 3.8 13.8 0l35.4-35.4c15.2-15.3 15.2-40 0-55.2zM384 346.2V448H64V128h229.8c3.2 0 6.2-1.3 8.5-3.5l40-40c7.6-7.6 2.2-20.5-8.5-20.5H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V306.2c0-10.7-12.9-16-20.5-8.5l-40 40c-2.2 2.3-3.5 5.3-3.5 8.5z"/></svg>
|
||||||
<path d="M28.4138 9.17125L22.8288 3.585C22.643 3.39924 22.4225 3.25188 22.1799 3.15134C21.9372 3.0508 21.6771 2.99905 21.4144 2.99905C21.1517 2.99905 20.8916 3.0508 20.6489 3.15134C20.4062 3.25188 20.1857 3.39924 20 3.585L4.58626 19C4.39973 19.185 4.25185 19.4053 4.15121 19.648C4.05057 19.8907 3.99917 20.151 4.00001 20.4138V26C4.00001 26.5304 4.21072 27.0391 4.5858 27.4142C4.96087 27.7893 5.46958 28 6.00001 28H11.5863C11.849 28.0008 12.1093 27.9494 12.352 27.8488C12.5947 27.7482 12.815 27.6003 13 27.4138L28.4138 12C28.5995 11.8143 28.7469 11.5938 28.8474 11.3511C28.948 11.1084 28.9997 10.8483 28.9997 10.5856C28.9997 10.3229 28.948 10.0628 28.8474 9.82015C28.7469 9.57747 28.5995 9.35698 28.4138 9.17125ZM6.41376 20L17 9.41375L19.0863 11.5L8.50001 22.085L6.41376 20ZM6.00001 22.4138L9.58626 26H6.00001V22.4138ZM12 25.5863L9.91376 23.5L20.5 12.9138L22.5863 15L12 25.5863ZM24 13.5863L18.4138 8L21.4138 5L27 10.585L24 13.5863Z" fill="black"/>
|
<!--
|
||||||
</svg>
|
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
||||||
|
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
-->
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 778 B |
@ -1,3 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M16 3C13.4288 3 10.9154 3.76244 8.77759 5.1909C6.63975 6.61935 4.97351 8.64968 3.98957 11.0251C3.00563 13.4006 2.74819 16.0144 3.2498 18.5362C3.75141 21.0579 4.98953 23.3743 6.80762 25.1924C8.6257 27.0105 10.9421 28.2486 13.4638 28.7502C15.9856 29.2518 18.5995 28.9944 20.9749 28.0104C23.3503 27.0265 25.3807 25.3603 26.8091 23.2224C28.2376 21.0846 29 18.5712 29 16C28.9964 12.5533 27.6256 9.24882 25.1884 6.81163C22.7512 4.37445 19.4467 3.00364 16 3ZM16 27C13.8244 27 11.6977 26.3549 9.88873 25.1462C8.07979 23.9375 6.66989 22.2195 5.83733 20.2095C5.00477 18.1995 4.78693 15.9878 5.21137 13.854C5.63581 11.7202 6.68345 9.7602 8.22183 8.22183C9.76021 6.68345 11.7202 5.6358 13.854 5.21136C15.9878 4.78692 18.1995 5.00476 20.2095 5.83733C22.2195 6.66989 23.9375 8.07979 25.1462 9.88873C26.3549 11.6977 27 13.8244 27 16C26.9967 18.9164 25.8367 21.7123 23.7745 23.7745C21.7123 25.8367 18.9164 26.9967 16 27ZM18 22C18 22.2652 17.8946 22.5196 17.7071 22.7071C17.5196 22.8946 17.2652 23 17 23C16.4696 23 15.9609 22.7893 15.5858 22.4142C15.2107 22.0391 15 21.5304 15 21V16C14.7348 16 14.4804 15.8946 14.2929 15.7071C14.1054 15.5196 14 15.2652 14 15C14 14.7348 14.1054 14.4804 14.2929 14.2929C14.4804 14.1054 14.7348 14 15 14C15.5304 14 16.0391 14.2107 16.4142 14.5858C16.7893 14.9609 17 15.4696 17 16V21C17.2652 21 17.5196 21.1054 17.7071 21.2929C17.8946 21.4804 18 21.7348 18 22ZM14 10.5C14 10.2033 14.088 9.91332 14.2528 9.66665C14.4176 9.41997 14.6519 9.22771 14.926 9.11418C15.2001 9.00065 15.5017 8.97094 15.7926 9.02882C16.0836 9.0867 16.3509 9.22956 16.5607 9.43934C16.7704 9.64912 16.9133 9.91639 16.9712 10.2074C17.0291 10.4983 16.9994 10.7999 16.8858 11.074C16.7723 11.3481 16.58 11.5824 16.3334 11.7472C16.0867 11.912 15.7967 12 15.5 12C15.1022 12 14.7206 11.842 14.4393 11.5607C14.158 11.2794 14 10.8978 14 10.5Z" fill="black"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.9 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M26.7075 8.2925L21.7075 3.2925C21.6146 3.19967 21.5042 3.12605 21.3829 3.07586C21.2615 3.02568 21.1314 2.9999 21 3H11C10.4696 3 9.96086 3.21071 9.58579 3.58579C9.21071 3.96086 9 4.46957 9 5V7H7C6.46957 7 5.96086 7.21071 5.58579 7.58579C5.21071 7.96086 5 8.46957 5 9V27C5 27.5304 5.21071 28.0391 5.58579 28.4142C5.96086 28.7893 6.46957 29 7 29H21C21.5304 29 22.0391 28.7893 22.4142 28.4142C22.7893 28.0391 23 27.5304 23 27V25H25C25.5304 25 26.0391 24.7893 26.4142 24.4142C26.7893 24.0391 27 23.5304 27 23V9C27.0001 8.86864 26.9743 8.73855 26.9241 8.61715C26.8739 8.49576 26.8003 8.38544 26.7075 8.2925ZM21 27H7V9H16.5863L21 13.4137V23.98C21 23.9875 21 23.9937 21 24C21 24.0063 21 24.0125 21 24.02V27ZM25 23H23V13C23.0001 12.8686 22.9743 12.7385 22.9241 12.6172C22.8739 12.4958 22.8003 12.3854 22.7075 12.2925L17.7075 7.2925C17.6146 7.19967 17.5042 7.12605 17.3829 7.07586C17.2615 7.02568 17.1314 6.9999 17 7H11V5H20.5863L25 9.41375V23ZM18 19C18 19.2652 17.8946 19.5196 17.7071 19.7071C17.5196 19.8946 17.2652 20 17 20H11C10.7348 20 10.4804 19.8946 10.2929 19.7071C10.1054 19.5196 10 19.2652 10 19C10 18.7348 10.1054 18.4804 10.2929 18.2929C10.4804 18.1054 10.7348 18 11 18H17C17.2652 18 17.5196 18.1054 17.7071 18.2929C17.8946 18.4804 18 18.7348 18 19ZM18 23C18 23.2652 17.8946 23.5196 17.7071 23.7071C17.5196 23.8946 17.2652 24 17 24H11C10.7348 24 10.4804 23.8946 10.2929 23.7071C10.1054 23.5196 10 23.2652 10 23C10 22.7348 10.1054 22.4804 10.2929 22.2929C10.4804 22.1054 10.7348 22 11 22H17C17.2652 22 17.5196 22.1054 17.7071 22.2929C17.8946 22.4804 18 22.7348 18 23Z" fill="black"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,3 +0,0 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="M27.96 8.26876L16.96 2.25001C16.6661 2.08761 16.3358 2.00243 16 2.00243C15.6642 2.00243 15.3339 2.08761 15.04 2.25001L4.04 8.27126C3.72586 8.44314 3.46363 8.69621 3.28069 9.00404C3.09775 9.31187 3.00081 9.66317 3 10.0213V21.9763C3.00081 22.3343 3.09775 22.6856 3.28069 22.9935C3.46363 23.3013 3.72586 23.5544 4.04 23.7263L15.04 29.7475C15.3339 29.9099 15.6642 29.9951 16 29.9951C16.3358 29.9951 16.6661 29.9099 16.96 29.7475L27.96 23.7263C28.2741 23.5544 28.5364 23.3013 28.7193 22.9935C28.9023 22.6856 28.9992 22.3343 29 21.9763V10.0225C28.9999 9.66378 28.9032 9.3117 28.7203 9.00315C28.5373 8.6946 28.2747 8.44095 27.96 8.26876ZM16 4.00001L26.0425 9.50001L16 15L5.9575 9.50001L16 4.00001ZM5 11.25L15 16.7225V27.4463L5 21.9775V11.25ZM17 27.4463V16.7275L27 11.25V21.9725L17 27.4463Z" fill="black"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 911 B |
@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
|
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
Before Width: | Height: | Size: 602 B |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 2.7 KiB |
@ -1,3 +1,5 @@
|
|||||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="#7d7d8e" viewBox="0 0 448 512"><path d="M0 84V56c0-13.3 10.7-24 24-24h112l9.4-18.7c4-8.2 12.3-13.3 21.4-13.3h114.3c9.1 0 17.4 5.1 21.5 13.3L312 32h112c13.3 0 24 10.7 24 24v28c0 6.6-5.4 12-12 12H12C5.4 96 0 90.6 0 84zm416 56v324c0 26.5-21.5 48-48 48H80c-26.5 0-48-21.5-48-48V140c0-6.6 5.4-12 12-12h360c6.6 0 12 5.4 12 12zm-272 68c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208zm96 0c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208zm96 0c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208z"/></svg>
|
||||||
<path d="M27 6H5C4.73478 6 4.48043 6.10536 4.29289 6.29289C4.10536 6.48043 4 6.73478 4 7C4 7.26522 4.10536 7.51957 4.29289 7.70711C4.48043 7.89464 4.73478 8 5 8H6V26C6 26.5304 6.21071 27.0391 6.58579 27.4142C6.96086 27.7893 7.46957 28 8 28H24C24.5304 28 25.0391 27.7893 25.4142 27.4142C25.7893 27.0391 26 26.5304 26 26V8H27C27.2652 8 27.5196 7.89464 27.7071 7.70711C27.8946 7.51957 28 7.26522 28 7C28 6.73478 27.8946 6.48043 27.7071 6.29289C27.5196 6.10536 27.2652 6 27 6ZM24 26H8V8H24V26ZM10 3C10 2.73478 10.1054 2.48043 10.2929 2.29289C10.4804 2.10536 10.7348 2 11 2H21C21.2652 2 21.5196 2.10536 21.7071 2.29289C21.8946 2.48043 22 2.73478 22 3C22 3.26522 21.8946 3.51957 21.7071 3.70711C21.5196 3.89464 21.2652 4 21 4H11C10.7348 4 10.4804 3.89464 10.2929 3.70711C10.1054 3.51957 10 3.26522 10 3Z" fill="black"/>
|
<!--
|
||||||
</svg>
|
Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com
|
||||||
|
License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
-->
|
||||||
|
Before Width: | Height: | Size: 917 B After Width: | Height: | Size: 791 B |
@ -43,25 +43,6 @@ Window {
|
|||||||
font.pixelSize: theme.fontSizeLarge
|
font.pixelSize: theme.fontSizeLarge
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkDialog {
|
|
||||||
id: networkDialog
|
|
||||||
anchors.centerIn: parent
|
|
||||||
width: Math.min(1024, window.width - (window.width * .2))
|
|
||||||
height: Math.min(600, window.height - (window.height * .2))
|
|
||||||
Item {
|
|
||||||
Accessible.role: Accessible.Dialog
|
|
||||||
Accessible.name: qsTr("Network dialog")
|
|
||||||
Accessible.description: qsTr("opt-in to share feedback/conversations")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AboutDialog {
|
|
||||||
id: aboutDialog
|
|
||||||
anchors.centerIn: parent
|
|
||||||
width: Math.min(1024, window.width - (window.width * .2))
|
|
||||||
height: Math.min(600, window.height - (window.height * .2))
|
|
||||||
}
|
|
||||||
|
|
||||||
onClosing: function(close) {
|
onClosing: function(close) {
|
||||||
if (window.hasSaved)
|
if (window.hasSaved)
|
||||||
return;
|
return;
|
||||||
@ -82,173 +63,7 @@ Window {
|
|||||||
|
|
||||||
color: theme.black
|
color: theme.black
|
||||||
|
|
||||||
Rectangle {
|
ChatView {
|
||||||
id: viewBar
|
anchors.fill: parent
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
width: 80
|
|
||||||
color: theme.viewBarBackground
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
id: viewsLayout
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.topMargin: 30
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
Layout.margins: 0
|
|
||||||
spacing: 25
|
|
||||||
|
|
||||||
MyToolButton {
|
|
||||||
id: chatButton
|
|
||||||
backgroundColor: toggled ? theme.iconBackgroundViewBarToggled : theme.iconBackgroundViewBar
|
|
||||||
backgroundColorHovered: toggled ? backgroundColor : theme.iconBackgroundViewBarHovered
|
|
||||||
Layout.preferredWidth: 40
|
|
||||||
Layout.preferredHeight: 40
|
|
||||||
Layout.alignment: Qt.AlignCenter
|
|
||||||
toggledWidth: 0
|
|
||||||
toggled: stackLayout.currentIndex === 0
|
|
||||||
toggledColor: theme.iconBackgroundViewBarToggled
|
|
||||||
scale: 1.5
|
|
||||||
source: "qrc:/gpt4all/icons/chat.svg"
|
|
||||||
Accessible.name: qsTr("Chat view")
|
|
||||||
Accessible.description: qsTr("Chat view to interact with models")
|
|
||||||
onClicked: {
|
|
||||||
stackLayout.currentIndex = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MyToolButton {
|
|
||||||
id: searchButton
|
|
||||||
backgroundColor: toggled ? theme.iconBackgroundViewBarToggled : theme.iconBackgroundViewBar
|
|
||||||
backgroundColorHovered: toggled ? backgroundColor : theme.iconBackgroundViewBarHovered
|
|
||||||
Layout.preferredWidth: 40
|
|
||||||
Layout.preferredHeight: 40
|
|
||||||
toggledWidth: 0
|
|
||||||
toggled: stackLayout.currentIndex === 1
|
|
||||||
toggledColor: theme.iconBackgroundViewBarToggled
|
|
||||||
scale: 1.5
|
|
||||||
source: "qrc:/gpt4all/icons/models.svg"
|
|
||||||
Accessible.name: qsTr("Search")
|
|
||||||
Accessible.description: qsTr("Launch a dialog to download new models")
|
|
||||||
onClicked: {
|
|
||||||
stackLayout.currentIndex = 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MyToolButton {
|
|
||||||
id: settingsButton
|
|
||||||
backgroundColor: toggled ? theme.iconBackgroundViewBarToggled : theme.iconBackgroundViewBar
|
|
||||||
backgroundColorHovered: toggled ? backgroundColor : theme.iconBackgroundViewBarHovered
|
|
||||||
Layout.preferredWidth: 40
|
|
||||||
Layout.preferredHeight: 40
|
|
||||||
toggledWidth: 0
|
|
||||||
toggledColor: theme.iconBackgroundViewBarToggled
|
|
||||||
toggled: stackLayout.currentIndex === 2
|
|
||||||
scale: 1.5
|
|
||||||
source: "qrc:/gpt4all/icons/settings.svg"
|
|
||||||
Accessible.name: qsTr("Settings")
|
|
||||||
Accessible.description: qsTr("Reveals a dialogue with settings")
|
|
||||||
|
|
||||||
onClicked: {
|
|
||||||
stackLayout.currentIndex = 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
id: buttonsLayout
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.margins: 0
|
|
||||||
anchors.bottomMargin: 25
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
Layout.margins: 0
|
|
||||||
spacing: 25
|
|
||||||
|
|
||||||
MyToolButton {
|
|
||||||
id: networkButton
|
|
||||||
backgroundColor: toggled ? theme.iconBackgroundViewBarToggled : theme.iconBackgroundViewBar
|
|
||||||
backgroundColorHovered: toggled ? backgroundColor : theme.iconBackgroundViewBarHovered
|
|
||||||
toggledColor: theme.iconBackgroundViewBar
|
|
||||||
Layout.preferredWidth: 40
|
|
||||||
Layout.preferredHeight: 40
|
|
||||||
scale: 1.2
|
|
||||||
toggled: MySettings.networkIsActive
|
|
||||||
source: "qrc:/gpt4all/icons/network.svg"
|
|
||||||
Accessible.name: qsTr("Network")
|
|
||||||
Accessible.description: qsTr("Reveals a dialogue where you can opt-in for sharing data over network")
|
|
||||||
|
|
||||||
onClicked: {
|
|
||||||
if (MySettings.networkIsActive) {
|
|
||||||
MySettings.networkIsActive = false
|
|
||||||
Network.sendNetworkToggled(false);
|
|
||||||
} else
|
|
||||||
networkDialog.open()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MyToolButton {
|
|
||||||
id: infoButton
|
|
||||||
backgroundColor: theme.iconBackgroundViewBar
|
|
||||||
backgroundColorHovered: theme.iconBackgroundViewBarHovered
|
|
||||||
Layout.preferredWidth: 40
|
|
||||||
Layout.preferredHeight: 40
|
|
||||||
scale: 1.2
|
|
||||||
source: "qrc:/gpt4all/icons/info.svg"
|
|
||||||
Accessible.name: qsTr("About")
|
|
||||||
Accessible.description: qsTr("Reveals an about dialog")
|
|
||||||
onClicked: {
|
|
||||||
aboutDialog.open()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StackLayout {
|
|
||||||
id: stackLayout
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: viewBar.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
|
|
||||||
ChatView {
|
|
||||||
id: chatView
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: chatView
|
|
||||||
function onDownloadViewRequested(showEmbeddingModels) {
|
|
||||||
console.log("onDownloadViewRequested")
|
|
||||||
stackLayout.currentIndex = 1;
|
|
||||||
if (showEmbeddingModels)
|
|
||||||
downloadView.showEmbeddingModels();
|
|
||||||
}
|
|
||||||
function onSettingsViewRequested(page) {
|
|
||||||
settingsDialog.pageToDisplay = page;
|
|
||||||
stackLayout.currentIndex = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ModelDownloaderView {
|
|
||||||
id: downloadView
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
Item {
|
|
||||||
Accessible.role: Accessible.Dialog
|
|
||||||
Accessible.name: qsTr("Download new models")
|
|
||||||
Accessible.description: qsTr("View for downloading new models")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsView {
|
|
||||||
id: settingsDialog
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.fillHeight: true
|
|
||||||
onDownloadClicked: {
|
|
||||||
stackLayout.currentIndex = 1
|
|
||||||
downloadView.showEmbeddingModels()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,17 +98,4 @@ MyDialog {
|
|||||||
Accessible.description: qsTr("Contains embedded link to https://home.nomic.ai")
|
Accessible.description: qsTr("Contains embedded link to https://home.nomic.ai")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyButton {
|
|
||||||
id: checkForUpdatesButton
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
text: qsTr("Check for updates...")
|
|
||||||
font.pixelSize: theme.fontSizeLarge
|
|
||||||
Accessible.description: qsTr("Launch an external application that will check for updates to the installer")
|
|
||||||
onClicked: {
|
|
||||||
if (!LLM.checkForUpdates())
|
|
||||||
checkForUpdatesError.open()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -16,22 +16,13 @@ Rectangle {
|
|||||||
id: theme
|
id: theme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signal downloadClicked
|
||||||
|
signal aboutClicked
|
||||||
|
|
||||||
color: theme.containerBackground
|
color: theme.containerBackground
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: borderRight
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
width: 2
|
|
||||||
color: theme.containerForeground
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
anchors.top: parent.top
|
anchors.fill: parent
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: borderRight.left
|
|
||||||
anchors.margins: 10
|
anchors.margins: 10
|
||||||
|
|
||||||
Accessible.role: Accessible.Pane
|
Accessible.role: Accessible.Pane
|
||||||
@ -59,7 +50,7 @@ Rectangle {
|
|||||||
anchors.rightMargin: -10
|
anchors.rightMargin: -10
|
||||||
anchors.topMargin: 10
|
anchors.topMargin: 10
|
||||||
anchors.top: newChat.bottom
|
anchors.top: newChat.bottom
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: checkForUpdatesButton.top
|
||||||
anchors.bottomMargin: 10
|
anchors.bottomMargin: 10
|
||||||
ScrollBar.vertical.policy: ScrollBar.AlwaysOff
|
ScrollBar.vertical.policy: ScrollBar.AlwaysOff
|
||||||
clip: true
|
clip: true
|
||||||
@ -245,5 +236,45 @@ Rectangle {
|
|||||||
Accessible.description: qsTr("List of chats in the drawer dialog")
|
Accessible.description: qsTr("List of chats in the drawer dialog")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyButton {
|
||||||
|
id: checkForUpdatesButton
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: downloadButton.top
|
||||||
|
anchors.bottomMargin: 10
|
||||||
|
text: qsTr("Updates")
|
||||||
|
font.pixelSize: theme.fontSizeLarge
|
||||||
|
Accessible.description: qsTr("Launch an external application that will check for updates to the installer")
|
||||||
|
onClicked: {
|
||||||
|
if (!LLM.checkForUpdates())
|
||||||
|
checkForUpdatesError.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyButton {
|
||||||
|
id: downloadButton
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: aboutButton.top
|
||||||
|
anchors.bottomMargin: 10
|
||||||
|
text: qsTr("Downloads")
|
||||||
|
Accessible.description: qsTr("Launch a dialog to download new models")
|
||||||
|
onClicked: {
|
||||||
|
downloadClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyButton {
|
||||||
|
id: aboutButton
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
text: qsTr("About")
|
||||||
|
Accessible.description: qsTr("Launch a dialog to show the about page")
|
||||||
|
onClicked: {
|
||||||
|
aboutClicked()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,6 @@ Rectangle {
|
|||||||
|
|
||||||
property var currentChat: ChatListModel.currentChat
|
property var currentChat: ChatListModel.currentChat
|
||||||
property var chatModel: currentChat.chatModel
|
property var chatModel: currentChat.chatModel
|
||||||
signal settingsViewRequested(int page)
|
|
||||||
signal downloadViewRequested(bool showEmbeddingModels)
|
|
||||||
|
|
||||||
color: theme.black
|
color: theme.black
|
||||||
|
|
||||||
@ -38,6 +36,13 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: downloadNewModels
|
||||||
|
function onClosed() {
|
||||||
|
startupDialogs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: Download
|
target: Download
|
||||||
function onHasNewerReleaseChanged() {
|
function onHasNewerReleaseChanged() {
|
||||||
@ -85,15 +90,15 @@ Rectangle {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for any current models and if not, open download view once
|
// check for any current models and if not, open download dialog once
|
||||||
if (!hasShownModelDownload && ModelList.installedModels.count === 0 && !firstStartDialog.opened) {
|
if (!hasShownModelDownload && ModelList.installedModels.count === 0 && !firstStartDialog.opened) {
|
||||||
downloadViewRequested();
|
downloadNewModels.open();
|
||||||
hasShownModelDownload = true;
|
hasShownModelDownload = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for new version
|
// check for new version
|
||||||
if (Download.hasNewerRelease && !firstStartDialog.opened) {
|
if (Download.hasNewerRelease && !firstStartDialog.opened && !downloadNewModels.opened) {
|
||||||
newVersionDialog.open();
|
newVersionDialog.open();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -148,6 +153,13 @@ Rectangle {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AboutDialog {
|
||||||
|
id: aboutDialog
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: Math.min(1024, window.width - (window.width * .2))
|
||||||
|
height: Math.min(600, window.height - (window.height * .2))
|
||||||
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
Accessible.role: Accessible.Window
|
Accessible.role: Accessible.Window
|
||||||
Accessible.name: title
|
Accessible.name: title
|
||||||
@ -282,265 +294,265 @@ Rectangle {
|
|||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
height: 100
|
height: 100
|
||||||
color: theme.mainHeader
|
color: theme.mainHeader
|
||||||
|
Item {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
height: childrenRect.height
|
||||||
|
visible: true
|
||||||
|
|
||||||
RowLayout {
|
Label {
|
||||||
id: comboLayout
|
id: modelLabel
|
||||||
height: 80
|
color: theme.textColor
|
||||||
anchors.left: parent.left
|
padding: 20
|
||||||
anchors.right: parent.right
|
font.pixelSize: theme.fontSizeLarger
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
text: ""
|
||||||
spacing: 20
|
background: Rectangle {
|
||||||
|
color: theme.mainHeader
|
||||||
Rectangle {
|
|
||||||
Layout.alignment: Qt.AlignLeft
|
|
||||||
Layout.leftMargin: 30
|
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.preferredWidth: 100
|
|
||||||
Layout.topMargin: 20
|
|
||||||
color: "transparent"
|
|
||||||
Layout.preferredHeight: childrenRect.height
|
|
||||||
MyToolButton {
|
|
||||||
id: drawerButton
|
|
||||||
anchors.left: parent.left
|
|
||||||
backgroundColor: theme.iconBackgroundLight
|
|
||||||
width: 40
|
|
||||||
height: 40
|
|
||||||
scale: 1.5
|
|
||||||
padding: 15
|
|
||||||
source: conversation.state === "expanded" ? "qrc:/gpt4all/icons/left_panel_open.svg" : "qrc:/gpt4all/icons/left_panel_closed.svg"
|
|
||||||
Accessible.role: Accessible.ButtonMenu
|
|
||||||
Accessible.name: qsTr("Chat panel")
|
|
||||||
Accessible.description: qsTr("Chat panel with options")
|
|
||||||
onClicked: {
|
|
||||||
conversation.toggleLeftPanel()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
horizontalAlignment: TextInput.AlignRight
|
||||||
}
|
}
|
||||||
|
|
||||||
MyComboBox {
|
RowLayout {
|
||||||
id: comboBox
|
id: comboLayout
|
||||||
Layout.alignment: Qt.AlignHCenter
|
anchors.top: modelLabel.top
|
||||||
Layout.fillHeight: true
|
anchors.bottom: modelLabel.bottom
|
||||||
Layout.fillWidth: true
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
Layout.preferredWidth: 100
|
anchors.horizontalCenterOffset: window.width >= 950 ? 0 : Math.max(-((950 - window.width) / 2), -99.5)
|
||||||
Layout.maximumWidth: 675
|
spacing: 20
|
||||||
enabled: !currentChat.isServer
|
|
||||||
&& !window.trySwitchContextInProgress
|
|
||||||
&& !window.isCurrentlyLoading
|
|
||||||
model: ModelList.installedModels
|
|
||||||
valueRole: "id"
|
|
||||||
textRole: "name"
|
|
||||||
|
|
||||||
function changeModel(index) {
|
MyComboBox {
|
||||||
window.modelLoadingPercentage = 0.0;
|
id: comboBox
|
||||||
window.isCurrentlyLoading = true;
|
Layout.fillWidth: true
|
||||||
currentChat.stopGenerating()
|
Layout.fillHeight: true
|
||||||
currentChat.reset();
|
implicitWidth: 575
|
||||||
currentChat.modelInfo = ModelList.modelInfo(comboBox.valueAt(index))
|
width: window.width >= 750 ? implicitWidth : implicitWidth - (750 - window.width)
|
||||||
}
|
enabled: !currentChat.isServer
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: currentChat
|
|
||||||
function onModelLoadingPercentageChanged() {
|
|
||||||
window.modelLoadingPercentage = currentChat.modelLoadingPercentage;
|
|
||||||
window.isCurrentlyLoading = currentChat.modelLoadingPercentage !== 0.0
|
|
||||||
&& currentChat.modelLoadingPercentage !== 1.0;
|
|
||||||
}
|
|
||||||
function onTrySwitchContextOfLoadedModelAttempted() {
|
|
||||||
window.trySwitchContextInProgress = true;
|
|
||||||
}
|
|
||||||
function onTrySwitchContextOfLoadedModelCompleted() {
|
|
||||||
window.trySwitchContextInProgress = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Connections {
|
|
||||||
target: switchModelDialog
|
|
||||||
function onAccepted() {
|
|
||||||
comboBox.changeModel(switchModelDialog.index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
background: ProgressBar {
|
|
||||||
id: modelProgress
|
|
||||||
value: window.modelLoadingPercentage
|
|
||||||
background: Rectangle {
|
|
||||||
color: theme.mainComboBackground
|
|
||||||
radius: 10
|
|
||||||
}
|
|
||||||
contentItem: Item {
|
|
||||||
Rectangle {
|
|
||||||
visible: window.isCurrentlyLoading
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
width: modelProgress.visualPosition * parent.width
|
|
||||||
height: 10
|
|
||||||
radius: 2
|
|
||||||
color: theme.progressForeground
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
contentItem: Text {
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
leftPadding: 10
|
|
||||||
rightPadding: {
|
|
||||||
if (ejectButton.visible && reloadButton)
|
|
||||||
return 105;
|
|
||||||
if (reloadButton.visible)
|
|
||||||
return 65
|
|
||||||
return 25
|
|
||||||
}
|
|
||||||
text: {
|
|
||||||
if (currentChat.modelLoadingError !== "")
|
|
||||||
return qsTr("Model loading error...")
|
|
||||||
if (window.trySwitchContextInProgress)
|
|
||||||
return qsTr("Switching context...")
|
|
||||||
if (currentModelName() === "")
|
|
||||||
return qsTr("Choose a model...")
|
|
||||||
if (currentChat.modelLoadingPercentage === 0.0)
|
|
||||||
return qsTr("Reload \u00B7 ") + currentModelName()
|
|
||||||
if (window.isCurrentlyLoading)
|
|
||||||
return qsTr("Loading \u00B7 ") + currentModelName()
|
|
||||||
return currentModelName()
|
|
||||||
}
|
|
||||||
font.pixelSize: theme.fontSizeLarger
|
|
||||||
color: theme.white
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
elide: Text.ElideRight
|
|
||||||
}
|
|
||||||
delegate: ItemDelegate {
|
|
||||||
id: comboItemDelegate
|
|
||||||
width: comboBox.width
|
|
||||||
contentItem: Text {
|
|
||||||
text: name
|
|
||||||
color: theme.textColor
|
|
||||||
font: comboBox.font
|
|
||||||
elide: Text.ElideRight
|
|
||||||
verticalAlignment: Text.AlignVCenter
|
|
||||||
}
|
|
||||||
background: Rectangle {
|
|
||||||
color: (index % 2 === 0 ? theme.darkContrast : theme.lightContrast)
|
|
||||||
border.width: highlighted
|
|
||||||
border.color: theme.accentColor
|
|
||||||
}
|
|
||||||
highlighted: comboBox.highlightedIndex === index
|
|
||||||
}
|
|
||||||
Accessible.role: Accessible.ComboBox
|
|
||||||
Accessible.name: currentModelName()
|
|
||||||
Accessible.description: qsTr("The top item is the current model")
|
|
||||||
onActivated: function (index) {
|
|
||||||
var newInfo = ModelList.modelInfo(comboBox.valueAt(index));
|
|
||||||
if (newInfo === currentChat.modelInfo) {
|
|
||||||
currentChat.reloadModel();
|
|
||||||
} else if (currentModelName() !== "" && chatModel.count !== 0) {
|
|
||||||
switchModelDialog.index = index;
|
|
||||||
switchModelDialog.open();
|
|
||||||
} else {
|
|
||||||
comboBox.changeModel(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MyMiniButton {
|
|
||||||
id: ejectButton
|
|
||||||
visible: currentChat.isModelLoaded && !window.isCurrentlyLoading
|
|
||||||
z: 500
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 50
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
source: "qrc:/gpt4all/icons/eject.svg"
|
|
||||||
backgroundColor: theme.gray300
|
|
||||||
backgroundColorHovered: theme.iconBackgroundLight
|
|
||||||
onClicked: {
|
|
||||||
currentChat.forceUnloadModel();
|
|
||||||
}
|
|
||||||
ToolTip.text: qsTr("Eject the currently loaded model")
|
|
||||||
ToolTip.visible: hovered
|
|
||||||
}
|
|
||||||
|
|
||||||
MyMiniButton {
|
|
||||||
id: reloadButton
|
|
||||||
visible: currentChat.modelLoadingError === ""
|
|
||||||
&& !window.trySwitchContextInProgress
|
&& !window.trySwitchContextInProgress
|
||||||
&& !window.isCurrentlyLoading
|
&& !window.isCurrentlyLoading
|
||||||
&& (currentChat.isModelLoaded || currentModelName() !== "")
|
model: ModelList.installedModels
|
||||||
z: 500
|
valueRole: "id"
|
||||||
anchors.right: ejectButton.visible ? ejectButton.left : parent.right
|
textRole: "name"
|
||||||
anchors.rightMargin: ejectButton.visible ? 10 : 50
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
function changeModel(index) {
|
||||||
source: "qrc:/gpt4all/icons/regenerate.svg"
|
window.modelLoadingPercentage = 0.0;
|
||||||
backgroundColor: theme.gray300
|
window.isCurrentlyLoading = true;
|
||||||
backgroundColorHovered: theme.iconBackgroundLight
|
currentChat.stopGenerating()
|
||||||
onClicked: {
|
currentChat.reset();
|
||||||
if (currentChat.isModelLoaded)
|
currentChat.modelInfo = ModelList.modelInfo(comboBox.valueAt(index))
|
||||||
currentChat.forceReloadModel();
|
|
||||||
else
|
|
||||||
currentChat.reloadModel();
|
|
||||||
}
|
}
|
||||||
ToolTip.text: qsTr("Reload the currently loaded model")
|
|
||||||
ToolTip.visible: hovered
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
Connections {
|
||||||
color: "transparent"
|
target: currentChat
|
||||||
Layout.alignment: Qt.AlignRight
|
function onModelLoadingPercentageChanged() {
|
||||||
Layout.rightMargin: 30
|
window.modelLoadingPercentage = currentChat.modelLoadingPercentage;
|
||||||
Layout.fillWidth: true
|
window.isCurrentlyLoading = currentChat.modelLoadingPercentage !== 0.0
|
||||||
Layout.preferredWidth: 100
|
&& currentChat.modelLoadingPercentage !== 1.0;
|
||||||
Layout.preferredHeight: childrenRect.height
|
|
||||||
Layout.topMargin: 20
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
spacing: 20
|
|
||||||
anchors.right: parent.right
|
|
||||||
MyButton {
|
|
||||||
id: collectionsButton
|
|
||||||
Image {
|
|
||||||
id: collectionsImage
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: 15
|
|
||||||
width: 24
|
|
||||||
height: 24
|
|
||||||
mipmap: true
|
|
||||||
source: "qrc:/gpt4all/icons/db.svg"
|
|
||||||
}
|
}
|
||||||
|
function onTrySwitchContextOfLoadedModelAttempted() {
|
||||||
ColorOverlay {
|
window.trySwitchContextInProgress = true;
|
||||||
anchors.fill: collectionsImage
|
|
||||||
source: collectionsImage
|
|
||||||
color: collectionsButton.hovered || collectionsImage.toggled ? theme.iconBackgroundHovered : theme.iconBackgroundLight
|
|
||||||
}
|
}
|
||||||
|
function onTrySwitchContextOfLoadedModelCompleted() {
|
||||||
|
window.trySwitchContextInProgress = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: switchModelDialog
|
||||||
|
function onAccepted() {
|
||||||
|
comboBox.changeModel(switchModelDialog.index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
leftPadding: 50
|
background: ProgressBar {
|
||||||
borderWidth: 0
|
id: modelProgress
|
||||||
backgroundColor: theme.mainComboBackground
|
value: window.modelLoadingPercentage
|
||||||
backgroundColorHovered: theme.conversationButtonBackgroundHovered
|
|
||||||
backgroundRadius: 5
|
|
||||||
padding: 15
|
|
||||||
topPadding: 8
|
|
||||||
bottomPadding: 8
|
|
||||||
textColor: hovered || toggled ? theme.iconBackgroundHovered : theme.iconBackgroundLight
|
|
||||||
text: qsTr("LocalDocs")
|
|
||||||
fontPixelSize: theme.fontSizeSmall
|
|
||||||
|
|
||||||
property bool toggled: currentChat.collectionList.length
|
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
radius: collectionsButton.backgroundRadius
|
color: theme.mainComboBackground
|
||||||
color: collectionsButton.toggled ? collectionsButton.backgroundColorHovered : collectionsButton.backgroundColor
|
radius: 10
|
||||||
}
|
}
|
||||||
|
contentItem: Item {
|
||||||
|
Rectangle {
|
||||||
|
visible: window.isCurrentlyLoading
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
width: modelProgress.visualPosition * parent.width
|
||||||
|
height: 10
|
||||||
|
radius: 2
|
||||||
|
color: theme.progressForeground
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contentItem: Text {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
leftPadding: 10
|
||||||
|
rightPadding: {
|
||||||
|
if (ejectButton.visible && reloadButton)
|
||||||
|
return 105;
|
||||||
|
if (reloadButton.visible)
|
||||||
|
return 65
|
||||||
|
return 25
|
||||||
|
}
|
||||||
|
text: {
|
||||||
|
if (currentChat.modelLoadingError !== "")
|
||||||
|
return qsTr("Model loading error...")
|
||||||
|
if (window.trySwitchContextInProgress)
|
||||||
|
return qsTr("Switching context...")
|
||||||
|
if (currentModelName() === "")
|
||||||
|
return qsTr("Choose a model...")
|
||||||
|
if (currentChat.modelLoadingPercentage === 0.0)
|
||||||
|
return qsTr("Reload \u00B7 ") + currentModelName()
|
||||||
|
if (window.isCurrentlyLoading)
|
||||||
|
return qsTr("Loading \u00B7 ") + currentModelName()
|
||||||
|
return currentModelName()
|
||||||
|
}
|
||||||
|
font.pixelSize: theme.fontSizeLarger
|
||||||
|
color: theme.white
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
delegate: ItemDelegate {
|
||||||
|
id: comboItemDelegate
|
||||||
|
width: comboBox.width
|
||||||
|
contentItem: Text {
|
||||||
|
text: name
|
||||||
|
color: theme.textColor
|
||||||
|
font: comboBox.font
|
||||||
|
elide: Text.ElideRight
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
}
|
||||||
|
background: Rectangle {
|
||||||
|
color: (index % 2 === 0 ? theme.darkContrast : theme.lightContrast)
|
||||||
|
border.width: highlighted
|
||||||
|
border.color: theme.accentColor
|
||||||
|
}
|
||||||
|
highlighted: comboBox.highlightedIndex === index
|
||||||
|
}
|
||||||
|
Accessible.role: Accessible.ComboBox
|
||||||
|
Accessible.name: currentModelName()
|
||||||
|
Accessible.description: qsTr("The top item is the current model")
|
||||||
|
onActivated: function (index) {
|
||||||
|
var newInfo = ModelList.modelInfo(comboBox.valueAt(index));
|
||||||
|
if (newInfo === currentChat.modelInfo) {
|
||||||
|
currentChat.reloadModel();
|
||||||
|
} else if (currentModelName() !== "" && chatModel.count !== 0) {
|
||||||
|
switchModelDialog.index = index;
|
||||||
|
switchModelDialog.open();
|
||||||
|
} else {
|
||||||
|
comboBox.changeModel(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Accessible.name: qsTr("Add documents")
|
MyMiniButton {
|
||||||
Accessible.description: qsTr("add collections of documents to the chat")
|
id: ejectButton
|
||||||
|
visible: currentChat.isModelLoaded && !window.isCurrentlyLoading
|
||||||
|
z: 500
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: 50
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
source: "qrc:/gpt4all/icons/eject.svg"
|
||||||
|
backgroundColor: theme.gray300
|
||||||
|
backgroundColorHovered: theme.iconBackgroundLight
|
||||||
onClicked: {
|
onClicked: {
|
||||||
collectionsDialog.open()
|
currentChat.forceUnloadModel();
|
||||||
}
|
}
|
||||||
|
ToolTip.text: qsTr("Eject the currently loaded model")
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
}
|
||||||
|
|
||||||
|
MyMiniButton {
|
||||||
|
id: reloadButton
|
||||||
|
visible: currentChat.modelLoadingError === ""
|
||||||
|
&& !window.trySwitchContextInProgress
|
||||||
|
&& !window.isCurrentlyLoading
|
||||||
|
&& (currentChat.isModelLoaded || currentModelName() !== "")
|
||||||
|
z: 500
|
||||||
|
anchors.right: ejectButton.visible ? ejectButton.left : parent.right
|
||||||
|
anchors.rightMargin: ejectButton.visible ? 10 : 50
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
source: "qrc:/gpt4all/icons/regenerate.svg"
|
||||||
|
backgroundColor: theme.gray300
|
||||||
|
backgroundColorHovered: theme.iconBackgroundLight
|
||||||
|
onClicked: {
|
||||||
|
if (currentChat.isModelLoaded)
|
||||||
|
currentChat.forceReloadModel();
|
||||||
|
else
|
||||||
|
currentChat.reloadModel();
|
||||||
|
}
|
||||||
|
ToolTip.text: qsTr("Reload the currently loaded model")
|
||||||
|
ToolTip.visible: hovered
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SettingsDialog {
|
||||||
|
id: settingsDialog
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: Math.min(1920, window.width - (window.width * .1))
|
||||||
|
height: window.height - (window.height * .1)
|
||||||
|
onDownloadClicked: {
|
||||||
|
downloadNewModels.showEmbeddingModels = true
|
||||||
|
downloadNewModels.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: drawerButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.leftMargin: 30
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
scale: 1.5
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
source: conversation.state === "expanded" ? "qrc:/gpt4all/icons/left_panel_open.svg" : "qrc:/gpt4all/icons/left_panel_closed.svg"
|
||||||
|
Accessible.role: Accessible.ButtonMenu
|
||||||
|
Accessible.name: qsTr("Chat panel")
|
||||||
|
Accessible.description: qsTr("Chat panel with options")
|
||||||
|
onClicked: {
|
||||||
|
conversation.toggleLeftPanel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkDialog {
|
||||||
|
id: networkDialog
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: Math.min(1024, window.width - (window.width * .2))
|
||||||
|
height: Math.min(600, window.height - (window.height * .2))
|
||||||
|
Item {
|
||||||
|
Accessible.role: Accessible.Dialog
|
||||||
|
Accessible.name: qsTr("Network dialog")
|
||||||
|
Accessible.description: qsTr("opt-in to share feedback/conversations")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: networkButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.rightMargin: 30
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
toggled: MySettings.networkIsActive
|
||||||
|
source: "qrc:/gpt4all/icons/network.svg"
|
||||||
|
Accessible.name: qsTr("Network")
|
||||||
|
Accessible.description: qsTr("Reveals a dialogue where you can opt-in for sharing data over network")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
if (MySettings.networkIsActive) {
|
||||||
|
MySettings.networkIsActive = false
|
||||||
|
Network.sendNetworkToggled(false);
|
||||||
|
} else
|
||||||
|
networkDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: Network
|
target: Network
|
||||||
function onHealthCheckFailed(code) {
|
function onHealthCheckFailed(code) {
|
||||||
@ -552,7 +564,49 @@ Rectangle {
|
|||||||
id: collectionsDialog
|
id: collectionsDialog
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
onAddRemoveClicked: {
|
onAddRemoveClicked: {
|
||||||
settingsViewRequested(2 /*page 2*/)
|
settingsDialog.pageToDisplay = 2;
|
||||||
|
settingsDialog.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: collectionsButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.right: networkButton.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
width: 40
|
||||||
|
height: 42.5
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
toggled: currentChat.collectionList.length
|
||||||
|
source: "qrc:/gpt4all/icons/db.svg"
|
||||||
|
Accessible.name: qsTr("Add documents")
|
||||||
|
Accessible.description: qsTr("add collections of documents to the chat")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
collectionsDialog.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: settingsButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.right: collectionsButton.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
source: "qrc:/gpt4all/icons/settings.svg"
|
||||||
|
Accessible.name: qsTr("Settings")
|
||||||
|
Accessible.description: qsTr("Reveals a dialogue with settings")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
settingsDialog.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,6 +650,35 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: copyButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.right: settingsButton.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
source: "qrc:/gpt4all/icons/copy.svg"
|
||||||
|
Accessible.name: qsTr("Copy")
|
||||||
|
Accessible.description: qsTr("Copy the conversation to the clipboard")
|
||||||
|
|
||||||
|
TextEdit{
|
||||||
|
id: copyEdit
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
var conversation = getConversation()
|
||||||
|
copyEdit.text = conversation
|
||||||
|
copyEdit.selectAll()
|
||||||
|
copyEdit.copy()
|
||||||
|
copyMessage.open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getConversation() {
|
function getConversation() {
|
||||||
var conversation = "";
|
var conversation = "";
|
||||||
for (var i = 0; i < chatModel.count; i++) {
|
for (var i = 0; i < chatModel.count; i++) {
|
||||||
@ -633,6 +716,29 @@ Rectangle {
|
|||||||
return str + "]}"
|
return str + "]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyToolButton {
|
||||||
|
id: resetContextButton
|
||||||
|
backgroundColor: theme.iconBackgroundLight
|
||||||
|
anchors.right: copyButton.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.topMargin: 42.5
|
||||||
|
anchors.rightMargin: 10
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
z: 200
|
||||||
|
padding: 15
|
||||||
|
source: "qrc:/gpt4all/icons/regenerate.svg"
|
||||||
|
|
||||||
|
Accessible.name: text
|
||||||
|
Accessible.description: qsTr("Reset the context and erase current conversation")
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
Network.sendResetContext(chatModel.count)
|
||||||
|
currentChat.reset();
|
||||||
|
currentChat.processSystemPrompt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Dialog {
|
Dialog {
|
||||||
id: checkForUpdatesError
|
id: checkForUpdatesError
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
@ -662,12 +768,31 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ModelDownloaderDialog {
|
||||||
|
id: downloadNewModels
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: Math.min(1920, window.width - (window.width * .1))
|
||||||
|
height: window.height - (window.height * .1)
|
||||||
|
Item {
|
||||||
|
Accessible.role: Accessible.Dialog
|
||||||
|
Accessible.name: qsTr("Download new models")
|
||||||
|
Accessible.description: qsTr("Dialog for downloading new models")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ChatDrawer {
|
ChatDrawer {
|
||||||
id: drawer
|
id: drawer
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.top: accentRibbon.bottom
|
anchors.top: accentRibbon.bottom
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
width: Math.max(180, Math.min(600, 0.2 * window.width))
|
width: Math.min(600, 0.2 * window.width)
|
||||||
|
onDownloadClicked: {
|
||||||
|
downloadNewModels.showEmbeddingModels = false
|
||||||
|
downloadNewModels.open()
|
||||||
|
}
|
||||||
|
onAboutClicked: {
|
||||||
|
aboutDialog.open()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupDialog {
|
PopupDialog {
|
||||||
@ -847,7 +972,7 @@ Rectangle {
|
|||||||
padding: 18
|
padding: 18
|
||||||
leftPadding: 50
|
leftPadding: 50
|
||||||
Image {
|
Image {
|
||||||
id: downloadImage
|
id: image
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 15
|
anchors.leftMargin: 15
|
||||||
@ -857,13 +982,12 @@ Rectangle {
|
|||||||
source: "qrc:/gpt4all/icons/download.svg"
|
source: "qrc:/gpt4all/icons/download.svg"
|
||||||
}
|
}
|
||||||
ColorOverlay {
|
ColorOverlay {
|
||||||
anchors.fill: downloadImage
|
anchors.fill: image
|
||||||
source: downloadImage
|
source: image
|
||||||
color: theme.accentColor
|
color: theme.accentColor
|
||||||
}
|
}
|
||||||
onClicked: {
|
onClicked: {
|
||||||
console.log("download button")
|
downloadNewModels.open();
|
||||||
downloadViewRequested(false /*showEmbeddingModels*/);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -872,7 +996,10 @@ Rectangle {
|
|||||||
ListView {
|
ListView {
|
||||||
id: listView
|
id: listView
|
||||||
visible: ModelList.installedModels.count !== 0 && chatModel.count !== 0
|
visible: ModelList.installedModels.count !== 0 && chatModel.count !== 0
|
||||||
anchors.fill: parent
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
width: Math.min(1280, parent.width)
|
||||||
model: chatModel
|
model: chatModel
|
||||||
|
|
||||||
ScrollBar.vertical: ScrollBar {
|
ScrollBar.vertical: ScrollBar {
|
||||||
@ -886,8 +1013,7 @@ Rectangle {
|
|||||||
delegate: TextArea {
|
delegate: TextArea {
|
||||||
id: myTextArea
|
id: myTextArea
|
||||||
text: value + (MySettings.localDocsShowReferences ? references : "")
|
text: value + (MySettings.localDocsShowReferences ? references : "")
|
||||||
anchors.horizontalCenter: listView.contentItem.horizontalCenter
|
width: listView.width
|
||||||
width: Math.min(1280, listView.contentItem.width)
|
|
||||||
color: {
|
color: {
|
||||||
if (!currentChat.isServer)
|
if (!currentChat.isServer)
|
||||||
return theme.textColor
|
return theme.textColor
|
||||||
|
@ -11,15 +11,21 @@ import modellist
|
|||||||
import network
|
import network
|
||||||
import mysettings
|
import mysettings
|
||||||
|
|
||||||
Rectangle {
|
MyDialog {
|
||||||
id: modelDownloaderDialog
|
id: modelDownloaderDialog
|
||||||
color: theme.containerBackground
|
modal: true
|
||||||
|
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
|
||||||
|
padding: 10
|
||||||
|
property bool showEmbeddingModels: false
|
||||||
|
|
||||||
function showEmbeddingModels() {
|
onOpened: {
|
||||||
Network.sendModelDownloaderDialog();
|
Network.sendModelDownloaderDialog();
|
||||||
ModelList.downloadableModels.expanded = true
|
|
||||||
var targetModelIndex = ModelList.defaultEmbeddingModelIndex
|
if (showEmbeddingModels) {
|
||||||
modelListView.positionViewAtIndex(targetModelIndex, ListView.Beginning)
|
ModelList.downloadableModels.expanded = true
|
||||||
|
var targetModelIndex = ModelList.defaultEmbeddingModelIndex
|
||||||
|
modelListView.positionViewAtIndex(targetModelIndex, ListView.Beginning)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupDialog {
|
PopupDialog {
|
||||||
@ -30,7 +36,7 @@ Rectangle {
|
|||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 20
|
anchors.margins: 10
|
||||||
spacing: 30
|
spacing: 30
|
||||||
|
|
||||||
Label {
|
Label {
|
@ -9,8 +9,6 @@ Button {
|
|||||||
padding: 10
|
padding: 10
|
||||||
property color backgroundColor: theme.iconBackgroundDark
|
property color backgroundColor: theme.iconBackgroundDark
|
||||||
property color backgroundColorHovered: theme.iconBackgroundHovered
|
property color backgroundColorHovered: theme.iconBackgroundHovered
|
||||||
property color toggledColor: theme.accentColor
|
|
||||||
property real toggledWidth: 1
|
|
||||||
property bool toggled: false
|
property bool toggled: false
|
||||||
property alias source: image.source
|
property alias source: image.source
|
||||||
property alias fillMode: image.fillMode
|
property alias fillMode: image.fillMode
|
||||||
@ -27,12 +25,11 @@ Button {
|
|||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: myButton.toggledColor
|
color: "transparent"
|
||||||
visible: myButton.toggled
|
visible: myButton.toggled
|
||||||
border.color: myButton.toggledColor
|
border.color: theme.accentColor
|
||||||
border.width: myButton.toggledWidth
|
border.width: 1
|
||||||
radius: 6
|
radius: 10
|
||||||
opacity: .2
|
|
||||||
}
|
}
|
||||||
Image {
|
Image {
|
||||||
id: image
|
id: image
|
||||||
|
132
gpt4all-chat/qml/SettingsDialog.qml
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import QtCore
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Controls.Basic
|
||||||
|
import QtQuick.Dialogs
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Qt.labs.folderlistmodel
|
||||||
|
import download
|
||||||
|
import modellist
|
||||||
|
import network
|
||||||
|
import llm
|
||||||
|
import mysettings
|
||||||
|
|
||||||
|
MyDialog {
|
||||||
|
id: settingsDialog
|
||||||
|
modal: true
|
||||||
|
padding: 20
|
||||||
|
onOpened: {
|
||||||
|
Network.sendSettingsDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
signal downloadClicked
|
||||||
|
property alias pageToDisplay: listView.currentIndex
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Accessible.role: Accessible.Dialog
|
||||||
|
Accessible.name: qsTr("Settings")
|
||||||
|
Accessible.description: qsTr("Contains various application settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
id: stacksModel
|
||||||
|
ListElement {
|
||||||
|
title: qsTr("Models")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
title: qsTr("Application")
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
title: qsTr("LocalDocs")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: stackList
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
width: 220
|
||||||
|
color: theme.controlBackground
|
||||||
|
radius: 10
|
||||||
|
|
||||||
|
ScrollView {
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.topMargin: 10
|
||||||
|
ScrollBar.vertical.policy: ScrollBar.AsNeeded
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listView
|
||||||
|
anchors.fill: parent
|
||||||
|
model: stacksModel
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
id: item
|
||||||
|
width: listView.width
|
||||||
|
height: titleLabel.height + 10
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
MyButton {
|
||||||
|
id: titleLabel
|
||||||
|
backgroundColor: index === listView.currentIndex ? theme.buttonBackground : theme.controlBackground
|
||||||
|
backgroundColorHovered: index === listView.currentIndex ? backgroundColor : theme.containerBackground
|
||||||
|
borderColor: index === listView.currentIndex ? theme.accentColor : "transparent"
|
||||||
|
borderWidth: index === listView.currentIndex ? 1 : 0
|
||||||
|
textColor: index === listView.currentIndex ? theme.oppositeTextColor : theme.titleTextColor
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.margins: 10
|
||||||
|
font.bold: index === listView.currentIndex
|
||||||
|
text: title
|
||||||
|
font.pixelSize: theme.fontSizeLarge
|
||||||
|
onClicked: {
|
||||||
|
listView.currentIndex = index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StackLayout {
|
||||||
|
id: stackLayout
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.left: stackList.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
currentIndex: listView.currentIndex
|
||||||
|
|
||||||
|
MySettingsStack {
|
||||||
|
title: qsTr("Model/Character Settings")
|
||||||
|
tabs: [
|
||||||
|
Component { ModelSettings { } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
MySettingsStack {
|
||||||
|
title: qsTr("Application General Settings")
|
||||||
|
tabs: [
|
||||||
|
Component { ApplicationSettings { } }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
MySettingsStack {
|
||||||
|
title: qsTr("Local Document Collections")
|
||||||
|
tabs: [
|
||||||
|
Component {
|
||||||
|
LocalDocsSettings {
|
||||||
|
id: localDocsSettings
|
||||||
|
Component.onCompleted: {
|
||||||
|
localDocsSettings.downloadClicked.connect(settingsDialog.downloadClicked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,132 +0,0 @@
|
|||||||
import QtCore
|
|
||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Controls.Basic
|
|
||||||
import QtQuick.Dialogs
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import Qt.labs.folderlistmodel
|
|
||||||
import download
|
|
||||||
import modellist
|
|
||||||
import network
|
|
||||||
import llm
|
|
||||||
import mysettings
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: settingsDialog
|
|
||||||
color: theme.containerBackground
|
|
||||||
|
|
||||||
signal downloadClicked
|
|
||||||
property alias pageToDisplay: listView.currentIndex
|
|
||||||
|
|
||||||
Item {
|
|
||||||
Accessible.role: Accessible.Dialog
|
|
||||||
Accessible.name: qsTr("Settings")
|
|
||||||
Accessible.description: qsTr("Contains various application settings")
|
|
||||||
}
|
|
||||||
|
|
||||||
ListModel {
|
|
||||||
id: stacksModel
|
|
||||||
ListElement {
|
|
||||||
title: qsTr("Models")
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
title: qsTr("Application")
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
title: qsTr("LocalDocs")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.margins: 20
|
|
||||||
Rectangle {
|
|
||||||
id: stackList
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
width: 220
|
|
||||||
color: theme.controlBackground
|
|
||||||
radius: 10
|
|
||||||
|
|
||||||
ScrollView {
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.topMargin: 10
|
|
||||||
ScrollBar.vertical.policy: ScrollBar.AsNeeded
|
|
||||||
clip: true
|
|
||||||
|
|
||||||
ListView {
|
|
||||||
id: listView
|
|
||||||
anchors.fill: parent
|
|
||||||
model: stacksModel
|
|
||||||
|
|
||||||
delegate: Rectangle {
|
|
||||||
id: item
|
|
||||||
width: listView.width
|
|
||||||
height: titleLabel.height + 10
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
MyButton {
|
|
||||||
id: titleLabel
|
|
||||||
backgroundColor: index === listView.currentIndex ? theme.buttonBackground : theme.controlBackground
|
|
||||||
backgroundColorHovered: index === listView.currentIndex ? backgroundColor : theme.containerBackground
|
|
||||||
borderColor: index === listView.currentIndex ? theme.accentColor : "transparent"
|
|
||||||
borderWidth: index === listView.currentIndex ? 1 : 0
|
|
||||||
textColor: index === listView.currentIndex ? theme.oppositeTextColor : theme.titleTextColor
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.margins: 10
|
|
||||||
font.bold: index === listView.currentIndex
|
|
||||||
text: title
|
|
||||||
font.pixelSize: theme.fontSizeLarge
|
|
||||||
onClicked: {
|
|
||||||
listView.currentIndex = index
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StackLayout {
|
|
||||||
id: stackLayout
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: stackList.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
currentIndex: listView.currentIndex
|
|
||||||
|
|
||||||
MySettingsStack {
|
|
||||||
title: qsTr("Model/Character Settings")
|
|
||||||
tabs: [
|
|
||||||
Component { ModelSettings { } }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
MySettingsStack {
|
|
||||||
title: qsTr("Application General Settings")
|
|
||||||
tabs: [
|
|
||||||
Component { ApplicationSettings { } }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
MySettingsStack {
|
|
||||||
title: qsTr("Local Document Collections")
|
|
||||||
tabs: [
|
|
||||||
Component {
|
|
||||||
LocalDocsSettings {
|
|
||||||
id: localDocsSettings
|
|
||||||
Component.onCompleted: {
|
|
||||||
localDocsSettings.downloadClicked.connect(settingsDialog.downloadClicked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -200,17 +200,6 @@ QtObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property color viewBarBackground: {
|
|
||||||
switch (MySettings.chatTheme) {
|
|
||||||
case "LegacyDark":
|
|
||||||
return blue950;
|
|
||||||
case "Dark":
|
|
||||||
return darkgray300;
|
|
||||||
default:
|
|
||||||
return gray300;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property color progressForeground: {
|
property color progressForeground: {
|
||||||
switch (MySettings.chatTheme) {
|
switch (MySettings.chatTheme) {
|
||||||
case "LegacyDark":
|
case "LegacyDark":
|
||||||
@ -387,39 +376,6 @@ QtObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property color iconBackgroundViewBar: {
|
|
||||||
switch (MySettings.chatTheme) {
|
|
||||||
case "LegacyDark":
|
|
||||||
return iconBackgroundLight;
|
|
||||||
case "Dark":
|
|
||||||
return iconBackgroundLight;
|
|
||||||
default:
|
|
||||||
return green600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property color iconBackgroundViewBarToggled: {
|
|
||||||
switch (MySettings.chatTheme) {
|
|
||||||
case "LegacyDark":
|
|
||||||
return iconBackgroundHovered;
|
|
||||||
case "Dark":
|
|
||||||
return green400;
|
|
||||||
default:
|
|
||||||
return green950;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property color iconBackgroundViewBarHovered: {
|
|
||||||
switch (MySettings.chatTheme) {
|
|
||||||
case "LegacyDark":
|
|
||||||
return iconBackgroundHovered;
|
|
||||||
case "Dark":
|
|
||||||
return iconBackgroundHovered;
|
|
||||||
default:
|
|
||||||
return green950;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property color slugBackground: {
|
property color slugBackground: {
|
||||||
switch (MySettings.chatTheme) {
|
switch (MySettings.chatTheme) {
|
||||||
case "LegacyDark":
|
case "LegacyDark":
|
||||||
|