* Added placeholder to tab rename dialog's input
* Always set placeholder to default tab name.
* Renamed context menu entries, updated popup
* Removed TextInputDialog class, slight popup fix
* Forgot to rename variable (no fun allowed 😥)
* forsenT
* Made use of QDialogButtonBox
* Added changelog entry
Reference: https://doc.qt.io/qt-5/qwheelevent-obsolete.html#delta and https://doc.qt.io/qt-5/qwheelevent-obsolete.html#orientation
Changes in behavior introduced in this commit
Change from `event->delta()` to `event->angleDelta().y()` makes it, so you can no longer scroll horizontally (with trackpad / touchpad) to select next/previous tab (until now, you were able to do it, but I believe this is wrong anyways).
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Also:
- Fixed capitalization of one method in `LoginDialog.cpp`
- Visually improved some strings in `LoginDialog.cpp`
- Added utility function getting clipboard content to `Clipboard.cpp`
- Made sure to use `crossPlatformCopy` in `UserInfoPopup.cpp`
Fix CLI arguments not being respected. This happened due to the addition of category-based logging (--help, --version) and changes to the window loading ( --channels), respectively.
When handling --channels, I took the liberty to refactor the previous version of window description (which relied on generating JSON) to directly building the WindowLayout.
You can create clips with `/clip` command, `Alt+X` keybind or `Create a clip` option in split header's context menu. This requires a new authentication scope so re-authentication will be required to use it.
Co-authored-by: Leon Richardt <leon.richardt@gmail.com>
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Also changes the way timeouts happen, since right now if a timeout was met (which it mostly wasn't), it would run the error callback twice causing potentially undefined behaviour
PR #2284 introduced this bug: whispers aren't linked to a twitch channel
but we're storing user colors in a twitch channel. So, dereferencing
a nullptr. Not good.
You can disable this by unchecking "Color @usernames" under `Settings -> General -> Advanced (misc.)`
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
* fix: use copy instead of reference for overriding message flags
* doc: update changelog
Note: the initial attempt at fixing this issue (#2090) was also included
in order to make the development process more trackable.
* Made colors a bit lighter
And also removed the tooltip from non-twitch channels
* Updated the changelog entry
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
* Fix `runIgnoreReplaces` fall into infinity loop
The regex pattern was not checked for emptiness, which led to an endless
loop
* Update CHANGELOG.md
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
* Fixed contributor avatar links
Had to put them in qtresource format so those will actually display in Settings -> About.
Reference: https://doc.qt.io/qt-5/resources.html#compiled-in-resources
* Added my avatar and updated documentation
This was an error introduced in ec94869. Instead of the
Qt::CheckStateRole, which stores the state represented in the table
view, the Qt::DisplayRole was used. As per [1], this always returns
`false` in our use case.
[1]: https://doc.qt.io/qt-5/qvariant.html#toBool
- split everything into 2 separate labels, so we won't have any issues with dank dpi (like pajlada had) and no resizing to minimum size is required (which was apparently broken on Windows xd)
- decided to remove line, which is rather not visible / very small and can't be seen anyway
- added nice unicode characters for follow and sub label
- removed unnecessary QLabel include (which I believe was also introduced by me by an accident)
Adds custom channel filters complete with their own mini-language. Filters can be created in settings, and applied by clicking the three dots to open the Split menu and selecting "Set filters".
Prior to this commit, adding a ColorButton to a SettingsLayout via
`SettingsLayout::addColorButton` lead to the button not respecting
search queries. This is because they are not added to the layout in a
Group. This commit fixes the behavior, causing color buttons to behave
like every other settings widget.
There's now a new (yet another, sigh) section in Settings -> General, which lets you set streamer mode to 'enable/disable/detect obs' and there are also separate settings for each of the things that streamer mode covers. I just have to add ping sounds and PR is ready to be merged :)
* Show "Streamer Mode" image as link thumbnails if applicable
* Moved hideViewerCountAndDuration to streamerMode settings
Set it to false by default (just how it used to be under /misc settings, also reworked live tooltip to be a bit prettier and say "<Streamer Mode>" in gray instead of "Live with <hidden> for <hidden> viewers"
* 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
* Update TwitchIrcServer.cpp
* made english better
changed "sending messages too fast" to "You are sending messages too fast"
* changed english
* Changed English
Changed the English in 2 system messages
* Update CHANGELOG.md
* Changed too fast to too quickly
Co-authored-by: fourtf <tf.four@gmail.com>
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
* Add missing includes
We would normally have these included in another file already, or even
the precompiled headers, but having the files included here too makes
testing single parts easier.
* Modify the regex building of highlight phrases for non-regex phrases
For phrases like !test, the word boundary checking we did before was not
enough, so we now check for either a word boundary, a whitespace
character, or the line start/end.
* Add tests for ensuring I haven't fully broken the highlight system
* Add changelog entry
* 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 has historically been done in the Recent Messages API, but this functionality is being moved to Chatterino instead
* Remove `clearchatToNotice=true` query parameter to the Recent Messages API
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
* Don't require mod rights to listen to moderation actions topic
* Format timeout messages directed at you differently
e.g. "You were banned" or "You were timed out for 4h20m", also including
reason if specified.
* Better Highlights: Fix wrong color for migrated phrases
Prior to this commit, no default color was set when an "old" highlight
phrase (one added prior to #1320 / 5957551) was deserialized. This
commit makes highlight phrases uses the default self-highlight color for
these situations. This approach is reasonably sensible since that color
is also similar to the old highlight color.
Fixes#1565.
* Update default self-highlight color
The new default color was suggested in [1] by @RAnders00. Refer to the
link for further information.
[1]: https://github.com/Chatterino/chatterino2/issues/1565#issuecomment-590441625
* Theme: Remove highlight color
As highlight color is independent of the selected theme now, the member
has been removed from the `Theme` singleton. Instead, the fallback theme
color is defined in `HighlightPhrase` now.
Uses of `themes->messages.backgrounds.highlighted` have been replaced
with `HighlightPhrase::FALLBACK_COLOR` accordingly.
* Update src/controllers/highlights/HighlightPhrase.hpp
attempt to just remove constexpr
Co-Authored-By: Ruben Anders <ruben.anders@robotty.de>
* Initialize FALLBACK_COLOR outside header file
* Rename FALLBACK_COLOR to FALLBACK_HIGHLIGHT_COLOR
In preparation for the next commit introducing a new variable.
* Moved subscription highlight color into HighlightPhrase
* Use actual subscription color as a fallback
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Co-authored-by: Ruben Anders <ruben.anders@robotty.de>
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.
Fixes#1546
This change introduces a "window timer" that runs every 100ms that we
use to update the pixmap if necessary, since there is no signal for "let
me know when this image is done loading".
- get rid of `getImageFileFormat`, now uses QMimeDatabase
- now uses a `QMutex` to be thread safe,
- uploading two things at the same time is now impossible
This commit is in response to #1523.
Whispers are now only added to the `/mentions` tab if they also match a
user name or phrase highlight. On a related note, the `highlightVisual_`
member has been removed as it is no longer necessary.
* 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.
The `CHATTERINO_NIGHTLY_VERSION_STRING` defines differ on Windows and
MacOS/Linux. (See `appveyor.yml` and `travis.yml`, respectively.)
Therefore, the Windows version string looked really messed up but it
should be fixed now.
* 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