* Added subage and followage information to usercard
We are using Leppunen's API here to determine user's subage to the current channel and since that API call also returns followage information I decided to utilize that and save ourselves an extra Helix API call.
I also added new files specifying new class and methods for Ivr API, which can be very easily expanded with new methods in the future if we ever have to do that.
When I was coding I also saw couple unnecessary nitpicks which I fixed :)
* Added changelog entry
* remove empty lambda
* Update UserInfoPopup.cpp
* xd
Co-authored-by: fourtf <tf.four@gmail.com>
* feat: improve "Login expired!" message
Since this message occurs when the OAuth token becomes invalid, users
have to re-add their account in order to continue using the application.
The previous message did not make this clear enough, often leading to
confusion and questions by users.
This commit changes the system message to more clear about what the user
has to do, and adds a link that opens the "Accounts" page in the
preferences.
* Update changelog
* Update ChannelView.cpp
Co-authored-by: fourtf <tf.four@gmail.com>
Fix the following compiler warning
../src/common/NetworkResult.hpp: In constructor ‘chatterino::NetworkResult::NetworkResult(const QByteArray&, int)’:
../src/common/NetworkResult.hpp:28:16: warning: ‘chatterino::NetworkResult::data_’ will be initialized after [-Wreorder]
28 | QByteArray data_;
| ^~~~~
../src/common/NetworkResult.hpp:27:9: warning: ‘int chatterino::NetworkResult::status_’ [-Wreorder]
27 | int status_;
| ^~~~~~~
../src/common/NetworkResult.cpp:9:1: warning: when initialized here [-Wreorder]
9 | NetworkResult::NetworkResult(const QByteArray &data, int status)
* Clang compiler warnings
Fixes every instance of the following error:
In file included from ../src/widgets/settingspages/CommandPage.cpp:12:
In file included from ../src/controllers/commands/CommandModel.hpp:5:
../src/common/SignalVectorModel.hpp:242:10: warning: 'moveRows' overrides a member function but is not marked 'override' [-Winconsistent-missing-override]
bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count,
^
../src/controllers/commands/CommandModel.hpp:12:29: note: in instantiation of template class 'chatterino::SignalVectorModel<chatterino::Command>' requested here
class CommandModel : public SignalVectorModel<Command>
* Experimental argument handling
* Restored browser extension launch functionality
Also moved check from BrowerExtension.cpp to Args.cpp as it is more relevant there and doesn't require passing arguments to a function in another file
* Fixed formatting
* Simplified Args.cpp code, added changelog entry
* Hid crash-recovery from help
* Dont save settings if launched with --channels
* Changed parsing method to t:channel
* Code cleanup
* Changed plaform delimeter to :, platform defaults to Twitch
Co-authored-by: fourtf <tf.four@gmail.com>
* Add move up, down buttons to list settings
Channel notifications, moderation buttons etc. have a move up and move
down button now for reordering.
* Selection follows moved rows, refactor
Also fixed rows past the 2nd one not moving
* Update selection property with more than 1 column
* Fix crash when moving without a row selected
* Move rows with drag and drop
Right now it's a little iffy registering the row to be moved, but I
wanna go to bed :)
* Remove EditableTableView, move to SignalVectorModel
Replace my ghetto drag and drop solution in EditableTableView with small
patches to the stuff already written in SignalVectorModel::dropMimeData
We would have been able to keep doing this if the Network Request code
followed redirects - however, it doesn't, so this is the best we can do.
We also don't have header support in Network Result, so we can't
validate that the response we got is actually an image.
Fixes#1972
* Split up Window Layout loading into a loading and application stage
Previously, we were creating UI elements at while we were reading the window-layout.json file.
We now read the window-layout.json file fully first, which results in a
WindowLayout struct which is built up of a list of windows with a list
of tabs with a root node which contains containers and splits.
This WindowLayout can then be applied.
This will enable PRs like #1940 to start Chatterino with Window Layouts
that aren't defined in a json file.
This commit has deprecated loading of v1 window layouts (we're now on v2). If a v1 window layout is there, it will just be ignored and Chatterino will boot up as if it did not have a window layout at all, and on save that old window layout will be gone.
* Fix compile error for mac
This is done by deliberately setting and reading the enabled state of
the widget whenever the stateChanged event happens.
If the stateChanged event happens while the widget is not enabled, we
know the event must have been triggered by our "check user follow state"
event, and then we don't act upon that event
On macOS, trying to display a dialog before showing the main window
(like when starting minimized) leads to a crash. The dialog will now
show before the main window is opened, preventing this issue.
* (#1874) Disable update checking for unsupported platforms
As described #1874, only Windows, macOS and GNU/Linux are officially
supplied with builds. Thus checking for updates is unnecessary if we
are e.g. on FreeBSD, OpenBSD, illumos distros and possibly other
Operating Systems.
This fixes#1874 by ifdef-ing the 3 officially supported platforms
when checking for updates. Otherwise a debug warning will be emitted
and in the settings the checkbox for beta-updates is hidden and
replaced by a message, explaining the reason for why there are no beta
updates.
* Update CHANGELOG
In accordance with #1874
* (#1874) Move platform check into checkForUpdates
As discussed in #1914
* (#1874) Move check for supported OS to a seperate function.
As requested in #1914
* fixed SearchWindow memory leak
* Update CHANGELOG.md
* added DebugCount for BaseWindow
* [Bug Fix] Color of second user highlight cannot be set (#1898)
* Highlighting: Fix bug preventing user highlight from being set
Before this commit, only the row of a clicked cell was checked, but not
the tab it was clicked in.
Since the "Whispers" row is the second row in the "Messages" tab on the
highlighting page, the color picker was not opened for the second entry
in the "Users" tab either. This commit fixes the bug by also checking
tab the cell was clicked in.
* Update CHANGELOG.md
* Emote Popup Improvements (#1895)
* Put exact matching emotes first
* Close GenericListView on Escape press
* smol fix
* fixed emote input when not in the first char
* fixes#1902
* closes#1904
Co-authored-by: Leon Richardt <leon.richardt@gmail.com>
Co-authored-by: Daniel <24928223+dnsge@users.noreply.github.com>
* Highlighting: Fix bug preventing user highlight from being set
Before this commit, only the row of a clicked cell was checked, but not
the tab it was clicked in.
Since the "Whispers" row is the second row in the "Messages" tab on the
highlighting page, the color picker was not opened for the second entry
in the "Users" tab either. This commit fixes the bug by also checking
tab the cell was clicked in.
* Update CHANGELOG.md
* Proof of Concept for Quick Switcher
* Fix crash when suggestions are empty
* QuickSwitcher: Use tab name instead of a single channel
* Rebase later
* Add missing include for <functional>
* Move QuickSwitcher related classes into own subfolder
* Refactor switcher list items
Now, items are responsible for taking the right action when selected in
the switcher list. This should allow for more focused code and
responsibilities.
* Add note about memory management
* Add option to open channel in a new tab
* Add support for using the mouse
* Spawn switcher popup in the middle of the window
Works reliably on i3 at least. Might need some additional testing on
other WMs (and especially on Windows!).
* Add some icons for switcher items
Note that the final design of the list is not final but I do plan to
incorporate these in the future.
* Set Qt::Dialog window flag on switcher popup
Prevents tiling window managers like i3 from trying to tile the window.
* Rename "SwitcherItem" to "AbstractSwitcherItem"
* Add comments about what items are inserted
* Use custom model and view
Still missing: Currently selected item is not highlighted yet. You can
move between selected items with tab and arrow keys though.
* Add helper function to convert QVariant to AbstractSwitcherItem *
* Remove useless constant
* Highlight currently selected switcher item
* Use a different method for centering QuickSwitcherPopup window
* QuickSwitcherModel: Add documentation
* Add default parameter to QuickSwitcherModel::rowCount
* QuickSwitcherPopup: Add comments
* Remove outdated TODO
* QuickSwitcherModel: Init vector with default capacity
* Remove outdated comment
* Add comment about 0 ms timeout interval
* NewTabItem: Simplify interface
* Only fetch opened splits once
This is better than the prior approach since opened splits cannot change
anyways while the switcher is open.
* Use SplitContainer to pass information instead of custom type
* Allow searching for tab titles as well
Before this commit, only channel names could be searched.
* Refactor switcher item interface to be more flexible
Also show tab name and channel name in the switcher list.
* Add documentation for AbstractSwitcherItem
* Add documentation for NewTabItem
* Add comments about {begin,end}{Insert,Remove}Rows
* Remove unused method
* Replace magic size with named constant
* Add change log entry
Co-authored-by: fourtf <tf.four@gmail.com>
This makes it so that we consistently start with the same values after
having cleared a ChannelView.
Example place where this happens: UserInfoPopup when user messages are
loaded and refreshed
This ensures that the layout will survive for the lifetime of the menu,
so any of the menu actions can with confidence do things with the
layout, not having to worry whether it's dead or not.
This means that the user, while having the message menu open, could have
one extra MessageLayout alive. I have ensured that when the menu dies
the reference to the shared pointer dies with it.
- /usercard command doesn't close imidiatelly
- removed "Dialog" window flag. It seems to be unnecessary and causes issues (on left-clicking user name it sometimes didnt render unless you clicked 2-3 times.
There's a Refresh button added to the popup to refresh the users messages in the popup. Not automatic now while we figure out how fast/slow it would be.
Co-authored-by: dnsge <sagedanielr@gmail.com>
Upon joining a channel or pressing F5, BTTV and FFZ emotes are
(re)loaded. This change adds visual feedback of the network requests and
their outcome, in the form of a system message in the associated
channel's chat window.
Non-error messages are suppressed when joining a
channel (which automatically loads emotes).
This feature is off by default and can be enabled in the settings with the "Show link thumbnail" setting. This feature also requires the "Show link info when hovering" setting to be enabled.
thumbnails support is only there for direct image links, twitch clips, and youtube links. can be expanded in the future in the /api repo
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit adds support for uploading images to i.nuuls.com from clipboard or by dragging an image into a split.
Documentation for how to self-host the image uploader is available in ENV.md
By default, you will be asked before an image upload takes place. There's an option in the dialog to not be asked again, if that option is chosen you can revert that choice in the settings dialog.
* ChannelView: Rename mouse event related members
This is more in line with the naming of the other members as well as
future members.
* ChannelView: Add ability to scroll with middle mouse button
* Add scrolling resources
* Use custom icons for scroll cursor
* Slightly refactor scrolling logic
* Respect screen scaling when calculating scroll offset
* Nicer scrolling UX
This change allows scrolling to be feel smoother when close to the
starting point.
* Add scrolling with keeping middle mouse pressed
This mimics the behavior of browsers as well.
* Refactor ChannelView::enableScrolling
* Disable drag-scrolling on left or right click
There's a document in src/providers/twitch/api which describes how we interact with the Twitch API.
Keeping this up to date might be a healthy way for us to ensure we keep using the right APIs for the right job.
* HighlightPhrase: Fix wrong documentation
* Use right constructor for new HighlightPhrases
* Fix preset highlights changing unintentionally
Prior to this commit, the callback for reacting to user input on the
highlight table (namely, `HighlightingPage::tableCellClicked`) only
checked for the row number in order to determine whether preset
highlights (self highlights, whispers, and subscriptions) need to be
updated. Hence, changing rows 0 through 2 in the "User Highlights" tab
would also update the preset highlights.
This commit adds a check to determine whether the callback was triggered
by the "Messages" highlight tab, or not.
Since #1320, subscription messages are treated as highlights in order to
allow customization. This caused subscription messages to highlight the
split(s) the message was received in. This is not intended behavior.
This commit fixes the issue by additionally checking if the
`Subscription` flag is set on a highlighted message.
* Support for user-defined sounds and colors
* Make color & sound columns selectable
* Add custom row for subscription highlights
* Add subscriptions to custom highlights and centrally manage highlight colors
* Dynamically update message highlight colors
* Introduce crossPlatformCopy()
It sets the text of the clipboard and also syncs it with the selection
clipboard if it is supported. Such behaviour is pretty common for X11
application on Unix-like Operating Systems.
* Fix clang-format remarks
* Fix weird clang-format config discrepancy between my machine and CI
* Remove clipboard argument from crossPlatformCopy
* Fix clang-format remarks
* Channel text for offline chats
* Title refresh timer
* Fixed typo
* Refresh title when room id is loaded
* removed timer
* Typo
* Loaded on demand when hovered over
* removed the extra api request
* Moved refreshTitle function call
* Added thottling for 10s
* Fixed formating style
* reformat
* make status fetcher safer
* Requested changes from fourtf
Things changed:
- make getImageFileFormat case insensitive
- use QTextEdit::dragEnterEvent instead of QAbstractScrollArea::dragEnterEvent,
- Make dragEnterEvent() and dropEvent() overrides.
This includes:
- NuulsUploader.cpp
- changing upload delay to a #define
- moving png conversion code to `boost::optional<QByteArray> convertToPng(QImage image)`
- in uploadImageToNuuls: moving content type definition to a variable, move things around a bit to eliminate an if
- in upload: adding a comment about `source->hasUrls()` and `source->urls()`, change `uploadQueue.size()` to `!uploadQueue.empty()`
- ResizingTextEdit.cpp
- changing #include order
While tab-completing user names already respected the setting for
mentions with commas, right-clicking user names did not.
This commit adds the missing check in ChannelView::handleMouseClick.
* Ran clang-format
* Implement user-specific search in message history
This functionality was originally requested in #1236.
This commit changes the SearchPopup::performSearch method so that only
messages from specific users can be shown.
In order to filter for a specific user, enter their username with a
leading '@' in the search popup. You can also add an additional search
phrase which will also be considered in the search.
* Naive implementation for "from:" tags
Rebase later?
* Cleverer (?) version using Predicates
Commit adds two POC predicates: one for the author of messages, and one
for substring search in messages.
Problems/TODOs:
* Best way to register new predicates?
* Clean up tags (e.g. "from:") or not?
* Test combinations of different predicates
* Add a predicate to check for links in messages
* Remove a dumb TODO
* Rewrite SearchPopup::performSearch to be cleaner
* Ran clang-format on all files
* Remove TODO I missed earlier
* Forgot to run clang-format
peepoSadDank
* Re-use {}-initialization
Was accidentally removed when fixing earlier merge conflict.
* Does this fix line endings?
No diffs are shown locally, hopefully Git doesn't lie to me.
* Rename "predicates" directory to "search"
Resolving one conversation in the review of #1237.
* Use LinkParser in LinkPredicate
Resolving a conversation in the review of #1237.
* Predicates: Use unique_ptr instead of shared_ptr
Resolves a conversation in the review of #1237.
* Refactor of SearchPopup and AuthorPredicate
Resolving some points from the review in #1237.
* Moved parsing of comma-seperated values into AuthorPredicate
constructor.
* Rewrite SearchPopup::parsePredicates as suggested.
* Deleted now redundant methods in SearchPopup.
* MessagePredicate::appliesTo now takes a Message&
... instead of a MessagePtr.
This resolves a conversation in the review of #1237.
* Run clang-format on two files I missed
* AuthorPredicate: Check for displayName & loginName
Resolving conversation on #1237.
* Add user ids to user cards and a setting to the misc section of the settings
* Fix letter casing
* Forgot to run clang-format, now it's fixed
* Fix crash in UserInfoPopup::updateUserData()
* Removed setting as per Apa420's and fourtf's advice
* Removed remnants of the setting
This commit implements a simpler fix for the problem described in #1209.
The setting's signal is connected to a reset of `completionInProgress_`
so that the completion model is updated on the next word already.
This commit also removes the older approach tackling this issue.
This commit fixes a bug that would occur when changing the completion
mode from prefix-only to substring while mid-completion.
In that case, the suggestion list was not updated until the next
completion attempt.
This is fixed by forcing a suggestion list refresh whenever the
setting's checkbox is updated.
* Make emote tab completion search for substrings
Previously, tab completion only searched for emotes that start
with the current prefix under the cursor. This commit makes tab
completion look for the current prefix as a substring in any position,
not just the start.
Examples:
* In forsen's channel, tabbing on "pls" will cycle through "DonaldPls", "forsenPls",
"GachiPls", "nyanPls" and "SourPls".
* As a forsen subscriber, tabbing on "sen1" will complete to "forsen1".
* As a pajlada subscriber, tabbing on "shrug" will cycle through
"pajaShrugL" and "pajaShrugR". (Unless you are in a channel with
more "shrug" emotes, of course.)
* Add a setting for prefix and substring completion
This commit adds a setting under the "Miscellaneous" section to allow
user to choose whether they want prefix-only or substring emote
completion.
The QCompleter filter mode and `addString` function are now chosen
according to the user's setting.
* Improve description of emote completion setting
Also reintroduce a blank line that went missing.
This commit fixes the unresponsiveness of the "Manage Account" button
(described in #1188).
Apparently, focus was lost when pressing down the mouse button. This is
circumvented by setting the focus policy of the button to `Qt::NoFocus`.
The button then works as expected and opens the "Account" page in the
preferences.
* Move "About" tab in Settings
* Resize Settings window
This prevents from spawning horizontal scroll (which is caused by too long line
in "Attributions" group)
* Fix "show license" link width
If you clicked empty space next to link application assumed you clicked link.
I fixed that by using QLabels instead of SignalLabel (there's something "wrong"
with them, but I couldn't find what)
"Stack" is the default behaviour, it will search 20 messages up and 5
seconds back in time to stack the timeout.
"Stack sparingly" will try to do the same, but only if the user has not
typed a message inbetween the this and the last timeout.
Fixes#1157
Inline whispers will be displayed with highlighted background color.
New Flag needed to differentiate between normal whisper (highlighted) and whisper with mention.
Supa quick fix for #1100
Looks like this bug may come back in other places where we use
`TooltipWidget`. For a permanent fix we have to go through all of the
places that touch `TooltipWidget` and check if they clean the preview
image correctly.
It would be better to merge TooltipPreviewImage and TooltipWidget
together and change `TooltipWidget::setText` to be
```c++
void TooltipWidget::setText(const QString &text, ImagePtr image = ptrnull);
```
But it's impossible right now, because TooltipWidget is located in
appbase and `ImagePtr` is not visible there (it's located in the main
chatterino repo). Plus we also need an access to
`getApp()->windows->gifRepaintRequested`.
First step in implementing the permanent fix would be moving
TooltipWidget to chatterino from appbase.
Any thoughts on the situation?
fixes Chatterino#635
prepares for future implementation of Chatterino#79
Was a little bit hard to find the right combination for now. Pasting images from clipboard surpasses the check for dragging images in canInsertFromMimeData OMGScoots
changed setting from String to int.
changed EnumCase
I used createComboBox only has an implementation that handles stringsettings. I implemented my own combobox to handle the ToastsSettings now. Not sure if this is the best way. Won't come up with something smarter for now.
Implemented #710
Added options for opening streams from clicking the toas notficiation: (according to options in splits)
- open in browser
- open player in browser
- open in streamlink (needs to be tested, but should in theory work, since I only use the already existing function)
- don't open the stream (in case someone wants to prevent opening streams "by accident")