Commit graph

55 commits

Author SHA1 Message Date
Andreas Kling
fd5eb79d19 LibGUI: Make GMenu inherit from CObject
This is primarily to make it possible to pass a GMenu* where a CObject*
is expected.
2019-12-09 21:05:44 +01:00
Andreas Kling
15fb341eb4 HackStudio: Always re-match curlies/parens after a re-highlight
While you are typing in HackStudio, we re-lex the C++ as you type,
so this means we also need to keep re-checking for matching curlies and
parentheses at the cursor.

Fixes #769 (although it's not optional, because it's too cool. :^)
2019-11-18 19:21:18 +01:00
Andreas Kling
c8e02e60a6 HackStudio+LibGUI: Implement matching curly brace highlighting
This works for C++ syntax highlighted text documents by caching the C++
token type in a new "arbitrary data" member of GTextDocumentSpan.

When the cursor is placed immediately before a '{' or immediately after
a '}', we highlight both of these brace buddies by changing their
corresponding spans to have a different background color.

..and spans can also now have a custom background color. :^)
2019-11-18 19:10:06 +01:00
Andreas Kling
834eff7983 HackStudio: Mark whitespace tokens as skippable GTextDocumentSpans
This makes Ctrl+Left/Right jump over whitespace, which feels nice :^)
2019-11-15 21:03:22 +01:00
Sergey Bugaev
c6a8b95643 HackStudio: Add a Stop action to kill the current process
Also give the Run action a different icon that has the same style
as the stop icon that's now alongside it.

Closes https://github.com/SerenityOS/serenity/issues/771
2019-11-14 20:10:16 +01:00
Andreas Kling
2fea238675 HackStudio: Reflect widget selections in the form widget tree view
You can now manipulate the widget selection either by clicking and
dragging the widgets using the cursor tool, or by interacting with
the form widget tree view. :^)
2019-11-11 22:20:02 +01:00
Andreas Kling
d5f735ecec HackStudio: Show the edited form widget's widget tree in the tree view
This patch introduces a simple WidgetTreeModel that models the widget
tree inside of a given root GWidget.
2019-11-11 22:20:02 +01:00
Andreas Kling
6dab257a45 HackStudio: Make the widget toolbar buttons checkable and exclusive
This way you can see which tool you've currently got selected, and it
doesn't let you select more than one at once.
2019-11-10 22:50:30 +01:00
Andreas Kling
e87756424d HackStudio: Introduce a Tool class with subs CursorTool and WidgetTool
These will be used to draw out new widgets on a FormWidget, or in the
case of CursorTool, to select and manipulate existing widgets.
2019-11-10 21:45:32 +01:00
Andreas Kling
a04ab219d1 HackStudio: Use a visually distinct icon for the cursor tool
Using the default cursor bitmap as the cursor tool icon in HackStudio
was predictably making it impossible to tell if it's the real cursor
or not. Replace it with a color-inverted cursor. :^)
2019-11-10 21:19:08 +01:00
Andreas Kling
f92e0f7d80 HackStudio: Add placeholder code to test widget factory construction
We now use the magical widget registry to factory-construct widgets and
place them into the form.

This will need all kinds of work, but it's nice that the mechanism is
working as intended.
2019-11-10 12:57:37 +01:00
Andreas Kling
2da058c7f2 HackStudio: Use the GWidget class registry to populate the toolbar
This will allow HackStudio to learn about new GWidget types without
having to do anything in HackStudio :^)
2019-11-10 12:57:37 +01:00
Andreas Kling
3e84ea9a53 HackStudio: Add panes on the right hand side of the form editing mode
- Form's widget tree pane (GTreeView)
- Selected widget's properties pane (GTableView)
2019-11-09 00:41:00 +01:00
Andreas Kling
489c6ac05c HackStudio: Add a widgets toolbar to the form editing mode 2019-11-09 00:41:00 +01:00
Andreas Kling
d016d5e365 HackStudio: Start fleshing out the GUI for a GUI designer :^)
I'll be reconstructing parts of the VisualBuilder application here and
then we can retire VisualBuilder entirely once all the functionality
is available in HackStudio.
2019-11-09 00:41:00 +01:00
Andreas Kling
d6c0d32b63 HackStudio: Make the project file list a little narrower by default 2019-11-07 21:06:31 +01:00
Andreas Kling
2755184e11 HackStudio: Update the "remove current editor" action enabled state
This action should not be enabled when there is only one editor open,
since you are not allowed to be editor-less.
2019-11-05 21:08:17 +01:00
Andreas Kling
cb627a3ada HackStudio: Allow removing the current editor with Alt+Shift+E
Note that you are not allowed to remove the very last editor.

These keybinds are all temporary while I figure out what the right ones
should be. I'm not exactly sure how, but it'll reveal itself. :^)
2019-11-05 21:02:31 +01:00
Andreas Kling
538d5f82c1 HackStudio: Allow switching between editors with Ctrl+E / Ctrl+Shift+E 2019-11-05 20:56:36 +01:00
Andreas Kling
f844715106 HackStudio: Allow adding more editors by pressing Ctrl+Alt+E
We also now start out with a single editor, instead of two. :^)
2019-11-05 20:56:30 +01:00
Andreas Kling
b4de5ac128 HackStudio: Start working on a "Locator", much like Qt Creator has
Pressing Ctrl+K will now open the little locator command line at the
bottom of the window. Right now it can only be used to jump quickly
to a file.
2019-10-28 19:08:48 +01:00
Andreas Kling
fe83d5087b HackStudio: Show .h files with C++ syntax highlighting 2019-10-28 19:08:48 +01:00
Andreas Kling
e2d7f585da HackStudio: Support opening the same file in both editors
Hey, it actually works! You can now edit the same file in both editors
and even the C++ highlighting updates correctly in both of them. :^)
2019-10-27 19:39:15 +01:00
Andreas Kling
f1c6193d6d LibGUI: Move GTextDocument out of GTextEditor
The idea here is to decouple the document from the editor widget so you
could have multiple editors being views onto the same document.

This doesn't work yet, since the document and editor are coupled in
various ways still (including a per-line back-pointer to the editor.)
2019-10-27 16:44:16 +01:00
Andreas Kling
1bcbc3f827 HackStudio: Allow switching between the two editors with Ctrl+E :^)
This is very hackish and should be done differently, but the feature
feels pretty nice and does work for now.
2019-10-27 13:10:37 +01:00
Andreas Kling
1e5f4714c7 HackStudio: Tweak EditorWrapper layouts a bit to make things look nice 2019-10-27 13:06:30 +01:00
Andreas Kling
e39b1f11f9 HackStudio: Support multiple editors on screen
This patch adds Editor (subclass of GTextEditor) and EditorWrapper.
An EditorWrapper is a composite widget that adds a little statusbar
above an Editor widget. The statusbar is used for showing the filename
and the current cursor position. More things can definitely be added.

To get to the currently active editor, call current_editor().
You can also get to the current editor's wrapper by calling..
current_editor_wrapper(). Which editor is current is determined by
which was was last focused by the user.
2019-10-27 12:55:10 +01:00
Andreas Kling
90c81d5c16 HackStudio: Tweak style of C++ identifiers
On second thought, let's not have bold identifiers, as this ended up
making most of the code bold. :^)
2019-10-26 21:47:51 +02:00
Andreas Kling
dd74cb9c8f HackStudio: Focus the text editor after opening a file 2019-10-26 21:45:29 +02:00
Andreas Kling
cea6506998 HackStudio: Implement adding an existing file to project 2019-10-26 21:43:46 +02:00
Andreas Kling
9129dbe0b9 HackStudio: Implement adding a new file to the project
You can now press Ctrl+N to create and add a new file to the project!
2019-10-26 21:28:31 +02:00
Andreas Kling
bc2026d26d LibGUI: Make GTextEditor::Span have a range instead of two positions
A GTextRange is really just two GTextPositions (start and end) anyway.
This way we can say nice things like "if (range.contains(position))"
2019-10-26 15:33:19 +02:00
Andreas Kling
df7f3ca604 HackStudio: "Hide" the action tabs (find in files, console) by default
By "hide" I really mean collapse them down to 24px height. We grow them
to a normal size when they're needed. The user is also free to resize
them at will.

This keeps them out of the way when you just want to do editing. :^)
2019-10-26 12:30:49 +02:00
Andreas Kling
db353a06e5 HackStudio: Enable line wrapping and automatic indentation by default 2019-10-26 11:33:39 +02:00
Andreas Kling
ed242d538a HackStudio: Assorted improvements to C++ highlighting
Add a list of hard-coded standard types (including AK types) and show
them in a different style.

Rehighligt the file whenever it changes. (This is very inefficient but
makes it much easier to experiment.)

Also keep tweaking the colors. :^)
2019-10-26 10:33:50 +02:00
Andreas Kling
2b19badd74 HackStudio: Make C++ keywords bold :^)
Now that we can specify the font of a GTextEditor::Span, use this to
make C++ keywords show up in bold text. Also tweak colors a bit.
2019-10-26 00:19:36 +02:00
Andreas Kling
6afe27b914 HackStudio: Lex C++ files and apply some basic syntax highlighting
When we open a file whose name ends in ".cpp", we now pass the contents
through CppLexer, which produces a CppToken stream.

Those CppTokens are then converted into GTextEditor::Spans and handed
over to GTextEditor which then colorizes the source code accordingly.

This is pretty neat. :^)
2019-10-25 21:09:16 +02:00
Andreas Kling
f256c55e8d HackStudio: Unbreak jumping to a search result
I broke this when factoring out the find-in-files widget into its own
class. This patch adds a main_editor() global getter for grabbing at
the main GTextEditor from wherever you are.
2019-10-25 10:25:42 +02:00
Andreas Kling
deabc7e13b HackStudio: Bring up the console when doing a "build" or "run"
We most likely want to see what comes out on the console when starting
one of these actions.
2019-10-24 22:28:36 +02:00
Andreas Kling
84a2208b5c HackStudio: Add some toolbar icons to liven up the UI a bit :^) 2019-10-24 22:25:26 +02:00
Andreas Kling
2260190f39 HackStudio: Move "find in files" widget to its own file/class
Instead of clogging up main.cpp with find-in-files functionality,
put it in a FindInFilesWidget class in a separate file.
2019-10-23 21:13:08 +02:00
Andreas Kling
2d460b504f HackStudio: Make the "find in files" widget more keyboard-accessible
Have Ctrl+Shift+F open the find-in-files widget and focus the text box
so you can start entering text right away.

Also make it do a search when you press the return key.
2019-10-23 21:02:02 +02:00
Andreas Kling
d3e81d2ba8 HackStudio: Start adding a "find in files" function
Projects now contain a set of TextDocument objects. Each TextDocument
represents a member file in the project. TextDocuments may not have
their file contents loaded at all times, but they will be loaded on
demand when calling TextDocument::contents().

"Find in files" works by iterating over the documents in the project
and calling find(needle) on each one. The return value from find() is
a vector of line numbers where the needle was found.

This is obviously going to need a bunch more work. :^)
2019-10-23 20:54:41 +02:00
Andreas Kling
5f5f837ec5 HackStudio: Put the console terminal wrapper in a GTabWidget
This will make it straightforward to add more things at this level.
2019-10-23 19:52:34 +02:00
Andreas Kling
29669ba661 HackStudio: Add a simple "Save" action
Pressing Ctrl+S now saves the currently open file to disk.
2019-10-22 22:25:05 +02:00
Andreas Kling
708543c3d6 HackStudio: Add a simple "Run" action
Ctrl+R will now execute "make run" in the project directory. :^)
2019-10-22 22:18:46 +02:00
Andreas Kling
654ffdef91 HackStudio: Add a simple "Build" action
Pressing Ctrl+B now invokes "make" in the project directory and routes
the output from the make command to the little terminal widget.
2019-10-22 22:15:43 +02:00
Andreas Kling
a6b153abf1 HackStudio: Show the currently open file in bold (in the project list)
Also import a little default C++ project called "little" :^)
2019-10-22 21:38:58 +02:00
Andreas Kling
2638a94094 HackStudio: Add a simple app icon and some initial menus 2019-10-21 22:13:20 +02:00
Andreas Kling
3fa16dfae2 HackStudio: "Go to line" was mixed up about 0/1-based line numbers 2019-10-21 20:33:47 +02:00